10.6.- Administrar la seguridad local

Administrar la seguridad local

capturaLa seguridad local abarca muchos más aspectos que las amenazas de los intrusos remotos. Por tanto, debemos prestar atención a ciertas cuestiones como proteger las contraseñas, limitar el acceso a root, definir los límites de los usuarios y seguir la pista de los ficheros SUID/SGID.

Proteger las contraseñas

La configuración por defecto de Linux depende demasiado de las contraseñas, que son las llaves del sistema de los usuarios, por lo que, si estos son descuidados, pueden aparecer fisuras en la seguridad. Para poder mantener la seguridad del sistema es necesaria la ayuda de los usuarios, ya que son los únicos que están en posesión de las contraseñas.  Debemos conocer también algunas de las herramientas que proporciona Linux para ayudar a mantener la seguridad de las contraseñas.

Los riesgos de las contraseñas

Para evitar que las contraseñas acaben en manos ajenas, debemos seguir ciertas pautas, entre las que se encuentran:

  • Utilizar contraseñas seguras: se deben utilizar buenas contraseñas, aunque esta práctica no elimina todo el riesgo.
  • Cambiar las contraseñas con frecuencia: esto minimiza el daño por una contraseña comprometida. Hay herramientas que ayudan a implementar estos cambios.
  • Utilizar contraseñas ocultas: si un individuo accede al sistema como un usuario normal, podrá leer el fichero de contraseñas y utilizar uno de los muchos programas para obtenerlas. Es aconsejable utilizar las contraseñas ocultas almacenadas en /etc/shadow siempre que sea posible. La mayoría de distribuciones utilizan contraseñas ocultas por defecto.
  • Mantener las contraseñas en secreto: hay que recordarle a los usuarios que no se pueden revelar las contraseñas. No se debe anotar la contraseña, guardarla en formato electrónico o enviarla por correo u otros medios electrónicos.  Los usuarios no deben ni enviar ni guardar contraseñas y, sobre todo, jamás se deben anotar.
  • Utilizar protocolos seguros de acceso remoto: determinados protocolos de acceso remoto son intrínsecamente inseguros: todos los datos atraviesan la red sin cifrar. Los ordenadores que se encuentran entre ambos extremos de la conexión pueden atrapar las contraseñas de estas sesiones. Es preferible desactivar telnet, ftp y otros protocolos que emplean contraseñas en texto plano en favor de protocolos que encriptan las contraseñas, como ssh.
  • Evitar los fisgones: si los usuarios acceden desde terminales públicos, como campus universitarios, cibercafes y similares, es posible que haya personas observando mientras introducen las contraseñas. Los usuarios deben ser conscientes de esta posibilidad para minimizar en lo posible este tipo de accesos.
  • Utilizar cada contraseña sólo para un sistema: si se compromete la base de datos de contraseñas de un ordenador y los usuarios de dicho sistema reutilizan las contraseñas en otros, se pondrán en riesgo también estos otros sistemas. Es aconsejable utilizar cada contraseña una sola vez. Hoy en día, esto puede ser casi imposible, ya que hay un gran número de sitios web cuyo acceso requiere una contraseña. Una solución razonables es utilizar una contraseña para los sitios menos sensibles y contraseñas únicas para los sitios webs más sensibles y cuentas de acceso.
  • Tener cuidado con la ingeniería social: esta práctica implica engañar a personas fingiendo ser un administrador del sistema o confundiéndolas de algún otro modo, para que les entreguen sus contraseñas, es muy alto el porcentaje de usuarios que cae en el engaño. Una práctica relacionada con ésta es el phishing, en el que un atacante crea un sitio web falso o envía un correo electrónico fingiendo ser alguna otra persona, de manera que la víctima se lo crea y le revele algún dato sensible, como su número de tarjeta de crédito.

