PERMISOS Y PROPIETARIOS DE
ARCHIVOS EN UNIX
============================================
Todos los archivos
y directorios en los Unix's tienen propietarios y permisos,
es la base de la
seguridad de archivos del sistema. Se pueden cambiar los
permisos y los
propietarios para restar o agregar restricciones de acceso.
Los permisos son
tambien los que definen si un archivo se puede ejecutar como
un comando.
cuando tipeamos ls
-l vemos algo como esto:
-rwxr-x--- 1 vorax
users 65 Dec 13 15:59
prueba*
drwx------ 2 vorax
users 1024 Dec 12 00:02
tmp/
El primer campo es
el que indica los permisos (-rwxr-x---). Tambien vemos que
"vorax"
es el *usuario* propietario del archivo y "users" es el *grupo*
propietario.
/tmp es un
directorio, el primer caracter de los permisos es una "d".
Estos son los
caracteres que pueden aparecer al principio de los permisos:
Caracter Significado
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ - | Archivo comun ³
³ d | Directorio ³
³ b | Block Device (disco,CD-ROM,etc) ³
³ l | Symbolic Link (BSD o V.4) ³
³ s | Socket (BSD o V.4) ³
³ = | FIFO (System V, Linux) ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Los permisos se
interpretan asi:
Son 10 caracteres, si quitamos el primero que
es el que indica el tipo de
archivo nos quedan 9 que se agrupan de a
tres:
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ propietario grupo
otros usuarios ³
³ (owner) (group) (others) ³
³ | rwx | | r-x | | --- | ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
r= read-lectura w= write-escritura x=eXecute-ejecucion
Con estos datos
sabemos que el usuario propietario del archivo (owner) puede
leer(r),
escribir(w) y ejecutar(x). Los miembros del grupo propietario pueden
leerlo(r) y
ejecutarlo(x). Los otros usuarios no pueden hacer nada (---)
En el caso del
directorio (/tmp):
(drwx------)
En un directorio
los caracteres se interpretan asi:
r= Permite ver el
contenido del directorio con ls.
w= Se pueden
crear, mover o borrar archivos dentro del directorio.
x= Se puede
acceder al directorio mediante cd.
Lo mas comun para
un directorio es r-x o rwx.
Modo numerico
-------------
Los permisos
pueden representarse con tres numeros octales (base 8) (ej:664)
y podemos usar el
modo numerico para cambiar los permisos a un archivo.
El primer digito
indica los privilegios del propietario, el segundo los del
grupo y el tercero
los de los otros usuarios. Cada digito se obtiene sumando
todos los privilegios (rwx) de cada propietario
(owner,group,others): Cada
privilegio es un
bit de un grupo de 3, su valor posicional si valen 1:
r=4 w=2 x=1
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
Volviendo a nuestro ejemplo (-rwxr-x---)
³owner = rwx =
4+2+1 = 7 ³ la codificacion numerica es 750 y este numero
³group = r-x =
4+1 = 5 ³ se obtiene de la forma que
se muestra en la figura.
³other = ---
= 0 ³ Si tomamos cada digito
octal como un numero de tres
³ 750³ digitos binarios. Y
si consideramos que si el
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
permiso esta habilitado es 1 y si no 0, entonces
r-x seria 101 en
binario, en decimal 4+0+1=5,y obtenemos un digito del permiso
octal.
Los mas comunes
son : 0,1,4,5,6,7 y en los tres casos: 600 750 640 644
SUID: 4000 SGID:
2000 (ver mas adelante)
CAMBIAR PERMISOS
(comando chmod)
--------------------------------
Cuando creamos un
archivo nos convertimos en sus propietarios y podemos
cambiar los
permisos de este mediante el comando "chmod"
<=SOLO EL PROPIETARIO PUEDE
CAMBIAR LOS PERMISOS=>
La sintaxis es:
chmod <especificacion> archivo_o_directorio
Hay dos formas de
cambiar los permisos: en forma numerica o con codigos de
letras.
=Modo numerico=
(en el prompt del
UNIX)
unix:~$ ls -l
prueba
-rwxr-x--- 1 vorax
users 65 Dec 13 15:59
prueba*
unix:~$chmod 511
prueba
unix:~$ls -l
prueba
-r-x--x--x 1 vorax
users 65 Dec 13 15:59
prueba*
unix:~$chmod 710
prueba
unix:~$ls -l
prueba
-rwx--x--- 1 vorax
users 65 Dec 13 15:59
prueba*
Aunque al
principio puede parecer dificil, posiblemente el modo numerico
sea el que mas
uses. Arriba explico como se obtiene el numero.
=Modo simbolico=
La sintaxis es:
chmod [ugoa...][=-+][rwxXstugo][...] pueden hacerse
multiples
operaciones simbolicas separadas por comas.
1) Primero debemos
especificar que permisos queremos modificar mediante una
letra: u= los del propietario (user)
g= los del grupo (group)
o= los de los otros (other)
a= los de todos (ugo)
2) Debemos indicar
si agregamos o sacamos un permiso, + y - respectivamente
o si lo modificamos, signo =
3)Indicamos los
permisos mediante el codigo de letras.
Ejemplo, para
agregar el permiso de lectura para el grupo y los otros:
unix:~$ chmod go+r
otros ejemplos :
unix:~$ ls -l
prueba
-rwxr-x--- 1 vorax users 65 Dec 13
15:59 prueba*
unix:~$ chmod
u-w,g-r,o+x prueba
unix:~$ ls -l
prueba
-r-x--x--x 1 vorax
users 65 Dec 13 15:59
prueba*
unix:~$ chmod
u+w,o-x prueba
unix:~$ ls -l
prueba
-rwx--x--- 1 vorax
users 65 Dec 13 15:59 prueba*
unix:~$chmod
a+x,u-rw prueba
unix:~$ ls -l
prueba
---x--x--x 1 vorax
users 5 Dec 13 15:59
prueba*
NOTAS
Estos comandos son
equivalentes: chmod ugo+rx =igual a=
chmod a+rx
Se pueden usar
comodines: chmod a-r *sec* (saca permiso de lectura a todos
los archivos que
tengan "sec" en su nombre: seco.txt casiseco.txt,etc)
Varios archivos a
la ves: chmod a+x zap.x wedit.x
Recursivamente
(como attrib /s en DOS) chmod a-r * -R (saca permiso de lectura
a todos los
archivos y directorio del directorio actual y subdirectorios)
Si un directorio
tiene permiso de escritura para todos (chmod o+w) cualquiera
puede borrar los
archivos que esten adentro sin importar los permisos.
Cualquiera con
permisos de lectura puede copiar el archivo. El propietario
de la copia es el
que la copio.
Chmod no cambia
los permisos de un link, si no del archivo al que este apunta.
SUID y GUID
===========
Hay casos en que
un usuario comun necesita tener privilegios. Por ejemplo
el programa passwd
que permite cambiar el password de un un usuario necesita
escribir en
/etc/passwd, y un usuario comun no tiene privilegios para hacerlo.
Para solucionar
esto UNIX permite que un programa se 'encubra' bajo la
identidad de su propietario,
asumiendo un UID o GID distinto al del usuario
que lo ejecuto. Un
programa que puede hacer esto se denomina SUID o SGID.
Cuando un programa
SUID se ejecuta, el "effective UID" (EUID) es el del
propietario del
archivo, aunque el usuario que lo ejecuto sea otro.
Si seteamos los
bits de permiso suid o sgid a un archivo ejecutable, otros
usuarios pueden
tener acceso a los mismos recursos (mediante el ejecutable)
que los
propietarios reales. Ejemplo:
el programa cat
que se encuentra generalmente en /bin nos permite ver el
contenido de un
archivo al que tenemos acceso de lectura:
unix:~$ cat
/etc/passwd
root:KQc4YhmF6pc6X:0:0:root:/root:/bin/bash
bin:*:1:1:bin:/bin:
[sigue]
Los permisos
normales de /bin/cat son:
unix:~$ls -l
/bin/cat
-rwxr-xr-x 1 root
bin 7737 Aug 6
1995 /bin/cat*
SI SOMOS ROOT
PODEMOS HACER ESTO:
unix:~$chmod u+s
/bin/cat (agregamos suid a
/bin/cat)
unix:~$ls -l
/bin/cat
-rwsr-xr-x 1 root
bin 7737 Aug 6
1995 /bin/cat*
( ^-la x de ejecucion fue reemplazada por una
"s")
Entonces cada vez
que un usuario usa "cat" toma momentaneamente la identidad
de su propietario
(root) por lo tanto puede leer cualquier archivo aunque
no tenga permisos
reales (si de Carlos) para hacerlo. :)
Si seteamos suid
un shell tenemos acceso de root como si entramos con login
y password: (HAY
QUE SER ROOT PARA HACER ESTO)
unix:~$cp /bin/sh
./rootsh
unix:~$chmod u+s
rootsh
unix:~$ls -l
rootsh
-rwsr-xr-x 1 root
users 299649 Dec 13 18:56
rootsh*
unix:~$rootsh
unix:~# (somos root :)
Si rootsh tuviera
estos permisos:
-rwsr-sr-x 1 juan
clientes 299649 Dec 13 18:56
rootsh*
Tomariamos la
identidad de "juan" y el grupo "clientes", aunque realmente
fueramos
"carlos" del grupo "users".
NOTAS
Si encontramos un
archivo suid escribible por nosotros es suficiente para
ganarse el r00t.
No les recomiendo
dejar shells suid root en los lugares que hakean como
forma para volver
a entrar, muchas utilidades de seguridad los
detectan
y hay mejores
metodos para asegurarse el reingreso.
Estos comandos son
equivalentes: chmod a+x,u+s =igual a=
chmod 4111
chmod
a+x,g+s =igual a= chmod 2111
chmod u+s,g+s =igual a= chmod 6111
Sticky Bit= si la
ultima x de un archivo es un "t" el programa
es Sticky. Esta
permiso en archivos es obsoleto pero se usa en directorios.
Este comando
muestra todos los SUID find / -type f -perm +u+s -ls
Si un archivo es
SUID o SGID pero no ejecutable (!) se ve una S mayuscula
prueben!.
CAMBIAR
PROPIETARIOS (chown,chgrp)
---------------------------------
Para cambiar el
grupo o usuario propietario de un archivo, se debe ser
"due¤o"
del mismo, o root. Para cambiar el grupo se debe pertenecer a el.
Sintaxis:
Cambiar grupo :
chgrp <grupo> archivo
Cambiar
'owner': chown <usurio> archivo
Ejemplos:
unix:~$chown vorax
.hosts_n (cambio el propietario del archivo .hosts_n)
unix:~$chgrp users
.hosts_n (cambio el grupo propietario del archivo)
unix:~$chown vorax
* (todos los archivos del
directorio)
unix:~$chown vorax
.titbax prueba ckd.c (varios archivos)
Si usamos los
numeros UID o GID:
unix:~$chown 501
.rare.txt (507 es el UID del usuario)
unix:~$chgrp 100
.rare.txt (100 es GID del grupo)
Todo junto:
chown usuario:grupo archivo
unix:~$chown
juan:users juan.txt (setea usuario:grupo de una vez)
unix:~$chown
juan: (setea usuario y el grupo
con el que esta logeado)
Y todas las
combinaciones posibles...
Usen el comando id
en cada uno de los ejemplos para entender mejor.
===========================================================================
Sacado del e-zine
RareGazz nº 10 por BrainSCAN para HackUMA