OpenSSH mit HPN-Patch

Vorwort

Ich hatte ja früher schon mal das Vergnügen, auf den HPN-Patch für OpenSSH zu stoßen, damals, als wir SSH noch zweckentfremdet haben zum… ähm =) lassen wir das. Dank Rigby aus dem Ubuntuusers-Forum bin ich erneut mit dem Thema konfrontiert worden und mir kam in den Sinn, dass ein kleines HowTo diesbezüglich ganz nett sein könnte. Der Gedanke dahinter ist, mit speziellen Parametern in der Konfiguration (die durch den Patch ermöglicht werden) dem SSH-Daemon (und dem gepatchten Client) mehr Geschwindigkeit bei der Übertragung zu entlocken.

Software

  • Ubuntu 9.10 Karmic Koala amd64
  • OpenSSH 5.3p1
  • OpenSSL 0.9.8g
  • HPN-Patch 13v7

Installation

Ubuntu/Debian typisch greift einem der Paketmanager unter die Arme, so dass das Laden der Bibliotheken und das Kompilieren keine Hexerei ist. Man beachte, dass root-Rechte erforderlich sind!

Vorbereitung

Zuerst wischt man erst mal alle Spuren der „original“ SSH-Software vom System.

Unter Ubuntu wird man gefragt, ob man (wegen der Abhängigkeiten) das Paket ubuntu-desktop deinstallieren möchte. Dem kann man getrost zustimmen, da es nur ein Metapaket ist und keinesfalls GNOME/KDE o.ä. deinstalliert.

aptitude purge openssh-client openssh-server

Sofern noch nicht vorhanden, bedient man sich am Besten des Metapaketes build-essential, um Kompiler etc. zu installieren. Eine saubere (De-)Installation ermöglicht das Verwenden von checkinstall, welches ein Debian-Paket aus dem Kompilat erstellt:

aptitude install build-essential checkinstall

Das Repository speichert auch Build-Informationen und ermöglicht die Installation der benötigten Development-Pakete in einem Rutsch. Wer sich lieber von configure sagen lassen möchte, was alles fehlt bzw. andere Versionen laden möchte, lässt diesen Schritt aus.

aptitude build-dep openssh-server openssh-client

Was jetzt noch an Material fehlt, ist der Source von OpenSSH und der HPN-Patch (es ist darauf zu achten, dass die Versionen übereinstimmen!). Download und Entpacken:

wget http://ftp-stud.fht-esslingen.de/pub/OpenBSD/OpenSSH/portable/openssh-5.3p1.tar.gz
tar xf openssh-5.3p1.tar.gz
wget http://www.psc.edu/networking/projects/hpn-ssh/openssh-5.3p1-hpn13v7.diff.gz
gunzip openssh-5.3p1-hpn13v7.diff.gz

Letztendlich noch in das Source-Verzeichnis wechseln und den Patch drüberlaufen lassen:

cd openssh-5.3p1
patch < ../openssh-5.3p1-hpn13v7.diff

Soviel dazu :-)

Kompilation

Nun zum spannenden Part: das Kompilieren :-) Mit dem configure-Script erstellt man das Makefile, welches den Vorgang angenehm automatisiert. Zu den Parametern:

  • –prefix gibt den Installationspfad der Binaries an, Ubuntu-typisch ist das /usr
  • –sysconfdir ist das Konfigurationsverzeichnis, üblich ist /etc/ssh
  • –with-pam ermöglicht das Verwenden von PAM (muss bei der Kompilation mit angegeben werden!)

Anschließend lässt man make laufen und spätestens hier sieht man, ob es gut geht ;-) Wenn die Ausgabe fehlerlos ist, werden mit checkinstall die SSH-Komponenten im System installiert:

./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam
make
checkinstall

Von checkinstall wird man noch diverse Sachen abgefragt, die man alle mit Standardwerten durchlaufen lassen kann. Abschließend wird das neue aus dem Kompilat erzeugte Paket mit dem Paketmanager automatisch installiert. Das Schlimmste ist hiermit vorüber :-)

Rechte

Da der Master-Prozess sshd als root läuft und jeder neue Client eine eigene Instanz des Prozesses bekommt, dropt der Daemon per default seine Rechte beim Verbindungsversuch auf einen unprivilegierten Benutzer sshd, den man anlegen muss, sofern nicht vorhanden:

groupadd -g 35 sshd
useradd -u 35 -g 35 --system sshd

Startskript

Upstart