Algunos de estos pasos son cosas que se pueden hacer, como sustituir los protocolos inseguros por otros cifrados. Otras cosas las tienen que hacer los usuarios, lo que pone revela la importancia de la educación del usuario, en particular en los sistemas con muchos usuarios.

La gente tiende a volverse perezosa en los asuntos de la seguridad. Llevado a la informática, esto se traduce en que los usuarios tienden a escoger contraseñas fáciles de adivinar y que cambian con poca frecuencia. Linux incluye herramientas para ayudar a los usuarios a escoger buenas contraseñas y cambiarlas regularmente.

Las contraseñas comunes suelen basarse en nombres de familiares, amigos y mascotas, libros, películas, programas de TV, números de teléfono, direcciones postales, números de la seguridad social y otros datos personales con significado. Cualquier palabra que se pueda encontrar en un 0000324515diccionario es una mala elección para una contraseña. Las mejores contraseñas se basan en conjuntos aleatorios de letras, dígitos y signos de puntuación. Lamentablemente estas contraseñas son difíciles de recordar. Una solución aceptable sería crear la contraseña en dos pasos: primero, escoger una base que sea fácil de recordar pero difícil de adivinar. Seguidamente, la modificaremos para que resulte más difícil de adivinar.

Un método para crear una base es utilizar dos palabras sin relación entre sí. Otro sistema, incluso razonablemente mejor que el primero, es utilizar las primeras letras de una frase que tenga significado. Como norma general, cuanto más larga sea la contraseña, mejor. Las versiones antiguas de Linux tenían un limite de ocho caracteres para la contraseña; hoy en día, gracias al uso de un hash md5, se ha elevado este límite. Hay sistemas que exigen que la contraseña tenga cuatro o seis caracteres de longitud. La utilidad passwd no acepta nada de longitud inferior al mínimo de la distribución.

El usuario debe aplicar al menos un par de estas posibles modificaciones:

  • Añadir números o puntuación: es la modificación más importante. Como norma general, añadiremos al menos dos símbolos o números.
  • Mezclar mayúsculas y minúsculas: Linux distingue mayúsculas y minúsculas, por lo que mezclarlas puede mejorar la seguridad.
  • Invertir el orden: un cambio muy leve en sí, pero que puede mejorar algo la seguridad si se utiliza conjuntamente a los anteriores. Podemos aplicar esto a una sola palabra o a toda la base.

que-es-el-cifradoLa mejor herramienta para hacer que los usuarios escojan buenas contraseñas es educarlos. Debemos indicarles cuáles son las contraseñas fáciles de adivinar, tanto por personas mal intencionadas como por aquellas que les escojan al azar. Además, debemos indicarles que Linux cifra internamente las contraseñas y que existen programas que utilizan diccionarios que pasan por algoritmos de cifrado para comparar el resultado con las contraseñas cifradas. Emplear una contraseña que no se encuentre en un diccionario ni sea una variante sencilla de una palabra, mejora substancialmente la seguridad. Hay que advertir a los usuarios que sus cuentas se pueden utilizar como primer paso para acceder a todo el ordenador o como punto de partida para atacar a otros ordenadores; advertiremos a los usuarios de que jamás deben revelar sus contraseñas, incluso a personas que afirmen ser administradores del sistema. También deben saber que no deben utilizar la misma contraseña en varios sistemas. Todo esto ayuda a los usuarios a entender las razones de nuestra preocupación y, quizá, algunos de ellos se animen a escoger buenas contraseñas.

Si los usuarios no muestran preocupación por estos asuntos, tendremos que hacer uso de las comprobaciones de passwd. La mayoría de las implementaciones de esta utilidad exigen que la contraseña tenga una longitud mínima y suelen comprobar la calidad de la contraseña empleando un diccionario para eliminar las peores elecciones. Otras requieren que una contraseña contenga como mínimo uno o dos dígitos o signos de puntuación.

