jueves, 15 de mayo de 2008

Seguridad de Ficheros / Sistema de ficheros

Una casa sólida necesita cimientos sólidos, si no se derrumbará. En el caso de Linux, esto es el sistema de ficheros ext2 (EXTendido, versión 2). Algo así como el standard UNIX de toda la vida. Soporta permisos de ficheros (lectura, escritura, ejecución, sticky bit, suid, guid, etc.), propiedad de ficheros (usuario, grupo, otros), y otro tipo de standards. Alguna de sus desventajas son: no se puede hacer journaling, y especialmente no hay Listas de Control de Acceso, las cuales se rumorea vendrán con el ext3. En la parte positiva, Linux tiene excelente software RAID, soportando bastante bien los Niveles 0, 1 y 5 (RAID no tiene que ver con la seguridad, pero por supuesto tiene que ver con la estabilidad).

Las utilidades básicas para interactuar con ficheros son: "ls", "chown", "chmod" y "find". Otras incluyen ln (para creación de enlaces), stat (muestra información de un fichero) y muchas más. En cuanto a la creación y mantenimiento de sistemas de ficheros por sí mismos, tenemos "fdisk" (el viejo fdisk), "mkfs" (MaKe FileSystem, que formatea particiones), y "fsck" (FileSystem ChecK, que suele arreglar problemas). De modo que, ¿qué es lo que estamos tratando de evitar que haga la gente hostil? (generalmente usuarios, y/o demonios de red alimentados con información maligna). Se puede comprometer con facilidad un sistema Linux si se consigue acceso a ciertos ficheros, por ejemplo la capacidad para leer un fichero de claves sin shadow da como resultado la posibilidad de ejecutar contraseñas cifradas contra crack, encontrando con facilidad las contraseñas débiles. Es un objetivo típico de los atacantes que vienen de la red (scripts CGI pobremente escritos suelen ser los favoritos). De otra forma, si un atacante puede escribir en el fichero de contraseñas, el o ella puede irrumpir en el sistema, o (presumiblemente peor) conseguir cualquier nivel de acceso que quiera. Este tipo de situaciones suelen estar causadas por lo general por "razas tmp", en las cuales un programa setuid (uno que se esté ejecutando con privilegios de root), escribe ficheros temporales, por lo general en /tmp , sin embargo muchos no comprueban la existencia de un fichero, y cuando se ejecuta el fichero setuid, boom, se borra /etc/passwd o incluso se le añaden entradas. Hay muchos ataques más similares a este, de modo que ¿cómo se pueden prevenir?

Es simple: configurando el sistema de ficheros correctamente cuando se instale. Dos directorios habituales a los que los usuarios tienen acceso son /tmp y /home, dividir esto en particiones separadas también evita que los usuarios llenen cualquier sistema de ficheros crítico (un / lleno es algo bastante malo). Un /home lleno podría dar como resultado la incapacidad de que los usuarios pudieran hacer un login (por eso el directorio del root está en /root). Poner /tmp y /home en particiones separadas es algo así como obligatorio si los usuarios tienen acceso al servidor, poner /etc, /var, y /usr en particiones separadas también es una muy buena idea.

Las herramientas principales para conseguir información sobre ficheros y sistemas de ficheros son relativamente simples y fáciles de usar, "df" (muestra el uso del disco) también mostrará el uso de los ínodos, "df –i" (los ínodos contienen información acerca de los ficheros tal como su localización en el disco duro, te puedes quedar sin ellos antes de quedarte sin disco duro si tienes muchos ficheros muy pequeños. Lo cual da mensajes de error del tipo "disco lleno", cuando en realidad "df" te dirá que queda espacio libre, "df –i" sin embargo mostraría los ínodos como todos usados). Esto es parecido a la reserva de entradas de ficheros de Windows, con vfat en realidad se almacenan los nombres en formato 8.3, utilizando múltiples entradas para nombres largos de ficheros, con un máximo de 512 entradas por directorio, lo cual es muy útil para averiguar dónde se ha ido todo el espacio, se usa como "du" (saca un listado de todo lo que hay en el directorio actual y por debajo de él a lo que tengas acceso) o "du /nombre/directorio", opcionalmente utilizando "-s" para sacar un sumario, lo cual es útil para directorios como /usr/src/linux. Para conseguir información sobre ficheros específicos, la herramienta principal es ls (similar al comando "dir" del DOS), "ls" sólo saca nombres de ficheros/directorios, "ls –l" muestra información como los permisos de los ficheros, el tamaño, etc., y "ls –la" muestra los directorio y los ficheros que empiezan con ".", generalmente ficheros de configuración y directorios (.bash_history, .bash_logout, etc.). La utilidad "ls" tiene una docena de opciones para ordenar, basada en el tamaño, fecha, órden inverso, etc.; "man ls" para ver todos los detalles. Para detalles sobre un fichero en particular (fecha de creación, último acceso, ínodo, etc.) está el "stat", que símplemente da información de las estadísticas vitales de un fichero(s) dado, y es muy útil para ver si un fichero está en uso, etc.