Da Upstart nun immer fester im System verankert wird, habe ich ein Startskript (welches in /etc/init/ landet) auf dessen Basis erstellt. Dazu legt man eine Datei mit folgendem Inhalt an:

sshd.conf
# OpenSSH Server
 
description     "OpenSSH Server Daemon with HPN-Patch v5.3"
start on startup
expect fork
respawn
stop on shutdown
exec /usr/sbin/sshd

Schwierig, nicht wahr? ;-) So wird nun der SSH-Server beim Boot mit gestartet oder kann mit start sshd bzw. stop sshd gesteuert werden.

SysV Init

Für Debian oder alte Hasen ;-) hier ein „minimales“ SysV Init-Script des Daemons (ich hab den Großteil der Kommentare rausgeworfen, wen es interessiert schaut am besten in /etc/init.d/skeleton nach):

sshd
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="OpenSSH Server Daemon with HPN-Patch v5.3"
NAME=sshd
DAEMON=/usr/sbin/$NAME
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
 
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
 
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
 
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
 
do_start()
{
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
		|| return 1
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
		$DAEMON_ARGS \
		|| return 2
}
 
do_stop()
{
	start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
	[ "$?" = 2 ] && return 2
	rm -f $PIDFILE
	return "$RETVAL"
}
 
case "$1" in
  start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  status)
       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  restart|force-reload)
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	  0|1)
		do_start
		case "$?" in
			0) log_end_msg 0 ;;
			1) log_end_msg 1 ;; # Old process is still running
			*) log_end_msg 1 ;; # Failed to start
		esac
		;;
	  *)
	  	# Failed to stop
		log_end_msg 1
		;;
	esac
	;;
  *)
	#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
	echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
	exit 3
	;;
esac

Schließlich noch Rechte und die Startlinks setzen lassen:

chmod +x /etc/init.d/sshd
update-rc.d sshd defaults

Sieht auf den ersten Blick schlimm aus, liest sich aber wie Butter :-D

PAM

Zwar ist der SSH-Server auch ohne PAM lauffähig, allerdings nutzt die Ubuntu-Version einige Features, die mit folgender Konfiguration ermöglicht werden. Ich habe mir erlaubt, die Zeile mit der User-Blacklist /etc/ssh/sshd.deny hinzuzufügen, da mir dieses Feature sehr sinnvoll erscheint, man muss die Konfiguration des Daemons nicht neu laden wie es bei den SSH-eigenen Mechanismen wie AllowUsers oder DenyUsers nötig wäre. Die Benutzer, die in der sshd.deny landen, werden sofort an der Anmeldung gehindert. Nun zum Config-File:

/etc/pam.d/sshd
# PAM configuration for the Secure Shell service
 
# Read environment variables from /etc/environment and
# /etc/security/pam_env.conf.
auth       required     pam_env.so # [1]
# In Debian 4.0 (etch), locale-related environment variables were moved to
# /etc/default/locale, so read that as well.
auth       required     pam_env.so envfile=/etc/default/locale
# Now a user is denied to login via sshd if they are listed in this file:
auth       required     pam_listfile.so item=user sense=deny file=/etc/ssh/sshd.deny onerr=succeed
 
# Standard Un*x authentication.
@include common-auth
 
# Disallow non-root logins when /etc/nologin exists.
account    required     pam_nologin.so
 
# Uncomment and edit /etc/security/access.conf if you need to set complex
# access limits that are hard to express in sshd_config.
# account  required     pam_access.so
 
# Standard Un*x authorization.
@include common-account
 
# Standard Un*x session setup and teardown.
@include common-session
 
# Print the message of the day upon successful login.
session    optional     pam_motd.so # [1]
 
# Print the status of the user's mailbox upon successful login.
session    optional     pam_mail.so standard noenv # [1]
 
# Set up user limits from /etc/security/limits.conf.
session    required     pam_limits.so
 
# Set up SELinux capabilities (need modified pam)
# session  required     pam_selinux.so multiple
 
# Standard Un*x password updating.
@include common-password

Berechtigungen sollten folgende sein:

-rw-r--r-- 1 root root 1361 2010-02-28 20:28 sshd

Um PAM auch nutzen zu können, muss noch diese Direktive in /etc/ssh/sshd_config gesetzt werden:

UsePAM yes

Nun sei auch dies geschafft :-) Man wird nun beim Login z.B. über neue Mails informiert bzw. den Update-Status. Viel Spaß!

Download

Für alle die es etwas schneller haben wollen hier die fertigen Debian-Pakete:

Wie üblich garantiere ich für nichts :-)

Quellen

Kommentare