Permisos en GNU/Linux

Un artigo de repaso sobre a aplicación e uso de permisos en GNU/Linux.

Sobre o básico dos permisos lectura, escritura e execución así cómo o de dono e grupo, non vou tratar, tampouco o das acl ou selinux.

Mudar o grupo actual por defecto do usuario

Nesta sección falo de como poñerse un dos grupos secundarios aos que pertenzamos como se fora o noso primario, a utilidade de isto por exemplo é crear os ficheiros ou directorios co nome do grupo de desenvolvemento ou de x aplicativo, en lugar de un que so sexa o noso nome de usuario.

Para mudalo dono dos arquivos e directorios xa feitos, está o mítico “chown” e logo o grupo está “chgrp”.

Mais para que os novos arquivos que fagamos na sesión os fagamos cun grupo diferente ao noso por defecto, podemos facer uso de ‘newgrp’.

Mudando o noso grupo actual por defecto por un dos nosos grupos secundarios na sesión actual:
newgrp <nome_do_grupo>

Con isto os ficheiros que creamos durante a sesión pasarán a ter como grupo o grupo que nos asinemos, sempre que pertenzamos a él.

Mudar os permisos

Explicación dos básicos

Usando o chmod podemos usar o “atallo” de mencionar a “u”, “g”, “o”, e “a” pra asinarllelos permisos.

Logo deberiamos de incluir un dos seguintes símbolos:

Símbolo: Descripción:
+ Engade os novos permisos se fai falla.
= Aplica os permisos tal cal os indicamos no comando.
- Retira os permisos indicados no caso de que os teña.
Exemplo chmod:
chmod o=r,g-w,u+x o_meu_script.sh
Quitar tódolos permisos do arquivo:
chmod a=- arquivo

Permisos en formato numerario octal

Este soe ser un dos da miña predilección, se trata de usalo valor octal dos bits que compoñen os permisos e que dan como valor o seguinte:

Valor: Define: Equivalente:
4 Lectura r
2 Escritura w
1 Execución x
0 ningún -

Entonces sumando esos 3 números, podemos obter combinacións do 0 ao 7 pra aplicalos permisos a un dos tres integrantes dos permisos básicos “dono”, “grupo”, “outros.

Total que para sumalos permisos terías que xogar cos valores r,w,x , os cales serían equivalentes a: 4,2,1

No caso de 0, sería ningún, todo son valores octais.

Exemplo permisos octáis:
chmod 604 ficheiro

Neste caso, asgina:

Obxetivo: Valor: Permiso efectivo:
dono 6 Lectura 4 + Escritura 2
grupo 0 Ningún
outros 4 Lectura

Efectos dos permisos en arquivos e directorios

Repaso básicos

Repaso os básicos para logo explicar os avanzados.

En unix todo son ficheiros, un ficheiro non é máis que un conxuto de bits. Os directorios son ficheiros especiais que como un “directorio telefónico” apuntan a outros directorios ou ficheiros.

O de lectura “r”

O de escritura “w”

Execución “x”

Permisos avanzados sobre ficheiros

Aquí xa entramos nos famosos “setuid”, “setgid” e o “sticky bit”.

Estos son aplicados por Root, poidendo aplicarse de maneira simbólica ( con letras ) ou octal.

No caso do octal faixe engadindo un número máis ao principio.

Setuid e setgid

setuid

setuid = SET User ID upon execution.

O permiso setuid usado nos arquivos executables, permite executalos como root a usuarios que non o son.

Isto pasaría noutros sistemas UNIX, en GNU/Linux o kernel só executa dito permiso se o arquivo é un binario, isto engade unha capa de seguridade que impide que os usuarios poidan modificalo programa e executalo coma root.

setgid

No caso do arquivos faría o mesmo que setuid pero esta vez usando o grupo.

No caso dos directorios aos que se lle aplica, permite que os usuarios poidan compartir arquivos con outros usuarios que están en diferentes grupos.

Cando os usuarios crean un arquivo no directorio, automáticamente pasan a telo grupo propietario do directorio, en lugar do seu grupo por defecto.

Resumo efectos de setuid e setgid

Setuid nun arquivo

Fai que o arquivo se execute baixo a identidade do dono do arquivo, en lugar da identidade do usuario que o executa.

Setgid nun arquivo

Fai que o arquivo se execute baixo a identidade do grupo do arquivo, en lugar da identidade do grupo do usuario que o executa.

Setgid nun directorio

Fai que os novos arquivos e directorios creados nel, sexan creados aplicándolles o grupo dono do directorio.

Sticky bits

Efecto Sticky bit nos arquivos

Resumo: En GNU/Linux non se usa nos arquivos, o kernel non o ten en conta.

Noutros sistemas UNIX o sticky bit úsase tamén cos ficheiros, dependendo do sistema traballará dunha forma ou outra normalmente se trataría de evitar que carguen os datos en swap para axilizala execución dos mesmos, a súa implantación data da quita edición de UNIX no 1974 e o seu uso noutras versións de UNIX aló polo 1984. No caso de GNU/Linux o kernel pasa do sticky bit nos arquivos.

Polo tanto, non se aplica o sticky bit aos arquivos e no caso de facelo non sería utilizado polo kernel do sistema.

Efecto Sticky bit nos directorios

O permiso “stick” coñecido como “sticky bit” ( O bit pegañento ), é importante para evitar que os usuarios non poidan eliminalos ficheiros dos outros usuarios.

O sticky bit nun directorio modifica o permiso de escritura nun directorio, onde só usuarios específicos poden borrar arquivos co sticky bit definido no directorio que os contén:

Un exemplo de uso do sticky bit, serían os directorios de temporáis /tmp e /var/tmp.

Cando un directorio ten o sticky unha “t” remplazará a “x” nos permisos de others.

No caso de ter “T” significa que os usuarios afectados por others, non teñen o permiso de execución nos arquivos do directorio. Non podrán cambiar a este directorio ou crear arquivos nel.

Resumo Sticky bit

Sticky bit nun arquivo

O kernel de GNU/Linux non lle fai caso nos arquivos, polo que non se usa.

Sticky bit no directorio

Fai que os arquivos dentro do directorio só poidan ser eliminados polo seu dono ou polo root.

Eliminar os permisos especiáis en ficheiros e directorios

Se poñemos o “0000” como en “0777” estariamos quitándolle os permisos especiais ao arquivo ou directorio a tratar.

Umask

Por defecto os arquivos se crean con tódolos seus bits de permisos a 1 salvo os de execución que os pon a 0, o cal resulta en que todos poden leer eescribir no caso dos arquivos, en octal sería 666, no caso dos directorios 777 pois sen execución os directorios non funcionan.

Cando se carga a terminal, se define automáticamente o umask que soe ser 002 ou 022, dependendo da distribución que uses.

O umask restaría os valores dos bits dos permisos por defecto, facendo que se aplique o resultado como os permisos efectivos básicos do arquivo. ( Se non, todos serían 666 no caso dos arquivos e 777 no dos directorios ).

Comportamento de umask

O comando umask, é executado automáticamente cando iniciamos sesión nunha terminal.

Para ter unha UMASK persoalizada e persistente, podemos configurala no arquivo ~/.bashrc .

O umask afecta aos novos arquivos ou directorios que creamos.

Afecta aos permisos básicos de dono,grupo,outros , tamén aos de setuid,setgid ou ao sticky bit. En definitiva todos aqueles que se poidan definir cos números octais.

O que fai é “enmascaralos” permisos que se aplicarían por defecto según o sistema.

Canto máis elevado sexa o valor octal definido máis permisos quitaría ao dono, grupo ou outros aos que se lle aplica.

Como pasa cos permisos octais, aquí teriamos os seguintes valores octais para enmascaralos “umask” arquivos:

Por defecto o permiso de execución non se aplica aos arquivos, polo que nos moveriamos polo rango de 0 a 6, poidendo usar o 7 no umask para quitalos todos.

Orixe das definicións de umask por defecto

Noutros sistemas operativos a creación de directorios ou arquivos se pode basear nos permisos do directorio pai, mais en UNIX se basa na especificación da UMASK do usuario.

A umask por defecto dos usuarios se define no /etc/profile.

Nas sesións ssh pode asignarse outro diferente segundo se defina no sshd_conf.

Logo tamén pode ser definido en calquer script intermedio que sexa chamado cando se carga a sesión e o entorno de traballo do usuario.

Consulta do umask que temos aplicado actualmente

Velo umask que temos actualmente:
$ umask
0002

Exemplos de umask sobre arquivos e directorios

Umask na creación de arquivos

Supoñamos que queremos que os arquivos se creen cos seguintes permisos “un tanto raros”: rw-,-w-,r–

No noso /etc/profile por defecto pode vir o umask 0002 ( no caso de ubuntu ), isto supón que aos permisos por defecto 0666 para os arquivos , sempre lle restan aparte, neste caso restaría o de escritura para outros, quedándolle a outros só a posibilidade de leelo arquivo.

O umask actual da miña sesión é: 0002

Cando fago un arquivo por defecto ten os permisos en octal: 664

Entonces teriamos que calcular qué permisos lle queremos “restar” aos de por defecto:

En octal se calcuarían así: 1 , 4+1 , 2+1

Sendo o resultado octal: 6,2,6

Para facela máscara umask sería: 1,5,3

Este sería o umask a usar: 153

Fago un arquivo probas, miro os seus permisos, e logo mudo o umask e fago outro, estos son os resultados:
usuario@localhost:~$ umask
0002
usuario@localhost:~$ touch proba
usuario@localhost:~$ umask 153
usuario@localhost:~$ touch proba2
usuario@localhost:~$ ls -l proba*
-rw-rw-r-- 1 usuario usuario 0 Mar 26 16:36 proba
-rw--w-r-- 1 usuario usuario 0 Mar 26 16:47 proba2

Cómo se pode observar, nunca por defecto se aplicarán os permisos de execución, e logo unha vez aplicado o umask, nos seguintes arquivos creados se aplicarán os permisos desexados coa nosa mascara “rara”.

Un umask bastante efectivo e “seguro” sería o de 0055, o cal só deixaría permisos de lectura ao grupo e a outros. Ou ben meterlle o 7 para outros, e así non terán nengún permiso, mais estos permisos poden facer que os usuarios atopen problemas a hora de usalos arquivos, todo depende de cómo plantexes a seguridade e uso do teu sistema.

Umask na creación de directorios

Cando se crean arquivos, por seguridade o sistema nunca lles aplica o de execución (0666), mais cando creamos directorios por utilidade sempre se lles asina o de execución (0777), pois o directorio ao final é un arquivo que apunta aos inodes dos arquivos aos que enlaza, e sen “execución” o directorio non fai a súa “maxia” de amosar os arquivos que “contén”.

Tendo en conta o tema do permiso de execución o resto sería igual.

umask e permisos especiais

Nestos exemplos uso o 0 ao principio, mais o umask tamén pode afectar aos setuid, setgid e ao bit pegañento, mais non é unha práctica recomendable,xa que por defecto se crean sen este bit especial, polo tanto a restarlle 0 a este bit, incluso se podría definilo umask con só 3 números octais.