Amministrando sistemi Linux Server è sempre utile chiedersi che cosa si vuole raggiungere come obbiettivo. È utile per il mio obbiettivo lasciare non so quanti demoni delle varie applicazioni attivi, come per es cups ( demone per il print Server ), se il Server in questione è un Web Server?!

Chiaramente no, tutto quello che non ci serve ( servizi, driver, programmi ecc. ) deve venire rimosso, anche dal Kernel ( Guida in italiano sul come compilare il Kernel ).

Ricompilare il Kernel togliendo tutte le cose che non servono e altro vuol dire più sicurezza, velocità e stabilità. Chiaramente meno applicazioni girano sul server e meno applicazioni ci sono da “exploitare” rispettivamente da proteggere.

Per vedere quali demoni sono attivi usare il comando netstat:

# netstat -lp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   
tcp        0      0 *:mysql                 *:*                     LISTEN      1500/mysqld         
tcp        0      0 *:www-http              *:*                     LISTEN      12779/httpd2-prefor 
tcp        0      0 *:ssh                   *:*                     LISTEN      1378/sshd           
tcp        0      0 *:https                 *:*                     LISTEN      12779/httpd2-prefor 
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
unix  2      [ ACC ]     STREAM     LISTENING     5446   1500/mysqld         /var/lib/mysql/mysql.sock
unix  2      [ ACC ]     STREAM     LISTENING     6258   1561/acpid          /var/run/acpid.socket
unix  2      [ ACC ]     STREAM     LISTENING     5491   1574/dbus-daemon    /var/run/dbus/system_bus_socket
unix  2      [ ACC ]     STREAM     LISTENING     6876   2376/mcelog         /var/run/mcelog-client
unix  2      [ ACC ]     STREAM     LISTENING     5528   1650/hald           @/var/run/hald/dbus-ca1QSpmtK8
unix  2      [ ACC ]     STREAM     LISTENING     5531   1650/hald           @/var/run/hald/dbus-WQCKBVSnqK
#

Come si può notare sul mio Server sono attivi solo i demoni di cui ho bisogno.

Un’altra cosa da fare è controllare i setuid e setgid, che se sono impostatati potrebbero venire usati per svolgere degli attacchi tramite exploit ( eseguire codice da root ).

I setuid permettono a dei file binari di venire in alcuni casi eseguiti con diritti speciali, diversi dall’utente che li ha eseguiti.

Anche se i vari fornitori fanno molta attenzione a correggere tutti i bug in modo da impedire dei setuid/setgid Root exploits, sembra che ne vengano scoperti ogni due mesi di nuovi. Ecco anche l’importanza di aggiornare il proprio sistema regolarmente.

Quindi, specialmente se si offre l’accesso tramite shell al proprio Server, consiglio di dare un occhiata ai setuid-binaries.

Per farlo eseguire il seguente comando:

# find / -perm  /6000 -type f -exec ls -ld {} \;
-rwsr-xr-x 1 root shadow 35688 Jan 13  2012 /sbin/unix_chkpwd
-rwsr-xr-x 1 root root 111272 Feb 20 16:04 /sbin/mount.nfs
-rwsr-xr-x 1 root shadow 10736 Dec 16  2011 /sbin/unix2_chkpwd
-rwsr-xr-x 1 root root 40016 Mar 19 00:59 /bin/su
-rwsr-xr-x 1 root audio 23880 Dec 14  2011 /bin/eject
-rwsr-xr-x 1 root root 40048 Apr 15  2011 /bin/ping
-rwsr-xr-x 1 root root 94776 Apr 29 23:20 /bin/mount
-rwsr-xr-x 1 root root 69208 Apr 29 23:20 /bin/umount
-rwsr-xr-x 1 root root 35792 Apr 15  2011 /bin/ping6
-rwsr-x--- 1 root messagebus 47912 Oct 15  2012 /lib64/dbus-1/dbus-daemon-launch-helper
-rwxr-sr-x 1 root tty 10680 May 10  2010 /usr/sbin/utempter
-rwsr-xr-x 1 root root 10632 Feb 14 19:56 /usr/sbin/zypp-refresh-wrapper
-rwxr-sr-x 1 root maildrop 15136 Jun 18  2012 /usr/sbin/postdrop
-rwxr-sr-x 1 root maildrop 19176 Jun 18  2012 /usr/sbin/postqueue
-rwsr-xr-x 1 root shadow 19320 Feb  1  2012 /usr/bin/expiry
-rwsr-xr-x 1 root root 230072 Apr 30 10:38 /usr/bin/sudo
-rwsr-xr-x 1 root root 44752 Jun 29  2011 /usr/bin/opiesu
-rwxr-sr-x 1 root tty 15000 Apr 29 23:21 /usr/bin/wall
-rwsr-xr-x 1 root shadow 81856 Feb  1  2012 /usr/bin/passwd
-rwsr-xr-x 1 root trusted 40432 Apr  3 01:33 /usr/bin/crontab
-rwsr-xr-x 1 root shadow 82472 Feb  1  2012 /usr/bin/chfn                                                        
-rwxr-sr-x 1 root tty 14896 Apr 29 23:21 /usr/bin/write                                                          
-rws--x--x 1 root root 1914440 May 24 22:56 /usr/bin/Xorg                                                        
-rwsr-xr-x 1 root root 19416 Feb  1  2012 /usr/bin/newgrp                                                        
-rwsr-xr-x 1 root root 44304 Jun 29  2011 /usr/bin/opiepasswd                                                    
-rwsr-xr-x 1 root shadow 85952 Feb  1  2012 /usr/bin/gpasswd                                                     
-rwsr-xr-x 1 root trusted 31552 Apr 15 16:33 /usr/bin/fusermount                                                 
-rwsr-xr-x 1 root shadow 77848 Feb  1  2012 /usr/bin/chsh                                                        
-rwsr-xr-x 1 root shadow 86200 Feb  1  2012 /usr/bin/chage                                                       
-rwxr-sr-x 1 root shadow 15128 Feb 21  2009 /usr/bin/vlock                                                       
-rwsr-xr-x 1 root root 26897 Mar 18 22:30 /usr/lib64/pt_chown                                                    
-rwxr-sr-x 1 root polkituser 23160 Oct 26  2012 /usr/lib/PolicyKit/polkit-revoke-helper                          
-rwxr-sr-x 1 root polkituser 19208 Oct 26  2012 /usr/lib/PolicyKit/polkit-grant-helper                           
-rwsr-x--- 1 root polkituser 10744 Oct 26  2012 /usr/lib/PolicyKit/polkit-grant-helper-pam                       
-rwxr-sr-x 1 root polkituser 14856 Oct 26  2012 /usr/lib/PolicyKit/polkit-read-auth-helper                       
-rwxr-sr-x 1 root polkituser 19008 Oct 26  2012 /usr/lib/PolicyKit/polkit-explicit-grant-helper                  
-rwsr-xr-x 1 polkituser root 23176 Oct 26  2012 /usr/lib/PolicyKit/polkit-set-default-helper                     
# 

Ecco la lista. Ora eseguo un comando più specifico per listare i file binari con il setuid-bit nelle varie cartelle.

Aggiungendo la pipeline “|” si ridireziona l’output e cioè il risultato del primo comando, find, e lo si usa come input per il comando grep che poi mostra il suo risultato come output finale.

Vediamo un po’ cosa c’è nella cartella /usr/bin eseguendo il seguente comando:

# find / -perm  +6000 -type f -exec ls -ld {} \; | grep "/usr/bin"                                                         
-rwsr-xr-x 1 root shadow 19320 Feb  1  2012 /usr/bin/expiry                                                      
-rwsr-xr-x 1 root root 230072 Apr 30 10:38 /usr/bin/sudo                                                         
-rwsr-xr-x 1 root root 44752 Jun 29  2011 /usr/bin/opiesu                                                        
-rwxr-sr-x 1 root tty 15000 Apr 29 23:21 /usr/bin/wall                                                           
-rwsr-xr-x 1 root shadow 81856 Feb  1  2012 /usr/bin/passwd                                                      
-rwsr-xr-x 1 root trusted 40432 Apr  3 01:33 /usr/bin/crontab                                                    
-rwsr-xr-x 1 root shadow 82472 Feb  1  2012 /usr/bin/chfn                                                        
-rwxr-sr-x 1 root tty 14896 Apr 29 23:21 /usr/bin/write                                                          
-rws--x--x 1 root root 1914440 May 24 22:56 /usr/bin/Xorg                                                        
-rwsr-xr-x 1 root root 19416 Feb  1  2012 /usr/bin/newgrp                                                        
-rwsr-xr-x 1 root root 44304 Jun 29  2011 /usr/bin/opiepasswd                                                    
-rwsr-xr-x 1 root shadow 85952 Feb  1  2012 /usr/bin/gpasswd                                                     
-rwsr-xr-x 1 root trusted 31552 Apr 15 16:33 /usr/bin/fusermount                                                 
-rwsr-xr-x 1 root shadow 77848 Feb  1  2012 /usr/bin/chsh                                                        
-rwsr-xr-x 1 root shadow 86200 Feb  1  2012 /usr/bin/chage                                                       
-rwxr-sr-x 1 root shadow 15128 Feb 21  2009 /usr/bin/vlock                                                       
# 

