EPET N° 1 "UNESCO"

Curso Esencia Linux



Tema 5: Seguridad y Permisos de Archivos

Peso: 7

5.1: Seguridad Básica e Identificación de Tipos de Usuarios

Peso: 2

Linux es un sistema operativo multiusuario. con o el nombre sugiere, este tipo de sistema operativo permite que diferentes usuarios utilicen el sistema de modo independiente. el sea, diferentes personas pueden utilizar el mismo sistema operativo sin que sus archivos y personalizaciones estén accesibles a otros usuarios.

Diferentes usuarios pueden utilizar el sistema operativo al mesmo tempo. A pesar de no ser común que una misma computadora posea más de un teclado y monitor, es bastante común que diversos usuarios utilicen el  mismo sistema vía red.

Otra ventaja en mantener los usuarios en cuentas distintas es poder controlar sus privilegios dentro del sistema. Un usuario debe poder trabajar con sus archivos y tener acceso restricto a ciertos recursos de la computadora, pero no debe tener acceso a archivos de terceros o a recursos que pueden perjudicar el funcionamiento del sistema operativo. El único usuario que posee acceso irrestricto dentro del sistema operativo es el usuario root.

El usuario root

El principal usuario de un sistema Unix es el usuario llamado root. Es creado de manera predeterminada y es utilizado para configurar el sistema operativo y corregir eventuales problemas. También es el único usuario cuyo directorio personal no está en el directorio predeterminado de usuarios, /home, sino en la raíz del sistema de archivos, en /root.

Contraseña de root

La contraseña del usuario root normalmente se define durante la instalación del sistema operativo. En algunos casos, no es atribuida una contraseña al usuario root, y será necesario utilizar el comando sudo para realizar operaciones de root.

Debido a su permisos irrestrictos en el sistema operativo, es importante tener mucho cuidado cuando se utiliza el usuario root. Aún tratándose de una computadora personal utilizada por una sola persona, es recomendable operar la computadora con un usuario convencional.

Usuarios convencionales y de sistema

El usuario root es el responsable de crear usuarios en el sistema local. Todas las cuentas de usuario son almacenadas en el archivo de configuración /etc/passwd. El usuario root también puede asociar un usuario a un grupo para conferirle privilegios extras. Los grupos del sistema y los usuarios asociados a ellos son almacenados en el archivo /etc/group.

Todo usuario está asociado a por lo menos un grupo, llamado su grupo principal. el grupo principal es único, pero el usuario puede estar asociado a diversos otros grupos.

Cada usuario y grupo poseen un número único asociado, llamado respectivamente UID y GID. El único usuario con un número predeterminado es el root, con número UID 0. Los números de un usuario y de sus grupos pueden ser observados con el comando id. Sin  argumentos, el comando id muestra el número del usuario actual y los grupos a los que pertenece:

$ id
uid=13130(epet1) gid=207(bmac) groups=207(bmac)

En este ejemplo, el número (uid) del usuario epet1 es 13130, el número de su grupo principal (bmac) es 207 y está asociado solamente a este grupo. Los números son generados automáticamente, generalmente se atribuyen números a partir de 1000 para usuarios convencionales.

Los usuarios con unes pueden ejecutar tareas normalmente reservadas al root con el comando sudo. Por ejemplo, para utilizar el comando administrativo apt-get dist-upgrade con sudo:

$ sudo apt-get dist-upgrade

El comando sudo puede ser configurado para restringir diferentes tipos de acción a usuarios específicos, solicitando o no una contraseña. También puede ser usado con el comando su para iniciar una nueva sesión del shell con o otro usuario, con el comando sudo su usuario, donde usuario es el nombre de login del otro usuario. En caso que la cuenta de root tenga una contraseña definida, puede ser utilizado el comando su directamente:

$ su -

En este caso será necesario proporcionar la clave de root para continuar.

Además de los usuarios convencionales, existen usuarios especiales llamados usuarios de sistema. Estos usuarios no corresponden a una persona, sino a alguna tarea del sistema operativo. Este abordaje ofrece una capa adicional de seguridad, pues programas ejecutados por un usuario no pueden interferir con archivos y procesos que no le pertenecen.

Inspección de usuarios

El usuario root puede interferir en procesos de otros usuarios y modificar sus archivos. El usuario root puede incluso verificar quien está usando el  sistema con el comando who. Con el comando w el usuario root puede verificar quien está utilizando el sistema y su actividad en ese momento.

