Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
psusan(1)			PuTTY tool suite		       psusan(1)

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  encryp-
     tion  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 speci-
	    fied 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 chan-
     nel 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  com-
     mand-line	option	-ssh-connection and specify the absolute path to the ap-
     propriate Unix-domain socket in place of a hostname.

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

   Docker
     A good example is the console or standard I/O channel leading into  a  con-
     tainer  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 con-
     tainer 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 in-
     side 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 win-
	    dow title (if you run GUI PuTTY), so you might want to  write  some-
	    thing 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 com-
     mand 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  pro-
     tocol  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:  ei-
     ther 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 unnec-
     essary, because these are all precautions you need to take when the connec-
     tion 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 com-
     mand line so that instead of running bash it runs psusan. But running  psu-
     san  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 er-
     ror 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. How-
     ever, 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) fur-
     ther 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  win-
     dow.

     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 Cyg-
     win's /bin directory. (It has to be in that directory for	non-Cygwin  pro-
     grams  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 filesys-
     tem 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 psu-
     san  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 dif-
     ferent 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-de-
     fault  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 forward-
     ings 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 op-
     tion  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-connec-
     tion' 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 priv-
     ilege separation (running some less-trusted program with limited  abilities
     to access all your stuff), then you probably have a `default' or most priv-
     ileged 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  an-
     other):  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  pri-
     vate, 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  psu-
     san  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 path-
	    name is inside a directory whose read and exec permissions	are  re-
	    stricted to only the user(s) you want to be able to access the envi-
	    ronment 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 op-
	    tion than by wrapping psusan in a script that changes directory  be-
	    fore starting it.

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

     -sshlog logfile

     -sshrawlog logfile
	    These  options cause psusan to log protocol details to a file, simi-
	    larly 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, in-
	    cluding the outer packet format and the initial greetings.

PuTTY tool suite		   2020-12-13			       psusan(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=psusan&sektion=1&manpath=FreeBSD+Ports+15.1.quarterly>

home | help