Vediamone alcuni:

Wall e write

Wall e write vengono usati per poter scrivere messaggi al terminal di un altro utente. Ecco un esempio: write a message to login users through terminal Non mi serve, l’unico utente sono io e root.

Fusermount

DESCRIPTION: The fusermount utility acts as a frontend to the refuse(3) library, allowing mounting and unmounting of refuse-based file systems. Non ne ho bisogno.

Vlock

is a program to lock one or more sessions on the Linux console. This is especially useful for Linux machines which have multiple users with access to the console. Vlock viene tipicamente usato in sistemi in cui diversi utenti accedono al sistema simultaneamente. Non è il mio caso, tolgo anche questo.

Sudo

Sudo viene usato per permettere agli utenti normali di eseguire alcuni comandi con diritti di amministrazione. Sudo può essere molto utile per esempio in una situazione in cui vi sono più amministratori di sistema (ancora una volta, non lasciare diritti inutilmente, non fidarsi di nessuno) con compiti diversi, per permettere ai vari Admins di svolgere solo i comandi che servono loro per potere svolgere correttamente le loro funzioni. Mentre solo un Admin ha il controllo di tutto. O un utente che per comodità si aggiunge mount e umount o altro. Non è il nostro caso, sono l’unico Admin. L’utente non admin lo uso solo per connettermi tramite ssh al server.

Passwd, chage, chfn e chsh

Passwd viene usasto per combiare la propria password ma visto che non vi sono utenti eccetto me e che non offro l’accesso via shell a nessuno, mi basta potere cambiare le password degli utenti da amministratore. Chfn viene usato per modificare le proprie informazioni finger. Chsh per modificare il proprio login alla shell. Il comando chage viene usato per modificare la scadenza in cui un utente deve cambiare la password in relazione all’ultima modifica effettuata. “The chage command changes the number of days between password changes and the date of the last password change. This information is used by the system to determine when a user must change his/her password.” Non abbiamo per vari motivi intenzione di offrire la possibilità a utenti normali id eseguire questi comandi.

Nella maggior parte dei casi si possono cancellare quasi tutti i setuid-bit. Sulle applicazioni che non si conoscono si fa una breve ricerca in modo da capire se sono essenziali oppure no al proprio scopo. Informarsi ed eliminare tutto quello che non serve.

Non dimenticare che per ottenere informazioni in inglese sui vari comandi appena elencati basta eseguire il comando man “nomecomando”.

$ man passwd

Per sapere a cosa serve il comando passwd per esempio. Ecco l’inoformazione trovata con man:“DESCRIPTION The passwd command changes passwords for user accounts. A normal user may only change the password for his/her own account, while the superuser may change the password for any account. passwd also changes the account or associated password validity period.”

Il comando usato per cancellare il setuid-bit è chmod a-s:

# chmod a-s /usr/bin/{wall,crontab,chfn,write,newgrp,opiepasswd,gpasswd,fusermount,chsh,chage,vlock,opiesu,passwd,sudo}

Ora si fa lo stesso comando con /bin:

