martedì 26 gennaio 2010

Restricted bash con apparmor

Molto spesso si ha l'esigenza di limitare quello che un utente può fare da una shell Linux. Storicamente su linux esiste il comando rbash (restricted bash) , che dovrebbe permettere di  bloccare gli utenti nella loro home e di consentirgli solo un set limitato di comandi.

Tuttavia molti non ritengono rbash particolarmente sicuro. Apparmor è invece ritenuto decisamente più sicuro, è  più maneggevole e più semplice da configurare.

Voglio riportare qua una semplice ricetta su come usare apparmor per creare una shell che consente ad un utente non privilegiato di utilizzare solo il comando ssh per connettersi a macchine remote, e niente altro. Una volta capite le basi di come procedere l'unico limite su cosa permettere o bloccare è la fantasia.

Su Ubuntu apparmor viene installato di default (a partire dalla release  8.0.4 - Hardy) quindi è molto probabile che chi usa questa distribuzione ce l'abbia già  installato.  In caso contrario bisogna accertarsi di avere installati questi pacchetti:

apparmor apparmor-profiles apparmor-utils

Per gli utenti di altre distribuzioni maggiori informazioni possono essere trovate qua.

Avvertenza: io non mi sono mai abituato all'utilizzo di 'sudo' su Ubuntu, quindi metto sempre una password a root e digito i comandi direttamente dalla shell di root. I comandi riportati di seguito vanno quindi eseguiti come root. Se siete utenti che usano il 'sudo' mettetelo sempre davanti ad ogni comando.

Per cominciare creiamo un utente (il classico pippo che si usa per fare le prove) e assegnamoli una password:

useradd -m pippo
passwd pippo

Poi creiamo un hard link alla bash (cerchiamo di non chiamarlo rbash per non fare confusione con l'altro sistema):

ln /bin/bash /bin/bashstrict

Poi facciamo in modo che pippo usi la shell nuova che abbiamo appena creato:

usermod -s /bin/bashstrict pippo

A questo punto possiamo cominciare a creare una policy di apparmor per la nostra nuova shell:

aa-genprof /bin/bashstrict

Partirà  un wizard in modalità  testo. Il sistema chiederà  se volete che apparmor si connetta ad un repository di policy. E' una scelta personale, connettersi non costa nulla e non obbliga poi a caricare sul repository le proprie policy personali. Quando compare questa scritta:

Profiling: /bin/bashstrict

[(S)can system log for SubDomain events] / (F)inish

dovete aprire un'altra shell, loggarvi come utente pippo, eseguire il comando che volete abiltare (ssh <macchina remota>) e solo quello, fare il logout.

Fatto questo tornate sulla console dove c'era il wizard in attesa e premete S (Scan). Verranno fatte delle domande di questo tipo:

Reading log entries from /var/log/audit/audit.log.
Updating AppArmor profiles in /etc/apparmor.d.

Profile:  /bin/bashstrict
Execute:  /usr/bin/lesspipe
Severity: unknown


[(I)nherit] / (P)rofile / (U)nconfined / (D)eny / Abo(r)t / (F)inish

Se siamo sicuri di aver digitato solo i comandi corretti possiamo senza dubbio scegliere I(nherit) e A(llow) quando viene chiesto.

Alla fine verrà proposto il salvataggio della policy, che naturalmente accetteremo di buon grado.
Per rendere operativa la policy appena creata è sufficiente digitare:

aa-enforce bin.bashstrict

Alla fine del processo riproviamo a fare un login come pippo, tralasciamo per un momento i messaggi di errore e proviamo a fare ssh su una macchina remota. Dovrebbe funzionare. proviamo a dare qualunque altro comando. Dovrebbe dare un 'Permission denied'. Se le cose stanno così è tutto a posto.

L'ultimo problema è quello dei fastidiosi messaggi di errore che compaiono al login. Sono legati alla mancanza dei permessi sui file che utilizza la bash (.bash_profile, .bashrc, .bash_history etc.) oppure a files e programmi invocati da questi files. Per eliminare i messaggi di errore ci sono due strade:

1) Ridurre all'osso le istruzioni contenute in .bashrc e .bash_profile in modo che da questi non venga richiamato niente altro, e dare i corretti permessi a questi file in apparmor (vedi punto2).

2) Ripetere tutta la procedura di addestramento (aa-genprof /bin/bashstrict + login di pippo con ssh su macchina remota + salvataggio e attivazione policy) per un po' di volte finchè non scompaiono i messaggi di errore. In effetti ad ogni successivo addestramento vengono aggiunti nuovi permessi fino a che tutti i file necessari al funzionamento della shell sono consentiti.

Il file che contiene la policy si trova in /etc/apparmor.d/bin.bashstrict e, naturalmente, può essere anche modificato a mano, a patto che si sappia cosa si sta facendo. Per curiosità , il file /etc/apparmor.d/bin.bashstrict creato con la procedura di cui sopra e utilizzando il metodo 2 per far sparire gli errori (4 o 5 ripetizioni dell'addestramento) , si presenta in questo modo:

# Last Modified: Tue Jan 26 09:28:31 2010
#include <tunables/global>


/bin/bashstrict {
#include <abstractions/base>
#include <abstractions/bash>
#include <abstractions/nameservice>


/bin/lesspipe rix,
/bin/sed rix,
/bin/uname rix,
/dev/tty rw,
/etc/bash.bashrc r,
/etc/init.d/ r,
/etc/profile r,
/etc/ssh/ssh_config r,
owner /home/*/.bash_history rw,
owner /home/*/.bash_logout r,
owner /home/*/.bashrc r,
owner /home/*/.profile r,
owner /home/*/.ssh/known_hosts r,
/usr/bin/basename rix,
/usr/bin/clear_console rix,
/usr/bin/dirname rix,
/usr/bin/groups rix,
/usr/bin/ssh rix,


}

Nessun commento:

Posta un commento