Debian Repository per ssh auf ein chroot

Für eigene Zwecke will man immer mal ein Repository haben, auf das andere nicht zugreifen können, aber das man auch an Bekannte oder Testgruppen oder wen auch immer weitergeben kann. ftp mit Passwort und http mit Passwort sind so ne Sache, ein wenig sicherer könnte das schon sein.

Debian Repositories können auch via ssh eingebunden werden, eine entsprechende Zeile in der sources list sieht dann so aus:

deb ssh://repouser@example.com/packages/ jessie main

Auf dem Server muss man einen entsprechenden Nutzer einrichten und die packages enthalten eben das Debian Repository. Authentisierung erfolg per ssh key, d.h. auf Clientseite wird ein ssh-Key erzeugt, der auf Serverseite im ~/.ssh/authorized_keys des repouser liegt. Soweit so straightforward.

Der Nachteil dieser Variante ist, dass der repouser nun einen ssh login auf dem Server hat, was ihn natürlich auch lesenden Zugriff auf andere Ressourcen gibt, was man eher nicht unbedingt will. Kann sein, dass man dies auch noch besser absichern kann, die beste Absicherung ist auf jeden Fall, diesen Benutzer in ein chroot environment zu sperren.

Dieses fahre ich über die sftp chroot variante des sshd, in der sshd_config steht dazu:

Subsystem sftp internal-sftp

Match Group sftp
ChrootDirectory %h
AllowTcpForwarding no

Nun muss der repouser noch zur Gruppe sftp dazu und jetzt kommt das eigentliche Problem: die chroot Umgebung mit den richtigen Dateien und Rechten auszustatten, d.h. alles dort einzurichten, was nötig ist, um auf Clientseite apt-get … aufzurufen. Und da war das Problem: Was braucht apt-get via ssh auf der Serverseite? Letzendlich hab ich es nur raus bekommen, in dem ich mir die Sourcen von apt-get angeschaut habe. Und da waren vor allem find und dd die Hänger… die drauf und es ging. Wie man herausbekommt, welche libs nötig sind, sagt ldd find und ldd dd und gut ist.

Das ganze ist hier in einem schmutzigen Script, das so unter Ubuntu 14.04 läuft, Achtung: die Libs werden so für andere Distris nicht passen, aber ldd ist dein Freund, der Rest stimmt.

<br />
#!/bin/bash<br />
echo &quot;This script should be started as root on the machine, which hosts the repo&quot;<br />
REPOUSER=&quot;repouser&quot;<br />
REPOHOME=&quot;ssdhome/$REPOUSER&quot;<br />
echo &quot;Generating chroot environment for $REPOUSER in $REPOHOME&quot;&lt;/code&gt;</p>
<p>adduser --disabled-password --ingroup sftp --home /$REPOHOME $REPOUSER<br />
mkdir -p /$REPOHOME<br />
chown root:root /$REPOHOME<br />
cd /$REPOHOME<br />
mkdir -p bin dev etc home lib usr var tmp usr/bin vat/tmplib/x86_64-linux-gnu usr/lib/x86_64-linux-gnu $REPOHOME lib/x86_64-linux-gnu lib64<br />
cp /bin/ls bin/<br />
cp /bin/dash bin/sh<br />
cp /bin/bash bin/<br />
cp /usr/bin/scp usr/bin/<br />
cp /bin/dd bin/<br />
cp /usr/bin/find usr/bin/<br />
cp /usr/bin/whoami usr/bin/<br />
cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/x86_64-linux-gnu/<br />
cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/<br />
cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/<br />
cp /lib64/ld-linux-x86-64.so.2 lib64/<br />
cp /lib/x86_64-linux-gnu/libselinux.so.1 lib/x86_64-linux-gnu/<br />
cp /lib/x86_64-linux-gnu/libacl.so.1 lib/x86_64-linux-gnu/<br />
cp /lib/x86_64-linux-gnu/libpcre.so.3 lib/x86_64-linux-gnu/<br />
cp /lib/x86_64-linux-gnu/libattr.so.1 lib/x86_64-linux-gnu/<br />
cp /lib/x86_64-linux-gnu/libnss_compat* lib/x86_64-linux-gnu/<br />
cp /lib/x86_64-linux-gnu/libm.so.6 lib/x86_64-linux-gnu/<br />
mknod dev/null c 1 3<br />
mknod dev/zero c 1 5<br />
chmod 666 dev/*<br />
chmod 1777 tmp<br />
grep $REPOUSER /etc/passwd &amp;gt;&amp;gt; etc/passwd<br />
echo &quot;now, cp the repository beginning with the packages dir to ssdhome/$REPOUSER&quot;<br />
echo &quot;do not forget to add the public key to ssdhome/$REPOUSER/.ssh/authorized_keys&quot;<br />
echo &quot;and add a line like: deb ssh://$REPOUSER@example.com/packages/ jessie main&quot;<br />