# find / -perm  +6000 -type f -exec ls -ld {} \; | grep "/bin"
-rwsr-xr-x 1 root root 40016 Mar 19 00:59 /bin/su                                                                                                                                                                                                                              
-rwsr-xr-x 1 root audio 23880 Dec 14  2011 /bin/eject                                                                                                                                                                                                                          
-rwsr-xr-x 1 root root 40048 Apr 15  2011 /bin/ping                                                                                                                                                                                                                            
-rwsr-xr-x 1 root root 94776 Apr 29 23:20 /bin/mount                                                                                                                                                                                          
-rwsr-xr-x 1 root root 69208 Apr 29 23:20 /bin/umount                                                                                                                                                                                                                          
-rwsr-xr-x 1 root root 35792 Apr 15  2011 /bin/ping6

Qui abbiamo ping e ping 6 che son dei programmi per testare la connetività, mount e umount che servono per montare rispettivamente demontare dei dischi. Ed in fine eject che viene usato per espellere il DVD-ROM o un dischetto.

Una volta deciso quali tenere e quali no, eseguiamo nuovamente il comando:

# chmod a-s /bin/{ping6,ping,eject,mount,umount} 

Ora cercare i programmi con il bit impostato nella cartella sbin:

# find / -perm  +6000 -type f -exec ls -ld {} \; | grep "/sbin"                                                                                                                                                                                                   
-rwsr-xr-x 1 root shadow 35688 Jan 13  2012 /sbin/unix_chkpwd                                                                                                                                                                                                                  
-rwsr-xr-x 1 root root 111272 Feb 20 16:04 /sbin/mount.nfs                                                                                                                                                                                                                     
-rwsr-xr-x 1 root shadow 10736 Dec 16  2011 /sbin/unix2_chkpwd                                                                                                                                                                                                                                                                                                                                                                                                 
-rwxr-sr-x 1 root tty 10680 May 10  2010 /usr/sbin/utempter                                                                                                                                                                                                                    
-rwsr-xr-x 1 root root 10632 Feb 14 19:56 /usr/sbin/zypp-refresh-wrapper
-rwxr-sr-x 1 root maildrop 15136 Jun 18  2012 /usr/sbin/postdrop
-rwxr-sr-x 1 root maildrop 19176 Jun 18  2012 /usr/sbin/postqueue
#

Vediamone alcuni:

mount.nfs serve per montare il file system nfs. Se si vuole usare un nfs client o server sul Server. Non ci serve.

Postdrop e postqueue sono dei componenti di Postfix, che fa da sendmail.

Definizione in inglese di Utempter: is a utility that allows some non-privileged programs to have required root access without compromising system security. Utempter accomplishes this task by acting as a buffer between root and the programs.

Definizione di unix_chkpwd: is a helper program for the pam_unix module that verifies the password of the current user. It also checks password and account expiration dates in shadow. It is not intended to be run directly from the command line and logs a security violation if done so.

# chmod a-s /usr/sbin/{postdrop,postqueue,utempter}
# chmod a-s /sbin/mount.nfs

Se una certa applicazione non si usa si potrebbe pensare di eliminare il pacchetto del tutto, vediamo:

# rpm -qa | grep "ftp"
ftp-xx
# rpm -e ftp-xx

Cancellare chiaramente anche i programmi come ftp, sftp, traceroute, telnet, wget, curl e altri. Il compiler gcc una volta compilato il Kernel, rimuoverlo – uno potrebbe copiare il codice da shell a shell e compliare il programma localmente senza lasciare traccia nei log file… Come cancellare veramente ogni pacchetto che non ci serve.

Per dare un occhiata ai pacchetti installati eseguire:

# rpm -qa | less

Ora come test finale provare ancora a cercare i setuid Binaries e si vede dal risultato che ve ne sono molto meno, solo il necessario. Abbiamo finito!

# find / -perm  +6000 -type f -exec ls -ld {} \;
-rwsr-xr-x 1 root shadow 35688 Jan 13  2012 /sbin/unix_chkpwd
-rwsr-xr-x 1 root shadow 10736 Dec 16  2011 /sbin/unix2_chkpwd
-rwsr-xr-x 1 root root 40016 Mar 19 00:59 /bin/su
-rwsr-xr-x 1 root shadow 19320 Feb  1  2012 /usr/bin/expiry
-rws--x--x 1 root root 1914440 May 24 22:56 /usr/bin/Xorg
-rwsr-xr-x 1 root root 26897 Mar 18 22:30 /usr/lib64/pt_chown
# 

Fonte: Linux Server Hacks – Rob Flickenger