Monitorare gli incidenti di un server Linux

monitor_server_linux_garanet
Il Monitoraggio e la gestione degli incidenti è una faccenda seria. È impossibile prevedere quale sarà il prossimo problema. Qui una serie di aiuti

Un avviso o un alert su Nagios, ci indica che il Server é giú, cosa fare?

1. Non fatevi prendere dal panico.
2. Possiamo ricavare informazioni su cosa sta succedendo.
3. Connettiti via SSH sul Server.

Se il server ha la memoria satura o i processori sono in overload questo potrebbe impiegare molto tempo. Se davvero non puoi connetterti via SSH al server, è male. Dovrete riavviare il server o effettuare il login utilizzando la console seriale.

Comandi da utilizzare dopo il login ssh sul server.

Qualcuno è già sul problema?

#:~$ users oppure #:~$ who

Per i processi in esecuzione, si usa top, vi dirà sull’utilizzo della memoria e della cpu.

#:~$ top  oppure #:~$ htop  (se installato.)

Vi mostrerá qualcosa come:

top - 11:11:25 up 48 days, 14:40,  2 users,  load average: 49.67, 48.85, 33.94
Tasks: 158 total,   1 running, 157 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.8%sy,  0.0%ni, 11.5%id, 86.7%wa,  0.0%hi,  0.6%si,  0.1%st
Mem:   8147096k total,  8108144k used,    38952k free,    28712k buffers
Swap:  4194296k total,   164740k used,  4029556k free,  2919400k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                          
30261 root      20   0 5148m 4.6g 5884 S   18 58.6   6931:26 java                                                                              
 4470 n2        20   0 14004  964  396 S    1  0.0 391:12.84 n2txd                                                                             
 3645 root      20   0     0    0    0 D    0  0.0  11:18.61 flush-202:1                                                                       
22092 root      20   0  9768  604  568 S    0  0.0   0:54.42 tail                                                                              
22839 guest     20   0 19236 1420 1040 R    0  0.0   0:00.04 top                                                                               
    1 root      20   0 23832 1120  532 S    0  0.0   0:17.27 init                                                                              
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd                                                                          
    3 root      RT   0     0    0    0 S    0  0.0   0:00.82 migration/0                                                                       
    4 root      20   0     0    0    0 S    0  0.0   0:13.66 ksoftirqd/0                                                                       
    5 root      RT   0     0    0    0 S    0  0.0   0:00.94 watchdog/0                                                                        
    6 root      RT   0     0    0    0 S    0  0.0   0:00.92 migration/1

In cima di solito vi dirà che cosa dovete conoscere. Il primo processo nella top list su un WebServer dovrebbe essere java.

#:~$ ps aux | grep java
root     30261 79.9 58.5 5260904 4774052 ?     Sl   May30 6932:43 /usr/lib/jvm/java-6-sun/bin/java -Djava.util.logging.config.file=/usr/local/tomcat7/conf/logging.properties -server

Il primo numero è l’id del processo, con questo possiamo uccidere/chiudere il processo in esecuzione e avviarlo nuovamente.

#:~$ sudo kill -9 30261
#:~$ sudo /etc/init.d/tomcat start

Un server mostra avvisi o errori relativi al carico della CPU, i siti sono ancora visitabili, probabile che il server è occupato a fare qualcosa di pesante.
Il carico della CPU non deve superare 1,0 per core. In realtà, carichi fino a 5.0 al nucleo sono ancora accettabili.

top - 11:11:25 up 48 days, 14:40,  2 users,  load average: 49.67, 48.85, 33.94
Tasks: 158 total,   1 running, 157 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.8%sy,  0.0%ni, 11.5%id, 86.7%wa,  0.0%hi,  0.6%si,  0.1%st
Mem:   8147096k total,  8108144k used,    38952k free,    28712k buffers
Swap:  4194296k total,   164740k used,  4029556k free,  2919400k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                          
30261 root      20   0 5148m 4.6g 5884 S   18 58.6   6931:26 java                                                                              
 4470 n2        20   0 14004  964  396 S    1  0.0 391:12.84 n2txd                                                                             
 3645 root      20   0     0    0    0 D    0  0.0  11:18.61 flush-202:1                                                                       
22092 root      20   0  9768  604  568 S    0  0.0   0:54.42 tail                                                                              
22839 guest     20   0 19236 1420 1040 R    0  0.0   0:00.04 top                                                                               
    1 root      20   0 23832 1120  532 S    0  0.0   0:17.27 init                                                                              
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd                                                                          
    3 root      RT   0     0    0    0 S    0  0.0   0:00.82 migration/0                                                                       
    4 root      20   0     0    0    0 S    0  0.0   0:13.66 ksoftirqd/0                                                                       
    5 root      RT   0     0    0    0 S    0  0.0   0:00.94 watchdog/0                                                                        
    6 root      RT   0     0    0    0 S    0  0.0   0:00.92 migration/1

Ha un carico di 49,67. Questo non è bene. Con carichi come questa performance il server risulterá inutile. Cerchiamo la causa:

Troppi visitatori sul sito Web o App ???

#:~$ sudo tail -f /var/log/apache2/access.log 
#:~$ sudo tail -f /var/log/apache2/other_vhosts_access.log

Error.log nella stessa cartella, vi mostrerá se ci sono errori gravi.

#:~$ sudo tail error.log

DDoS, tentativo di hacking, scansione di sicurezza, la brute force…

Se qualcuno sta cercando di accedere al sistema piú di 1000 volte al secondo causerà carichi elevati. Il log di Apache mostrerà cose strane se questo sta accadendo. Per vedere se qualcuno sta utilizando un brute force via SSH oppure via Web/App Apache, controllare i seguenti log’s files:

/var/log/apache2/error.log
/var/log/apache2/access.log
/var/log/apache2/other_vhosts_acces.log
/var/log/auth.log

Gli hacker di solito cercano di trovare uno strumento popolare per trovare bugs come per il PHP. Non c’è alcun pericolo reale che l’hacker comprometterà i nostri sistemi se prova alcuni tools. Ci vuole molto tempo tuttavia per Apache servire un errore. Se il tool fa richieste come un milione di volte al secondo,il server diventerà lento. Se mai si sente la necessità di eseguire uno script come webGUI/CGI, si prega di utilizzare un accesso supplementare per Apache per proteggerlo. (http://www.elated.com/articles/password-protecting-your-pages-with-htaccess/).

#:~$ sudo tail /var/log/apache2/access.log
*:80 110.173.1.118 - - [30/Mag/2015:03:37:15 +0200] "GET //scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:15 +0200] "GET //admin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:16 +0200] "GET //admin/pma/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:17 +0200] "GET //admin/phpmyadmin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:17 +0200] "GET //db/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:18 +0200] "GET //dbadmin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:19 +0200] "GET //myadmin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:20 +0200] "GET //mysql/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:20 +0200] "GET //mysqladmin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:21 +0200] "GET //typo3/phpmyadmin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:22 +0200] "GET //phpadmin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:23 +0200] "GET //phpMyAdmin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:23 +0200] "GET //phpmyadmin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:24 +0200] "GET //phpmyadmin1/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:25 +0200] "GET //phpmyadmin2/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:25 +0200] "GET //pma/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:27 +0200] "GET //web/phpMyAdmin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:28 +0200] "GET //xampp/phpmyadmin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:29 +0200] "GET //web/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:29 +0200] "GET //php-my-admin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:30 +0200] "GET //websql/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:31 +0200] "GET //phpmyadmin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:32 +0200] "GET //phpMyAdmin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:32 +0200] "GET //phpMyAdmin-2/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:33 +0200] "GET //php-my-admin/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:34 +0200] "GET //phpMyAdmin-2.2.3/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:36 +0200] "GET //phpMyAdmin-2.2.6/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:37 +0200] "GET //phpMyAdmin-2.5.1/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:37 +0200] "GET //phpMyAdmin-2.5.4/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:38 +0200] "GET //phpMyAdmin-2.5.5-rc1/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
*:80 110.173.1.118 - - [30/Mag/2015:03:37:39 +0200] "GET //phpMyAdmin-2.5.5-rc2/scripts/setup.php HTTP/1.1" 404 1808 "-" "-"
#:~$ sudo grep w00t /var/log/apache2/error.log
[May 30 03:14:53 2015] [error] [client 193.200.124.171] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
[May 11 17:47:18 2015] [error] [client 50.57.84.107] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.test0:)
[Jun 02 08:24:29 2015] [error] [client 95.211.37.204] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
[Aug 04 06:51:10 2015] [error] [client 95.211.37.224] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

Esempio di Attacco SSH

#:~$ sudo tail /var/log/auth.log
May 30 07:01:17 serverX sshd[15598]: Failed password for root from 31.6.80.232 port 51975 ssh2
May 30 07:01:17 serverX sshd[15598]: Received disconnect from 31.6.80.232: 11: Bye Bye [preauth]
May 30 07:01:17 serverX sshd[15600]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=31.6.80.232  user=root
May 30 07:01:19 serverX sshd[15600]: Failed password for root from 31.6.80.232 port 52235 ssh2
May 30 07:01:19 serverX sshd[15600]: Received disconnect from 31.6.80.232: 11: Bye Bye [preauth]
May 30 07:01:20 serverX sshd[15602]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=31.6.80.232  user=root
May 30 07:01:22 serverX sshd[15602]: Failed password for root from 31.6.80.232 port 52505 ssh2
May 30 07:01:22 serverX sshd[15602]: Received disconnect from 31.6.80.232: 11: Bye Bye [preauth]
May 30 07:01:22 serverX sshd[15604]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=31.6.80.232  user=root
May 30 07:01:24 serverX sshd[15604]: Failed password for root from 31.6.80.232 port 52767 ssh2
May 30 07:01:24 serverX sshd[15604]: Received disconnect from 31.6.80.232: 11: Bye Bye [preauth]
May 30 07:01:25 serverX sshd[15606]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=31.6.80.232  user=root
May 30 07:01:27 serverX sshd[15606]: Failed password for root from 31.6.80.232 port 53009 ssh2
May 30 07:01:27 serverX sshd[15606]: Received disconnect from 31.6.80.232: 11: Bye Bye [preauth]
May 30 07:01:27 serverX sshd[15609]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=31.6.80.232  user=root

Stanno cercando di effettuare il login come root, usando alcune password comuni. Ancora una volta, non c’è alcun rischio che essi possono compromettere il sistema, dal momento che non permettiamo il login di root.(in /etc/ssh/sshd_config abbiamo PermitRootLogin no).
Se vogliamo sapere da dove proviene l’ip basta digitare :

#:~$ whois 31.6.80.232

Se l’ip e/o l’utente non hanno un aspetto familiare tipo proveniente dalla Cina, Russia o qualche altra nazione dubbia, si puó bloccare l’ip aggiungendolo in:

#:~$ sudo vi /etc/hosts.deny

Con:

#:~$ ALL: 31.6.80.232

Il server è in swapping

Quando un server diventa molto lento, potrebbe essere la partizione di swap. Ecco alcuni output del comando top. La riga di memoria indica che il server utilizza quasi tutta la memoria e si hanno 164740k in swap.

MEM: 8147096k totale, 8108144k utilizzato, 38952 KB liberi, 28712 buffer k
Swap: 4194296k totale, utilizzato 164740k, 4029556k gratis, 2919400k memorizzati nella cache

Quando un server esaurisce la memoria e ha una partizione di swap configurata, utilizzerà la partizione di swap come memoria di emergenza. Se non c’è nessun spazio di swap disponibile quando la memoria si esaurisce, il kernel di linux inizierà a uccidere i processi che utilizzano un sacco di memoria, che solitamente inizia con java. Se c’è spazio di swap disponibile, il kernel non ucciderà nulla, ma è possibile che il server diventerà lento perché sta tentando di gestire la lettura/scrittura sul disco.
Controllo partizioni/swap:

#:~$ cat /etc/fstab

Mostrerá qualcosa come:

# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# proc /proc proc nodev,noexec,nosuid 0 0
# / was on /dev/sda1 during installation
/dev/xvda1 / ext3 errors=remount-ro 0 1
/dev/xvda2 none swap sw 0 0
dev /dev tmpfs rw 0 0

Disattiva Swap

#:~$  /sbin/swapoff /dev/xvda2

Attiva Swap

#:~$  /sbin/swapon /dev/xvda2

Se non c’è abbastanza memoria disponibile, il server si rifiuterà di disattivare la partizione di swap.




Monitorare gli incidenti di un server Linux ultima modifica: 2015-12-10T19:54:22+00:00 da Gabriele Gatto