Provided by: putty-tools_0.77-1_amd64 bug

NAME

       psusan - pseudo-SSH for untappable, separately authenticated networks

SYNOPSIS

       psusan [ options ]

DESCRIPTION

       psusan  is  a  server program that behaves like the innermost `connection' layer of an SSH
       session, without the two outer  security  layers  of  encryption  and  authentication.  It
       provides all the post-authentication features of an SSH connection:

             choosing  whether  to  run  an  interactive  terminal session or a single specified
              command

             multiple terminal sessions at once (or a mixture of those and specified commands)

             SFTP file transfer

             all the standard SSH port-forwarding options

             X11 forwarding

             SSH agent forwarding

       The catch is that, because it lacks the outer layers of SSH, you have to run it over  some
       kind  of data channel that is already authenticated as the right user, and that is already
       protected to your satisfaction against eavesdropping and session hijacking. A good rule of
       thumb is that any channel that you were prepared to run a bare shell session over, you can
       run psusan over instead, which adds  all  the  above  conveniences  without  changing  the
       security properties.

       The  protocol  that  psusan speaks is also spoken by PuTTY, Plink, PSCP, and PSFTP, if you
       select the protocol type `Bare ssh-connection' or the command-line option  -ssh-connection
       and  specify  the  absolute  path  to  the  appropriate  Unix-domain  socket in place of a
       hostname.

EXAMPLES

       The idea of a secure, pre-authenticated data channel  seems  strange  to  people  thinking
       about  network  connections. But there are lots of examples within the context of a single
       Unix system, and that's where psusan is typically useful.

   Docker
       A good example is the console  or  standard  I/O  channel  leading  into  a  container  or
       virtualisation  system.  Docker  is  a  familiar  example.  If  you want to start a Docker
       container and run a shell directly within it, you might say something like

       docker run -i -t some:image

       which will allow you to run a single shell session  inside  the  container,  in  the  same
       terminal you started Docker from.

       Suppose  that  you'd  prefer  to run multiple shell sessions in the same container at once
       (perhaps so that one of them can use debugging tools to poke at what  another  is  doing).
       And  perhaps inside that container you're going to run a program that you don't trust with
       full access to your network, but are prepared to let it make one or two  specific  network
       connections of the kind you could set up with an SSH port forwarding.

       In  that  case,  you could remove the -t option from that Docker command line (which means
       `allocate a terminal device'), and tell it to run psusan inside the container:

       docker run -i some:image /some/path/to/psusan

       (Of course, you'll need to ensure that psusan is installed somewhere inside the  container
       image.)

       If  you do that from a shell command line, you'll see a banner line looking something like
       this:

       SSHCONNECTION@putty.projects.tartarus.org-2.0-PSUSAN_Release_0.75

       which isn't particularly helpful except that it tells  you  that  psusan  has  started  up
       successfully.

       To talk to this server usefully, you can set up a PuTTY saved session as follows:

             Set the protocol to `Bare ssh-connection' (the psusan protocol).

             Write something in the hostname box. It will appear in PuTTY's window title (if you
              run GUI PuTTY), so you might want to write something that will remind you what kind
              of window it is. If you have no opinion, something generic like `dummy' will do.

             In  the  `Proxy'  configuration panel, set the proxy type to `Local', and enter the
              above `docker run' command in the `Telnet command, or  local  proxy  command'  edit
              box.

             In  the  `SSH' configuration panel, you will very likely want to turn on connection
              sharing. (See below.)

       This arranges that when PuTTY starts up, it will run the Docker command as shown above  in
       place  of  making a network connection, and talk to that command using the psusan SSH-like
       protocol.

       The effect is that you will still  get  a  shell  session  in  the  context  of  a  Docker
       container.  But  this time, it's got all the SSH amenities. If you also turn on connection
       sharing in the `SSH' configuration panel, then the `Duplicate Session' option will get you
       a  second  shell  in  the  same Docker container (instead of a primary shell in a separate
       instance). You can transfer files in and out of the container  while  it's  running  using
       PSCP  or  PSFTP;  you  can forward network ports, X11 programs, and/or an SSH agent to the
       container.

       Of course, another way to do all of this would be to run the full SSH  protocol  over  the
       same  channel.  This  involves  more  setup:  you  have  to invent an SSH host key for the
       container, accept it in the client, and deal with it being left behind  in  your  client's
       host  key cache when the container is discarded. And you have to set up some login details
       in the container: either configure a password, and type it in the client, or copy  in  the
       public  half  of  some SSH key you already had. And all this inconvenience is unnecessary,
       because these are all precautions you need to take when the connection between two systems
       is  going  over a hostile network. In this case, it's only going over a kernel IPC channel
       that's guaranteed to go to the right place, so those safety precautions are redundant, and
       they only add awkwardness.

   User-mode Linux
       User-mode  Linux is another container type you can talk to in the same way. Here's a small
       worked example.

       The easiest way to run UML is to use its `hostfs' file  system  type  to  give  the  guest
       kernel  access  to  the  same  virtual  filesystem as you have on the host. For example, a
       command line like this gets you a shell prompt inside a UML instance sharing your existing
       filesystem:

       linux mem=512M rootfstype=hostfs rootflags=/ rw init=/bin/bash

       If  you  run this at a command line (assuming you have a UML kernel available on your path
       under the name `linux'), then you should see a lot of kernel startup messages, followed by
       a shell prompt along the lines of

       root@(none):/#

       To  convert  this  into  a psusan-based UML session, we need to adjust the command line so
       that instead of running bash it runs psusan.  But  running  psusan  directly  isn't  quite
       enough,  because  psusan  will  depend  on  a  small amount of setup, such as having /proc
       mounted. So instead, we set the init process to a shell script which will do the necessary
       setup and then invoke psusan.

       Also,  running psusan directly over the UML console device is a bad idea, because then the
       psusan binary protocol will be mixed with textual console messages. So a better plan is to
       redirect  UML's  console  to the standard error of the linux process, and map its standard
       input and output to a serial  port.  So  the  replacement  UML  command  line  might  look
       something like this:

       linux mem=512M rootfstype=hostfs rootflags=/ rw \
           con=fd:2,fd:2 ssl0=fd:0,fd:1 init=/some/path/to/uml-psusan.sh

       And the setup script uml-psusan.sh might look like this:

       #!/bin/bash
       # Set up vital pseudo-filesystems
       mount -t proc none /proc
       mount -t devpts none /dev/pts
       # Redirect I/O to the serial port, but stderr to the console
       exec 0<>/dev/ttyS0 1>&0 2>/dev/console
       # Set the serial port into raw mode, to run a binary protocol
       stty raw -echo
       # Choose what shell you want to run inside psusan
       export SHELL=/bin/bash
       # Set up a default path
       export PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
       # And now run psusan over the serial port
       exec /home/simon/src/putty/misc/psusan

       Now  set up a PuTTY saved session as in the Docker example above. Basically you'll want to
       use the above linux command as the local proxy command. However, it's worth wrapping it in
       setsid(1),  because when UML terminates, it kills its entire process group. So it's better
       that PuTTY should not be part of that group, and should have the opportunity to shut  down
       cleanly  by  itself. So probably you end up setting the proxy command to be something more
       like:

       setsid linux mem=512M rootfstype=hostfs rootflags=/ rw \
           con=fd:2,fd:2 ssl0=fd:0,fd:1 init=/some/path/to/uml-psusan.sh

       You may also find that you have to enable the  bug  workaround  that  indicates  that  the
       server  `Discards  data  sent  before  its  greeting',  because otherwise PuTTY's outgoing
       protocol greeting can be accidentally lost during UML startup. (See Debian bug #991958.)

       Once you've done that, you'll have a PuTTY session that starts up  a  clean  UML  instance
       when  you  run  it,  and (if you enabled connection sharing) further instances of the same
       session will connect to the same instance again.

   Windows Subsystem for Linux
       On Windows, the default way to use WSL is to run the wsl program, or one of  its  aliases,
       in  a Windows console, either by launching it from an existing command prompt, or by using
       a shortcut that opens it in a fresh console. This gives you a Linux terminal  environment,
       but in a Windows console window.

       If  you'd  prefer  to  interact with the same environment using PuTTY as the terminal (for
       example, if you prefer PuTTY's mouse shortcuts for copy and paste), you can set it  up  by
       installing psusan in the Linux environment, and then setting up a PuTTY saved session that
       talks to it. A nice way to do this is to use the name of the WSL distribution as the `host
       name':

             set  the  local  proxy command to `wsl -d %host /usr/local/bin/psusan' (or wherever
              you installed psusan in the Linux system)

             enter the name of a particular WSL distribution in the host name box. (For example,
              if  you  installed WSL Debian in the standard way from the Windows store, this will
              just be `Debian'.)

             set the protocol to `Bare ssh-connection', as usual.

       Like all the other examples here, this also permits you to forward ports in and out of the
       WSL  environment  (e.g.  expose  a  WSL2 network service through the hypervisor's internal
       NAT), forward Pageant into it, and so on.

   Cygwin
       Another Unix-like environment on Windows is Cygwin. That comes with its own  GUI  terminal
       application,  mintty  (as  it  happens, a derivative of PuTTY); but if you'd prefer to use
       PuTTY itself to talk to your Cygwin terminal sessions, psusan can help.

       To do this, you'll first need to build the Unix PuTTY tools inside Cygwin (via  the  usual
       cmake  method).  Then, copy the resulting psusan.exe into Cygwin's /bin directory. (It has
       to be in that directory for non-Cygwin programs to run it; otherwise it won't be  able  to
       find the Cygwin DLL at startup.)

       Then set up your PuTTY saved session like this:

             set  the local proxy command to run psusan.exe via its real Windows path. You might
              also want to add the --sessiondir option so that shell sessions start  up  in  your
              Cygwin    home    directory.    For    example,   you   might   use   the   command
              `c:\cygwin64\bin\psusan.exe --sessiondir /home/simon' (changing  the  pathname  and
              username to match your setup).

             enter anything you like in the host name box; `Cygwin' is probably a good choice

             set the protocol to `Bare ssh-connection', as usual.

       Port  forwarding is probably not particularly useful in this case, since Cygwin shares the
       same network port space as the host machine. But turning on agent  forwarding  is  useful,
       because  then  the  Cygwin command-line SSH client can talk to Pageant without any further
       configuration.

   schroot
       Another example of a container-like environment is the alternative filesystem  layout  set
       up by schroot(1).

       schroot  is  another  program that defaults to running an interactive shell session in the
       terminal you launched it from. But again, you can get a psusan connection into the schroot
       environment  by  setting  up  a PuTTY saved session whose local proxy command is along the
       lines of

       schroot -c chroot-name /some/path/to/psusan

       Depending on how much of the chroot environment is copied from your main  one,  you  might
       find  this  makes  it easier to (for example) run X11 programs inside the chroot that open
       windows on your main X display, or transfer files in and out of the chroot.

   Between network namespaces
       If you've set up multiple network namespaces on a  Linux  system,  with  different  TCP/IP
       configurations, then psusan can be a convenient unprivileged-user gateway between them, if
       you run it as a non-root user in the non-default one of  your  namespaces,  listening  for
       connections on a Unix-domain socket.

       If  you  do that, then it gives you convenient control over which of your outgoing network
       connections use which TCP/IP configuration: you can use PuTTY to run a  shell  session  in
       the  context  of the other namespace if you want to run commands like ping, or you can set
       up individual port forwardings or even a SOCKS server so that  processes  running  in  one
       namespace can send their network connections via the other one.

       For  this application, it's probably most convenient to use the --listen option in psusan,
       which makes it run as a server and listen for connections on a  Unix-domain  socket.  Then
       you  can  enter  that socket name in PuTTY's host name configuration field (and also still
       select the `Bare ssh-connection' protocol option), to connect to that socket as if it were
       an SSH client.

       Provided  the Unix-domain socket is inside a directory that only the right user has access
       to, this will ensure that authentication is done implicitly by the Linux kernel.

   Between user ids, via GNU userv
       If you use multiple user ids on the same machine, say for purposes of privilege separation
       (running  some less-trusted program with limited abilities to access all your stuff), then
       you probably have a `default' or most privileged account where you  run  your  main  login
       session, and sometimes need to run a shell in another account.

       psusan  can  be  used as an access channel between the accounts, using GNU userv(1) as the
       transport. In the account you want to access, write a userv configuration stanza along the
       lines of

       if (glob service psusan & glob calling-user my-main-account-name)
          reset
          execute /some/path/to/psusan
       fi

       This gives your main account the right to run the command

       userv my-sub-account-name psusan

       and you can configure that command name as a PuTTY local proxy command, in the same way as
       most of the previous examples.

       Of course, there are plenty of ways already to access one local account from another, such
       as  sudo.  One  advantage  of  doing  it  this  way  is  that  you  don't  need the system
       administrator to intervene when you want to change the access controls (e.g. change  which
       of  your  accounts have access to another): as long as you have some means of getting into
       each  account  in  the  first  place,  and  userv  is  installed,  you  can  make  further
       configuration changes without having to bother root about it.

       Another  advantage  is  that  it  might make file transfer between the accounts easier. If
       you're the kind of person who keeps your home directories private, then  it's  awkward  to
       copy  a  file  from  one of your accounts to another just by using the cp command, because
       there's nowhere convenient that you can leave it in one account where the  other  one  can
       read  it.  But  with psusan over userv, you don't need any shared piece of filesystem: you
       can scp files back and forth without any difficulty.

OPTIONS

       The command-line options supported by psusan are:

       --listen unix-socket-name
              Run psusan in listening mode. unix-socket-name is the  pathname  of  a  Unix-domain
              socket  to  listen  on.  You should ensure that this pathname is inside a directory
              whose read and exec permissions are restricted to only the user(s) you want  to  be
              able to access the environment that psusan is running in.

              The  listening  socket  has  to be a Unix-domain socket. psusan does not provide an
              option to run over TCP/IP, because the unauthenticated nature of the protocol would
              make it inherently insecure.

       --listen-once
              In listening mode, this option causes psusan to listen for only one connection, and
              exit immediately after that connection terminates.

       --sessiondir pathname
              This option sets the directory that shell sessions and subprocesses will start  in.
              By default it is psusan's own working directory, but in some situations it's easier
              to change it with a command-line option than by wrapping psusan in  a  script  that
              changes directory before starting it.

       -v, --verbose
              This option causes psusan to print verbose log messages on its standard error. This
              is probably most useful in listening mode.

       -sshlog logfile

       -sshrawlog logfile
              These options cause psusan to log protocol details to  a  file,  similarly  to  the
              logging options in PuTTY and Plink.

              -sshlog  logs  decoded  SSH  packets  and other events (those that -v would print).
              -sshrawlog additionally logs the raw wire data, including the outer  packet  format
              and the initial greetings.