NAME
rssh - restricted secure shell allowing only scp
and/or sftp
SYNOPSIS
rssh [ options... ] [ ...
]
rssh -v
DESCRIPTION
rssh is a restricted shell for providing
limited access to a host via ssh(1),
allowing a user whose shell is configured to rssh to use one
or more of the command(s) scp(1),
sftp(1)
cvs(1),
rdist(1),
and rsync(1),
and only those commands. It is intended primarily to work
with OpenSSH (see http://www.openssh.com), but may
work with other implementations. The system administrator should
install the shell on the restricted system. Then the password file
entry of any user for whom it is desireable to provide restricted
access should be edited, such that their shell is rssh. For
example:
- luser:x:666:666::/home/luser:/usr/bin/rssh
If invoked with
the -v option, rssh will report its version, and
exit. All other arguments to rssh are those specified by the
remote ssh(1)
client, and aren't of much concern to the average user. The
arguments provided must be what a shell on the remote end would
receive in order to pass control to scp(1),
sftp(1),
etc. If rssh receives arguments which do not conform, it
will emit an error message and exit. If the program the user is
trying to run is not allowed, or contains syntax which will try to
execute a shell command (such as a command substitution), it will
also emit an error and exit. rssh has a configuration file,
(5),
which allows some of the behavior of rssh to be customized.
See that man page for details.
SECURITY NOTES
Read this section with exceptional care,
or you may put your system at risk!
Using rssh With CVS
If you are using rssh to allow
CVS access, it should be noted that it is not possible to prevent a
user who is very familiar with CVS from bypassing rssh and
getting a shell, unless the user does not have write access in the
repository. Obviously, the user must have write access to the
repository in order to update it, which allows them to upload
arbitrary programs into the repository. CVS provides several
mechanisms for executing such arbitrary programs... The only
reasonably safe way to use rssh with CVS is to use the
chroot jail facilities to place the CVS repository within a chroot
jail. Please see below and all relevant documentation for details
of how to set up chroot jails. Note that users will still be
able to get shell access within the jail; the only protection
which is provided is that they can not escape the jail. I have been
pursuaded to retain support for CVS because this protection is
better than no protection. You have been warned. Use CVS at your
own risk.
Potential root Compromise With Old Versions
Before rssh 2.3.0, if a regular user had shell access to
a machine where rssh was installed, a root compromise was
possible due to rssh_chroot_helper allowing a user to
arbitrarily (2)
to anywhere on the filesystem. It is possible to mitigate this
attack against affected versions of rssh using strict access
controls to files, by making sure that the user can not write to
any file on the same partition as system executables, and that any
partition where they can write files does not allow execution of
SUID programs. As of rssh 2.3.0, this attack has been
prevented by preventing arbitrary chroot(), if your jail is set
up securely. In particular, make sure that regular users can
not write to directories inside the jail which contain the copied
binaries. That should be obvious, but it needs to be said. Though
it should not be strictly necessary, to further protect your system
from possible compromise, it is also advisable to follow the
section below, entitled "Safeguards Against Bypassing rssh".
section below, entitled "Safeguards Against Bypassing rssh".
Safeguards Against Bypassing rssh
rssh is designed
to interact with several other programs. Even if rssh is completely
bug-free, changes in those other programs could possibly result in
methods to circumvent the protection that rssh is intended
to provide. It is important for you, the system administrator,
to stay current on the services you make available with rssh, to be
sure that these commands do not provide mechanisms to allow the
user to run arbitrary commands. Also, while the goal of every
release is to be bug free, no one is perfect... There may be
undiscovered bugs in rssh which might allow a user to
circumvent it. You can protect your system from those who would
take advantage of such weaknesses. This is not required for
rssh to work properly, but it is a really good idea. There
are six basic steps:
-
- 1.
- protect all non-administrator accounts with rssh (i.e. no
regular user should have shell access to the server)
- 2.
- place your users in a chroot jail
- 3.
- limit the binaries which live in the jail to the absolute
minimum required
- 4.
- mount their home filesystem with the noexec/nosuid option (i.e.
use separate partitions in the jail for user home directories and
all other files, if possible/reasonable)
- 5.
- create a group for rssh users, and limit executable access to
the binaries to users in that group.
- 6.
- use standard file permissions carefully and
appropriately
If possible, make sure that no regular user
has any kind of shell access to the system other than through
rssh. Otherwise, users with shell access could potentially
exploit undiscovered bugs in rssh_chroot_helper to gain root
access to the server. rssh gives the system administrator
the ability to place the users in a chroot jail. See details in the
man page for rssh.conf and in the file CHROOT which
is distributed with the source code. If you want to ensure users
can not run arbitrary programs, use a chroot jail, and be sure not
to put any programs other than what are absolutely necessary to
provide the service you are trying to provide. This prevents them
from running standard system commands. Then, make sure the user's
files inside the jail are on a seperate filesystem from your
system's executables. If possible in your environment, make sure
you mount this filesystem using the noexec and nosuid
options, if your operating system provides them. This prevents the
users from being able to execute programs which they have uploaded
to the target machine (e.g. using scp) which might otherwise be
executable, and prevents SUID programs from respecting the SUID
bits. Note that these options necessitate the users' files are on
separate partitions from the binaries and libraries that live in
the jail. Therefore you will need at least 2 partitions for your
jail to do this properly (one for the system binaries in the jail,
the other for the user directories). Additionally, create a group,
for example "rsshuser", for rssh users. Put all your users who will
be restricted by rssh in that group. Set the ownership and
permissions on rssh and rssh_chroot_helper so that only those users
can execute them. The following commands should illustrate:
- # groupadd rsshuser
# chown root:rsshuser rssh rssh_chroot_helper
# chmod 550 rssh
# chmod 4550 rssh_chroot_helper
Lastly, use standard
Unix/POSIX file permissions to ensure they can not access files
they should not be able to within the chroot jail.
Command Line Parser
As of rssh version 2.2.3, the
program must parse out the complete command line to avoid command
line options which cause the execution of arbitrary programs (and
hence bypass the security of rssh). In order to keep the
program source code sane, the parser is a little over-zealous about
matching command line options. In practice, this probably will not
be an issue, but in theory it is possible. If you run into a
problem where rssh refuses to run, claiming to be rejecting
insecure command line options which were not specified, try
changing your command line such that all short options are
specified as single-letter option flags (e.g. -e -p instead of -ep)
and make sure you separate arguments from their respective options
by a space (e.g. -p 123 instead of -p123). In virtually all cases,
this should solve the problem. Admittedly, an exhaustive search was
not performed, but no problematical cases were found which were
likely to be common. The alternative would have been to include a
complete command-line parser for rcp, rdist, and rsync; this was
way out of the scope of this project. In practice, the existing
parser should suffice. If, however, you find cases where it does
not, please post details to the rssh mailing list. Details about
how to post to the mailing list can be found at the rssh homepage.
OpenSSH Versions and Bypassing rssh
Prior to OpenSSH 3.5,
sshd(8) will
generally attempt to parse files in the user's home directory, and
may also try to run a start-up script from the user's
$HOME/.ssh directory. rssh does not make use of the
user's environment in any way. The relevant command is executed by
calling (3)
with the full path to the command, as specified at compile time. It
does not depend upon the user's PATH variable, or on any other
environment variable. There are, however, several problems that can
arise. This is due entirely to the way the OpenSSH Project's sshd
works, and is in no way the fault of rssh. For example, one
problem which might exist is that, according to the sshd(8) man
page from at least some releases of OpenSSH, the commands listed in
the $HOME/.ssh/rc file are executed with /bin/sh
instead of the user's defined shell. This appears not to be the
case on the systems the author had available to test on; commands
were executed using the user's configured shell (rssh),
which did not allow the execution. However if it is true on your
system, then a malicious user may be able to circumvent rssh
by uploading a file to $HOME/.ssh/rc which will be executed
by /bin/sh on that system. If any releases (of OpenSSH) are,
in fact, vulnerable to this problem, then it is very likely that
they are only old, outdated versions. So long as you are running a
recent version of OpenSSH, this should not be a problem as far as I
can tell. If your sshd is vulnerable to this attack, there
is a workaround for this problem, though it is pretty restrictive.
The user's home directory absolutely must not be writable by the
user. If it is, the user can use sftp to remove the directory
or rename it, and then create a new one, and fill it up with
whatever environment files they like. For providing file uploads,
this means a user-writable directory must be created for them, and
they must be made aware of their inability to write into their home
directory other than in this location. A second problem is that
after authenticating the user, sshd also reads
$HOME/.ssh/environment to allow the user to set variables in
their environment. This allows the user to completely circumvent
rssh by clever manipulation of such environment variables as
LD_LIBRARY_PATH or LD_PRELOAD to link the rssh binary
against arbitrary shared libraries. In order to prevent this from
being a problem, as of version 0.9.3, by default rssh is now
compiled statically. The restrictive work-around mentioned above
will also defeat this sort of attack. As of OpenSSH 3.5,
sshd now supports the option PermitUserEnvironment
which is set to "no" by default. This option allows restricted
shells like rssh to function properly without requiring them
to be linked statically. As of rssh version 1.0.1, the
configure script should detect that OpenSSH 3.5 is present, and
disable the default of static compilation.
BUGS
None. =8^)
A Note About Getting Help
If you are having trouble getting
rssh working, or you think you've found a bug, please use
the mailing list, and do not e-mail me directly. You
must sign up for the list in order to post. Information about how
to sign up is available on the rssh homepage. If you mail me
directly with questions, I will almost certainly ignore you, or at
the very least ask you to repost your question on the mailing list.
Please also feel free to provide feedback about rssh on the mailing
list, whether positive or negative (especially negative).
Security Problems
The only exception to the above is if you
believe you have found a security problem with rssh. If that
is the case, then please do contact me privately. If you are
unable to find my direct contact info, post a message on the
mailing list requesting that I contact you about a potential
security problem. Security problems should be dealt with privately,
so that the threat can be properly assessed, and so as not to
needlessly endanger the installations of rssh in production
environments. I take security problems seriously, and will work to
resolve them as quickly as possible.
N.B.:
Before you e-mail me (or the mailing list) with
questions, be sure to THOROUGHLY read all of the following
files: README, INSTALL, CHROOT, SECURITY. All of these files are
distributed with the rssh source code, as well as all binary
packages of rssh. If you downloaded a binary package, these
files should be located wherever your distribution keeps its
documentation files (usually /usr/share/doc/rssh-version/ or
something similar). Also THOROUGHLY read the man pages for
rssh(1), and
(5).
Finally, if you are still having problems, read the FAQ at http://www.pizzashack.org/rssh/faq.shtml.
If it is clear to me that you have not read these documents, I will
ignore you. In most cases, these documents will already have
everything you need to get rssh working, and I won't be able to
explain it any better on a mailing list than I did in those
documents...
SEE ALSO
(5),
sshd(8),
ssh(1),
scp(1),
sftp(1).