Seguridad en Linux
Contenido
Introducción
Conceptos
Políticas de Seguridad
Planificación de las necesidades de seguridad
Análisis de Riesgo
Análisis de Costo-Beneficio
Políticas de Seguridad
Implementación
Auditoria y respuesta ante incidentes
Grupos y usuarios en Sistemas tipo UNIX
Cuentas de Usuario
El fichero “/etc/passwd”
Identificador de usuario (UID, User
IDentificator)
Grupos
El fichero
“/etc/group”
Identificador de
grupo (GID, Group IDentificator)
Contraseñas
Usuarios
especiales: el superusuario
El comando su
Seguridad
en los sistemas de ficheros
El árbol de directorios
Permisos
Permisos de Ficheros y directorios
Permisos en Sistemas tipo UNÍS
SUID Shell Scripts
Enlaces
Verificar la integridad con tripwire
Seguridad en Red
Inetd
Nmap
INTRODUCCIÓN
Las dos definiciones de seguridad informática más conocidas y utilizadas
son:
"Un ordenador es seguro si podemos contar con que su hardware y su
software se comporten como se espera de ellos."
Se dice que un sistema se
encuentra en optimas condiciones para operar cuando se cumplen los siguientes
tres puntos fundamentales:
Þ
Confidencialidad
Þ
Integridad
Þ
Disponibilidad
La Seguridad de Sistemas se divide en varios campos de aplicación, los
más destacados son:
Técnicas de Seguridad (Firewalls, routers,
proxys, DMZ, backups etc.)
Þ
Actualización
de vulnerabilidades.
Þ
Seguridad Física.
Þ
Políticas de Seguridad y Plan de Contingencia
(Factor Humano)
Þ
Virus Informáticos
Þ
Criptografía
Þ
Seguridad Informática Forense.
Políticas de seguridad
Es importante considerar el establecimiento de
políticas de seguridad a la hora de estudiar la seguridad de un sistema
informático. Debido a esto, resumiremos los conceptos más relevantes de las
políticas de seguridad.
La planificación de las políticas de seguridad se
dividen en seis etapas diferentes:
Ø
Planificación
de las necesidades de seguridad:
Existen diferentes clases de seguridad, por lo
que, dependiendo del tipo de sistema, habrá que dar mayor o menor importancia a
las que tengan más relevancia:
Confidencialidad: Impedir el acceso a la información a usuarios no
autorizados.
Integridad de los datos: Evitar el borrado o alteración
indeseados de la información, incluidos los programas.
Disponibilidad: Asegurar que los servicios estén siempre
disponibles para un usuario autorizado.
Consistencia: Asegurar que el sistema se comporta como esperan
los usuarios autorizados; imagine lo que ocurriría si el comando ls
borrara archivos de vez en cuando en lugar de listarlos.
Control: Reglamentar el acceso al sistema, de forma que
programas e individuos no autorizados y desconocidos no alteren el normal
funcionamiento del sistema.
Auditoria: Determinar qué se hizo, quién lo hizo y qué fue
afectado. Para esto es necesario llevar un registro inexpugnable de todas las
actividades realizadas en el sistema y que identifica de forma no ambigua a los
usuarios que las llevaron a cabo.
Ø
Análisis
de riesgos:
Trata de responder a tres preguntas: ¿qué se debe
proteger?, ¿contra qué debe protegerse?, ¿cuánto se está dispuesto a invertir
para obtener una protección adecuada?. Para responder a estas preguntas, el
análisis de riesgos se divide en tres etapas:
Þ
Identificación
de los activos.
Þ
Identificación
de las amenazas.
Þ
Cálculo
de los riesgos.
Ø
Análisis
de costo-beneficio:
Consiste en asignar un costo a cada riesgo, y
determinar el costo de defenderse. De esta manera se puede decidir qué medidas
hay que adoptar para proteger los activos. Este aspecto no lo desarrollaremos
por que no entra en el ámbito de este estudio.
Ø
Políticas
de seguridad.
Las políticas sirven para definir qué se
considera valioso y especifican qué medidas hay que tomar para proteger esos
activos.
Deben aclarar qué se está protegiendo, establecer
la responsabilidad de la protección y poner las bases para resolver e
interpretar conflictos posteriores. No se debe hacer una lista de riesgos
específicos, computadoras o individuos por nombre. Deben ser generales y no
variar mucho a lo largo del tiempo.
Ø
Implementación:
Consiste en aplicar lo antes mencionado
conjuntamente con las herramientas provistas por cada plataforma para proteger
el sistema que se desea proteger.
Ø
Auditoría
y respuesta ante incidentes:
Se trata de saber, en un momento cualquiera;
quién, cuándo y cómo intentaron acceder o accedieron a parte o a toda nuestra
información contenida en la computadora, en el caso en que hayan accedido se
pretenderá saber que cambios sufrió la información y los datos supuestamente
protegidos además se establecerá en que punto falló nuestro sistema o en qué
punto es vulnerable para posteriormente reparar ese error.
Las cuentas de usuario son el primer objetivo de
cualquier atacante, su finalidad suele ser casi siempre esta, penetrar en el
sistema consiguiendo apoderarse de una cuenta de usuario (preferentemente la
del root). Después pueden robar, destruir o falsificar datos o
simplemente dejar una nota, pero el daño ya está hecho, la seguridad del
sistema se ha visto comprometida.
La identificación en los sistemas UNIX se realiza
mediante un nombre de usuario (login) y la autentificación mediante contraseñas
(password). Los nombres de usuario se conocen también como nombres de cuenta.
Para iniciar una sesión en un sistema tipo UNIX, es necesario conocer tanto el
nombre de usuario como la contraseña correspondiente.
De esta manera, el usuario queda totalmente
autentificado y obtendrá un interprete de comandos (shell) desde el que
podrá realizar diferentes tareas. Otra posibilidad es que el servidor disponga
de un entorno de trabajo en modo gráfico (X-Window), en ese caso el proceso de
autentificación se realiza de idéntica manera, con la única diferencia de que
el usuario obtendrá un entorno gráfico de trabajo en lugar del shell habitual.
Los nombres de usuario estándar en UNIX tienen
una longitud que puede ir de 1 a 8 caracteres. Estos nombres deben ser únicos
en una misma computadora, puesto que deben identificar al usuario de forma
inequívoca Las contraseñas en sistemas tipo UNIX tradicionalmente tenían una
longitud de entre 1 y 8 caracteres, aunque algunas versiones comerciales
permiten contraseñas mas largas. El uso de contraseñas mas largas implica una
mayor seguridad, por que son más difíciles de adivinar. La contraseña no debe
ser obligatoriamente única para cada usuario, varios usuarios pueden tener, de
hecho, la misma contraseña, aunque de ser así, esto indicaría que estos
usuarios han elegido una mala contraseña.
La elección de las contraseñas, así como las
posibles restricciones que se pueden establecer sobre ellas, es de vital
importancia a la hora de evitar intrusiones en el sistema
Ø
El
archivo /etc/passwd
En los sistemas tipo UNIX, la información sobre
las cuentas de usuario se almacenan en una base de datos localizada en el
archivo /etc/passwd. Esta es un fichero de texto en el que los
diferentes registros se encuentran separados por el carácter dos puntos (:).
Se puede emplear el comando cat para
visualizar el contenido del fichero passwd. A continuación se puede ver
una muestra de un archivo típico como ejemplo:
root:o8o7aSVh13nLD:0:0:root:/root:/bin/bash
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
adm:*:3:4:adm:/var/adm:
lp:*:4:7:lp:/var/spool/lpd:
mail:*:8:12:mail:/var/spool/mail:
news:*:9:13:news:/var/spool/news:
uucp:*:10:14:uucp:/var/spool/uucp:
operator:*:11:0:operator:/root:
ftp:*:14:50:FTP
User:/home/ftp:
nobody:*:99:99:Nobody:/:
manurod:EH5/.mj7J5dFh:501:100:Manuel Rodríguez:/home/alumnos/manurod:/bin/bash
maripet:aCq87MCñ03c9e:502:100:Mario
Petru:/home/alumnos/maripet:/bin/bash
javitup:md0mHM86yn3aW:503:100:Javier
Tup:/home/alumnos/javitup:/bin/bash
Algunas de las cuentas del ejemplo son cuentas
del sistema como root, daemon o apm. El resto son cuentas de usuario regulares
del sistema como manurod, javitup, maripet.
Las cuentas que tienen un * en al campo de la
contraseña no pueden ser utilizadas para iniciar una sesión desde un terminal,
es necesario utilizar la orden su. Son cuentas de sistema (en ocasiones
usuarios 'castigados'), que poseen archivos, a veces muy importantes, que
realizan tares administrativas o dan servicios.
Cada campo individual del archivo passwd
posee un significado directo. En la siguiente tabla se explica el significado
de una de las líneas del ejemplo:
|
Campo |
Contenido |
|
Manurod |
Nombre de usuario |
|
EH5/. mj7J5dFh |
Contraseña cifrada del usuario |
|
501 |
Numero de identificación del usuario (UID) |
|
500 |
Numero de identificación de grupo del usuario
(GID) |
|
Manuel Rodríguez |
Nombre completo del usuario |
|
/home/alumnos/manurod/ |
Directorio base del usuario |
|
/bin/bash |
Interprete de comandos del usuario |
La contraseña se guarda cifrada.
En la actualidad, muchas organizaciones poseen
grandes redes de tipo cliente-servidor que contienen muchos servidores y
una gran cantidad de estaciones de trabajo. Normalmente es deseable que los
usuarios entren en cualquiera de estas computadoras, y que lo hagan con el
mismo nombre de usuario y la misma contraseña. Esto conlleva que cada usuario
tenga una cuenta en cada estación de trabajo.
Este requisito hace que sea extremadamente
difícil mantener la coherencia entre las bases de datos de usuarios de todas
las computadoras. Para lograr esto se utilizan diversos paquetes de software
que proporcionan el contenido del fichero /etc/passwd a toda la red.
Algunos de estos sistemas son:
Þ
Network
Information System (NIS:Sistema de Información para la Red) de Sun
Microsystems.
Þ NIS+ de Sun
Microsystems
Þ
Distributed
Computing Environment (DCE: Ambiente de Computación Distribuido) de Open
Software Foundation.
Þ NetInfo de
NeXT Computers
Todos estos sistemas toman la información, que
por lo general, está almacenada en cada estación de trabajo y la ponen en una o
más computadoras que se usan como servidores de red. Al usar estos sistemas, ya
no se puede usar simplemente el comando cat, sino que hay que utilizar
una instrucción especifica para cada sistema para ver el contenido del archivo /etc/passwd.
El servicio NIS de Sun complementa la información
almacenada en los archivos de las estaciones de trabajo. Por lo tanto, para ver
la lista completa de las cuentas de usuario, es necesario listar el contenido
del archivo passwd local y además utilizar la siguiente instrucción:
% ypcat passwd
El servicio NIS+, también de Sun, se puede
configurar para complementar y sustituir sus entradas sobre cuentas de usuario
en lugar de las que están en el archivo passwd local, dependiendo del
contenido del archivo /etc/nsswitch.conf. Para ver la lista de usuarios
bajo NIS+ hay que utilizar el comando niscat y especificar el dominio de
NIS+. Por ejemplo: % niscat -o passwd.dominio
En las computadoras que ejecutan NetInfo, el
archivo local no se toma en cuenta y en su lugar se usa la versión de red. Por
ejemplo, para ver las cuentas de usuario, si se usa NetInfo, hay que escribir:
% nidump passwd /.
Las computadoras que usan DCE emplean una base de
datos de red cifrada como alternativa a las contraseñas cifradas y al archivo /etc/passwd.
Muchos administradores no utilizan sistemas de
administración de bases de datos en red porque temen que la seguridad se vea
comprometida. Estos temores provienen del hecho de que la configuración de
estos sistemas es, en ocasiones, muy complicada y los protocolos que utilizan
pueden no ser particularmente resistentes a ataques. Es una práctica habitual
entre los administradores mantener simplemente un archivo central con la
información de los usuarios y copiarlo de forma periódica en las computadoras
remotas. El inconveniente que se presenta es que con frecuencia el
administrador tiene que cambiar manualmente contraseñas de usuarios. En
general, es preferible aprender a dominar la configuración de estos sistemas y
luego colocar otras medidas defensivas como es el caso del cortafuegos
(firewall).
Ø
Identificador
de usuario (UID, User Identificación)
El UID es un número entero real de 16 bits (de 0
a 65535). Los primeros UID se usan principalmente para funciones del sistema.
Para las personas, normalmente empiezan en el 20, el 100 o el 500. Es habitual
asignar el UID dependiendo del grupo primario del usuario: los usuarios del
grupo 500 tendrán los UID 501, 502, 503, y así sucesivamente. Algunas versiones
de UNIX permiten ahora UID de 32 bits. En las versiones antiguas de UNIX los
UID son enteros de 16 bits con signo (de -32768 a 32767).
UNIX utiliza el archivo /etc/passwd para
almacenar la correspondencia entre el nombre de cada usuario y su UID. El UID
de cada usuario se guarda en el tercer campo, después de la contraseña cifrada.
Esta es una línea del ejemplo anterior:
manurod:
EH5/.mj7J5dFh:501:100:Manuel Rodríguez:/home/alumnos/manurod:/bin/bash
Aquí se puede ver que el UID de manurod es
501.
El UID es la información real que utiliza el
sistema operativo para identificar al usuario. Los nombre de usuario son solo
una comodidad para nosotros. Si dos usuarios tienen el mismo UID, UNIX los
trata como si fueran el mismo usuario, aunque tengan nombres y contraseñas
distintos. Dos usuarios con el mismo UID pueden leerse y borrarse archivos
libremente el uno al otro, así como suspenderse los programas que ejecuten.
Asignar a dos usuarios el mismo UID es, por lo general, una mala idea, salvo
algunas excepciones.
Ø
Grupos
Todos los usuarios de UNIX pertenecen a uno o más
grupos. El administrador del sistema puede utilizar los grupos para definir
conjuntos de usuarios que tendrán permiso de leer, escribir y/o ejecutar
ciertos archivos, directorios o dispositivos.
Cada usuario pertenece a un grupo primario, que
se anota en el archivo /etc/passwd. El GID del grupo primario de un
usuario aparece después del UID del usuario.
Los grupos permiten manejar cómodamente a varios
usuarios de alguna manera. Por ejemplo, tal vez se quiera abrir un grupo para
un equipo de estudiantes que trabajan en un proyecto y permitirles a ellos y
sólo a ellos leer y modificar los archivos del equipo.
Los grupos también se usan para restringir el
acceso a la información confidencial o aplicaciones con licencias especificas.
Por ejemplo, en muchas computadoras que usan UNIX, solamente se permite examinar
el contenido de la memoria del kernel del sistema a ls usuarios que pertenecen
al grupo kmem. El grupo ingres se usa normalmente para quienes
están registrados como usuarios del programa comercial del manejo de bases de
datos Ingres.
Algunas versiones especiales de UNIX permiten
usar CAO o Controles de Acceso Obligatorio (MAC: Mandatory Access Controls),
los cuales controlan el acceso mediante etiquetas en los datos, además o en
lugar de los controles tradicionales CAV o Controles de Acceso Voluntario (DAC:
Discretionary Access Controls) de UNIX . Los sistemas que se basan en CAO/CAV
(MAC/DAC) no emplean los grupos tradicionales de UNIX. En su lugar, los valores
de los GID y el archivo /etc/group se pueden usar para especificar
etiquetas de seguridad para el control de acceso o bien para apuntar a listas
de capacidades.
Ø
El
archivo /etc/group
El archivo /etc/group contiene la base de
datos con todos los grupos que hay en la computadora y sus GID
correspondientes. Su formato es similar al archivo /etc/passwd.
He aquí una muestra de archivo /etc/group
que pertenece a un sistema típico:
root:*:0:root
bin:*:1:root,bin,daemon
daemon:*:2:root,bin,daemon
sys:*:3:root,bin,adm
adm:*:4:root,adm,daemon
lp:*:7:daemon,lp
kmem:*:9:
wheel:*:10:root,javitup
mail:*:12:mail
news:*:13:news
uucp:*:14:uucp
ftp:*:50:
users:*:100:
floppy:*:19:
cdwriter:*:500:manurod
pppusers:*:44:maripet
La primera línea define el grupo root. Los
campos se detallan en la siguiente tabla:
|
Campo |
Contenido |
|
Root |
Nombre de grupo |
|
* |
Contraseña de grupo (cifrada) |
|
0 |
Numero de identificación del grupo (GID) |
|
Root |
Lista de usuarios miembros del grupo |
Los usuarios que aparecen en el archivo /etc/group
pertenecen a los grupos que se indican, además de pertenecer a sus grupos
primarios los cuales se indican en el archivo /etc/passwd. Por ejemplo, manurod,
maripet y javitup pertenecen al grupo users a pesar de no
aparecer explícitamente en el archivo /etc/group porque su grupo
primario es el 100. En algunas versiones de UNIX, se puede ejecutar el comando groups
o id para ver la lista de grupos a los que se pertenece.
Ø
Identificador
de grupo (GID)
Todos los usuarios de UNIX pertenecen a uno o más
grupos. Al igual que las cuentas de usuario, los grupos tienen un nombre de
grupo y un número de identificación de grupo (GID). Usualmente, los valores de
los GID también son enteros de 16 bits.
Análogamente al UID, el GID representa al grupo
en el sistema, y no su nombre. Los grupos permiten agrupar a varios usuario que
posean el mismo grupo primario (campo GID del archivo /etc/passwd) o que
aparezcan en el archivo /etc/group.
Las versiones de UNIX de AT&T anteriores a
SVR4 sólo permitían que un usuario estuviera en un grupo a la vez. Para cambiar
de grupo había que usar el comando newgrp. Cuando un usuario intentaba
acceder a un archivo sobre el que tenía permiso por pertenecer al mismo grupo,
se le denegaba el acceso si, en ese instante, el usuario no estaba en ese mismo
grupo. Por eso debía usar el comando newgrp.
En la actualidad, los usuarios pertenecen a todos
los grupos en los que aparecen en el archivo /etc/group a la vez. El
sistema operativo chequea todos los grupos a los que pertenece el usuario para
comprobar sus derechos de acceso. Aun así, el comando newgrp sigue
teniendo cierta importancia. Si un usuario quiere que sus archivos tengan un
grupo (GID) en especial de entre los que posee, debe utilizar el comando newgrp
en cada archivo para cambiarlos de grupo. Esto puede ser un poco pesado, si
está generando muchos archivos, así que puede cambiar de grupo con newgrp,
de forma que todos los archivos que genere tengan el nuevo GID.
Ø
Contraseñas
Para autentificar a un usuario, este debe
demostrar su identidad. Existen tres maneras por la que un usuario puede
autentificarse ante el sistema. Puede usarse una o varias de estas a la vez:
Þ
Se puede
indicar algo que se sabe (por ejemplo, una contraseña)
Þ
Se puede
mostrar algo que se tiene (por ejemplo, una tarjeta)
Þ
La
computadora puede considerar alguna característica personal (por ejemplo, una
huella dactilar).
Ninguno de estos sistemas es infalible. Alguien
puede robar la contraseña 'husmeando' la línea de un terminal, puede robar la
tarjeta en un atraco, y si tiene un cuchillo, quizás pueda obtener una huella
dactilar. En general, cuanto más confiable sea la forma de identificación, más
complicada será de usar, y más agresivo deberá ser el agresor para violarla.
Las contraseñas son el sistema de autentificación
más simple: son un secreto que se comparte con la computadora. Al iniciar la
sesión, se escribe la contraseña para demostrar a la computadora de quién se
trata. La computadora asegura que la contraseña corresponde al nombre de
usuario que se ha especificado. Si corresponde, se puede continuar.
En el sistema UNIX no se despliega la contraseña,
es decir, no se escribe en el terminal a medida que se teclea. Esto proporciona
protección adicional si alguien está mirando por encima del hombro del que
escribe. Esto puede parecer trivial, pero constituye la primera medida de
seguridad.
Las contraseñas son la primera línea de defensa
de UNIX contra los extraños que quieren penetrar en el sistema. Aunque se puede
penetrar en el sistema o robar información a través de la red sin abrir una
sesión, muchas intrusiones se deben a contraseñas mal elegidas y mal protegidas.
En los sistemas personales de escritorio no se
usan contraseñas. La seguridad se basa en métodos físicos como paredes, puertas
y cerraduras. En algunos ambientes de confianza tampoco se usan contraseñas, la
confianza y el respeto pueden ser suficientes como medida de seguridad.
Pero cuando una computadora está conectada a un
modem y se puede acceder desde casi cualquier parte del mundo, o cuando está
conectada a una red, sobre todo Internet, entonces las contraseñas son
absolutamente necesarias. Si una cuenta de una computadora que pertenece a una
red se ve comprometida, puede poner en peligro a toda la red.
Las contraseñas convencionales han sido parte de
UNIX desde sus primeros años. La ventaja de las contraseñas es que funcionan
sin un equipo especial (como lectores de tarjeta y de huellas digitales).
En la actualidad las contraseñas convencionales
en sistemas de red (la mayoría) no son suficiente. Es necesario usar
contraseñas descartables o criptografía, o ambas.
En algunas versiones de UNIX, si alguien intenta
iniciar una sesión varias veces seguidas de forma inválida se bloquea la
cuenta. Sólo el administrador puede desbloquearla. El bloqueo protege al
sistema de quienes intentan adivinar una contraseña y avisa que alguien ha intentado penetrar en la
cuenta.
Esta táctica puede ser utilizada en ataques de
negación de servicio, para bloquear a ciertos usuarios del sistema, o
simplemente para fastidiar. En lugar del bloqueo, algunos sistemas (como Linux)
introducen un retardo mayor cada vez que se falla una conexión desde un
terminal, lo que limita los ataques de negación del servicio, cumpliendo el
mismo efecto que el bloqueo.
El cambio de contraseña es otro momento crítico.
El comando passwd, que sirve para cambiar la contraseña, solicita
primero la contraseña anterior antes de la nueva. Así se evita que alguien se
siente en un terminal abierto y cambie la contraseña. Dejar un terminal abierto
sin protección, es un fallo de seguridad bastante grave, pero, por lo general,
bastante común.
El comando passwd, también requiere que se
repita la contraseña. Esto evita que, por un error tipográfico, se cambie la
contraseña por una desconocida.
Si se recibe un correo del administrador pidiendo
que se cambie la contraseña a una determinada, se debe ignorar y avisar al
administrador. Este tipo de mensajes se envía con frecuencia a usuarios
novatos. Si se cumple la orden, puede tener consecuencias devastadoras.
Si se comete un error, o se olvida la contraseña
y se pierde el acceso a la cuenta, hay que recurrir al administrador. Este no
puede descifrar la contraseña de ningún usuario. Pero puede eliminar la
contraseña o cambiarla, (esta parece la mejor opción) sin dar la contraseña
vigente.
Uno de los fallos más habituales es asignar como
contraseña el nombre de usuario. Esta es en algunos sistemas una práctica
habitual cuando se crea un usuario. Se debe obligar al usuario a cambiar la
contraseña en la primera sesión. Si no lo hace, es probable que cualquiera que
intente entrar en la computadora no tarde más de diez minutos en conseguirlo.
En general, se deben evitar las siguientes
contraseñas:
Þ
El
nombre propio, el de la esposa o del socio
Þ
El
nombre de la mascota o del hijo
Þ
Los
nombre de amigos o compañeros de trabajo
Þ
Los
nombres de los personajes favoritos
Þ
El
nombre del jefe
Þ
El
nombre de cualquier persona
Þ
El
nombre del sistema operativo que se está utilizando
Þ
El
nombre de la computadora que se usa
Þ
El
número de teléfono o el de la matricula del coche
Þ
Cualquier
parte del DNI o número de la Seguridad Social
Þ
Cualquier
cumpleaños
Þ
Cualquier
otra información que sea fácil de averiguar (dirección, universidad, etc.)
Þ
Cualquier
forma del nombre de usuario (por ejemplo, en mayúsculas o con letras dobles)
Þ
Cualquier
palabra que aparezca en un diccionario en cualquier idioma
Þ
Nombre
propios de lugares o personas
Þ
Contraseñas
que sean una repetición de la misma letra
Þ
Patrones
simples de letras del teclado: por ejemplo, qwerty
Þ
Cualquiera
de éstos escrito al revés
Þ
Cualquiera
de éstos con un dígito al principio o al final
Þ
En
general, cualquier combinación de cualquiera de las anteriores.
El motivo de estas recomendaciones, es que uno de
los ataques más habituales consiste en conseguir el archivo /etc/passwd
de la computadora, y utilizar después un generador de contraseñas. Estos
programas (como el programa Crack) utilizan un diccionario y un archivo de
normas. En el archivo de normas se encuentran reglas para combinar las palabras
del diccionario. Así se genera una lista de posibles contraseñas que se
encriptan (el algoritmo es público) y se comparan con las contenidas en el
archivo /etc/passwd.
Ø
Usuarios
especiales: el superusuario
Además de los usuarios normales, UNIX tiene
varios usuarios especiales para propósitos administrativos y contables. Ya se
han mencionado algunos. El más importante es el root, el superusuario.
Todos los sistemas UNIX tienen un usuario
especial en el archivo /etc/passwd cuyo UID es 0. Este es realmente el
único usuario realmente especial del sistema, los demás son especiales
porque son propietarios de determinados archivos o pertenecen a determinados
grupos (que a su vez tienen archivos importantes).
La cuenta root es la identidad que usa el
sistema operativo para llevar a cabo sus funciones básicas, tales como el
inicio y la terminación de sesiones de usuario, el registro de la información
contable y la administración de dispositivos de entrada / salida. Por esta
razón, el superusuario tiene el control de casi todo el sistema operativo:
cualquier programa ejecutado por root puede eludir casi todas las
restricciones de seguridad y se desactivan casi todas las verificaciones y
advertencias.
Como se indicó en la sección sobre el
identificador de usuario (UID), dos cuentas que tengan el mismo UID son la
misma para el sistema operativo. De esta manera, cualquier cuenta que tenga el
UID 0 tiene los privilegios del superusuario. El nombre de usuario root
es simplemente convencional.
Hay que sospechar inmediatamente de cualquier
cuenta que aparezca en el sistema con UID 0 que no haya sido creada por el
administrador. Estas cuentas se añaden con frecuencia por personas que penetran
en las computadoras como una manera sencilla de obtener privilegios de
superusuario en el futuro.
La cuenta root no se ha diseñado para que
el administrador la use como cuenta personal. Debido a que se inhabilitan todas
las pruebas de seguridad para el superusuario, un error tipográfico fácilmente
puede destruir todo el sistema.
Con frecuencia el administrador de un sistema
UNIX tendrá que convertirse en superusuario para llevar a cabo funciones administrativas.
Este cambio de estado se puede lograr mediante el comando su para crear
un intérprete de comandos privilegiado. Cuando de tiene la capacidad del
superusuario se deben tomar precauciones extremas. Cuando cese la necesidad de
tener este tipo de acceso, el administrador debe cerrar el intérprete de
comandos privilegiado.
Cualquier proceso que tiene UID efectivo 0 se
ejecuta como si fuera el superusuario, es decir, cualquier proceso con UID 0 se
ejecuta sin verificaciones de seguridad y puede hacer prácticamente lo que sea.
Las verificaciones y controles de seguridad se ignoran en el caso del
superusuario aunque la mayor parte de los sistemas sí registran en las
bitácoras y auditan algunas de las acciones del superusuario.
El usuario es la principal debilidad de seguridad
del sistema operativo UNIX. Dado el privilegio del superusuario, las personas
que penetran en un sistema UNIX tratan de convertirse en el superusuario.
Para evitar este problema con el superusuario, se
ha intentado varias veces diseñar un sistema UNIX seguro (que cumpla todos los
requisitos para un sistema altamente confiable) adoptando la estrategia de
dividir los privilegios del superusuario en muchas categorías. Lamentablemente
estos intentos a menudo fallan. Casi siempre, muchos de los privilegios en los
que se divide el superusuario pueden usarse para obtener los demás. Se cambia
un gran fallo de seguridad por otros más pequeños que llevan al mismo final.
Ø
El
comando su
A veces un usuario debe tomar la identidad de
otro. Pos ejemplo si se desea acceder a archivos propios estando sentado
delante el terminal de un amigo. En lugar de cerrar la sesión del amigo e
iniciar una propia, UNIX permite cambiar temporalmente el número de
identificación de usuario. El comando que lo permite se llama su, que
son las iniciales de “substitute user” (sustituir usuario). su requiere
que se use la contraseña del usuario al que se está cambiando.
Los procesos en sistemas UNIX tienen al menos dos
identidades en cada momento. Normalmente estas dos identidades son la misma. La
primera identidad es el UID real. El UID real es la identidad verdadera y
coincide, normalmente con el nombre de usuario con el que se inició la sesión.
A veces se quiere asumir la identidad de otro usuario para acceder a algunos archivos
o ejecutar algunos comandos. Esto se puede lograr iniciando una sesión con el
otro nombre y obteniendo de esa forma un intérprete de comandos cuyo proceso
subyacente tenga un UID igual al del usuario.
Como alternativa, si sólo se desea ejecutar algunos
comandos con la identidad de otro usuario, se puede emplear el comando su
para crear nuevos procesos. Esto ejecutará otra copia del intérprete de
comandos que tendrá la identidad (UID real) del otro usuario. Para emplear el
comando su es necesario conocer la contraseña del otro usuario o ser en
ese momento el superusuario.
Si se escribe su sin un nombre de usuario,
se indica a UNIX que se quiere convertir en superusuario. Entonces se solicita
la contraseña del superusuario. Si la contraseña de root se escribe
correctamente, se ejecuta un intérprete de comandos con UID 0. Al convertirse
en superusuario, el prompt cambiará por defecto al carácter '#', lo que
recordará los nuevos poderes que se han adquirido.
Cuando se usa en comando su para
convertirse en superusuario, siempre debe usarse la trayectoria completa del
comando /bin/su. Al hacerlo así, se asegura la ejecución del comando su
auténtico y de que no se ha ejecutado algún otro comando su que se
encuentre en la trayectoria de búsqueda. Esto es una manera importante de
protegerse y proteger la contraseña del superusuario contra algún caballo de
Troya.
Es recomendable invocar al comando su con
un argumento simple en forma de guión cuando se quiere convertir en
superusuario: $ /bin/su -
De esta forma, su invoca al intérprete de
comandos de forma que este lea todos loa archivos de configuración necesarios y
simule un inicio de sesión. Esto es importante porque así se evita que la
trayectoria de búsqueda (PATH) sea la del usuario que invoco su y no la
del superusuario.
Algunas versiones del UNIX de tipo Berkeley no
permiten usar su a ninguna cuenta que no sea miembro del grupo wheel.
Sin embargo la versión de su de GNU no utiliza esta característica.
Muchas versiones registran los intentos fallidos
del comando su. Las versiones más viejas de UNIX enviaban explícitamente
a la consola los avisos de los intentos fallidos de su y también los
colocaban en el archivo /var/adm/messages. Las versiones más modernas
registran los intentos fallidos de usar su a través del programa syslog,
el cual permite enviar los mensajes que se quieran a un archivo específico o
anotarlos en bitácoras que estén en computadoras remotas a través de la red.
Una norma básica de seguridad radica en la asignación
a cada usuario sólo de los permisos necesarios para poder cubrir las
necesidades de su trabajo sin poner en riesgo el trabajo de los demás.
Ø
El
árbol de directorios
Los sistemas tipo Unix se organizan en un
único árbol de directorios. Cada soporte, disco, partición, disquete o CD tiene
su propia organización lógica, un sistema de ficheros. Para usar uno de estos
soportes se necesita
"montarlo" en un directorio existente. El contenido de la partición aparecerá como el contenido del directorio.
Un primer criterio para mantener un sistema
seguro seria hacer una correcta distribución del espacio de almacenamiento.
Esto limita el riesgo de que el deterioro de una partición afecte a todo el
sistema, la pérdida se limitaría al contenido de esa partición.
Las bases de la decisión adecuada son el uso al que vaya destinado el
sistema y la experiencia.
Ø Permisos
Linux, como sistema multiusuario, asigna un
propietario y un grupo a cada fichero (y directorio), y unos permisos al
propietario, al grupo y al resto de los usuarios. La forma más rápida de
comprobar esta característica es usar el comando Is –la, este muestra el tipo
de fichero, el propietario, el grupo, los permisos e información adicional. En
los sistemas de ficheros pensados para entornos monousuario, como msdoso
vfat, no se tiene esta característica, por lo que son inseguros y su uso no
es aconsejable bajo Linux.
Es conveniente tener claros los permisos que
se pueden asignar a un fichero o directorio. Puede que algunas aplicaciones no
funcionen bien si algún fichero no tiene el permiso o el propietario correctos,
bien por falta de permisos o bien por exceso.
Ø Permisos de ficheros y directorios
Es necesario asegurarse que los ficheros del
sistema y los de cada usuario sólo sean accesibles por quienes tienen
que hacerlo y de la forma que deben. No sólo hay que protegerse de ataques o
miradas Indiscretas, también hay que protegerse de acciones accidentales. En
general, cualquier sistema UNIX divide el control de acceso a ficheros y
directorios en tres elementos: propietario, grupo y otros. Tanto el propietario
como el grupo son únicos para cada fichero o directorio, y en
cada grupo puede haber múltiples
usuarios. Otros hace referencia a los usuarios que ni son el
propietarios ni pertenecen al grupo. Todas estas características se almacenan
en el sistema de ficheros, en particular en un i-nodo, que es un elemento que
describe las características de un fichero en disco (excepto el nombre).
Ø Permisos en sistemas tipo Unix:
Propiedad: Qué usuario y grupo posee el control de los
permisos del i-nodo. Se almacenan como dos valores numéricos, el uid (user id)
y gid (group id)
Permisos:
Bits individuales que
definen el acceso a un fichero o directorio. Los permisos para directorio
tienen un sentido diferente a los permisos para ficheros.
Þ
Lectura (r)
Fichero: Poder acceder a los contenidos de un fichero
Directorio
Poder leer un directorio, ver qué ficheros contiene
Þ
Escritura (w)
Fichero Poder modificar o añadir contenido a un
fichero.
Directorio Poder borrar o mover ficheros en un
directorio
Þ Ejecución(x)
Fichero: Poder ejecutar un programa binario o guión de
shell.
Directorio: Poder entrar en n directorio
Estos permisos se pueden aplicar a:
Þ
usuario
(u) El propietario
del fichero
Þ
grupo
(g) El grupo al
que pertenece el fichero
Þ
otros
(o) El resto de
los usuarios del sistema
Otros bits de permisos indispensables para la
seguridad:
Þ
Sticky
bit: Si está activo
en un directorio, entonces un usuario sólo puede borrar ficheros que son de su propiedad
o para los que tiene permiso explícito de escritura, incluso cuando tiene
acceso de
escritura al directorio
Þ
Atributo
SUID: (Para
Ficheros): bit que describe permisos al identificador de
usuario del fichero. Cuando el modo de acceso de ID de usuario está activo en
los permisos del propietario, y ese fichero es ejecutable, los procesos
que lo ejecutan obtienen acceso a los recursos del sistema basados en el usuario que crea el proceso (no
el usuario que lo lanza)
Þ
Atributo
SGID: (Para ficheros) Si
está activo en los permisos de grupo, este bit controla el estado de
"poner id de grupo" de un fichero. Actúa de la misma forma que SUID,
salvo que afecta al grupo. El fichero tiene que ser ejecutable para que tenga
efecto.
Þ
Atributo
SGID: (Para directorios) Si
activa el bit SGID en un directorio ( con "chmod g+s directorio"),
los ficheros creados en ese directorio tendrán puesto su grupo como el grupo
del directorio.
Permisos de acceso individuales para un
fichero: ( Normalmente un fichero tendrá una combinación):
-r—— Permite
acceso de lectura al propietario
-w------ Permite modificar o borrar el fichero al
propietario
—x——Permite ejecutar este programa al propietario,
(los guiones de shell también requieren permisos de lectura al propietario)
—s—— Se ejecutará con usuario efectivo ID =
propietario
-——s-- Se ejecutará con usuario efectivo ID =
grupo
-rw—-TNo actualiza "instante de última
modificación". Normalmente usado para ficheros de intercambio (swap)
--.t—— No tiene efecto (antes sticky bit)
Permisos de acceso individuales para un
directorio: ( Normalmente un directorio tendrá una combinación)
dr-—-— Permite listar el contenido pero no se
pueden leer los atributos.
d-x—---.
Permite entrar en el directorio y usar en las rutas de ejecución
completas.
dr-x--—- Permite leer los atributos del fichero por el
propietario.
d-wx——Permite crear / borrar ficheros.
d——x-t
Previene el borrado de ficheros por otros con acceso de escritura. Usado
en /tmp
d—s-s- No
tiene efecto
Los ficheros de configuración del sistema
(normalmente en /etc. son habituales que tengan el modo 640
(-rw-r—--), y que sean propiedad del root Dependiendo de los requisitos
de seguridad del sistema, esto se puede modificar. Nunca deje un fichero del
sistema con permiso de escritura para un grupo o para otros.
Algunos ficheros de configuración, incluyendo /etc/shadow, sólo deberían
tener permiso de lectura por root, y los directorios de /etc. no
deberían ser accesibles, al menos
por otros.
Ø SUID Shell Scripts
Los scripts de shell SUID son un serio
riesgo de seguridad, y por esta razón el núcleo no los
acepta. Sin importar lo seguro que piense que
es su script de shell, puede ser utilizado para que un cracker pueda
obtener acceso a una shell de root.
Ø Enlaces
Los sistemas de ficheros de tipo Unix permiten
crear enlaces entre ficheros.
Þ
Enlaces
Duro: consiste en asignar más de un nombre a los mismos datos en disco. No
consume más espacio adicional que el que pueda representar el nuevo nombre que
le damos a unos datos y sólo es válido para ficheros que estén en el mismo
sistema de ficheros, es decir, la misma partición.
Þ
Enlaces
simbólicos: son ficheros que apuntan a otro fichero o directorio. Crean un
nuevo fichero pequeño que contiene la ruta del fichero destino.
Ø Verificar la integridad con Tripwire
Una forma cómoda de detectar ataques locales
(y también de red) en su sistema es ejecutar un programa que verifique la
integridad de la información almacenada en los ficheros, tal como Tripwire.
El programa Tripwire ejecuta varios cheksums de todos los binarios
importantes y ficheros de configuración y los compara con una base de datos con
valores de referencia aceptados como buenos. Así se detecta cualquier cambio en
los ficheros. Es buena idea instalar tripwire un disquete y protegerlo
físicamente. De esta forma no se puede alterar trípwire modificar su
base de datos. Una vez que (trpwire ha configurado, es buena idea
ejecutarlo como parte de los deberes habituales de administración para ver sí
algo ha cambiado. Tripwire puede ser una de las mejores herramientas
para detectar intrusos antes de que tenga otro tipo de noticias de ellos. Como
son muchos los ficheros que se modifican en su sistema, debería tener cuidado
para discernir lo que es la actividad de un cracker y lo que es la actividad
normal del sistema.
Ø
Inetd
Para atender las
solicitudes de conexión que llegan a nuestro equipo existe un demonio llamado
inetd que está a la escucha de todos los intentos de conexión que se realicen a
su máquina. Cuando le llega una solicitud de conexión irá dirigida a un puerto
(número de servicio, quizás sea más claro que puerto), por ejemplo, el 80 sería
una solicitud al servidor de páginas web. Los servicios de red que presta su
máquina están descritos en /etc/inetd.conf (y en /etc/services los números de
puertos). Por ejemplo, en /etc/inetd.conf podemos encontrar las siguientes
líneas:
(...)
pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
# imap stream tcp nowait root /usr/sbin/tcpd imapd
(...)
Esto quiere decir que,
cuando llegue una solicitud de conexión al puerto 110 (pop3) se ejecutará el
programa /usr/sbin/tcpd ipop3d. Sin embargo, el servicio imap está
deshabilitado (para deshabilitar se comenta, al inicio de la línea correspondiente,
con #), por lo que el sistema no le responde.
Ø
Nmap
Según el manual, Nmap “(...) está diseñado para
permitirle a los administradores de sitema e individuales curiosos,
‘escaneara’[analizar] grandes redes para determinar que hosts se encuentran funcionando,
y que servicios (ftp,http, ssh, telnet, MySQL,etc) están ofreciendo”.
Este portscanner es
la herramienta más utilizada por toda la comunidad en internet por la razón de
que soporta muchas técnicas de análisis, a saber:
ü TCP connect
(éste es el método utilizado por defecto)
ü UDP
ü TCP SYN
(medio abierto)
ü ftp proxy
(ataque de rebote)
ü ident-reverso
ü ICMP (barrido
de ping – ECHO_REQUEST)
ü FIN
ü Barrido ACK
ü Xmas Tree
(literalmente, ‘árbol de navidad’)
ü Barrido SYN
ü Protocolo IP
ü Null Scan
(Escaneo/Análisis nulo)
Nmap tiene un gran
número de utilidades adicionales que son usadas por los administradores de
Redes, por auditores de seguridad o por hackers. Éstas utilidades son:
ü Detección del
Sistema Operativo del host a través del escaneado de huellas TPC/IP
ü
Análisis Stealth (Furtivo)
ü
Calculo de esperas y
retransmisión dinámico
ü
Análisis paralelo
ü
Detección de hosts que no
funcionan a través de pings paralelos
ü
Análisis por decoys (hosts
intermedios)
ü
Detección de puertos a través
de filtrados (por el hosts final o uno intermedio)
ü
Análisis RPC directo (no por
mapeo de puertos)
ü
Análisis de fragmentación
ü
Especificación flexible de
objetivos y puertos
Al
ejecutar Nmap se obtendrá un lista de puertos abiertos y según las opciones
especificadas en la linea de comandos informará las siguientes características
del hosts: el SO que utiliza, los nombres de los usuarios que estén ejecutando
los programas de cada puerto, el nombre DNS, y algunas otras cosas. Otra
funcionalidad interesante que trae el Nmap es que informa el numero de versión
de los programas que se están ejecutando en los puertos abiertos del hosts.
Aunque esta función es muy útil es necesario prestar atención ya que los
programas pueden estar preparados para informar un numero falso de versión para
despistar a los crackers.
![]()
Número de visitantes actuales disponible desde el 14/07/2002:
Autor: lrmdavid@exa.unne.edu.ar
Ó FACENA - http://exa.unne.edu.ar
Servicios WEB: webmaster@exa.unne.edu.ar