Podríamos considerar la posibilidad de aplicar programas que averigüen contraseñas sobre nuestra base de datos de contraseñas cifradas para localizar las contraseñas pobres. Esto puede suponer el despido en muchas empresas e incluso una acusación de delito, al menos si lo hacemos sin autorización. Debemos consultar el asunto con nuestros superiores y obtener un permiso por escrito de una persona con la autoridad suficiente. Debemos extremar el cuidado con los ficheros implicados, es preferible extraer las contraseñas en un ordenador que no tenga conexiones de red.

Otro aspecto son los cambios de contraseña: si se hacen con frecuencia, minimiza el rango de oportunidades para hacer daño, ya que, si alguien obtiene una contraseña pero ésta cambia antes de que pueda utilizarla, el cambio de contraseñas habrá evitado el peligro. Podemos configurar las cuentas para que requieran un cambio de contraseña periódico; si utilizamos esta configuración, una cuenta dejará de aceptar accesos tras un periodo en caso de que la contraseña no se cambie cada cierto tiempo (podemos configurar avisos a los usuarios cuando se acerque este momento). Es una opción apropiada para sistemas sensibles o con muchos usuarios, pero no debemos configurar un tiempo de expiración demasiado corto, pues si los usuarios tienen que cambiar la contraseña con demasiada frecuencia, es probable que alternen entre un par de contraseñas o escojan contraseñas pobres. En la mayoría de sistemas, un periodo para el cambio de entre uno y seis meses resulta razonable, pero en otros puede ser más largo o más corto.

Herramientas para administrar contraseñas

La mayoría de distribuciones utilizan contraseñas ocultas por defecto. Además de proporcionar seguridad cifrando las contraseñas en el fichero /etc/shadow, las contraseñas ocultas incorporan información adicional sobre la cuenta. Una de las ventajas de estas contraseñas es que incluyen funcionalidades de vigencia de contraseñas y expiración de cuenta, lo que permite implementar cambios de contraseña en intervalos regulares o desactivar automáticamente una cuenta tras un periodo de tiempo especificado. Podemos activar estas funcionalidades y definir los tiempos utilizando el comando chage.

La utilidad usermod se puede utilizar para ajustar algunas características de las contraseñas ocultas, como la fecha de expiración de la cuenta. El comando chage es más completo en lo referente a la seguridad de las cuentas, pero usermod puede ajustar más características de otro tipo.

Limitar el acceso a root

Como root puede hacer cualquier cosa en el ordenador, debemos limitar el acceso a esta cuenta. En un sistema con un único administrador, esto se hace definiendo una contraseña para root que sólo conozca el administrador. Después, podremos acceder directamente como root o utilizar su. El nombre de este comando viene de switch user y se utiliza para cambiar la identidad aparente de un usuario. Si sólo escribimos su, se nos preguntará la contraseña de root, si la escribimos correctamente, la sesión se convertirá en una sesión de root. Podemos escribir un nombre de usuario detrás de su para obtener los privilegios de dicho usuario. Si esto lo hace root, no se le exige contraseña. La opción -c nos permite ejecutar un único programa con privilegios de root, por ejemplo,

su -c “lsof -i” para ejecutar lsof -i como root.

Acceder directamente como root está normalmente desaconsejado por varios motivos: no deja ningún rastro en los ficheros de registro acerca de quien escribió la contraseña, que se puede interceptar de varias maneras;  si el usuario abandona la terminal, cualquiera podría hacerse con el ordenador. Utilizar su es algo mejor que acceder directamente, ya que su uso suele dejar una indicación en el registro del sistema sobre quién se convirtió en root.

Un método algo más seguro que el acceso directo o su para obtener acceso como root es el programa sudo, que ejecuta un único comando como root, por ejemplo, para ejecutar lsof -i como root,escribiremos:

sudo_lsof_i_2