Para manipular ficheros y carpetas, están las herramientas generales como cp, mv, rm (CoPy, MoVe y ReMove, copiar, mover y eliminar), al igual que herramientas para manipular la información de seguridad. chown es responsable de cambiar la propiedad del usuario y grupo de un determinado fichero (el grupo otros es siempre otros, similar al grupo ‘todos’ de NT o Novell). chmod (CHange MODe, cambio de modo) cambia los atributos de un fichero, siendo los básicos lectura, escritura y ejecución, al igual que está el setuid, setguid (establecer la id del ususario y grupo bajo la cual se ejecuta el programa, a menudo root), sticky bit, etc. Con el uso adecuado de asignaciones de usuarios a grupos, chmod y chwon, se pueden emular las ACL’s (Listas de Control de Accesos) hasta cierto punto, pero es bastante menos flexible que los permisos para Sun/AIX/NT (aunque se rumorea que así será con ext3). Por favor, ten especial cuidado con los setuid/setgid, ya que cualquier problema en un programa/script de esos se puede agrandar enormemente.

Creo que también sería de mencionar "find". Encuentra ficheros (en esencia, lista ficheros), y también se puede utilizar con filtros basados en permisos/propiedad (también por tamaño, fecha y otros criterios diferentes). Un par de ejemplos rápidos para cazar programas setuid/guid:

para encontrar todos los programas setuid:

find / -perm +4000

para encontrar todos los programas setgid:

find / -perm +2000

La mayor parte de la seguridad son los permisos de usuarios. En Linux, un fichero es ‘propiedad’ de 3 entidades separadas, un Usuario, un Grupo y Otros (que es el resto). Se puede asignar a qué usuario pertenece un fichero y a qué grupo pertenece mediante:

chown usuario:grupo objeto

donde objeto es un fichero, directorio, etc. Si se quiere denegar el acceso de ejecución a los 3 propietarios, simplemente escribir:

chmod x=" " objeto

donde x es a|g|u|o (All/User/Group/Other), fuerza que los permisos sean igual a "" (null, nada, ningún acceso) y el objeto es un fichero, directorio, etc. Este es con mucho, el método más rápido y efectivo de eliminar permisos y denegar totalmente el acceso a usuarios/etc (=" " forzar a borrarlo). Recuerda que el root SIEMPRE puede cambiar los permisos de un fichero y ver/editar el fichero, Linux no aporta todavía protección a los usuarios sobre el root (lo cual muchos lo consideran algo bueno). Igualmente, cualquiera que sea dueño del directorio en que está el objeto (sea un usuario/grupo/otros con los permisos adecuados sobre el directorio padre) puede, potencialmente, editar los permisos (y puesto que el root es dueño de / puede hacer cambios que involucren cualquier lugar del sistema de ficheros).



Borrado seguro de ficheros

Algo que muchos de nosotros olvidamos es que cuando se borra un fichero, en realidad no se ha ido. Incluso se sobreescribe, se vuelve a formatear el disco duro o se lo intenta destruir de cualquier otra forma, hay posibilidades de que pueda ser recuperado, y por lo general, los servicios de recuperación de datos sólo cuestan unos pocos cientos de miles de pesetas, de modo que quizás les mereciese la pena a los atacantes en tiempo y en dinero. El truco consiste en desordenar los datos, alterando los bits magnéticos (alias los 1’s y 0’s) para que una vez hubiera terminado, no quedasen trazas del original (es decir, bits magnéticos cargados de la misma forma que estaban originariamente). Se han escrito dos programas (ambos llamados wipe) a tal efecto.

wipe (durakb@crit2.univ-montp2.fr∞)

wipe borra datos con seguridad, sobreescribiendo el fichero múltiples veces con varios patrones de bits, p. ej., todo 0’s, luego todo 1’s, luego alternando 1’s y 0’s, etc. Se puede utilizar wipe en ficheros o en dispositivos, si se utiliza con ficheros, hay que recordar que las fechas de creación de ficheros, permisos, etc., no serán borrados, de modo que asegúrate de borrar el dispositivo si se necesita eliminar toda traza de cualquier cosa. Se puede conseguir en: http://gsu.linux.org.tr/wipe/∞

wipe (thomassr@erols.com∞)

Este también borra datos de forma segura, sobreescribiéndolos múltiples veces, sin embargo este no soporta el borrado de dispositivos. Se puede conseguir en: http://users.erols.com/thomassr/zero/download/wipe/∞



Listas de Control de Acceso (ACL’s)

Uno de los componentes que se echan en falta es un sistema de ficheros Linux Listas de Control de Acceso (ACL’s) en lugar de los habituales Usuario, Grupo, Otros, con su docena o así de permisos. Las ACL’s te permiten un control de accesos del sistema de ficheros más afinado, por ejemplo, se puede otorgar al usuario "paco" acceso total a un fichero, a "maría" permiso de lectura, al grupo de ventas, permiso de cambio, al grupo de contabilidad, permiso de lectura, y ningún permiso para el resto. Bajo los permisos existentes para Linux, no se podría hacer esto. De aquí la necesidad de las ACL’s.

El proyecto de trustees (ACL) de Linux es una serie de parches y utilidades del kernel para configurar accesos ACL al sistema de ficheros. Esta solución es algo cutre, ya que mantiene los permisos en un fichero, y actúa como una capa de filtrado entre el fichero y los usuarios, lo cual no es un sistema basado en ACL propiamente dicho (pero es un empiece). Se puede conseguir en: http://www.braysystems.com/linux/trustees.html

No hay comentarios: