Crear y administrar listas de control de acceso (ACL)

Este es un de los objetivos que yo personalmente los tengo en el grupo de “sencillos”, ya que no es tan complicado como parece. Una vez que usted tiene bien definido los permisos en el directorio o archivo, la implementacion de acl se hace facil.

Para comenzar con nuestro ejercicio vamos a necesitar tener algunos grupos y usuarios ya creados. Para esto vamos a seguir la estructura que muestro en la siguiente imagen:

Entonces vamos a hacer algo bien rapido para crear esta estructura y comenzar con nuestro primer ejercicio de acl.

[root@class3 ~]# groupadd contabilidad
[root@class3 ~]# groupadd servicios
[root@class3 ~]# for usuarios in alfredo antonio aldo; do useradd $usuarios -G contabilidad; done
[root@class3 ~]# for usuarios in alfredo antonio aldo; do id $usuarios; done
uid=1001(alfredo) gid=1003(alfredo) groups=1003(alfredo),1001(contabilidad)
uid=1002(antonio) gid=1004(antonio) groups=1004(antonio),1001(contabilidad)
uid=1003(aldo) gid=1005(aldo) groups=1005(aldo),1001(contabilidad)
[root@class3 ~]# for usuarios in carlos charles tomas; do useradd $usuarios -G servicios; done
[root@class3 ~]# for usuarios in carlos charles tomas; do id $usuarios; done
uid=1004(carlos) gid=1006(carlos) groups=1006(carlos),1002(servicios)
uid=1005(charles) gid=1007(charles) groups=1007(charles),1002(servicios)
uid=1006(tomas) gid=1008(tomas) groups=1008(tomas),1002(servicios)
[root@class3 ~]# for usuarios in alfredo antonio aldo carlos charles tomas; do echo "password" | passwd $usuarios --stdin; done
Changing password for user alfredo.
passwd: all authentication tokens updated successfully.
Changing password for user antonio.
passwd: all authentication tokens updated successfully.
Changing password for user aldo.
passwd: all authentication tokens updated successfully.
Changing password for user carlos.
passwd: all authentication tokens updated successfully.
Changing password for user charles.
passwd: all authentication tokens updated successfully.
Changing password for user tomas.
passwd: all authentication tokens updated successfully.
[root@class3 ~]# mkdir -p /data/{contabilidad,servicios}
[root@class3 ~]# chmod 770 /data/{contabilidad,servicios}
[root@class3 ~]# chown :contabilidad /data/contabilidad
[root@class3 ~]# chown :servicios /data/servicios
[root@class3 ~]# ls -ld /data/*
drwxrwx---. 2 root contabilidad 6 Jun 23 15:53 /data/contabilidad
drwxrwx---. 2 root servicios    6 Jun 23 15:53 /data/servicios
[root@class3 ~]#

De esta forma ya tenemos nuestra estructura creada y verificada. Ahora vamos comenzar con la creacion de la primera acl, en donde vamos a darle permiso de lectura y escritura en el directorio “/data/contabilidad” al grupo “servicios”. Para eso vamos a aplicar la siguiente acl:

[root@class3 ~]# cd /data/
[root@class3 data]# setfacl -Rm g:servicios:rwX /data/contabilidad
[root@class3 data]#

La “X” quiere decir que solo va aplicar permiso de ejecucion en directorio, lo que quiere decir que podemos hacer “cd” dentro del directorio, y tambien previene que se aplique un permiso de ejecucion a un archivo que no querramos. Esta es la forma segura de hacerlo.

Pero aun no hemos terminado, porque cuando aplicamos acl sobre un directorio debemos tambien aplicar una acl por defecto. Y para esto repetimos el mismo comando con una minima modificacion:

[root@class3 data]# setfacl -m d:g:servicios:rwx /data/contabilidad

Como ven solo se agrega “d”, y ya no vamos a necesitar la “X”, porque el permiso de ejecucion sobre un directorio quiere decir que podemos listar o hacer “cd” dentro del mismo.

Como poedemos ir verificando nuestro trabajo hasta este punto, pues simplemente ejecutamos:

[root@class3 data]# getfacl /data/contabilidad
getfacl: Removing leading '/' from absolute path names
# file: data/contabilidad
# owner: root
# group: contabilidad
user::rwx
group::rwx
group:servicios:rwx
mask::rwx
other::---
default:user::rwx
default:group::rwx
default:group:servicios:rwx
default:mask::rwx
default:other::---

[root@class3 data]#

Ahora vamos a continuar con la otra acl, vamos a decir que el usuario carlos solo va a poder leer, a pesar de pertenecer al grupo servicios el cual tiene permisos de lectura y escritura.

[root@class3 data]# setfacl -Rm u:carlos:rX /data/contabilidad
[root@class3 data]# setfacl -m d:u:carlos:rx /data/contabilidad

La acl es identica, solo con el cambio de variable, de “g” a “u”

Si por algun motivo comete un error en la aplicacion de las acl, es mucho mas facil restablecer todo, ya que modificar una acl ya aplicada puede que no lo entienda. Y como el proposito de este ejercicio es que usted lo logre de la forma mas simple, es por eso que recomiendo restablecer todo. Para esto ejecutamos:

[root@class3 data]# setfacl -b /data/contabilidad
[root@class3 data]# getfacl /data/contabilidad
getfacl: Removing leading '/' from absolute path names
# file: data/contabilidad
# owner: root
# group: contabilidad
user::rwx
group::rwx
other::---

[root@class3 data]#

Ahora si podemos realizar algunas verificacion, para comenzar vamos a ver como quedaron establecidas las acl:

[root@class3 data]# getfacl /data/contabilidad
getfacl: Removing leading '/' from absolute path names
# file: data/contabilidad
# owner: root
# group: contabilidad
user::rwx
user:carlos:r-x
group::rwx
group:servicios:rwx
mask::rwx
other::---
default:user::rwx
default:user:carlos:r-x
default:group::rwx
default:group:servicios:rwx
default:mask::rwx
default:other::---

[root@class3 data]#

Ahora el otro paso de verificacion es iniciar sesion con un usuario del grupo contabilidad, crear un archivo y directorio. Despues iniciar sesion con un usuario del grupo servicios y hacer lo mismo. Y por ultimo intentamos con el usuario carlos.

[root@class3 data]# su - alfredo
[alfredo@class3 ~]$ touch /data/contabilidad/alfredo.txt
[alfredo@class3 ~]$ mkdir /data/contabilidad/alfredo-dir
[alfredo@class3 ~]$ ls -ls /data/contabilidad/
total 0
0 drwxrwx---+ 2 alfredo alfredo 6 Jun 23 15:59 alfredo-dir
0 -rw-rw----+ 1 alfredo alfredo 0 Jun 23 15:58 alfredo.txt
[alfredo@class3 ~]$ exit
logout
[root@class3 data]# su - tomas
[tomas@class3 ~]$ touch /data/contabilidad/tomas.txt
[tomas@class3 ~]$ mkdir /data/contabilidad/tomas-dir
[tomas@class3 ~]$ ls -ls /data/contabilidad/
total 0
0 drwxrwx---+ 2 alfredo alfredo 6 Jun 23 15:59 alfredo-dir
0 -rw-rw----+ 1 alfredo alfredo 0 Jun 23 15:58 alfredo.txt
0 drwxrwx---+ 2 tomas   tomas   6 Jun 23 15:59 tomas-dir
0 -rw-rw----+ 1 tomas   tomas   0 Jun 23 15:59 tomas.txt
[tomas@class3 ~]$ exit
logout
[root@class3 data]# su - carlos
[carlos@class3 ~]$ cd /data/contabilidad/
[carlos@class3 contabilidad]$ ll
total 0
drwxrwx---+ 2 alfredo alfredo 6 Jun 23 15:59 alfredo-dir
-rw-rw----+ 1 alfredo alfredo 0 Jun 23 15:58 alfredo.txt
drwxrwx---+ 2 tomas   tomas   6 Jun 23 15:59 tomas-dir
-rw-rw----+ 1 tomas   tomas   0 Jun 23 15:59 tomas.txt
[carlos@class3 contabilidad]$ touch carlos.txt
touch: cannot touch ‘carlos.txt’: Permission denied
[carlos@class3 contabilidad]$ mkdir carlos-dir
mkdir: cannot create directory ‘carlos-dir’: Permission denied
[carlos@class3 contabilidad]$ exit
logout
[root@class3 data]#

Como ven las reglas que aplicamos sobre el directorio “/data/contabilidad” estan trabajando como esperabamos. Ahora solo tenemos que continuar con la segunda parte del ejercicio. Asi que vamos a proceder con las reglas acl sobre el direcotrio “/data/servicios”

[root@class3 data]# setfacl -Rm g:contabilidad:rX /data/servicios
[root@class3 data]# setfacl -m d:g:contabilidad:rx /data/servicios
[root@class3 data]# setfacl -Rm u:alfredo:rwX /data/servicios
[root@class3 data]# setfacl -m d:u:alfredo:rwx /data/servicios
[root@class3 data]# getfacl /data/servicios/
getfacl: Removing leading '/' from absolute path names
# file: data/servicios/
# owner: root
# group: servicios
user::rwx
user:alfredo:rwx
group::rwx
group:contabilidad:r-x
mask::rwx
other::---
default:user::rwx
default:user:alfredo:rwx
default:group::rwx
default:group:contabilidad:r-x
default:mask::rwx
default:other::---

[root@class3 data]#

Como ven ya todo quedo bien, ahora vamos a realizar una comprobacion tal como lo realizamos anteriromente.

[root@class3 data]# su - carlos
Last login: Fri Jun 23 16:00:00 PDT 2017 on pts/1
[carlos@class3 ~]$ touch /data/servicios/carlos.txt
[carlos@class3 ~]$ mkdir /data/servicios/carlos-dir
[carlos@class3 ~]$ ls -ls /data/servicios/
total 0
0 drwxrwx---+ 2 carlos carlos 6 Jun 23 16:06 carlos-dir
0 -rw-rw----+ 1 carlos carlos 0 Jun 23 16:06 carlos.txt
[carlos@class3 ~]$ exit
logout
[root@class3 data]# su - aldo
[aldo@class3 ~]$ cd /data/servicios/
[aldo@class3 servicios]$ ls
carlos-dir  carlos.txt
[aldo@class3 servicios]$ touch aldo.txt
touch: cannot touch ‘aldo.txt’: Permission denied
[aldo@class3 servicios]$ mkdir aldo-dir
mkdir: cannot create directory ‘aldo-dir’: Permission denied
[aldo@class3 servicios]$ exit
logout
[root@class3 data]# su - alfredo
Last login: Fri Jun 23 15:58:32 PDT 2017 on pts/1
[alfredo@class3 ~]$ cd /data/servicios/
[alfredo@class3 servicios]$ ls -ls
total 0
0 drwxrwx---+ 2 carlos carlos 6 Jun 23 16:06 carlos-dir
0 -rw-rw----+ 1 carlos carlos 0 Jun 23 16:06 carlos.txt
[alfredo@class3 servicios]$ touch alfredo.txt
[alfredo@class3 servicios]$ mkdir alfredo-dir
[alfredo@class3 servicios]$ ls -las
total 0
0 drwxrwx---+ 4 root    servicios 80 Jun 23 16:07 .
0 drwxr-xr-x. 4 root    root      43 Jun 23 15:53 ..
0 drwxrwx---+ 2 alfredo alfredo    6 Jun 23 16:07 alfredo-dir
0 -rw-rw----+ 1 alfredo alfredo    0 Jun 23 16:07 alfredo.txt
0 drwxrwx---+ 2 carlos  carlos     6 Jun 23 16:06 carlos-dir
0 -rw-rw----+ 1 carlos  carlos     0 Jun 23 16:06 carlos.txt
[alfredo@class3 servicios]$ exit
logout
[root@class3 data]#

Como ven nuestra verificacion esta bien. Ahora quiero mostrarles como se ven las acl aplicadas en los archivos y directorios que creamos.

[root@class3 ~]# cd /data/contabilidad/
[root@class3 contabilidad]# getfacl alfredo alfredo.txt 
getfacl: alfredo: No such file or directory
# file: alfredo.txt
# owner: alfredo
# group: alfredo
user::rw-
user:carlos:r-x			#effective:r--
group::rwx			#effective:rw-
group:servicios:rwx		#effective:rw-
mask::rw-
other::---

[root@class3 contabilidad]# getfacl alfredo alfredo-dir/
getfacl: alfredo: No such file or directory
# file: alfredo-dir/
# owner: alfredo
# group: alfredo
user::rwx
user:carlos:r-x
group::rwx
group:servicios:rwx
mask::rwx
other::---
default:user::rwx
default:user:carlos:r-x
default:group::rwx
default:group:servicios:rwx
default:mask::rwx
default:other::---

[root@class3 contabilidad]#

Como pueden darse cuenta es bien facil trabajar con acl, solo deben estar claros si van a trabajar sobre un direcorio o no. Porque de ser asi deben de aplicar la acl por defecto sobre el directorio.

Ahora como aplicariamos una acl sobre un archivo. Para esto vamos a copiar un archivo para comenzar a trabajar sobre el.

[root@class3 ~]# cp /etc/fstab /var/tmp/
[root@class3 ~]# cd /var/tmp/
[root@class3 tmp]# ls -las fstab 
4 -rw-r--r--. 1 root root 594 Jun 23 16:13 fstab
[root@class3 tmp]# getfacl fstab 
# file: fstab
# owner: root
# group: root
user::rw-
group::r--
other::r--

[root@class3 tmp]#

Vamos apartir de la misma estructura de usuarios creada anteriormente. Vamos a decir que el usuario aldo puede leer y escribir sobre el archivo y el usuario tomas solo puede leer, y futuros usuarios que se creen en el sistema no van a tener acceso al archivo.

Actualmente el archivo cuenta con permisos “644”, lo que se traduce que el usuario root puede hacer lo que desee, mientras que otros usuarios pueden solamente leer. Lo que seria la condicion importante, porque cuando creemos un nuevo usuario puede que lea el archivo, pero con la aplicaciond e la acl apropiada esto no va ser posible.

Vasmos a comenzar con las reglas:

[root@class3 tmp]# setfacl -m u:aldo:rw /var/tmp/fstab 
[root@class3 tmp]# setfacl -m u:tomas:r /var/tmp/fstab 
[root@class3 tmp]# setfacl -m o::--- /var/tmp/fstab 
[root@class3 tmp]# getfacl /var/tmp/fstab 
getfacl: Removing leading '/' from absolute path names
# file: var/tmp/fstab
# owner: root
# group: root
user::rw-
user:aldo:rw-
user:tomas:r--
group::r--
mask::rw-
other::---

[root@class3 tmp]#

Ya aplicadas las reglas oslo nos queda verificar:

[root@class3 tmp]# su - aldo
Last login: Fri Jun 23 16:06:40 PDT 2017 on pts/1
[aldo@class3 ~]$ echo "aldo paso por aqui" >> /var/tmp/fstab 
[aldo@class3 ~]$ tail -n1 /var/tmp/fstab
aldo paso por aqui
[aldo@class3 ~]$ exit
logout
[root@class3 tmp]# su - tomas
Last login: Fri Jun 23 15:59:28 PDT 2017 on pts/1
[tomas@class3 ~]$ echo "tomas intenta escribir aqui" >> /var/tmp/fstab 
-bash: /var/tmp/fstab: Permission denied
[tomas@class3 ~]$ tail -n1 /var/tmp/fstab
aldo paso por aqui
[tomas@class3 ~]$ exit
logout
[root@class3 tmp]# useradd nuevousuario
[root@class3 tmp]# su - nuevousuario
[nuevousuario@class3 ~]$ cd /var/tmp/
[nuevousuario@class3 tmp]$ ls -als fstab 
4 -rw-rw----+ 1 root root 613 Jun 23 16:19 fstab
[nuevousuario@class3 tmp]$ cat fstab 
cat: fstab: Permission denied
[nuevousuario@class3 tmp]$ echo "tratando como usuarionuevo" >> /var/tmp/fstab 
-bash: /var/tmp/fstab: Permission denied
[nuevousuario@class3 tmp]$ exit
logout
[root@class3 tmp]#

Como se pueden dar cuenta, el “usuarionuevo” no puede leer en archivo. Y los usuarios aldo y tomas, pueden hacer lo que la regla acl dice.

Espero que con este tema se aclaren sus dudas sobre como trabajar con alc.

Leave a Reply

Your email address will not be published. Required fields are marked *