# [Howto] SSH Login ins Chroot

## sirro

Wenn du dich (wie ich) beim Anblick des chroot-USE-Flags des openssh schon des oefteren gefragt hast, wie man das wohl macht, dann ist der Thread hier richtig fuer dich.

Achtung: Wenn du nicht weisst was du hier tust: lass einfach die Finger davon. Ich gebe keine Garantie, dass nichts kaputt geht. Wer der Sache nicht traut, sollte das Skript lesen bevor er es ausfuehrt!

Vorraussetzung

"chroot" als globales oder fuer openssh lokales USE-Flag setzen und kompilieren.

Durchfuehrung

Als erstes muss ein Nutzer angelegt werden, der beim Login ins chroot verbannt wird. z.B.:

```
useradd -g users -G www -c "Chroot-User" -d /home/test/./ test

passwd test
```

Achtung: Das /./ am Ende des Pfads ist wichtig. Ohne versucht der sshd erst gar kein chroot-login!!!

Natuerlich braucht der User ein Zuhause:

```
mkdir /home/test
```

Was waere ein chroot ohne Programme, Tools und vorallem eine Shell? Genau: nicht lauffaehig. Also muessen diese in das neue $HOME kopiert werden. Da es recht muehsam ist alle benoetigten Libs von Hand rauszufinden, kann man das natuerlich automatiesieren. Ausgehend vom Howto und Skript in [1] habe ich ein eigenes geschrieben. Einfach die Variable APPS dem gewuenschten Szenario anpassen...

```
#!/bin/bash

#

# Distributed under the terms of the GNU General Public License v2

#

# Usage: ./chroot_home username

# These are the needed Apps for the chroot-env

APPS="/bin/bash /bin/cat /bin/cut /bin/id /bin/ls /bin/mkdir /bin/mv /bin/ping /bin/pwd /bin/rm /bin/rm /bin/rmdir /usr/bin/ssh"

# "exit with error"-function

function die() { echo ${*}; exit 1; }

umask 0022

# Check commandline for username

test -z "${1}" && die "Usage: ${0} username"

# set username

USERNAME=${1}

# try to get $HOME

CHROOT=`grep "^${USERNAME}" /etc/passwd |cut -d':' -f 6`

test -z "${CHROOT}" && die "Error: Could not get \$HOME for user \"${USERNAME}\""

cd ${CHROOT} || die "could not change to ${CHROOT}"

# create dirs, set permissions

mkdir -p bin dev etc home/${USERNAME} usr/bin usr/lib/misc \

        || die "error creating dirs"

chown $1:users home/$1

# create some useful devices

test -b dev/null && mknod dev/null c 1 3

test -b dev/zero && mknod dev/zero c 1 5

# create short versions of passwd and group

egrep "(^root)|(${USERNAME})" /etc/passwd > etc/passwd

egrep "(^root)|(${USERNAME})" /etc/group  > etc/group

for app in ${APPS};  do # copy apps

        cp ${app} ./${app}

        

        # get needed libs and copy them too

        for lib in `ldd ${app} 2>/dev/null|awk '{ print $3 }'`; do

                mkdir -p ./`dirname ${lib}` || die "error creating dir"

                cp ${lib} ./${lib} || die "error copying file"

        done

done
```

Als Parameter wird der Username uebergeben und der Rest geht automatisch:

```
./chroot_home test
```

Und zu guter letzt testen:

```
ssh test@localhost

[...]

-bash-2.05b$ ls /

bin  dev  etc  home  lib  usr
```

Diverses

Auch ein Passwortloser Login ueber einen Public-Key ist so noch moeglich.

```
mkdir -p /home/test/.ssh

${EDITOR} /home/test/.ssh/authorized_keys #Public Key eintragen
```

Auch ein sftp ins chroot ist moeglich, dazu fuegt man einfach /usr/lib/misc/sftp-server der Variable APPS hinzu.

Weblinks

[1] http://mail.incredimail.com/howto/openssh/

Tipps, Anregungen und Ergaenzungen nehme ich gerne per PN oder im Thread entgegen und baue sie evtl. ein.

Changelog:

passwd test eingefuegt

Unter http://de.gentoo-wiki.com/HOWTO_SSH_Login_ins_Chroot verfuegbar gemachtLast edited by sirro on Sun Jan 16, 2005 2:21 pm; edited 1 time in total

----------

## gorm82

Hi, erst mal danke für dein HowTo 

Leider bekomm ich einen Fehler, wenn ich versuche mich via ssh zu connecten. 

Read from remote host localhost: Connection reset by peer 

Connection to localhost closed. 

Laut Logfiles accepted er aber die Verbindung 

Accepted keyboard-interactive/pam for test from ::ffff:127.0.0.1 port 32789 ssh2 

