Cada sistema necesita procesos en ejecución para cumplir su objetivo principal. Pero a veces las cosas salen mal y un proceso puede fallar. Dependiendo de la configuración del sistema, se crea un volcado de núcleo. En otras palabras, se almacena una instantánea de memoria del proceso bloqueado. El término núcleo en realidad se refiere a la memoria de núcleo magnético antigua de sistemas más antiguos. Aunque este tipo de memoria ya no se utiliza, todavía usamos este término en sistemas Linux. Suficiente para la historia, configuremos nuestro sistema Linux para manejar correctamente los volcados de núcleo.
Tabla de Contenidos
Volcados de núcleo y Linux
La mayoría de los sistemas Linux tienen volcados de núcleo habilitados de forma predeterminada. Como siempre, hay un compromiso que hacer aquí. Por un lado, queremos recopilar datos para mejorar la estabilidad y la resolución de problemas. Por otro lado, queremos limitar los datos de depuración y evitar fugas de datos confidenciales.
La primera opción es buena para máquinas donde es necesario investigar programas inestables, como la estación de trabajo de un desarrollador. La segunda opción es más adecuada para sistemas de producción que almacenan o procesan datos confidenciales.
Deshabilitar volcados de núcleo
Tiene sentido deshabilitar cualquier volcado de núcleo en Linux de forma predeterminada para todos sus sistemas. Esto se debe a que los archivos ocupan espacio en disco y pueden contener datos confidenciales. Por lo tanto, si no necesita los volcados de núcleo para resolver problemas, deshabilitarlos es una opción segura.
Opción 1: ulimit a través del archivo de configuración
Para deshabilitar los volcados de núcleo necesitamos establecer un valor ulimit
. Esto se hace a través de/etc/security / limits.archivo de configuración y define algunas restricciones específicas del shell.
Es bueno saber que hay límites suaves y duros. Un límite duro es algo que nunca se puede anular, mientras que un límite suave solo puede aplicarse a usuarios específicos. Si queremos asegurarnos de que ningún proceso pueda crear un volcado de núcleo, podemos establecerlos a cero. Aunque puede parecer un booleano (0 = Falso, 1 = Verdadero), en realidad indica el tamaño permitido.
* núcleo blando 0
* núcleo duro 0
El signo de asterisco significa que se aplica a todos los usuarios. La segunda columna indica si queremos usar un límite duro o suave, seguida de las columnas que indican la configuración y el valor.
Opción 2: configurar ulimit a través de perfil
Los valores de ulimit también se pueden establecer a través de /etc/profile o un archivo personalizado en /etc/profile.directorio d. Este último es el preferido cuando está disponible. Por ejemplo, creando un archivo llamado /etc/profile.d/disable-coredumps.sh.
echo «ulimit-c 0 > / dev / null 2>&1» > /etc / perfil.d / desactivar-bombas de núcleo.sh
Este comando agrega la configuración a un archivo nuevo y establece el límite suave y duro en cero. Cada usuario obtiene este valor al iniciar sesión.
Además de la configuración de ulimit, también hay opciones de kernel a tener en cuenta. Así que elegir una de las opciones es el primer paso.
Opción 3: desactivar a través de systemd
Cuando utilice systemd y el servicio systemd-coredump, cambie el coredump.conf archivo. Este archivo se encuentra probablemente en /usr/lib / sysctl.d / 50-bomba de núcleo.conf. Como systemd tiene un conjunto de archivos, asegúrese de verificar los otros como:
Establezca la configuración de almacenamiento en ‘ninguno’. Luego configure ProcessSizeMax para limitar el tamaño máximo a cero.
Almacenamiento = ninguno
ProcessSizeMax=0
Por lo general, basta con recargar la configuración de systemd.
systemctl daemon-reload
Si esto sigue creando un volcado de núcleo, reinicie el sistema.
Deshabilitar los procesos setuid que descargan su memoria
Los procesos con permisos elevados (o el bit setuid) pueden seguir realizando un volcado de núcleo, dependiendo de sus otras configuraciones. Como estos procesos suelen tener más acceso, pueden contener segmentos de datos más sensibles en la memoria. Así que es hora de cambiar esto también. El comportamiento se puede alterar con una clave sysctl, o directamente a través del sistema de archivos / proc. Para la configuración permanente, se suele usar el comando y la configuración sysctl. Una configuración se denomina «clave», que tiene un valor relacionado adjunto (también conocido como par clave-valor).
Para deshabilitar el programa con el bit setuid a volcar, configure el fs.suid_dumpable a cero.
echo "fs.suid_dumpable=0" >> /etc/sysctl.conf
Vuelva a cargar la configuración de sysctl con el indicador-p para activar cualquier cambio que haya realizado.
sysctl -p
Sólo quiero probar sin hacer cambios permanentes? Utilice sysctl -w
seguido de la clave = valor.
Consejo: Usando sysctl puede ajustar su sistema y es una buena manera de endurecer el núcleo Linux.
Habilitar volcados de núcleo
La razón principal para permitir volcados de núcleo es para resolver problemas. La memoria descargada del proceso se puede usar para problemas de depuración, generalmente por desarrolladores más experimentados. Un proveedor de software puede solicitar habilitar volcados de núcleo. Por lo general, para descubrir por qué un proceso se bloqueó en primer lugar y encontrar la rutina relacionada que lo causó.
Habilitar volcados de núcleo en Linux es similar a deshabilitarlos, excepto que se deben configurar algunos detalles específicos. Por ejemplo, si solo necesita detalles de un programa en particular, puede usar límites suaves. Esto se hace usando -S
que indica que es un límite suave. -c
denota el tamaño de un volcado de núcleo.
ulimit -S -c 0
El siguiente paso es permitir que solo’ mi programa para solucionar problemas ‘ cree un volcado de núcleo.
ulimit -S -c unlimited my-program-to-troubleshoot
Si desea permitir que todos los procesos utilicen volcados de núcleo, utilice la línea anterior sin el programa, o establezca un límite del sistema en /etc / security / limits.conf
* soft core unlimited
Solucionar problemas de binarios setuid
Los binarios que tienen un conjunto de bits setuid pueden ejecutarse con permisos de root. Este tipo especial de acceso debe restringirse en la medida de lo posible. También para la creación de volcados de núcleo, debe configurarse correctamente. Esto se hace con el sysctl fs.suid_dumpable clave.
- 0 – desactivado
- 1 habilitado
- 2 habilitado con restricciones
Así que si desea solucionar problemas de programas con un conjunto de bits setuid, puede cambiar temporalmente el fs.suid_dumpable a 1 o 2. Se prefiere configurarlo en 2, ya que esto hace que los volcados de núcleo solo sean legibles para el usuario root. Esta es una buena alternativa para sistemas con datos confidenciales. Establecer la opción en 1 es más adecuado para los sistemas de desarrollo personal.
Crear archivos de volcado normales
Uno de los grandes misterios de los sistemas Linux es dónde se encuentran los volcados principales. Linux tiene un truco para capturar volcados de núcleo. Esta configuración en particular se realiza a través del núcleo sysctl.configuración core_pattern o / proc / sys / kernel / core_pattern. La mayoría de los sistemas tendrán una tubería (|
) en esta configuración para indicar que un programa debe encargarse de los datos generados. Así que si te preguntas a dónde va tu vertedero, ¡sigue la tubería!
Los volcados de núcleo en sistemas Ubuntu normalmente se van a incluir. Para los sistemas basados en Red Hat, se puede redirigir a la Herramienta de Informe Automático de Errores (ABRT).
Puede cambiar temporalmente esta configuración, haciendo eco de «core» en ese archivo, o usar la utilidad sysctl
.
sysctl -w kernel.core_pattern=core
Una nota importante es que este cambio podría no ser suficiente. También depende de su fs.suid_dumpable configuración. Si es así, se registrará una advertencia en su registrador del kernel.
Sep 06 15:51: 18 endurecimiento del núcleo: Patrón de núcleo inseguro utilizado con suid_dumpable=2. Se requiere un manipulador de tuberías o un camino de descarga de núcleo completamente calificado.
Cuando sea necesario, establezca su core_pattern en una ruta completa, opcionalmente con variables que definan quién la estaba ejecutando, el PID,etc.
núcleo sysctl-w.core_pattern= / var/crash / core.%u.%e. % p
En este ejemplo, nuestros volcados contendrán el id de usuario, el nombre del programa y el id del proceso.
Volcados de núcleo de Systemd
Cuando utilice una distribución Linux moderna, lo más probable es que tenga systemd habilitado. Es posible que necesite anular la configuración a través de /etc/sysctl.d / 50-bomba de núcleo.config y defina cómo y dónde desea almacenar sus volcados principales.
Usando systemd-coredump
Su núcleo.core_pattern se puede definir para usar la utilidad systemd-coredump. La ruta predeterminada donde se almacenan los volcados de núcleo se encuentra en /var/lib/systemd / coredump.
Probar su configuración
La mayoría de los demás tutoriales solo le dan la configuración que debe configurar. Pero, ¿cómo sabes que las cosas funcionan como se espera? Usted tendrá que probarlo!
Crear un volcado de núcleo
Opción 1: Crear un programa inestable
Vamos a crear un programa simple. Su objetivo principal es bloquearse cuando se ejecuta y luego, opcionalmente, crear un volcado de núcleo. Instale gcc en su sistema y cree un bloqueo de archivo.c en su directorio personal.
int main(){ return 1/0;}
Este programa iniciará la función principal y devolverá un valor entero (número). Sin embargo, está dividiendo 1 por cero, lo que no está permitido y se bloqueará. El siguiente paso es compilar nuestro pequeño programa con errores.
Nuestro pequeño programa inestable
Incluso el compilador muestra que nuestro programa contiene un problema grave y muestra una advertencia al respecto. Ahora vamos a comprobarlo y ver si este es el caso.
Un buen golpe!
De esta sola línea, podemos aprender algunas cosas. En primer lugar, que dejó de funcionar con una excepción, refiriéndose específicamente a los puntos flotantes. Este es un formato de número decimal para programas, por lo que puede indicar que algo sucedió mientras se hacían algunas matemáticas. Otra conclusión es que el núcleo es objeto de dumping debido a la adición (núcleo objeto de dumping) al final. Si los volcados de núcleo estuvieran desactivados, esto no aparecería.
Genial, así que con este bloqueo de arriba ahora tenemos un archivo volcado, ¿verdad? No exactamente. Dependiendo de su distribución Linux, las cosas podrían no ser tan simples como parece. Cada distribución trata de manera diferente los volcados de núcleo y la configuración predeterminada. Las distribuciones de Linux más recientes también usan systemd ahora y las reglas también se han cambiado ligeramente con eso. Dependiendo de su configuración, es posible que deba buscar sus volcados de núcleo. Así que aquí hay algunos consejos para asegurarse de que todo esté configurado correctamente.
Opción 2: matar un proceso en ejecución
En lugar de usar un programa de prueba, también puede terminar un proceso existente. Esto se hace mediante el uso de SIGSEGV, que es la abreviatura de violación de segmentación y también conocida como falla de segmentación.
kill -s SIGSEGV PID
Si reemplaza PID con»$ $», el programa actual (lo más probable es que su shell) se bloquee. Todo para la ciencia, ¿verdad?
Opción 3: usar gdb
Si tiene instalada la herramienta de depuración de desarrolladores gdb, adjunte a un proceso de su elección utilizando su ID de proceso (PID).
gdb -p 1234
Luego, cuando esté en el indicador gdb, genere el volcado de núcleo invocando la instrucción generate-core-file. Después de usar este comando, debería devolverle la salida.
Núcleo de archivo de núcleo guardado.1234
Comprobar configuración de ulimit
La configuración de ulimit define lo que puede suceder cuando un programa se bloquea. Por lo tanto, es seguro verificar esto primero, tanto para usuarios root como para usuarios normales sin privilegios.
Compruebe el límite duro para los vertederos de núcleo:
ulimit -H -c
Compruebe el límite suave también:
ulimit -S -c
Compruebe el patrón de núcleo
Utilice el sistema de archivos / proc para recopilar el valor y cambiarlo temporalmente durante la prueba. Si prefiere usar sysctl, consulte el núcleo.core_pattern clave.
cat /proc/sys/kernel/core_pattern
podría mostrar algo como esto:
|/usr/share/apport/apport %p %s %c %P
En este caso, un accidente se canaliza hacia el apport utilidad. Esto significa que los bloqueos serán analizados por Apport. Normalmente los bloqueos se encuentran en / var /crash, pero también pueden encontrarse en/var /spool o/var/lib/systemd / coredump en otras distribuciones de Linux.
Compruebe el diario (systemd)
En nuestro caso journalctl
muestra nuestro bloqueo, por lo que es un comienzo.
Después de comprobar todos estos ajustes, debería poder crear un buen volcado de núcleo.
Conclusión
Los volcados de núcleo pueden ser útiles para solucionar problemas, pero son un desastre para filtrar datos confidenciales. Deshabilite los volcados de núcleo cuando sea posible y solo habilítelos cuando realmente sea necesario. En tal caso, compruebe si los archivos se almacenan de forma segura, para que los usuarios normales no puedan ver los datos. E independientemente de la elección que haya hecho, siempre pruebe si su configuración funciona exactamente como espera que funcione.