El comando lastlog muestra cuando fue la última vez que cada usuario entró al sistema:

$ lastlog -t 2
Nombre de usuario         Porta     De             Último
guillermo        pts/1    143.107.45.1     Jue Feb 27 09:14:45 -0300 2019
lucas            pts/1    143.107.45.1     Mar Feb 26 10:23:34 -0300 2019
gustavo          pts/1    143.107.45.1     Mar Feb 26 19:47:28 -0300 2019
hugo             pts/2    143.107.45.1     Mar Feb 26 19:17:22 -0300 2019
felipe           pts/1    c-73-208-7-86.hs Mar Feb 26 15:39:21 -0300 2019
silvia           pts/1    179.225.189.179  Jue Feb 27 08:57:10 -0300 2019
daniel           pts/2    189.22.15.69     Jue Feb 27 09:57:19 -0300 2019

La opción -t 2 fue utilizada para limitar la inspección a los últimos dos días. Es posible verificar de dónde el usuario ingresó al sistema y cual fue la fecha y hora exactas del login.

El comando last tiene una finalidad semejante, pero muestra los últimos ingresos de usuarios al sistema. Para verificar los últimos ingresos de un usuario específico, basta con agregar su nombre de usuario con o argumento:

$ last daniel
daniel   pts/2        189.22.15.69    Mie Feb 27 09:57   still logged in
daniel   pts/1        189.22.15.69    Mar Feb 26 17:27 - 17:32  (00:04)
daniel   pts/1        189.22.15.69    Mar Feb 26 16:29 - 17:15  (00:46)
daniel   pts/0        189.22.15.69    Mie Feb 20 16:24 - 16:27  (00:02)
daniel   pts/0        189.22.15.69    Mie Feb 20 16:24 - 16:24  (00:00)

wtmp begins Fri Feb  1 13:48:21 2019

El comando last reboot muestra cuando el sistema fue encendido por última vez, o sea, desde cuando está activo. El usuario root puede verificar también se hubo intentos infructuosos de ingreso al sistema con el comando lastb.

5.2: Creación de usuarios y Grupos

Peso: 2

En ambientes donde más de una persona utiliza la computadora o utiliza sus recursos vía red, es muy importante que cada una de ellas posea restricciones para que no con prometa datos sensibles, sean pertinentes al propio sistema o a otros usuarios. Para eso, para cada usuario se crea una cuenta con la que accederá al sistema.

Corresponde al usuario root administrar las cuentas y grupos de usuarios. Sin embargo, pude modificar algunos aspectos de su propia cuenta en el sistema.

Cuenta de usuario

El comando useradd es usado por el usuario root para crear una nueva cuenta en el sistema. Las principales opciones del useradd son:

Con la opción -k /etc/skel se pueden crear nuevos directorios personales poden a partir de un contenido preestablecido almacenado en /etc/skel. Este procedimiento facilita la creación de varias cuentas de usuario a partir de un perfil predefinido.

Para que el usuario pueda acceder a su cuenta, el administrador precisará definir una contraseña para él. Esto puede ser hecho por medio del comando passwd usuario. Usado sin argumentos, passwd modifica la contraseña para el usuario actual, algo que puede ser hecho por un usuario común. El comando passwd también puede ser utilizado por el usuario root para bloquear la cuenta de un usuario. Por ejemplo, la cuenta del usuario daniel puede ser bloqueada con  el comando passwd -l daniel. La cuenta podrá ser desbloqueada con el comando passwd -u daniel.

El campo de descripción puede ser modificado con  el comando chfn y el shell principal puede cambiarse con chsh. Los usuarios comunes pueden usar estos comandos para modificar exclusivamente sus propias cuentas.

Una cuenta de usuario puede ser eliminada con  el comando userdel. La opción -r asegura que el directorio personal del usuario también sea eliminado.

La información de la cuenta de los usuarios del sistema es almacenada en el archivo /etc/passwd, en el formato:

root:x:0:0::/root:/bin/bash
daniel:x:1000:1000:Daniel Armando Rodriguez:/home/daniel:/bin/bash

Cada usuario es definido en una linea, en campos separados por “:” representando, respectivamente:

Para editar directamente el archivo /etc/passwd, se recomienda usar el comando vipw, que bloquea el archivo /etc/passwd contra posibles modificaciones concurrentes, evitando corrupción del archivo. La edición será hecha con  el editor predeterminado, como regla general el editor vi. Usado con  la opción -s, vipw abrirá para edición el archivo /etc/shadow.

Contraseñas shadow

El archivo /etc/passwd puede ser leído por cualquier usuario, lo que puede tornar las contraseñas criptografiadas pasibles de decodificación. Para evitar esa posibilidad, se u un segundo archivo, accesible solo por el usuario root, el archivo /etc/shadow. Las contraseñas de los usuarios son almacenadas en un hash criptografiado que no puede ser fácilmente decodificado.

Al igual que en el archivo /etc/passwd, los campos del archivo /etc/shadow son separados por “:”, correspondientes a:

La información referente a la validez de la contraseña también puede ser modificada por medio del programa chage, con  las siguientes opciones:

Para usuarios comunes, el chage sólo puede ser usado con  la opción -l usuario, que muestra las restricciones referentes al usuario en cuestión. El comando usermod agrega las funciones de modificación de la cuenta de usuario por medio de las opciones:

Los archivos /etc/passwd y /etc/shadow almacenan solamente las informaciones directamente relacionadas a cada cuenta de usuarios. Los grupos de usuarios son configurados en sus propios archivos de configuración.

Grupos de usuarios

Para crear un grupo de usuarios, se usa el comando groupadd:

# groupadd estudio_c

El número de identificación del grupo (GID) puede ser especificado con  la opción -g. Para eliminar un grupo, se usa el comando groupdel:

# groupdel estudo_c

Un usuario podrá ser incluido/excluido de un grupo con el comando gpasswd, utilizando el argumento adecuado. Las opciones más comunes del gpasswd son:

Un usuario puede pertenecer a más de un grupo, pero sólo un grupo puede ser el principal. Para mostrar los grupos a los cuales un usuario pertenece, se puede usar el comando groups usuario. Usado sin  argumentos, el comando groups muestra los grupos del usuario actual.

La información sobre los grupos existentes en el sistema es almacenadas en el archivo /etc/group. En este archivo, cada grupo es definido en una linea, en campos separados por :, representando:

Para editar directamente el archivo /etc/group, es muy recomendable usar el comando vigr, que bloquea el archivo /etc/group contra posibles modificaciones externas, evitando la corrupción del archivo.

El comando groupmod agrega algunas funciones de modificación de grupos. Sus opciones más comunes son:

La principal finalidad de los grupos es permitir que los usuarios ejecuten actividades que no son permitidas fuera del grupo en cuestión. Esas actividades se relacionan principalmente a la lectura y escritura en archivos y directorios restringidos. Por lo tanto, es importante comprender como funciona el sistema de permisos de archivos en ambientes Unix.

5.3: Control de Permisos y Propriedad de Archivos

Peso: 2

En sistemas de archivos del estándar Unix, existen reglas de permisos que determinan a quien pertenece un determinado archivo o directorio y cuales usuarios o grupos pueden utilizarlos. Para archivos y directorios hay tres niveles de permiso:

El directorio /var/run contiene archivos con diferentes tipos de permisos, identificados en la primera columna:

drwx------  2 root           root             40 feb 26 10:08 cryptsetup
drwxr-xr-x  3 root           lp               80 feb 26 10:08 cups
srw-rw-rw-  1 root           root              0 feb 26 10:08 .heim_org.h5l.kcm-socket
drwxrwxr-x  2 lightdm        lightdm          40 feb 26 10:08 lightdm
drwxr-x---  2 root           root             40 feb 26 10:08 pptp
-rw-r--r--  1 root           root              4 feb 26 10:08 crond.pid
drwx------  2 root           root             40 feb 26 10:51 udisks2
srw-rw-rw-  1 root           root              0 feb 26 10:08 secrets.socket
drwxr-x---  2 chrony         chrony           80 feb 27 09:00 chrony
prw-------  1 root           root              0 feb 26 10:08 dmeventd-server
drwx------  2 rpc            rpc              60 feb 26 10:08 rpcbind
drwxrwxr-x  2 root           root             40 feb 26 10:08 netreport
-rw-r--r--  1 root           root              5 feb 27 09:00 dhclient6-enp0s25.pid
prw-------  1 root           root              0 feb 26 10:08 initctl

La primera letra representa el tipo del archivo, puede ser:

Las demás letras se dividen en grupos de tras, determinando los permisos para el propietario del archivo, el grupo del archivo y demás usuarios, respectivamente. El archivo crond.pid, por ejemplo, posee permisos rw- para el propietario del archivo (usuario root), permisos r-- para el grupo (grupo root) y permisos r-- para los demás usuarios.

Modificar permisos

Los permisos son modificados con  el comando chmod y pueden ser de lectura (r), escritura (w) y ejecución (x). Por ejemplo, el grupo al cual pertenece un archivo llamado documentos.tar.gz sólo tendrá acceso de lectura a él y para los demás usuarios se retirará el permiso de lectura:

$ chmod g=r,o-r documentos.tar.gz

Para incluir permisos de escritura para el grupo del archivo documentos.tar.gz:

$ chmod g+w documentos.tar.gz

A pesar de tener el mismo modelo de permisos, archivos y directorios se comportan de maneras diferentes teniendo los mismos permisos. En  directorios, el permiso r posibilita leer el contenido del directorio, el permiso w permite crear archivos dentro del directorio y x permite listar el contenido del  directorio.

Permisos numéricos (octales)

Los permisos pueden ser manejados de modo más corto a través de un formato numérico, llamado octal. El número octal consiste en una secuencia de cuatro dígitos. El primer dígito representa un permiso especial, abordado más adelante. Los demás representan los permisos para el usuario, grupo y otros, en ese orden.

Cada dígito indica la presencia de permisos a partir de la suma de los valores 4, 2 y 1. Esos valores corresponden a lectura, escritura y ejecución. La siguiente tabla muestra todos los permisos posibles, desde 0 (ningún permiso) hasta 7 (todos los permisos).

Dígito Lectura (valor 4) Escritura (valor 2) Ejecución (valor 1)
0
1 Si
2 Si
3 Si Si
4 Si
5 Si Si
6 Si Si
7 Si Si Si

De esa forma, el comando chmod 0664 documentos.tar.gz cambiará los permisos del archivo documentos.tar.gz a -rw-rw-r--, o sea, lectura y escritura para el usuario, lectura y escritura para el grupo y solamente lectura para los demás.

Para cambiar recursivamente todos los archivos dentro de un directorio especificado, se utiliza chmod con la opción -R.

Modificar propietarios y grupos de archivos

Para cambiar propietario y grupo de archivos y directorios, se utilizan los comandos chown y chgrp. El primero argumento es un nombre válido de usuario o grupo y el segundo es el archivo o directorio a ser modificado. Sólo el usuario root puede usar el comando chown, pero cualquier usuario puede usar el comando chgrp en sus archivos y directorios, siempre que sea parte del grupo que será atribuído.

Cambiar propietario de archivo usando el chown:

# chown daniel documentos.tar.gz

Cambiar grupo de archivo:

$ chgrp users documentos.tar.gz

Para cambiar usuario y grupo simultaneamente:

# chown daniel.users documentos.tar.gz

o

chown daniel:users documentos.tar.gz

Tanto chown como chgrp poseen la opción -R para cambiar contenidos de directorios recursivamente.

5.4: Archivos y Directorios Especiales

Peso: 1

Permisos suid y sgid

En un ambiente Unix, todos los processos son vinculados al usuario que los inició. De esa forma, el programa heredará los mismos permisos de lectura y escritura del usuario que lo ejecutó. Algunas tareas, sin embargo, exigen  que el proceso modifique o acceda a archivos para los cuales el usuario no tiene los permisos necesarios. Por ejemplo, cambiar la propia contraseña exige que el archivo /etc/shadow sea modificado, pero los permisos de /etc/shadow limitan la escritura al usuario propietario de este archivo (el usuario root):

$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1172 May 15  2017 /etc/shadow

Para contornar esa condición, existe un tipo de permiso especial, llamado suid (set user id). Archivos ejecutables que posean permisos suid serán ejecutados con los mismas permisos del propietario del comando y no con los permisos del usuario que lo ejecutó. El permisos suid es representado por la letra s en lugar de la x en la porción referente al propietario del archivo:

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54192 Feb 24  2017 /usr/bin/passwd

Para incluir el permiso suid en un archivo ejecutable, se utiliza:

# chmod u+s comando

De manera semejante, el permiso sgid actúa en  directorios. Es un permiso de grupo, por lo tanto aparece en el campo de permisos referente al grupo. En un directorio con permiso sgid, todos los archivos allí creados pertenecerán al grupo del directorio en cuestión, el que es especialmente útil en directorios donde trabajan usuarios pertenecientes al mismo grupo.

Cuando están activos, los permisos suid y sgid hacen aparecer la letra s en lugar de la letra x en los permisos de propietario del archivo y grupo del  archivo, respectivamente. Si también existe permiso de ejecución, aparecerá la letra s minúscula. Si sólo existen los permisos suid y sgid, aparecerá la letra S mayúscula.

El permiso sticky

El inconveniente en usar directorios compartidos es que un usuario podría eliminar algún o todo el contenido inadvertidamente. Para evitar que eso suceda, existe el permiso sticky, que impide a los usuarios eliminar archivos que no fueron creados por ellos mismos. Es el caso del  directorio /tmp, cuyas propriedades pueden ser verificadas con  el comando ls -l más la opción -d, que permite obtener información del propio directorio en cuestión y no de su contenido:

$ ls -ld /tmp
drwxrwxrwt 17 root root 36864 Feb 27 11:32 /tmp

La letra t en los permisos para los demás usuarios demuestra el uso del permiso sticky. Si sólo existiera el permiso sticky, aparecerá a letra T mayúscula.

Para atribuir el permiso sticky a un directorio llamado trabajo, por lo tanto, puede ser utilizado un comando como chmod o+t trabajo.

Permisos especiales en formato numérico

Como las opciones convencionales, los permisos especiales también poden ser manipulados en formato octal (numérico). El permiso especial es el primero de los cuatro dígitos de la opción en el formato octal. La siguiente tabla detalla esa correspondencia.

Dígito suid (valor 4) sgid (valor 2) sticky (valor 1)
0
1 Si
2 Si
3 Si Si
4 Si
5 Si Si
6 Si Si
7 Si Si Si

Los enlaces son archivos especiales que tienen la finalidad de atajo para otros archivos, facilitando la manera en que son acessados. Existen dois tipos de enlaces: el softlink (enlace simbólico) y el hardlink (enlace físico).

Los hardlinks son uno o más nombres que un inode del sistema de archivos puede tener. Todo archivo creado e, necesariamente, un hardlink a su inodo correspondiente. Los nuevos hardlinks son creados usando el comando ln:

$ ln documentos.tar.gz docs.tar.gz

¿Qué es un inodo?

Un inodo es el elemento básico que identifica el archivo en el sistema de archivos. El primer inodo de un archivo guarda sus propiedades e indica en cuales otros inodos del sistema de archivos se localizan los datos de este archivo.

La opción -i del comando ls muestra el número de los inodos de los archivos:

$ ls -i
6534 documentos.tar.gz  6534 docs.tar.gz

Ambos documentos.tar.gz y docs.tar.gz son hardlinks para el mismo inode 6534. Los hardlinks para el mismo inodo poseen los mismos permisos, propietarios, tamaño y datos, pues esos atributos son registrados directamente en los inodos.

$ ls -l documentos.tar.gz
-rw-r--r-- 2 daniel daniel 188 Oct 16 22:10 documentos.tar.gz

El número 2 en la segunda columna de información demuestra que hay dos hardlinks para el inodo correspondiente al archivo documentos.tar.gz. Un archivo sólo se eliminará del sistema de archivos cuando el último hardlink remanente es eliminado.

Los hardlinks sólo pueden ser creados dentro de un mismo sistema de archivos. No es posible crear hardlinks a directorios. Los archivos especiales . y .. son hardlinks al directorio creados exclusivamente por el propio sistema.

Los enlaces simbólicos pueden apuntar a cualquier objetivo, inclusive en sistemas de archivos diferentes. Para crear un enlace simbólico, se usa ln con la opción -s:

$ ln -s documentos.tar.gz atajo.tar.gz

Detalles del enlace:

$ ls -l atajo.tar.gz
lrwxrwxrwx 1 epet1 bmac 17 Feb 27 11:40 atajo.tar.gz -> documentos.tar.gz

Un enlace simbólico es indicado por la letra l al inicio de los permisos que, en ese caso, son siempre rwxrwxrwx. El tamaño del archivo de enlace es exactamente la cantidad de bytes (caracteres) de la ruta al objetivo. La flecha al lado del nombre del enlace simbólico indica la ruta hasta el objetivo.

Un enlace simbólico a una ruta relativa se romperá si el objetivo o el propio enlace fuera movido. Un enlace simbólico a una ruta absoluta sólo se romperá si el objetivo fuera movido o eliminado. Para actualizar la información de objetivo de un enlace simbólico existente, pero “roto”, se puede redefinir el objetivo del enlace con la opción -f.

Las funciones comunes para enlaces simbólicos son indicar rutas largas frecuentemente usadas, crear nombres más simples para archivos ejecutables y nombres adicionales para librerías de sistema.