hoffe mal du kannst mir nen tip geben woran es liegt. 

Die Verzeichnisse wurden alle richtig erstellt. 

Das home dir im chroot hat die richtige berechtigung. 

emerge openssh wurde mit chroot USE durchgeführt...

vielleicht hat ja jemand ne idee was ich mal wieder verbockt hab   :Embarassed: 

----------

## andix

Bei mir passiert genau das Gleiche wie bei gorm. Ein chroot /home/chroot /bin/bash funktioniert aber.

 :Crying or Very sad:   :Crying or Very sad:   :Crying or Very sad: 

----------

## sirro

Hm, das ist komisch. Aber helfen kann ich da leider auch nicht, ich hab solche Probleme leider/zum Gleuck nicht gehabt.

----------

## CB2206

hi,

ich hab auch das problem.

```

ssh chroot@localhost

Password:

Read from remote host localhost: Connection reset by peer

Connection to localhost closed.

```

----------

## m.b.j.

Hi, ich hatte auch das Problem, bei mir fehlten Dateien innerhalb des chroots (einige Libaries waren nicht static reinkompieleirt).

Die Lösung die ich verwendet habe ist zwar aufwendig aber hilfreich:

1. SSHD mit strace starten 

```
strace -ff -o /root/strace /usr/sbin/sshd 
```

2. Einloggen und rausfliegen.

3. strace beenden 

```
killall -9 strace
```

3.1 Manchmal (eigendlich immer ging der sshd nicht mit aus)

```
killall -9 sshd
```

4. Die Logs durchschaun. 

Erstmal den passenden Log raussuchen, wir suchen den Log der den "chroot()" des Nutzers zeigt. Die einzelnden Logs der SSHD Prozess finded man im Verzeichniss /root/  (oder woimmer man sie mit strace hindelogt hat). 

```
cd /root/

# grep "chroot" strace.* 

strace.27855:chroot("/var/empty")                    = 0

strace.27857:chroot("/home/antos")                   = 0

```

4.1 die Logs geziehlt durchschaun:

```

mbj ~ # grep "ENOENT" strace.27857 

open("/etc/environment", O_RDONLY)      = -1 ENOENT (No such file or directory)

open("/etc/security/pam_env.conf", O_RDONLY) = -1 ENOENT (No such file or directory)

open("/etc/environment", O_RDONLY)      = -1 ENOENT (No such file or directory)

open("/dev/console", O_WRONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)

```

Jetzt hinkt mein Beispiel, da es bei mir zwar fehlende Dateien gibt aber der Login trotzdem funktioniert, aber vieleicht hilft meine "aufwändige" Fehleranalyse ja jem.

5. Dateien kopieren (Selbserklährend)

Vieleicht sollte man den openssh einfach mit USE="static" kompielieren aber naja...

Hoffe meine Kommentare helfen.

----------

## rukka

Erstmal vielen Dank für dieses HowTo  :Wink: 

Die Probleme die bei anderen auftreten habe ich (zum Glück) nicht, aber um ehrlich zu sein war ich auch nicht so faul und habe dein Shellscript benutzt sondern habe alles von Hand gemacht. User anlegen, Unterverzeichnisse und Device-Nodes erstellt, Programme und Bibliotheken reinkopiert etc.

Schlussendlich lief es dann auf eine statische Busybox hinaus ohne das ganze Geraffel von Bibliotheken, fande ich persönlich wesentlich einfacher. Vielleicht liegt da ja irgendwo das Problem begraben das es bei den anderen nicht funktioniert?!

Wobei ...! m.b.j. schreibt was davon das "strace"  was von pam nicht findet, vielleicht wurden openssh ohne das pam USE-Flag kompiliert *vermut*

Aber um ehrlich zu sein kann ich mir das nicht vorstellen. Vielleicht kann ja jemand der Sache auf den Grund gehen?  :Rolling Eyes: 

Na denn, erfolgreiche Fehlersuche wünsche ich noch! bye

-rukka

----------

## m.b.j.

Also ich hab openssh nochmal mit USE="static" gebaut, und schon musste ich den strace Kram nicht mehr machen...  (in einer neuen chroot umgebung)

----------

## kottlettstanze

Bei mir sieht das so aus, wenn ich ldd aufrufe

```
root # ldd /bin/bash

        linux-gate.so.1 =>  (0xffffe000)

        ... 

```

um das auf die Schnelle zu umgehen, habe ich folgende Zeile im Script:

```
for lib in `ldd ${app} 2>/dev/null|awk '{ print $3 }'`; do 
```

damit ersetzt:

```
for lib in `ldd ${app} 2>/dev/null|awk '{ print $3 }'| grep -v \(`; do
```

Ist wahrscheinlich etwas unsauber, aber läuft  :Smile: 

Grüße,

    Kevin

----------

