La seguridad en un sistema UNIX/Linux asegura que cada archivo o directorio puede ser accedido, modificado o ejecutado por ciertos usuarios, en base a dos factores:
Cada archivo y directorio tiene tres tipos de propietarios:
Cada archivo y directorio tiene los tres de permisos para cada uno de los tres tipos de propietario
-rwxrw-r-- 1 vagrant vagrant 3771 Nov 3 23:01 backup.sh
Tipo archivo
Permisos r (lectura) w (escritura) x (ejecución) - (sin permiso)
Contador de hard-links
Propietarios usuario grupo
Tamaño
Fecha modificación
Otros
archivo | directorio | |
---|---|---|
r | cat grep vim cp | ls |
w | > >> | rm mv cp |
x | ./ | cd |
vagrant@server:~$ ls -l
-rwxrw-r-- 1 vagrant vagrant 3771 Nov 3 23:01 backup.sh
vagrant@server:~$ stat backup.sh File: backup.sh Size: 3771 Blocks: 8 IO Block: 4096 regular file Device: 801h/2049d Inode: 33885 Links: 1 Access: (0764/-rwxrw-r--) Uid: ( 1000/ vagrant) Gid: ( 1000/ vagrant) Access: 2021-11-03 23:01:10.716314550 +0000 Modify: 2021-11-03 23:01:10.716314550 +0000 Change: 2021-11-03 23:02:10.962421647 +0000 Birth: -
Permite modificar los permisos de un archivo.
Tiene dos formas de uso:
Símbolos: + encender, - apagar, = no-modificar
Posicion: u usuario, g grupo, o otros, a todos
Permisos:
r lectura, w escritura, x ejecución, X ejecución solo directorio
Multiples conjuntos pueden ser indicados separados por coma
chmod +x script.sh chmod ugo+x script.sh
chmod ugo-x script.sh
chmod g=u script.sh
chmod a=rx script.sh
chmod u+rwx,g+rx,g-w,o+r,o-wx script.sh
binario | r | w | x |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 |
3 | 0 | 1 | 1 |
4 | 1 | 0 | 0 |
5 | 1 | 0 | 1 |
6 | 1 | 1 | 0 |
7 | 1 | 1 | 1 |
binario | r | w | x |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 |
3 | 0 | 1 | 1 |
4 | 1 | 0 | 0 |
5 | 1 | 0 | 1 |
6 | 1 | 1 | 0 |
7 | 1 | 1 | 1 |
binario | r | w | x |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 |
3 | 0 | 1 | 1 |
4 | 1 | 0 | 0 |
5 | 1 | 0 | 1 |
6 | 1 | 1 | 0 |
7 | 1 | 1 | 1 |
chmod 777 script.sh chmod 755 script.sh
chmod 750 script.sh
chmod 644 archivo.txt
chmod 600 archivo.txt
chmod 007 secreto.dat
-rwsr-sr-t 1 vagrant vagrant 3771 Nov 3 23:01 backup.sh
suid
sgid
sticky bit
-rwsr-sr-t 1 vagrant vagrant 3771 Nov 3 23:01 backup.sh
suid
SUID - modifica el permiso de ejecución y provoca que el archivo se ejecute como el usuario (owner)
Se usa en ejecutables.
-rwsr-xr-x 1 vagrant docker 3771 Nov 3 23:01 backup.sh
-rwsr-sr-t 1 vagrant vagrant 3771 Nov 3 23:01 test/
sgid
SGID - modifica el permiso de ejecución y provoca que el archivo se ejecute como el grupo
Es usado en directorios
-rwsr-xr-x 1 vagrant docker 3771 Nov 3 23:01 test/
-rwsr-sr-t 1 vagrant vagrant 3771 Nov 3 23:01 backup.sh
sticky bit
Stiky Bit - Se usa en directorios. Cada archivo en ese directorio puede ser borrado o renombrado solo por el usuario (owner) o root.
suid
sgid
sticky bit
1
2
4
chmod 0750
-rwSr-Sr-T 1 vagrant vagrant 3771 Nov 3 23:01 backup.sh
mayúscula == no hay x (ejecución)
umask es la máscara de permisos para el usuario (User-Mask) que permite definir los permisos que serán aplicados por defecto para los nuevos archivos creados por el usuario.
umask también es el comando que permite administrar dicha máscara.
El umask es parte del environment de usuario.
Define los permisos por defecto para directorios.
Para archivos "le quita" la "x" (el 1) de ejecución
$ umask 0002 $ umask -S u=rwx,g=rwx,o=rx $ umask -p umask 0002 $ umask 0022 $ umask -S u=rwx,g=rx,o=rx
Las Listas de Control de Acceso (ACL) son un mecanismo adicional más flexible para el sistema de permisos de archivos.
Las ACL permiten dar permiso a cualquier usuario o grupo a cualquier archivo del disco.
Las ACL puede ser visto como una flexibilización, como una excepción, o como una extensión al sistema de permisos (ugo)
$ getfacl test/ # file: test/ # owner: vagrant # group: vagrant user::rwx group::rwx other::r-x
$ setfacl -m u:ubuntu:rx test/ $ setfacl -m g:docker:rwx test/ $ getfacl test/ # file: test/ # owner: vagrant # group: vagrant user::rwx user:ubuntu:r-x <<<<<<<< group::rwx group:docker:rwx <<<<<<<< mask::rwx other::r-x
$ setfacl -m m:rx test/ $ getfacl test/ # file: test/ # owner: vagrant # group: vagrant user::rwx user:ubuntu:r-x group::rwx #effective:r-x group:docker:rwx #effective:r-x mask::r-x <<<<< other::r-x
La máscara limita los permisos efectivos que tendrán (como máximo) los usuarios y grupos nominados. Los permisos de usuario no se afectan por la máscara.
$ setfacl -m d::rw test/
$ getfacl test/
# file: test/
# owner: vagrant
# group: vagrant
user::rwx
user:ubuntu:r-x
group::r-x
group:docker:rwx #effective:r-x
mask::r-x
other::r-x
default:user::rw-
default:group::r-x
default:other::r-x
Los directorios pueden tener permisos configurados por defecto que serán heredados por todas las sub-carpetas
$ setfacl -m d:u:www-data:rwx test/
$getfacl test/
# file: test/
# owner: vagrant
# group: vagrant
user::rwx
user:ubuntu:r-x
group::r-x
group:docker:rwx #effective:r-x
mask::r-x
other::r-x
default:user::rw-
default:user:www-data:rwx <<<<<<<
default:group::r-x
default:mask::rwx
default:other::r-x
1) Respaldar las ACL
$ getfacl -R test > ~/facl.bak 2) Recuperar permisos de ACL $ setfacl --restore=~/facl.bak 3) Copiar ACL de un archivo a otro $ getfacl archivo.dat | setfacl --set-file=- archivo2.dat 4) Copiar default ACL de un directorio a otro $ getfacl dir/ | setfacl -d -M- test2/
4) Remover una entrada $ setfacl -x "entry" /path/to/file 5) Remover todas las entradas $ setfacl -b path/to/file
1) Guardar y recuperar incluyendo ACL con TAR $ tar czv --acls -f test.tgz test/
$ tar x --acls -f test.tgz 2) Sincronizar directorios con RSYNC incluyendo ACL $ rsync -aA test/ destest/
setfacl
getfacl
Los archivos en el filesystem (ext2, ext4 y xfs) tienen atributos propios que modifican el acceso o las acciones que se pueden realizar con un determinado archivo.
Estas acciones están gestionadas por las llamadas a funciones del propio filesystem.
The format of a symbolic mode is +-=[aAcCdDeijsStTu]. The operator '+' causes the selected attributes to be added to the existing attributes of the files; '-' causes them to be removed; and '=' causes them to be the only attributes that the files have. The letters 'aAcCdDeijsStTu' select the new attributes for the files: append only (a), no atime updates (A), compressed (c), no copy on write (C), no dump (d), synchronous directory updates (D), extent format (e), immutable (i), data journalling (j), secure deletion (s), synchronous updates (S), no tail-merging (t), top of directory hierarchy (T), and undeletable (u). The following attributes are read-only, and may be listed by lsattr(1) but not modified by chattr: compression error (E), huge file (h), indexed directory (I), inline data (N), compression raw access (X), and compressed dirty file (Z). Not all flags are supported or utilized by all filesystems; refer to filesystem-specific man pages such as btrfs(5), ext4(5), and xfs(5) for more filesystem-specific details.
Security-Enhanced Linux (SELInux) es un módulo de seguridad del kernel Linux que proporciona un mecanismo para implementar Control de Acceso Obligatorio (MAC) y Control de Acceso basado en Roles (RBAC)
Los conceptos clave son proyectos de la United States National Security Agency (NSA) de EE.UU.
SELinux por defecto está disponible en RedHat, Fedora, CentOS
Ubuntu y derivados utilizan AppArmor
SELinux define control de acceso para procesos y archivos en el sistema. Utiliza políticas de seguridad que son un conjunto de reglas.
Cuando un proceso (sujeto) hace una petición de acceso a un objeto (archivo, dispositivo, socket, puerto, etc.) SELinux revisa el access vector cache (AVC).
Si SELinux no puede tomar una decisión sobre el acceso basada en el cache, envía la petición al server de seguridad. El servidor ubica el contexto del proceso y del archivo. Y el contexto es contrastado contra la base de datos de políticas de SELinux para conceder o denegar el permiso.
usuario:rol:contexto:nivel (el nivel es opcional)
Política: Un proceso corriendo con cierta etiqueta puede acceder a un archivo con otra cierta etiqueta
httpd_sys_content_t
httpd_t
httpd
/var/www/html
/tmp
/var/tmp
httpd
/var/www/html
/tmp
/var/tmp
tmp_t
tmp_t
$ ps -ZC httpd
$ ls -Z /var/www
Política
$ netstat -tanZ | grep LISTEN | grep :80
$ getenforce
$ setenforce
/etc/selinux/config
$ getsebol -a
Los booleanos de SELinux permite prender y apagar reglas que cambian el funcionamiento de las políticas
$ setsebool httpd_enable_homedirs=on
$ ls -Zd /var/www/html
httpd_sys_content_t
$ echo prueba > ~/prueba.html $ mv ~/prueba.html /var/www/html/prueba.html $ ls -Zl /var/www/html/prueba.html
-rw-r--r-- root:root admin_home_t
$ tail /var/log/audit/audit.log
avc: denied for pid=2347
scontext=httpd_t tcontext=admin_home_t
$ restorecon -R /var/www/html
$ ls -Zl /var/www/html/prueba.html
httpd_sys_content_t
$ semanage fcontext -l
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
https://creativecommons.org/licenses/by/4.0/deed.es