SSH Chrooted

In questo howto esploreremo una delle possibilità di chroot di ssh, ovvero come restringere l’utente alla sua home, creando una fake root.

by Enrico Bassetti – http://www.enricobassetti.altervista.org/guide/ssh_chrooted.php

Prerequisiti

Inanzitutto dobbiamo avere installato OpenSSH, pam (quasi sempre incluso nelle distro), una particolare libreria di pam, chiamata libpam-chroot e makejail (per la fake root). Quindi possiamo dare (considerando che pam sia già installato):

$ apt-get install openssh-server openssh-client libpam-chroot makejail

Creazione utente

In questo caso utilizzerò la home dell’utente per la sua fake root, però si può usare anche un’altra cartella. Creo quindi l’utente:

$ adduser pippo

Rispondendo alle varie domande. Mi posiziono in /home e creo il file di descrizione di makejail, che chiamerò utente.py (uno script python):

#################################################
#
# Simple MakeJail Configuration file
#
#################################################

# Destination Dir of the Jail
chroot="/home/pippo"

# Commands that will be tested inside jail
#testCommandsInsideJail=["","",""]
testCommandsInsideJail=["bash ","ls","cd","dir"
"tar","gzip","gunzip",
"cat","less","vi","echo",
"chmod","chown","chgrp",
"dd","cp","mv","grep",
"kill","ln","mkdir","ps",
"pwd","rm","rmdir","sleep",
"touch","true",
"find","diff",
"env","id",
"scp"]

# Name of backgound processes (if any) as in ps
#processNames=["","",""]

# Commands that shound interact with demons inside
# the jail from outside the jail
#testCommandsOutsideJail=["","",""]

# Files that MUST NOT be copied
#doNotCopy=["","",""]

# Files that NUST be copied
#forceCopy=["","",""]
forceCopy=["/etc/shells", "/etc/nologin","/etc/environment",
"/etc/hosts*","/etc/ssh*",
"/bin/*sh", "/lib/libnss*",
"/dev/tty[0-9]*", "/lib/ld-linux.so.2", "/usr/bin/dircolors"]

# Do not delete anything from the followind dir
preserve=["/dev", "/lib", "/etc", "/home", "/var"]

Basato su quello presente al link in fondo pagina Possiamo personalizzare i programmi da inserire, o se vogliamo possiamo fagli copiare alcuni files. Ora per creare la fake root diamo il comando:

$ makejail utente.py

E’ importante che questo comando sia dato come utente root, o, in alternativa, con sudo.

Ora che abbiamo la home dell’utente, dobbiamo dire a pam di usare questa come fake root.

Configurazione PAM

Come dire a pam di usare la libreria libpam-chroot ? Semplice: per prima cosa modifichiamo il file /etc/pam.d/ssh aggiungendo la riga:

session required   pam_chroot.so

Ora però dobbiamo dirgli dov’è la fake root: modifichiamo quindi il file /etc/security/chroot.conf aggiungendo:

pippo    /home/pippo

Spiegazione: il primo parametro è il nome utente, e il secondo invece è il path della fake root (io ho usato la home, ma può anche essere un’altra).

Il file /etc/passwd, la home e il completamento bash

Purtroppo makejail non crea un esatto /etc/passwd nella fake root, utile al sistema per identificare l’utente dopo il login. Questo non vuol dire che l’utente non si possa loggare, ma che non venga riconosciuto da bash. Inoltre scp delle volte fa storie. La soluzione è creare un fake /etc/passwd prendendo spunto da quello del server reale e togliendo tutti gli altri utenti. E’ importante che l’uid e il gid siano uguali a quelli reali per far funzionare scp.

Si può usare il seguente comando:

$ echo `cat /etc/passwd | grep pippo:` > /home/pippo/etc/passwd

Sostituendo pippo al vostro nome utente, lasciando i due punti dopo il nome utente.

Un’altra cosa che non crea è la home…va creata manualmente, sia la cartella /home che /home/nomeutente (entrambe nella fake root)

Inoltre, per rendere la shell bash più "carina" e funzionale, si possono prendere i tre file .bash* da /etc/skel (del pc reale) e piazzarli nella /root e nella home directory della fake root.

Più avanti aggiungerò uno script che sto testando…

Problema frequente: applicativo no such file or directory

Utilizzando makejail potrebbe capitarvi di avere qualche programma (a me è successo con la shell bash) che non funziona, o meglio, quando si tenta di eseguirlo nella fake root restituisce l’errore no such file or directory, ad esempio:

$ chroot /home/pippo/
/bin/bash: no such file or directory
$ _

Questo molte volte è causato dalla mancanza di librerie: usate il tool ldd per trovare le librerie da cui dipende il programma e copiatelo manualmente (oppure inseritelo nello script del makejail sulla variabile forceCopy).

Generalmente quando non funzionano restituiscono questo errore, ma potrebbero anche dirvi altro. Una controllata a ldd e la cartella /lib della fake root non è una cattiva idea.

Problema comune: errore copia tty(s) varie

L’errore sorge perché si usa una versione di stat che non si interfaccia bene con makejail. Nella nuova versione infatti alla fine della riga viene messo un ritorno a capo, che nelle vecchie versioni mancava. Questo basta per impedire a makejail di vedere il risultato delle vecchie versioni. A me è successo con la versione 5.93 di stat. Nella versione di un altro mio pc, 5.97, il problema non c’era. Per vedere la versione:

stat --version

Provate ad eseguire

stat -t -c "%t %T" /dev/tty8

e se sulla stessa riga del risultato appare il prompt (nomeutente@pc:$_) allora è la versione vecchia.

Modificando /usr/sbin/makejail alla riga 276 c’è il comando stat che si presenta in questo modo:

return map(lambda h: int(h,16),execute('stat -t -c "%%t %%T" %s' % fileName)[0].split())

Per fixare basta aggiungere \\n dopo %T, come nell’esempio:

return map(lambda h: int(h,16),execute('stat -t -c "%%t %%T\\n" %s' % fileName)[0].split())

Crediti

Ho preso liberamente spunto da http://www.emcy.it/wiki/doku.php?id=tips:ssh_con_chroot per fare questi script. Sono molto simili ma quelli del sito non funzionavano sul mio server Ubuntu Linux Server 6.10, quindi ho deciso di pubblicare una versione fixata e completa (nel senso che questa su macchine dove quella bacata funziona, anche questa funziona 😉 )

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *