viernes, 12 de junio de 2009

Opciones de seguridad en bash

Fortificar un sistema Unix es una tarea más compleja de lo que en un principio se presupone, por desgracia no basta con aplicar unos cuantos parches y deshabilitar servicios.
En general estos servidores están administrados por un grupo amplio de técnicos, entre los que se pueden encontrar DBAs, operadores, auditores, administradores de sistemas... e incluso en algunos casos desarrolladores que hacen modificaciones directamente en producción...
La shell del sistema se convierte en un componente importante a que debe ser asegurado mediante unas cuantas modificaciones que optimizarán su comportamiento de seguridad.

En el caso de bash (lo siento, me pirra Matt Damon), permite mejorar sus controles mediante las siguientes opciones:

1.- Definición de variables de solo lectura. Mediante esta configuración es posible evitar que una variable de entorno sea sobreescrita por el usuario. Es común su uso en aquellas que definen como se comportará el histórico de comandos ejecutados. Se puede utilizar con las siguientes sintaxis:
declare -r HISTFILE=~/.bash_history
O bien mediante:
readonly HISTFILE=~/.bash_history

Para mostrar todas las variables de solo lectura basta con llamar a readonly con el parámetro -p
Las variables que configuran el histórico de comandos y que se deberían marcar como solo lectura son:
HISTFILE: define el archivo en el que se almacenarán cada uno de los comandos. Por defecto tiene el valor "~/.bash_history". Es conveniente que se le asignar atributos extendidos del sistema de ficheros para que el usuario no pueda eliminar el fichero: chttr +i .bash_history
HISTFILESIZE: determina el número de líneas que serán almacenadas en el fichero de histórico. El valor por defecto es de 500 aunque es recomendable que sea superior.
HISTSIZE: especifica el número de comandos que son almacenados en memoria y que serán mostrados cuando se soliciten mediante el comando "history"
HISTTIMEFORMAT= mediante esta variable se configura el formato que almacenará el archivo con los comandos ejecutados. Es recomendable modificarlo y añadir fecha y hora: mediante los valores: "%h/%d - %H:%M:%S ", de tal forma que podamos tener mayor detalle.
Otra variable interesante a modificar que amplía la funcionalidad del almacenado de histórico es "PROMPT_COMMAND", mediante la cual es posible forzar el salvado a fichero después de cada ejecución y no cuando el usuario haga logout. Evitando perdidas ""accidentales"" . Para configurarlo:
readonly PROMPT_COMMAND="history -a"

2.- Argumentos y opciones. Bourne dispone de un modo restringido que es invocado como argumento mediante el parámetro -r, --restricted o llamando a la shell mediante "rbash". Pese a que no es un método seguro, evita algunas acciones como:
Cambio de directorios mediante el comando "cd"
Modificar el valor de las variables: SHELL, PATH, ENV, y BASH_ENV
Ejecutar comandos que contengan "/"
Especificar ficheros que contengan / como argumento de "."
Redirección de salidas mediante >, >, <>, >&, &>, y >>
Restricción de exec
El uso de rbash es poco común ya que en general es sencillo evadir los controles, pero en ocasiones muy concretas puede ser interesante su uso.

El comando "shopt" permite controlar variables que son utilizadas por la shell para configurar su funcionamiento. La ejecución sin argumentos muestra todas las variables modificables y el valor que tienen. Con el valor -s se activan y con el valor -u se desactivan.
Una variable interesante que por defecto viene desactivada es "histappend", que determina si el fichero de históricos será sobre-escrito o si se añadirá contenido cada vez el usuario sale de la shell.
shopt -s histappend


3.- Tiempos de espera. Para disminuir el riesgo de que la shell sea utilizada por manos de Freddy Kruger, bash dispone de una variable que provocará la salida de bash. Esta variable también puede ser configurada en solo lectura y se define en segundos. Su valor por defecto es 0 (no activado).
declare -r TMOUT=120


4.- Límites. Bash permite la especificación de límites de recursos disponibles a consumir mediante el comando "ulimit". Existen tres tipos de límites, limites duros, blandos (hard y soft) y sin límites. El límite duro, configurado mediante el parámetro -H, no permite ser incrementado a usuarios sin privilegios de root. El límite mimosín permite ser incrementado hasta el número del límite van damme. Si no se especifica el tipo, ambos serán configurados con el mismo valor.
Para mostrar todos los límites basta con ejecutar ulimit con el parámetro -a:

# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 16304
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 16304
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

Los límites más interesantes son:
-c El tamaño máximo de los archivos core
-s El tamaño máximo de la stack
-t El tiempo máximo en segundos de cpu
-u El tiempo máximo de procesos disponibles por usuario
-v El tamaño máximo de mem virtual disponible para la shell
-x El número máximo de bloque de ficheros.

5.- Máscara de ficheros creados por usuario. Para evitar fugas de información, accesos no autorizados y otras gripes, todos los ficheros creados por usuarios deben tener permisos exclusivamente para ellos, eliminando grupos y otros. La configuración de mascara se lleva a cabo mediante el comando "umask", 077 configurará los permisos: u=rwx,g=,o=

umask 077

Cada uno de los distintos comandos vistos en esta entrada, se han de añadir al fichero /etc/profile para que sean ejecutados cuando un usuario se autentica.

Todas las protecciones no tienen sentido si en el sistema hay otras shells disponibles y pueden ser ejecutadas por el usuario, por lo que la configuración del archivo /etc/shells y la eliminación o modificación de permisos de otras shells es imprescindible.

Comentarios del post

No hay comentarios: