In questo post ti mostreremo come tracciare e tracciare un processo Linux sul sistema con due strumenti, ps e strumenti da riga di comando strace. Questi strumenti di sistema possono aiutarti a identificare il processo del sistema reale e la loro origine.
Sui server di hosting Web condivisi è molto comune affrontare problemi di spam e malware. Questo problema può verificarsi per molte ragioni e talvolta questi spam o attacchi in uscita vengono lanciati da processi di sistema come gli script perl che utilizzano molte risorse della CPU.
Nella maggior parte di questi casi, a quanto pare è "solo" un processo perl, ma ecco alcune domande interessanti:come fai a sapere da dove viene? In che modo un processo di sistema Linux potrebbe mascherare il suo vero nome? Qual è il modo più semplice e affidabile per scoprire dove è stato avviato questo processo Linux?
Oggi cercheremo di rispondere a tutte queste domande con alcuni esempi pratici facili e veloci.
Traccia un processo Linux usando il comando ps
Vediamo un esempio di vita reale accaduto giorni fa in un server dedicato che gestisco.
Su un particolare sito Web si è verificato un problema di spam in uscita che inviava molte e-mail, ma non è stato trovato alcun malware all'interno della cartella public_html, inoltre tutte le password delle caselle di posta elettronica sono state modificate, come la password dell'account FTP/cPanel. Tuttavia, c'era un modo in cui l'attaccante utilizzava il sistema Linux per inviare e-mail in uscita.
La fonte delle e-mail era un processo in esecuzione sotto l'utente "johndoe" che sembrava essere dannoso e non era quello che affermava di essere:
[[email protected] ~] ps -U johndoe -u johndoe u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND johndoe 59289 4.0 0.0 43568 9528 ? Ss Jun08 110:01 httpd
Come vedi, la prima cosa per scoprire il processo è stata usare il comando ps, come vedi sotto:
ps -U user -u user u
Sostituisci "utente" con il tuo utente di sistema reale.
Dopodiché, una volta elencati i processi sospetti, utilizza ll comando per scoprire ulteriori informazioni utilizzando il suo PID , come visto prima:
Come vedi, il processo afferma di essere "httpd" per nascondersi (qualsiasi processo può cambiare il proprio titolo di processo), in realtà è un processo perl:
[[email protected] ~] ll /proc/59289/exe lrwxrwxrwx 1 johndoe johndoe 0 Jun 10 10:05 /proc/59289/exe -> /usr/bin/perl*
Tuttavia, non esisteva alcun file di script associato. Lo script molto probabilmente è stato reindirizzato al processo perl per evitare di inserire qualcosa nel filesystem dove avrebbe lasciato una traccia.
Non so come sia stato eseguito lo script con questo utente, ma si trattava di un'installazione vulnerabile di WordPress con molti plug-in obsoleti e malware iniettato che potevano facilmente causare questo tipo di problemi.
Uccidere il processo di rossetto è stata la cosa migliore da fare in questo caso:
kill -9 59289
Sostituisci "59289" con l'ID processo reale.
Strace:un altro modo semplice per tracciare un processo di sistema
traccia è uno strumento molto utile e utile utilizzato dagli amministratori di sistema per il debug e la diagnostica dei problemi relativi al sistema e al processo in cui la fonte non è molto chiara e disponibile quando si dà una rapida occhiata.
Questo strumento di debug consente ai programmatori e agli utenti del sistema di scoprire rapidamente come un programma interagisce con il sistema operativo. Lo fa monitorando le chiamate e i segnali di sistema.
Come vedremo nei prossimi esempi, strace restituisce ogni riga nella traccia che include il nome della chiamata di sistema, i suoi argomenti e il valore restituito (tra parentesi).
esempio di traccia
Eseguiamo strace su /bin/ls e salviamo l'output in un file chiamato ls.txt
strace -o ls.txt /bin/ls
Per leggere l'output, esegui:
more ls.txt
Ma questo è solo un esempio di strace di base. La parte interessante arriva quando puoi tracciare il processo del server web e scoprire cosa sta facendo esattamente. Prendiamo un processo php-fpm come esempio:
strace -p 18478 -s 80 -o /root/php-fpm.debug.txt
[[email protected]:~]strace -p 18478 -s 80 -o /root/php-fpm.debug.txt Process 18478 attached ^CProcess 18478 detached [[email protected]:~]
Premendo CTRL+C terminerai la traccia e verrà staccata.
Puoi anche specificare cosa devi tracciare, ad esempio, se devi solo tracciare le chiamate di sistema aperte e lette, dovresti specificarlo nella sintassi strace, come vedi di seguito:
strace -e trace=open,read -p 18478 -s 80 -o /root/php-fpm.debug.txt
Questo rapido esempio di strace utilizzava alcune opzioni di comando, spiegate qui:
-o filename: used to write the strace output into a file name. -p PID: here you must specify the system process ID. -s SIZE: sets the maximum string size to print (32 is the default).
Ancora una volta, per leggere l'output, esegui:
more /root/php-fpm.debug.txt
Ora sai come tracciare facilmente un processo Linux con due semplici comandi, con queste informazioni puoi facilmente tracciare un processo Linux per scoprire cosa sta facendo esattamente all'interno del tuo server. strace richiede un po' più di tempo per essere compreso dal manuale, ma è lo strumento definitivo per tracciare un processo Linux.
Ulteriori letture:
- uomo straccio
- strace ciao mondo
- comando ps