GNU/Linux >> Linux Esercitazione >  >> Linux

Come dire che sto correndo in un Chroot?

Ho un'installazione Unix che dovrebbe essere utilizzabile sia come chroot che come sistema autonomo. Se è in esecuzione come chroot, non voglio eseguire alcun servizio (cron, inetd e così via), perché sarebbero in conflitto con il sistema host o sarebbero ridondanti.

Come faccio a scrivere uno script di shell che si comporta in modo diverso a seconda che sia in esecuzione in un chroot? La mia necessità immediata è un moderno sistema Linux, con /proc montato nel chroot e lo script è in esecuzione come root, ma sono benvenute anche risposte più portatili. (Vedi Come faccio a sapere che sto eseguendo in un chroot se /proc non è montato? per il caso di Linux senza /proc .)

Più in generale, sarebbero interessanti suggerimenti che funzionano per altri metodi di contenimento. La domanda pratica è:questo sistema dovrebbe eseguire dei servizi? (La risposta è no in un chroot e sì in una macchina virtuale a tutti gli effetti; non conosco casi intermedi come jail o container.)

Risposta accettata:

Quello che ho fatto qui è verificare se la radice di init processo (PID 1) è lo stesso della radice del processo corrente. Sebbene /proc/1/root è sempre un collegamento a / (a meno che init stesso è in chroot, ma non è un caso che mi interessa), seguendolo porta alla directory principale "master". Questa tecnica viene utilizzata in alcuni script di manutenzione in Debian, ad esempio per saltare l'avvio di udev dopo l'installazione in un chroot.

if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
  echo "We are chrooted!"
else
  echo "Business as usual"
fi

(A proposito, questo è un altro esempio del perché chroot è inutile per la sicurezza se il processo con chroot ha accesso come root. I processi non root non possono leggere /proc/1/root , ma possono seguire /proc/1234/root se è presente un processo in esecuzione con PID 1234 in esecuzione come lo stesso utente.)

Se non hai i permessi di root, puoi guardare /proc/1/mountinfo e /proc/$$/mountinfo (brevemente documentato in filesystems/proc.txt nella documentazione del kernel Linux). Questo file è leggibile da tutto il mondo e contiene molte informazioni su ciascun punto di montaggio nella vista del processo del filesystem. I percorsi in quel file sono limitati dal chroot che influisce sul processo di lettura, se presente. Se il processo legge /proc/1/mountinfo è chroot in un filesystem diverso dalla radice globale (supponendo che la radice di pid 1 sia la radice globale), quindi nessuna voce per / appare in /proc/1/mountinfo . Se il processo legge /proc/1/mountinfo viene eseguito il chroot in una directory sul filesystem radice globale, quindi una voce per / appare in /proc/1/mountinfo , ma con un ID di montaggio diverso. Per inciso, il campo radice ($4 ) indica dove si trova il chroot nel suo filesystem principale.

[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]

Questa è una soluzione Linux pura. Potrebbe essere generalizzabile ad altre varianti Unix con un /proc sufficientemente simile (Solaris ha un simile /proc/1/root , penso, ma non mountinfo ).

Correlati:come montare un `img` creato con /bin/dd di un disco rigido?
Linux
  1. Come dire a quale versione di Os X mi trovo dalla riga di comando?

  2. Come posso specificare un disco diverso come root in grub.cfg durante l'esecuzione di grub-mkconfig (da script/non interattivo)?

  3. Come configurare ssh senza password con chiavi RSA

  4. Come posso sapere in quale limite di utenti mi sto imbattendo?

  5. Come si accede a Webmin?

Come reimpostare la password di root di MySQL

Come cambiamo la password di root?

Come eseguire Dolphin come root?

Come limitare l'utente root in CentOS

Come scoprire se httpd è in esecuzione o meno tramite la riga di comando?

Perché eseguire named(bind) in chroot è così importante per la sicurezza? O forse non lo è?