Alcuni minuti di preparazione e pianificazione prima di mettere in funzione i sistemi possono essere d'aiuto per proteggere loro e i loro dati.
Non ci dovrebbe essere alcuna ragione per cui le home directory degli utenti permettano di usare programmi SUID/SGID. Si utilizzi l'opzione nosuid nel file /etc/fstab per partizioni scrivibili da chi non è root. Forse si vorrà anche usare nodev e noexec sulle partizioni home degli utenti e su /var, proibendo così l'uso di programmi e la creazione di character o block device, che comunque non dovrebbe mai essere necessaria.
Se esportate filesystem usando NFS, siate sicuri di configurare /etc/exports con l'accesso più restrittivo possibile. Questo significa non usare wildcard, non permettere accesso in scrittura di root e esportare solo in lettura quando è possibile.
Si configuri l'umask di creazione dei file dei vostri utenti in modo che sia più restrittiva possibile. Si veda la Sezione 5.1.
Se si montano filesystem usando un filesystem di rete come NFS, ci si assicuri di configurare /etc/exports con restrizioni adeguate. Tipicamente è consigliabile usare nodev, nosuid, e magari noexec.
Si impostino limiti per il filesystem invece di lasciarlo illimitato come di default. Si possono controllare i limiti per utente usando il modulo PAM per la limitazione delle risorse e /etc/pam.d/limits.conf. Per esempio, i limiti per il gruppo users potrebbero essere:
@users hard core 0 @users hard nproc 50 @users hard rss 5000 |
Così si proibisce la creazione di file core, si limita il numero di processi a 50 e la memoria disponibile ad ogni utente a 5 MB.
Si può anche usare il file di configurazione /etc/login.defs per impostare gli stessi limiti.
I file /var/log/wtmp e /var/run/utmp contengono i record di login per tutti gli utenti del sistema. La loro integrità deve essere conservata perché possono essere usati per determinare quando e da dove un utente (o un potenziale intruso) è entrato nel sistema. Questi file dovrebbero avere i permessi 644, senza limitare il normale uso del sistema.
Il bit immutable può essere usato per prevenire la cancellazione o sovrascrittura accidentale di un file che deve essere protetto. Inoltre evita che qualcuno crei un link simbolico al file. Si veda la pagina man chattr(1) per informazioni sul bit immutable.
I file SUID e SGID sono un potenziale rischio, e dovrebbero essere tenuti d'occhio. Visto che questi programmi danno speciali privilegi all'utente che li esegue, è necessario assicurarsi che non vengano installati programmi insicuri. Un trucco molto diffuso fra i cracker è sfruttare programmi con SUID-root, quindi lasciare un programma SUID a fare da backdoor per entrare la volta successiva, anche se il buco originale viene chiuso.
Si trovino tutti i programmi SUID/SGID sul sistema, e si tenga traccia di cosa sono, così da essere al corrente di qualsiasi cambiamento che potrebbe indicare un eventuale intruso. Si usi questo comando per trovare tutti i programmi con SUID/SGID sul sistema:
root# find / -type f \( -perm -04000 -o -perm -02000 \) |
La distribuzione Debian esegue un job ogni sera per determinare quali file con SUID esistano. Quindi li confronta con quelli della sera precedente. Potete cercare questo log in /var/log/setuid*.
Si possono togliere i permessi SUID o SGID da un programma sospetto con chmod, quindi rimetterli se si pensa che siano assolutamente necessari.
I file scrivibili da tutti, soprattutto i file di sistema, possono essere un buco nella sicurezza se un cracker accede al vostro sistema e li modifica. Inoltre, le directory scrivibili da tutti sono pericolose: permettono a un cracker di aggiungere o cancellare file come vuole. Per trovare tutti i file di libera scrittura sul sistema, si usi il comando:
root# find / -perm -2 ! -type l -ls |
Dei file senza un proprietario possono indicare che qualcuno è entrato nel vostro sistema. Si possono trovare i file senza proprietario, o senza gruppo, col comando:
root# find / \( -nouser -o -nogroup \) -print |
Cercare file .rhosts dovrebbe essere uno dei compiti di amministratore, visto che questi file non dovrebbero essere permessi sul sistema. Si ricordi che a un cracker basta un solo account insicuro per poter avere accesso a tutta la rete. Si possono trovare tutti i file .rhosts sul sistema col seguente comando:
root# find /home -name .rhosts -print |
Per finire, prima di cambiare i permessi su un qualsiasi file di sistema, si sia certi di sapere quello che viene fatto. Non cambiare mai i permessi di un file perché sembra la via più facile di far funzionare le cose. Determinare sempre la ragione per cui quel file ha quei permessi prima di cambiarli.
Il comando umask può essere usato per stabilire la modalità standard di creazione dei file nel sistema. È il complementare ottale della modalità desiderata. Se i file venissero creati senza tenere in conto i settaggi dei loro permessi, un utente potrebbe inavvertitamente dare permessi di lettura o scrittura a qualcuno che non li dovrebbe avere. I tipici settaggi di umask includono 022, 027 e 077 (che è il più restrittivo). Normalmente la umask viene impostata in /etc/profile, così che abbia effetto su tutti gli utenti sul sistema. I permessi risultanti vengono calcolati come segue: i permessi predefiniti di proprietario/gruppo/altri (7 per le directory, 6 per i files) sono combinati con la maschera invertita (NOT) eseguendo un'operazione AND bit per bit.
Esempio 1:
file, permesso predefinito 6, binario: 110 maschera, per es. 2: 010, NOT: 101
permessi risultanti, AND: 100 (uguale a 4, r__)
Esempio 2:
file, permesso predefinito 6, binario: 110 maschera, per es. 6: 110, NOT: 001
permessi risultanti, AND: 000 (uguale a 0, ___)
Esempio 3:
directory, permesso predefinito 7, binario: 111 maschera, per es. 2: 010, NOT: 101
permessi risultanti, AND: 101 (uguale a 5, r_x)
Esempio 4:
directory, permesso predefinito 7, binario: 111 maschera, per es. 6: 110, NOT: 001
permessi risultanti, AND: 001 (uguale a 1, __x)
# Imposta la maschera di default degli utenti umask 033 |
Se usate RedHat, e aderite al loro schema di creazione di ID di utenti e gruppi (User Private Groups), sarà sufficiente usare 002 per la vostra umask. Questo è dovuto al fatto che la configurazione di default è di un utente per gruppo.
È importante assicurarsi che i file di sistema non siano aperti da utenti e gruppi che non dovrebbero fare manutenzione di sistema.
Unix separa il controllo di accesso ai file e alle directory secondo tre caratteristiche: proprietario, gruppo e altri. C'è sempre un solo proprietario, un numero variabile di membri del gruppo, e tutti gli altri.
Ecco una veloce spiegazione dei permessi di Unix:
Proprietà - Quale/i utente/i e gruppo/i ha controllo sui permessi del nodo.
Permessi - Bit che possono essere settati o resettati per concedere certi tipi di accesso. I permessi delle directory possono avere significati diversi dai corrispondenti permessi sui file.
Lettura:
Poter vedere i contenuti del file
Poter aprire la directory
Scrittura:
Poter aggiungere parti o fare modifiche a un file
Poter cancellare o spostare i file in una directory
Esecuzione:
Poter eseguire un programma binario o script di shell
Poter eseguire una ricerca nella directory, nel caso abbia il permesso di lettura
Anche lo "sticky bit" ha un significato diverso quando applicato a directory e quando a file. Se lo sticky bit è impostato per una directory, allora un utente può solo cancellare file di cui è proprietario o di cui ha espliciti permessi di scrittura, anche se ha accesso in scrittura alla directory. Ciò è stato progettato per directory come /tmp, che sono scrivibili a tutti, ma in cui si preferisce che non tutti possano cancellare file a volontà. Lo sticky bit è segnato come una t nel listato lungo di una directory.
Descrive permessi set-user-id sul file. Quando la modalità di accesso set user ID è impostata nei permessi del proprietario, e il file è eseguibile, i processi che lo eseguono hanno accesso alle risorse di sistema basati sul proprietario del file, invece che sull'utente che ha creato il processo. Questa è la causa di molti exploit basati sul buffer overflow.
Se impostato nei permessi del gruppo, questo bit controlla lo stato "set group id" di un file. In pratica si comporta come SUID, solo che ha effetto sul gruppo. Il file deve essere eseguibile perché questo abbia effetto.
Se si imposta il bit SGID su una directory (con chmod g+s directory), i file creati in quella directory avranno il gruppo impostato sul gruppo della directory.
Voi - Il proprietario del file
Gruppo - Il gruppo a cui si appartiene
Tutti - Chiunque non sia il proprietario o membro del gruppo
File di esempio:
-rw-r--r-- 1 kevin users 114 Aug 28 1997 .zlogin 1° bit - directory? (no) 2° bit - lettura per il proprietario? (si, per kevin) 3° bit - scrittura per il proprietario? (si, per kevin) 4° bit - esecuzione per il proprietario? (no) 5° bit - lettura per il gruppo? (si, per users) 6° bit - scrittura per il gruppo? (no) 7° bit - esecuzione per il gruppo? (no) 8° bit - lettura per tutti? (si, per tutti) 9° bit - scrittura per tutti? (no) 10° bit - esecuzione per tutti? (no) |
Le seguenti linee sono esempi dei permessi minimi richiesti per l'accesso descritto. Forse vorrete dare più permessi di quanto vedete qui, ma questo mostra solo ciò che questi permessi minimi sui file fanno:
-r-------- Permette accesso in lettura al file per il proprietario --w------- Permette al proprietario di modificare o cancellare il file (Notate che chiunque con permesso di scrittura alla directory in cui si trova il file ha lo stesso privilegio) ---x------ Il proprietario può eseguire questo programma, ma non script della shell, che hanno bisogno anche del permesso in lettura ---s------ Il file verrà eseguito con User ID = utente --------s- Il file verrà eseguito con Group ID = gruppo -rw------T Non viene segnata l'ultima modifica. Usato spesso per file di swap ---t------ Nessun effetto. (Era lo sticky bit) |
drwxr-xr-x 3 kevin users 512 Sep 19 13:47 .public_html/ 1° bit - directory? (si, contiene molti file) 2° bit - lettura per il proprietario? (si, per kevin) 3° bit - scrittura per il proprietario? (si, per kevin) 4° bit - esecuzione per il proprietario? (si, per kevin) 5° bit - lettura per il gruppo? (si, per users) 6° bit - scrittura per il gruppo? (no) 7° bit - esecuzione per il gruppo? (si, per users) 8° bit - lettura per tutti? (si, per tutti) 9° bit - scrittura per tutti? (no) 10° bit - esecuzione per tutti? (si, per tutti) |
Le seguenti linee sono esempi dei permessi minimi richiesti per l'accesso descritto. Forse vorrete dare più permessi di quanto vedete qui, ma questo mostra solo ciò che questi permessi minimi sulle directory fanno:
dr-------- I contenuti possono essere listati, ma gli attributi dei file non possono essere letti d--x------ La directory può essere aperta e usata nei percorsi di esecuzione dr-x------ Gli attributi dei file possono essere letti dal proprietario d-wx------ I file possono essere creati/cancellati, anche se la directory non è quella corrente d------x-t Impedisce che i file siano cancellati da chi ha i permessi in scrittura. Usato su /tmp d---s--s-- Nessun effetto |
I file di configurazione del sistema (di solito in /etc) sono in genere in modo 640 (-rw-r-----), e proprietà di root. A seconda delle necessità di sicurezza del sistema si può cambiare questa impostazione. Non si lasci mai che dei file di sistema siano scrivibili da un gruppo o da tutti. Alcuni file di configurazione, incluso /etc/shadow, dovrebbero essere leggibili solo da root, e le directory in /etc non dovrebbero essere accessibili da altri.
Gli script della shell con SUID sono un serio rischio per la sicurezza, per cui il kernel non li considererà. A prescindere da quanto pensate che lo script sia sicuro, può essere sfruttato per dare a un cracker una shell di root.
Un altro ottimo modo per rilevare attacchi locali (e anche di rete) è eseguire un programma che faccia un controllo d'integrità come Tripwire, Aide o Osiris. Questi programmi eseguono una serie di controlli su tutti i binari importanti e sui file di configurazione e li compara con un database di valori precedenti che si presumono corretti. In questo modo, ogni cambiamento nei file verrà segnalato.
È una buona idea installare questo tipo di programmi in un floppy e quindi proteggerlo fisicamente dalla scrittura. Così degli intrusi non potranno sabotare il programma per il controllo o cambiare i database. Una volta che è stato impostato un programma del genere, è una buona idea eseguirlo come parte dei compiti amministrativi di routine per vedere se qualcosa è cambiato.
Potreste persino aggiungere un elemento al crontab per eseguire il controllo dal floppy ogni notte e inviarvi un e-mail con i risultati al mattino. Qualcosa come:
# imposta mailto MAILTO=kevin # esegui Tripwire 15 05 * * * root /usr/local/adm/tcheck/tripwire |
I controlli d'integrità possono essere una manna dal cielo per rilevare intrusioni prima che possano essere notate in altri modi. Dato che molti files cambiano durante il normale uso del sistema, si deve fare attenzione a cosa è dovuto all'attività di un cracker e cosa a quello che si sta facendo.
Si può trovare la versione open source e gratuita di Tripwire presso http://www.tripwire.org. Manuali e supporto sono invece a pagamento.
Aide si trova presso http://www.cs.tut.fi/~rammer/aide.html.
Osiris si trova presso http://www.shmoo.com/osiris/.
"Cavalli di Troia" prende il nome dal famoso inganno nell'Eneide di Virgilio. Il concetto è che un cracker distribuisce un programma o un binario che sembra attraente, e incita altre persone a scaricarlo ed eseguirlo come root. A quel punto il programma può compromettere il loro sistema mentre non se lo aspettano. Mentre pensano che il programma che hanno preso faccia una cosa (e magari la fa davvero), compromette anche la sicurezza del sistema.
Si dovrebbe controllare quali programmi vengono installati sulla macchina. RedHat fornisce checksum MD5 e firme PGP sui suoi pacchetti RPM perché si possa verificare ciò che viene installato. Altre distribuzioni hanno metodi simili. Non si dovrebbero mai eseguire binari che non si conoscono, di cui non si ha il sorgente, come root. Ovviamente pochi intrusi rilasciano il codice sorgente al pubblico.
Per quanto possa essere complesso, si prendano sempre i sorgenti di un programma dal suo vero sito di distribuzione. Se il programma deve essere eseguito da root, si controllino i sorgenti o si facciano controllare da qualcuno di cui ci si fida.