Il termine prigione chroot è stato utilizzato per la prima volta nel 1992, in un articolo di un importante ricercatore di sicurezza, Bill Cheswick, (il che è interessante se ti piacciono queste cose, puoi trovare l'articolo qui). Le prigioni Chroot hanno iniziato ad apparire nel 2003, con applicazioni come IRC e FTP. Nel 2005, Sun ha introdotto la sua tecnologia "Container" chiamata Zone, che a sua volta è stata un precursore del concetto di spazi dei nomi , che è una tecnologia di base utilizzata con i contenitori.
Nozioni di base su Chroot
Chroot consente a un amministratore di controllare l'accesso a un servizio o filesystem controllando l'esposizione all'ambiente del server sottostante. I due esempi comuni che potresti incontrare sono durante la sequenza di avvio e la "shell di emergenza" su sistemi Red Hat/CentOS/Fedora e in Secure FTP (SFTP).
Il comando si presenta così:
chroot <newroot> [[command][arguments]]
Simile a sudo
comando, il chroot
comando cambia l'ambiente del comando seguente. In altre parole, ti cambierà in newroot
directory e rende anche quella directory la directory "di lavoro". Il command
quindi viene eseguito in quella posizione, utile per operazioni come il salvataggio di un sistema che non si avvia.
A differenza di sudo
, sarai "nella" directory. Questa pratica, ancora una volta, è utile se esegui l'avvio da un supporto esterno ma devi accedere a un file system o a un comando "locale" per funzionare.
L'altro uso comune di chroot
consiste nel limitare un servizio o un utente utilizzando un wrapper per nascondere il resto del filesystem, limitando quindi la visualizzazione dei dati di altri utenti da parte di un utente remoto. Un'implementazione popolare che utilizza questo approccio SFTP.
Esempio
Prima di iniziare a lavorare su questo esempio, dovresti assicurarti di disporre dei backup. In questo caso, esegui il backup di /etc/ssh/sshd_config
file perché apporterai modifiche a quello in particolare:
[root@showme1 ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
Per ora, limiterai solo gli utenti SFTP alle loro home directory sul server. Questo requisito significa che dovrai aggiungere utenti e inserirli in un gruppo:
[root@showme1 ~]# useradd -g sftpusers -s /sbin/nologin -p nick nick
Nota che in questo modo assegnerai nick
un account senza shell di accesso. Questa tecnica è sia pratica che una buona pratica di sicurezza:se sta usando solo SFTP, non dovrebbe avere i privilegi di accesso. Discuterò di fornire una shell agli utenti remoti nel prossimo articolo.
Ora devi dire a ssh
servizio cosa fare quando gli utenti SFTP accedono. Apri il /etc/ssh/sshd_config
file e alla fine aggiungi quanto segue:
Subsystem sftp internal-sftp
Match Group sftpusers
ForceCommand internal-sftp
ChrootDirectory /home
X11Forwarding no
AllowTcpForwarding no
È importante aggiungere queste impostazioni come un insieme separato di voci e utilizzare il Match
sintassi per indicare che questa sezione solo si applica agli utenti di questo gruppo. Se hai apportato le modifiche alle voci esistenti, si applicherebbero a tutte Utenti SSH, che potrebbero interrompere l'accesso remoto.
Le righe di configurazione sono suddivise come segue:
- Il
ForceCommand
rendessh
scegli la sua struttura integrata per fornire il servizio SFTP (che puoi controllare in modo indipendente). ChrootDirectory
dice asshd
dove limitare l'utente a.Subsystem sftp internal-sftp
dice asshd
per caricare ilsftp
interno servizio e renderlo disponibile.
Potrebbe essere necessario assicurarsi che questo Subsystem
non è già definito commentando questa riga in precedenza nel file di configurazione:
# override default of no subsystems
# Subsystem sftp /usr/libexec/openssh/sftp-server
Dopo aver apportato le modifiche e controllato l'ortografia, vai avanti e salva le modifiche. Quindi, riavvia sshd
:
[root@showme1 ~]# systemctl restart sshd
Testa il nuovo utente:
[skipworthy@milo ~]$ sftp nick@showme
nick@showme's password:
Connected to nick@showme.
sftp> ls
accounting ansible fred jason kenny lisa
nick
sftp> pwd
Remote working directory: /
sftp> exit
Spiacenti, aspetta solo un minuto:sembra che tu possa vedere anche tutte le directory degli altri utenti. Tuttavia, non puoi accedere a quelle directory:
sftp> cd fred
sftp> ls
remote readdir("/fred"): Permission denied
Puoi indirizzare l'utente in chroot alla propria home directory modificando ChrootDirectory
riga nel sshd_config
file come questo:
ChrootDirectory /
Questa rapida modifica fa sembrare a Nick come se fosse nella sua home directory e non sarà in grado di vedere i file di nessun altro utente:
sftp> pwd
Remote working directory: /home/nick
sftp>
sftp> exit
[skipworthy@milo ~]$ touch test.txt
[skipworthy@milo ~]$ sftp nick@showme
nick@showme's password:
Connected to nick@showme.
sftp> put test.txt
Uploading test.txt to /home/nick/test.txt
test.txt 100% 0 0.0KB/s 00:00
sftp> ls
test.txt
sftp>
Dov'è andato? Dai un'occhiata:
[root@showme1 ~]# ls /home/nick
test.txt
Nota che una chroot jail
è non considerata di per sé un'adeguata restrizione di sicurezza. Sebbene impedisca a un utente di uscire da una directory con restrizioni, ci sono modi per aggirare questo problema (l'idea generale è indicata in chroot(2)
pagina man, a cui dovresti dare un'occhiata se stai pensando di utilizzare questo trucco in un contesto critico per la produzione o per l'azienda.)
Conclusione (per ora)
Quindi puoi vedere quel chroot
può essere uno strumento piuttosto utile. Nella parte 2, esaminerò maggiormente l'assegnazione di directory specifiche agli utenti e la fornitura di un ambiente shell a un utente remoto senza esporre il resto del server.
Nuovo per i container? Scarica Containers Primer e impara le basi dei container Linux.