TITLE: Open Secure SHell (OpenSSH) LFS VERSION: any AUTHOR: Daniel Roethlisberger SYNOPSIS: How to compile and install the OpenSSH daemon and client. HINT: HINT VERSION: 1.5 (17-May-2002) CHANGES: 1.5: Latest instructions on privilege separated openssh. 1.4: Latest versions, added more openssh options, and a number of other, minor changes. 1.3: Updated zlib web site. 1.2: Upgraded to latest openssh/openssl. Removed obsolete workaround for broken openssl installation, added man page fix. Enabled MD5 in openssh. 1.1: Incorporated comments by Sergey Ostrovsky regarding OpenSSL configuration, optimization and the broken install script. OpenSSL install is much improved now. Added comments on install location. Modified the random devices script a bit. INTRO This document describes the necessary steps to get a fully functional SSH daemon (sshd), and the SSH clients (ssh, scp). OpenSSH contains replacements for the aged, insecure and unencrypted telnet, rlogin, rcp and ftp services. With SSH, SFTP and SCP, you have a secure, encrypted alternative. In addition, you can tunnel about anything you can think of through secure, encrypted SSH tunnels. Why "Open"? There is a commercial package from Tatu Ylönen which is here for essentially the same thing. The commercial variant has several drawbacks, for instance the license doesn't permit using it freely in commercial environments, while OpenSSH has an open license, is free from any patent issues, and no cryptographic part of it was ever exported from the US, which means no ITAR export regulation problems. So in essence, OpenSSH is completely free, while the commercial SSH is not. In addition, one might say that Tatu has been a little unfriendly to the free SSH offspring in the past, so for me the commercial variant is out of the question. PACKAGES You'll need at least the following three packages to get started: openssh-3.2.2p1.tar.gz from http://www.openssh.com/portable.html openssl-0.9.6c.tar.gz from http://www.openssl.org/ zlib.tar.gz from http://www.gzip.org/zlib/ You may also get them from a mirror, such as your local sunsite. You are advised to get the latest stable release available. There have been several serious flaws in both openssl and even more so openssh lately, so make sure you are up to date, always. Consider subscribing to the announce mailing lists of openssh and openssl, so you'll know when new releases are available. Upgrading these two frequently is crucual to your system security. zlib is a compression library required to build the OpenSSL and OpenSSH packages. OpenSSL is an open SSL implementation library. OpenSSH is using OpenSSL for all its crypto-related tasks. DEPENDENCIES If you want to use SSH in conjunction with PAM, install PAM first. See the PAM-hint on how to do this. PAM is in no way required to run any part of OpenSSH, but if you want a PAM aware version of OpenSSH, you need to have PAM installed first. You are entirely on your own when building for PAM. DEVICES If you haven't already done so, you should create the /dev/random and /dev/urandom random character generator device files. OpenSSH comes with an internal random data generator, but it is strongly recommended to use the random device provided by the Linux kernel. You do so by typing the following commands: mknod /dev/random c 1 8 && mknod /dev/urandom c 1 9 && chown root.sys /dev/random /dev/urandom && chmod 0644 /dev/random /dev/urandom The kernel random data generator takes some of its random input ("noise"), from user interaction such as mouse, keyboard, network delays, and so forth. When a Linux system starts up without much outside world interaction, the entropy pool may be in a fairly predictable state. This reduces the actual amount of noise in the entropy pool below the estimate. In order to counteract this effect, it helps to carry entropy pool information across shut-downs and start-ups. To do this, add the following lines to an appropriate script which is run during the Linux system start-up sequence: echo -n "Initializing kernel random number generator..." # Initialize kernel random number generator with random seed # from last shut-down (or start-up) to this start-up. Load and # then save 512 bytes, which is the size of the entropy pool. if [ -f /var/random-seed ]; then cat /var/random-seed >/dev/urandom fi dd if=/dev/urandom of=/var/random-seed count=1 &>/dev/null evaluate_retval Also, add the following lines in an appropriate script which is run during the Linux system shutdown: # Carry a random seed from shut-down to start-up for the random # number generator. Save 512 bytes, which is the size of the # random number generator's entropy pool. echo -n "Saving random seed..." dd if=/dev/urandom of=/var/random-seed count=1 &>/dev/null evaluate_retval INSTALLATION A note on installation paths: I installed all the three packages into the /usr hierarchy. If you want to keep LFS base and additional packages you've installed later strictly separated, you'll want to replace /usr with /usr/local wherever I've used it in the following commands. ZLIB After you've made sure you got working random devices, install zlib first. Do this by unpacking the tarball as usual, and running the following commands from within the zlib source directory. ./configure --shared --prefix=/usr && make && make install && ldconfig OPENSSL Then, install OpenSSL as shared libraries the same way, but running those commands: ./config --prefix=/usr --openssldir=/usr/lib/openssl shared && make && make install && ldconfig && for m in /usr/lib/openssl/man/man? ; do cp $m/* /usr/man/$(basename $m)/ rm -rf $m done You might have noticed that OpenSSL does not read the CFLAGS compiler flags variable from the environment, but instead defaults to -O3 -m486. You might want to edit ./Configure, find the line beginning with "linux-elf" (including quotes) and set the processor model and optimization desired. I've used -O3 -march=i686 -mcpu=i686 . You may also want to play with other flags. If you don't want any patented algorithms, you can supply the options no-rc5 and no-idea to ./configure. That will skip support for those two patented algorithms. I want RC5 and IDEA no matter the patent issues. By default, the OpenSSL configuration script copies its configuration tree into $(prefix)/ssl. That violates the File Hierarchy Standard, and besides clutters the directory tree, thus we override this with the --openssldir switch, and have the script install the libraries where they belong to: into $(prefix)/lib/openssl. OPENSSH First, we need to do some preparations for the nifty privilege separation feature introduced in openssh-3.2.2 . The privilege separated SSH daemon is significantly more secure, as all the untrusted data processing is done in unprivileged processes, which means that bugs that would normally lead to a remote root compromise are now only leading to unprivileged user access within an empty chroot jail. Or in plain old English: remote root exploits that would normally work against OpenSSH do not work against the privilege separated version. Or at least chances are extremely slim that a hole leads to remote root. Create user and group 'sshd' by editing /etc/passwd, /etc/shadow, and /etc/group. Make the user sshd member of the group sshd, and no other groups. Set the home directory of the user to be /var/empty, and the shell to /bin/false. Then create that special directory by running: mkdir /var/empty && chown root:root /var/empty && chmod 755 /var/empty Take special care that there is not a single file in the whole filesystem that has user or group sshd. /var/empty must have owner and group root, not sshd. Now, install OpenSSH itself by running the following commands within its directory created by tar: ./configure --prefix=/usr --sysconfdir=/etc/ssh \ --with-md5-passwords \ --disable-suid-ssh \ --with-ipv4-default && make && make install This installs the binaries into /usr/bin and sbin, and the configuration files, including all host keys, into /etc/ssh. make install will create the /etc/ssh directory if not already present. New host keys will automatically be generated. Those keys are 1024 bits by default. If you want to create new or larger host keys manually later, use ssh-keygen to do so. If you use SSH protocol versions 1, you might want to raise the ServerKeyBits setting from the default 768 to 1024. You may need more ./configure options if you want to enable support for the likes of Kerberos, smartcards, PAM or AFS, or if you want to change the privilege separation defaults (/var/empty, sshd). Note that I install the ssh binary -not- suid root. Root privileges are needed by the client only when using rhosts for authentication, which requires ssh to bind to a privileged port. Since rhosts is an old, deprecated authentication method, insecure by design, I'm not using it, and neither should you. CONFIGURATION To enable privilege separation, edit /etc/ssh/sshd_config and add this line: UsePrivilegeSeparation yes For improved security, you might want to tune other paramters, such as disable SSH protocol v1 support, and you might want to disable rhosts authentification. I usually only allow password and pubkey authentication on my hosts (man sshd). RUNNING THE DAEMON If you want the SSH daemon (sshd) to be started by init on bootup, create a copy of /etc/init.d/template, name it sshd, edit it, put as binary path /usr/sbin/sshd where appropriate, make sure the scripts output is to your liking, and then create symlinks in the appropriate runlevel directories. On my box, I added "S20sshd" symlink in rc{3,4,5}.d, and "K40sshd" in rc{0,1,2,6}.d, all pointing to "../init.d/sshd". Note that your LFS may be using three digits, in which case make sure you create S200sshd and K400sshd as appropriate. To immediately start sshd, and to make sure the script works as it should, start the daemon via the script by running: /etc/init.d/sshd start In case you have telnetd or any of the BSD r-daemons running, you will want disable them, and tell your users to use ssh, scp and sftp instead. SFTP is now reasonably widespread, there are clients for just about every OS out there, including Windows, so you really ought to have your users use SFTP, and disable FTP access to system users. If you want to run sshd chrooted, you can write a simple program which does the chroot to the user homedir, drops privileges, cleans the env, and runs a shell. Install this chroot program suid root, add it to /etc/shells, and use it as the users shell. Don't forget to set up the chroot environment for the users in question (eg., sftp requires not only a bin/sh but also the sftp-server binary). You should also make sure that the user in question does not own anything in the chroot jail, and you might want to set the immutable bit on all the jail files if you are using a filesystem which supports it (man chattr). An alternative to using a suid root chroot wrapper is to patch the sshd and sftp-server binaries. Finding and applying those patches is up to you, I assure you they exist, however I prefer the wrapper. You are on your own entirely. By the way, if you're looking for a free win SSH client, check out PuTTY, which you'll find at the following URL. There's a lot of other clients as well, so take your pick. http://www.freessh.org/ People really shouldn't have to use any unencrypted protocols for authentication anymore. There's just no reason left to do so. Cheers, Dan