Nella prima parte, Come configurare le jail chroot di Linux, ho trattato il chroot
comando e hai imparato a usare il wrapper chroot in sshd
per isolare gli sftpusers
gruppo. Quando modifichi sshd_config
per invocare il wrapper chroot e dargli le caratteristiche corrispondenti, sshd
esegue determinati comandi all'interno del chroot jail o wrapper. Hai visto come questa tecnica potrebbe essere potenzialmente utile per implementare l'accesso confinato, anziché sicuro, per gli utenti remoti.
Esempio esteso
Inizierò ampliando ciò che ho fatto prima, in parte come recensione. Inizia configurando una directory personalizzata per gli utenti remoti. Userò i sftpusers
gruppo di nuovo.
Inizia creando la directory personalizzata che desideri utilizzare e impostando la proprietà:
# mkdir -p /sftpusers/chroot
# chown root:root /sftpusers/chroot
Questa volta, fai root come proprietario, anziché come sftpusers
gruppo. In questo modo, quando aggiungi utenti, questi non iniziano con l'autorizzazione a visualizzare l'intera directory.
Quindi, crea l'utente che vuoi limitare (in questo caso devi farlo per ogni utente), aggiungi il nuovo utente a sftpusers
gruppo e negare una shell di accesso perché sono sftp
utenti:
# useradd sanjay -g sftpusers -s /sbin/nologin
# passwd sanjay
Quindi, crea la directory per sanjay
e imposta la proprietà e le autorizzazioni:
# mkdir /sftpusers/chroot/sanjay
# chown sanjay:sftpusers /sftpusers/chroot/sanjay
# chmod 700 /sftpusers/chroot/sanjay
Quindi, modifica sshd_config
file. Innanzitutto, commenta la chiamata del sottosistema esistente e aggiungi quella interna:
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Quindi aggiungi la nostra voce caso di corrispondenza:
Match Group sftpusers
ChrootDirectory /sftpusers/chroot/
ForceCommand internal-sftp
X11Forwarding no
AllowTCPForwarding no
Tieni presente che sei tornato a specificare una directory, ma questa volta hai già impostato la proprietà per impedire sanjay
dal vedere le cose di qualcun altro. Quel /
finale è anche importante.
Quindi, riavvia sshd
e prova:
[skipworthy@milo ~]$ sftp sanjay@showme
sanjay@showme's password:
Connected to sanjay@showme.
sftp> ls
sanjay
sftp> pwd
Remote working directory: /
sftp> cd ..
sftp> ls
sanjay
sftp> touch test
Invalid command.
Così. Sanjay può vedere solo la sua cartella e ha bisogno di cd
in esso per fare qualcosa di utile.
Isolamento di un servizio o di un utente specifico
Ora, cosa succede se desideri fornire un ambiente shell utilizzabile per un utente remoto o creare un ambiente jail chroot per un servizio specifico? Per fare ciò, crea la directory incarcerata e il filesystem di root, quindi crea i collegamenti agli strumenti e alle librerie di cui hai bisogno. Fare tutto questo è un po' complicato, ma Red Hat fornisce uno script e istruzioni di base che rendono il processo più semplice.
Nota: Ho testato quanto segue in Red Hat Enterprise Linux 7 e 8, anche se ho capito che questa funzionalità era disponibile in Red Hat Enterprise Linux 6. Non ho motivo di pensare che questo script non funzionerebbe in Fedora, CentOS o qualsiasi altro Red Hat distro, ma il tuo chilometraggio (come sempre) potrebbe variare.
Per prima cosa, crea la tua directory chroot:
# mkdir /chroot
Quindi esegui lo script da yum
che installa i bit necessari:
# yum --releasever=/ --installroot=/chroot install iputils vim python
Il --releasever=/
flag passa le informazioni sulla versione locale corrente per inizializzare un repository nel nuovo --installroot
, definisce dove si trova il nuovo percorso di installazione. In teoria, potresti creare una jail chroot basata su qualsiasi versione dei repository yum o dnf (lo script, tuttavia, inizierà comunque con i repository di sistema correnti).
Con questo strumento installi le utilità di rete di base come l'editor VIM e Python. All'inizio potresti aggiungere altre cose se lo desideri, incluso qualsiasi servizio che desideri eseguire all'interno di questa prigione. Questa è anche una delle cose interessanti di yum
e dipendenze. Come parte della risoluzione delle dipendenze, yum
apporta le necessarie aggiunte all'albero del filesystem insieme alle librerie. Tuttavia, tralascia un paio di cose che devi aggiungere in seguito. Ci arriverò tra un momento.
A questo punto, i pacchetti e le dipendenze sono stati installati ed è stata creata una nuova chiave GPG per questo nuovo repository in relazione a questo nuovo filesystem di root. Quindi, monta i tuoi filesystem temporanei:
# mount -t proc proc /chroot/proc/
# mount -t sysfs sys /chroot/sys/
E imposta i tuoi binding di sviluppo:
# mount -o bind /dev/pts /chroot/dev/pts
# mount -o bind /dev/pts /chroot/dev/pts
Nota che queste cavalcature non sopravvivi a un riavvio in questo modo, ma questa configurazione ti consentirà di testare e giocare con un ambiente chroot jail.
Ora, prova per verificare che tutto funzioni come previsto:
# chroot /chroot
bash-4.2# ls
bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr
Puoi vedere che il filesystem e le librerie sono stati aggiunti con successo:
bash-4.2# pwd
/
bash-4.2# cd ..
Da qui, vedi la radice corretta e non riesci a risalire:
bash-4.2# exit
exit
#
Ora sei uscito dal wrapper chroot, il che è previsto perché l'hai inserito da una shell di accesso locale come root. Normalmente, un utente remoto non dovrebbe essere in grado di farlo, come hai visto in sftp
esempio:
[skipworthy@milo ~]$ ssh root@showme
root@showme's password:
[root@showme1 ~]# chroot /chroot
bash-4.2#
Nota che queste directory sono state tutte create da root, quindi ecco chi le possiede. Ora aggiungi questo chroot a sshd_config
, perché questa volta abbinerai solo questo utente:
Match User leo
ChrootDirectory /chroot
Quindi, riavvia sshd
.
Devi anche copiare il /etc/passwd
e /etc/group
file dal sistema host al /chroot
directory:
[root@showme1 ~]# cp -vf /etc/{passwd,group} /chroot/etc/
Nota: Se salti il passaggio precedente, puoi accedere, ma il risultato sarà inaffidabile e sarai soggetto a errori relativi ad accessi in conflitto
Ora per il test:
[skipworthy@milo ~]$ ssh leo@showme
leo@showme's password:
Last login: Thu Jan 30 19:35:36 2020 from 192.168.0.20
-bash-4.2$ ls
-bash-4.2$ pwd
/home/leo
Sembra buono. Ora, puoi trovare qualcosa di utile da fare? Divertiamoci un po':
[root@showme1 ~]# yum --releasever=/ --installroot=/chroot install httpd
Puoi potresti rilascia il releasever=/
, ma mi piace lasciar perdere perché lascia meno possibilità di risultati imprevisti.
[root@showme1 ~]# chroot /chroot
bash-4.2# ls /etc/httpd
conf conf.d conf.modules.d logs modules run
bash-4.2# python
Python 2.7.5 (default, Aug 7 2019, 00:51:29)
Quindi, httpd
c'è se lo vuoi, ma solo per dimostrare che puoi usare un veloce one-liner di Python, che hai anche installato:
bash-4.2# python -m SimpleHTTPServer 8000
Serving HTTP on 0.0.0.0 port 8000 ...
E ora hai un semplice server web in esecuzione in una prigione chroot. In teoria, puoi eseguire un numero qualsiasi di servizi dall'interno della jail chroot e tenerli "contenuti" e lontani da altri servizi, consentendoti di esporre solo una parte di un ambiente di risorse più ampio senza compromettere l'esperienza dell'utente.
Nuovo per i container Linux? Scarica Containers Primer e impara le basi.