Buenas,
Continuamos con nuestro mini curso, y hoy vamos a hablar de los procesos en ejecución, y cómo analizarlos de una manera cómoda. Para ello vamos a introducir un concepto bastante importante a la hora de examinar máquinas UNIX, y ese no es otro que el scripting para la extracción de datos.
Para listar los procesos en ejecución, todos los UNIX tienen un comando llamado ps, acrónimo de process status, o estado de los procesos. La manera más cómoda y completa de listar los procesos en ejecución es emplear los parámetros -ef, lo que hará que se muestren todos los procesos (-e) en modalidad full listing o listado completo (-f)
ps -ef
Lo normal es que el listado sea largo, con lo que es aconsejable que extraigamos el contenido de la sentencia a fichero de texto:
ps -ef >> listado_ps.txt
El formato de ps -ef suele ser uniforme y muestra información sobre UID, PID, PPID, C STIME, TTY, TIME y CMD. A nosotros nos va a interesar auditar quíen ejecuta procesos, y en caso de detectar algo anormal, ya miraremos otros datos, como el identificador del proceso, hora, etc.
Es en este momento cuando podemos aplicar scripting para la extracción de datos. Ya cada cual puede optar por la opción que más le interese o convenga, yo suelo emplear Bash Scripting.
#!/bin/bash
#Descripcion: Script de auditoría de usuarios y procesos
#Sergio Hernando
#
#el fiichero listado_ps.txt debe contener los resultados de ps-ef
#
clear
echo
echo USUARIOS QUE EJECUTAN PROCESOS
echo ————————————
echo
for i in $(awk ‘{print $1}’ listado_ps.txt | sort | uniq | grep -v UID); do
echo Procesos ejecutados por $i& grep $i listado_ps.txt | wc -l
echo
echo ————————————
done
echo ============================
Ejemplo práctico
Imaginemos que nuestro fichero de salida de ps -ef tiene los siguientes contenidos:
UID PID PPID C STIME TTY TIME CMD
sergio 29197 18961 0 Sep27 ? 00:00:06 sshd: sergio@pts/87
antonio 32097 29197 0 Sep27 pts/87 00:00:00 -csh
sergio 7209 32097 0 12:17 pts/87 00:00:00 ps -ef
Aplicamos nuestro script de clasificación:
USUARIOS QUE EJECUTAN PROCESOS
————————————Procesos ejecutados por sergio
2————————————
Procesos ejecutados por antonio
1============================
En nuestro ejemplo, muy simplificado, no hemos advertido nada anormal. No pasará lo mismo cuando hagamos esto en un sistema de producción real, donde puede haber perfectamente más de 300 procesos en ejecución y más de 20 usuarios ejecutándolos. Analizaremos uno a uno los resultados, verificaremos que los usuarios que aparecen son legítimos y que los procesos son los esperados.
Resumen
El comando ps -ef permite conocer un listado completo de procesos en ejecución. El objetivo de la auditoría es conocer quién ejecuta procesos y si esos procesos son los esperados en la máquina. Cada usuario o proceso no identificado o sospechoso será catalogado como incidencia en nuestro informe de auditoría.
Saludos :)
Uno de los perfiles de procesos que pueden ser considerados «sospechosos» son aquellos que llevan mucho tiempo en el sistema (hora de creación) pero no han recibido CPU alguna (tiempo de ejecución cero, como 00:00). Este perfil puede ser sintomático de una bomba lógica, aunque algunos demonios o servicios del sistema que no se utilizan nunca (o casi nunca) pueden presentar un perfil similar. Por ejemplo, en Mac OS X, el proceso /sbin/dynamic_pager puede estar presente en el sistema durante bastante tiempo con un tiempo de ejecución de 0:00.00.
¡Una serie de artículos interesantes, sin duda! Para quien le interese, el mismo script con el ps incluido, con y sin usar ficheros temporales:
#!/bin/bash
# Approach con archivo temporal.
################################
#ps -ef > ps.txt
#for i in $(awk '{print $1}' ps.txt | sort | uniq | grep -v UID); do
# echo Procesos ejecutados por $i: ; grep $i ps.txt | wc -l
#done
#rm ps.txt
# Approach sin archivo temporal.
################################
echo
echo ___________
echo
for i in $(ps -ef | awk '1 {print $1}' | sort | uniq | grep -v UID); do
echo Procesos ejecutados por $i: ; ps -ef | awk '1 {print $1}' | grep $i | wc -l
done
echo __________
Ante todo, felicidades por esta serie de artículos, pues son una buena referencia de cómo empezar a securizar un sistema *nix empezando desde abajo.
A continuación pego el script para mostrar los procesos de cada usuario ligeramente más elaborado:
#!/bin/bash
echo
echo ___________
echo
for i in $(ps -ef | awk ‘1 {print $1}’ | sort | uniq | grep -v UID); do
echo Procesos ejecutados por $i: ; ps -ef | awk ‘1 {print $1}’ | grep $i | wc -l
done
echo __________
Un saludo!
Muy buen post, me ha venido estupendo.
Gracias, un saludo.