El ordenador pregunta por la contraseña del usuario, no por la de root. La idea de sudo es que primero se configure el ordenador para aceptar a determinados usuarios como usuarios de sudo, para después poder utilizar sus propias contraseñas para realizar tareas de super usuario, aunque no conozcan la contraseña de root. También podemos especificar qué tareas pueden realizar los usuarios a través del fichero de configuración /etc/sudoers. visudoque es una variante de vi que permite editar este fichero de una forma segura. Para más información podemos recurrir al manual del programa con MAN visudo.

/etc/sudoers consta de dos tipos de entradas: alias y especificaciones del usuario. Los alias son variables y pueden utilizarse para definir grupos de comandos, grupos de usuarios, etc. Las especificaciones de usuarios vinculan usuarios con máquinas y comandos, posiblemente utilizando alias para algunas o todas las opciones. Por tanto, podemos configurar sudoers de manera que nombre_usuario pueda ejecutar programas de red con privilegios de root,pero no las herramientas de mantenimiento de cuentas, mientras que otro usuario podrá ejecutar herramientas de mantenimiento de cuentas pero no programas de red. Probablemente /etc/sudoers incluya varios ejemplos.

Consideremos las siguientes líneas

acceso_root

Este ejemplo define dos alias de comandos, STORAGEPROCESSES. Los usuarios que sean miembros del grupo sys pueden utilizar ambos, los usuarios miembros del grupo disk podrán utilizar los comandos STORAGE pero no los PROCESSES, los miembros del grupo wheel pueden utilizar todos los comandos del sistema.

Hay distribuciones como Ubuntu que hacen un uso intensivo de sudo, son distribuciones pensadas para administrarlas exclusivamente con sudo y la configuración del fichero /etc/sudoers, que proporciona al menos un usuario con fácil acceso a todas las utilidades del sistema. Otras distribuciones que no se basan en sudo permiten alterar su configuración para activar la administración empleándolo.

Definir los límites de acceso, procesos y memoria

A veces es deseable imponer límites al número de veces que los usuarios pueden acceder, cuánto tiempo de CPU pueden consumir, cuánta memoria pueden utilizar, etc. Es preferible realizar estas restricciones mediante un módulo PAM (módulo de autenticación conectable) llamado pam_limits. La mayoría de distribuciones utilizan este módulo como parte de su configuración PAM estándar, por lo que es posible que no necesitemos instalarlo; sin embargo, tendremos que configurar pam_limits mediante el fichero /etc/security/limits.conf, que contiene comentarios y líneas de límites que constan de cuatro campos:

domain (dominio)  type (tipo)  item (elemento)  value (valor)

limites_acceso
Cada uno de estos campos especifica un tipo particular de información:

El dominio.- describe la entidad a la que se aplica el límite, puede ser un nombre de usuario, un nombre de grupo (que tendría la forma @nombregrupo) o un asterisco (*), que coincide con todo el mundo.
Límites estrictos o flexibles.- tipo especifica el límite como hard (estricto) o soft (flexible). El límite estricto lo impone el administrador del sistema y no se puede rebasar bajo ninguna circunstancia; el límite flexible puede ser excedido temporalmente por un usuario.  Un guión (-) indica que un límite es tanto estricto como flexible.
El elemento limitado.- elemento especifica qué tipo de elemento se limita, entre ellos están core (tamaño de los ficheros del núcleo), data (tamaño del área de datos de un programa),  fsize (tamaño de los ficheros creados por el usuario), nofile (número de ficheros de datos abiertos), rss (tamaño de proceso residente), stack (tamaño de la pila), cpu (tiempo de CPU de un único proceso en minutos), nproc (número de procesos concurrentes), maxlogins (número de accesos simultáneos) y priority (prioridad de acceso). Los elementos data, rss y stack están todos relacionados con la memoria consumida por un programa. Estas y otras medidas de capacidad de datos se miden en KB.
El valor.- el campo final especifica el valor que se aplica al límite.

Como ejemplo, consideremos un sistema en el que determinados usuarios deberían poder acceder y realizar un número limitado de acciones, pero no permanecer indefinidamente y consumir grandes cantidades de tiempo de CPU. Podríamos utilizar una configuración como la siguiente:

ejemplo_limites

Con esta configuración aplicamos un límite de CPU de dos minutos al grupo limited, sus miembros podrán acceder y ejecutar programas, pero si uno de estos programas consume más de dos minutos de tiempo de CPU, se cerrará.

tux_maestro_derEl tiempo de CPU y el tiempo total de acceso al sistema son dos cosas completamente diferentes. El tiempo de CPU se calcula en función a la cantidad de tiempo que la CPU está procesando activamente los datos del usuario. El tiempo de inactividad (por ejemplo, cuando la consola del usuario está activa pero no hay en ejecución tareas que hagan uso intenso de la CPU) no cuenta. En consecuencia, un usuario puede acceder y permanecer en el sistema durante horas con un límite estricto de tiempo de CPU muy bajo. Este límite está pensado para evitar problemas causados por los usuarios que ejecutan programas que hacen uso constante de la CPU en sistemas que no se deberían utilizar para tales fines.

 Otra manera de definir los límites es a través del comando ulimit, que es nativo de bash, por lo que sólo afectará a bash y a los programas iniciados desde éste. Su sintaxis es la siguiente:

ulimit_1

Las opciones definen lo que se está limitando:

  • Límites de los ficheros del núcleo: -c limita el tamaño de los volcados del núcleo, que son ficheros creados cuando se depuran determinados tipos de fallo de programa.
    ulimit_f
  • Límites de fichero: -f  limita el tamaño de los ficheros que puede crear la consola y -n limita el número de los descriptores de fichero abiertos (la mayoría de sistemas no respetan los límites de -n).
    ulimit_fn
  • Límites de proceso: -u limita el número de procesos que puede ejecutar un usuario y -t limita el tiempo total de CPU en segundos.
    ulimit_ut
  • Límites de memoria: -v define la cantidad total de memoria virtual disponible para la consola, -s define el tamaño máximo de la pila, -n define el tamaño máximo del conjunto residente, -d limita el tamaño del conjunto de datos de los programas y -l define el tamaño máximo que se puede bloquear en la memoria.
    ulimit_vs
  • Límites estrictos y flexibles: -H y -S modifican las opciones haciendo que se definan como límites estrictos o flexibles. Los límites estrictos no se pueden incrementar, pero los flexibles sí. Si no indicamos ninguna opción, ulimit define ambos límites con el valor especificado.
    ulimit_hs
  • Parámetros actuales: -a hace que ulimit informe sobre sus parámetros actuales.
    ulimit_a

El limite suele ser un valor numérico asociado al límite. ulimit suele aparecer en los scripts de inicio de usuario de bash o en los del sistema, generalmente como ulimit -c 0, para evitar la creación de ficheros del núcleo que pueden crear desorden en el sistema de ficheros. Si los usuarios desarrollan software, es aconsejable no definir este límite, o, al menos, hacerlo como límite flexible (como ulimit -Sc 0) para que los usuarios puedan invalidarlo cuando sea necesario. Como ulimit es un comando nativo de bash, su utilidad como herramienta de seguridad del sistema es limitada:  los usuarios tienen acceso a herramientas GUI de acceso o pueden acceder al sistema saltándose bash  de algún modo (por ejemplo, mediante ssh). Por consiguiente, deberíamos considerar a ulimit como un medio para prevenir problemas debidos a un abuso accidental, más que intencionado, del sistema.

El fichero /etc/nologin aplica un concepto de seguridad particularmente radical. Si se encuentra presente, sólo root puede acceder al ordenador. En muchos aspectos, esto equivale a definir un valor cero para los límites críticos del sistema para todos los usuarios. Este fichero, probablemente, sea más útil en sistemas de servidores dedicados que no poseen usuarios de consola locales o remotos.

Localizar ficheros SUID/SGID

Los bits SUID y SGID (descrito en la sección Bits de permisos especiales) son indicadores especiales que se pueden aplicar a los ficheros de programa ejecutables, haciendo que Linux trate el programa como si lo ejecutara el propietario del fichero (SUID) o el grupo del fichero (SGID) en lugar de la persona que realmente lo ejecuta. Por ejemplo, si el bit SUID se define en un programa y su propietario es bruce, cuando cualquiera ejecute este programa, esa persona podrá acceder a todos los ficheros cuyo propietario sea bruce.SUID

Los bits SUID y SGID se asocian frecuentemente con la cuenta root para permitir realizar tareas que requieran un privilegio especial. Por ejemplo, el programa passwd tiene SUID de root, ya que sólo este usuario puede modificar la base de datos de contraseñas de Linux. Si un usuario normal quiere cambiar una contraseña, debe existir un mecanismo para ejecutar un proceso como root; este mecanismo, en el caso de passwd, es el bit SUID.

El problema de todo esto es que estos bits pueden suponer un riesgo para la seguridad. Por ejemplo, supongamos que tengamos definido el bit SUID del programa rm. El propietario suele ser root,  por lo que definir el bit SUID en rm implica que cualquier usuario podría borrar cualquier fichero del sistema. Ninguna distribución define este bit para rm por defecto, debemos tener cuidado para no definirlo de manera inadecuada, algo que puede ocurrir por accidente, por malicia o debido a algún ligero error de configuración del mantenedor de la distribución. Incluso en el caso de que los bits de SUID y de SGID se definan correctamente, un bug del programa puede volverse más serio debido a que el bug se ejecute como root, si permite a los usuarios escribir ficheros, por ejemplo, cualquiera podría aprovecharse de ello para sobrescribir ficheros críticos del sistema.

Deberíamos revisar periódicamente el sistema para localizar todos los programas SUID o SGID y, si fuera preciso,cambiar su configuración. Para ello utilizaremos el comando find junto con la opción -perm modo, que busca ficheros que tengan el modo de permiso especificado. Para buscar ficheros SUID y SGID deberíamos pasarle el modo +6000. La representación simbólica de los bits SUID y SGID es 6000 y el signo de la suma (+) le dice a find que localice cualquier fichero que tenga definido cualquiera de los bits especificados (podríamos buscar sólo los ficheros SUID pasándole +4000 o sólo por SGID pasándole +2000). Puede que también necesitemos pasarle -type f, que restringe la búsqueda a los ficheros normales, ya que los directorios utilizan los bits SUID y SGID de manera diferente. Por tanto, para buscar en todo el ordenador programas SUID y SGID escribiremos lo siguiente:

find_ejemplo

El resultado es una lista de ficheros, uno por línea, que tienen definidos los bits SUID o SGID. Probablemente, en esta lista aparecerán los programas su, ping, mount, passwd, umount y sudo, todos ellos necesitan estar configurados de esta manera. La mayoría de sistemas poseen programas SUID y SGID adicionales. Si tenemos dudas de si un programa realmente necesita este status, deberíamos investigarlo verificando la integridad del paquete o buscando en internet el nombre del programa y SUID o SGID. También podemos probar a cambiar el estado SUID del programa utilizando chmod y ver si éste continúa funcionando correctamente cuando lo ejecuta un usuario normal.

tux_maestro_derLos programas que tienen el SUID o SGID de root pero no deberían tenerlo, pueden ser una señal de que el sistema está comprometido. Por consiguiente, si localizamos tales programas, deberíamos investigar la integridad global del sistema. Por otra parte, si el mantenedor de la distribución define incesantemente el bit SUID o SGID, esto no debe ser motivo de preocupación, aunque es recomendable corregir este detalle. Si realizamos accidentalmente una configuración errónea, no causará un trastorno masivo en el sistema, pero tendremos que investigar para aclarar si tal cambio es accidental o es síntoma de un problema más grave.

Anuncios