|
Administración básica de GNU/Linux (2) Permisos en GNU/Linux |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Permisos en GNU/LinuxPara evitar que otros usuarios accedan a nuestros ficheros en los sistemas UNIX se establecen permisos a todos los ficheros para indicar quien y cómo puede acceder a esos ficheros. Estos permisos juegan un papel importante ya que en los sistemas UNIX todo son ficheros. Cuando se escribe algo en el monitor para el sistema operativo se esta escribiendo en un fichero, de igual forma cuando se leen las pulsaciones del teclado el sistema operativo esta leyendo un fichero, el correspondiente al teclado. Gracias a este tipo de abstracción tenemos un sistema altamente configurable. Almacenamiento de permisosLos permisos de los ficheros se almacenan como un entero de doce bits y se dividen en cuatro ternas:
Tipos de permisosBasicamente los permisos que podemos encontrar son:
Estos permisos se comportan de forma diferente dependiendo de si se aplican a un fichero normal o a un directorio. El permiso de ejecuciónEl comportamiento de este permiso es el siguiente:
El permiso de escrituraEl comportamiento de este permiso es el siguiente:
El permiso de lecturaEl comportamiento de este permiso es el siguiente:
Comprobación de los permisos de un ficheroPara comprobar los permisos que tiene un fichero basta con hacer un ls -l:
En este caso tendríamos que en el directorio del superusuario sólo hay un fichero y vemos la salida nos produce siete columnas:
Los permisos los podemos ver en la primera columna y vienen representados (de izquierda a derecha) por diez caracteres:
Cuando en cualquiera de los permisos aparece un - significa que ese permiso no está concedido. Cómo cambiar los permisos de los ficherosLo primero indicar que las únicas personas que pueden cambiar los permisos de un fichero son el propietario y el superusuario, como cabría esperar. Para cambiar los permisos de un fichero se utiliza el comando chmod. Una cosa a tener en cuenta es que los permisos sólo se cambiaran a los ficheros dentro del directorio que especifiquemos y no dentro de los subdirectios que se encuentren dentro del subdirectorio especificado. Si los quisieramos cambiar en todos los subdirectorios contenidos en el directorio especificado debemos utilizar el flag -R. Cambiando los permisos de forma intuitivaPodemos cambiar los permisos de forma intuitiva, esta es la forma más fácil para usuarios no familiarizados con sistemas UNIX. La razón de decir que es una forma intuitiva es porque los usuarios ya experimentados lo hacen especificando los permisos en notación octal. Para asignar permisos podemos utilizar:
Veamos unos ejemplos:
El usuario bender ha hecho lo siguiente:
Podemos añadir el flag -v y nos informará del resultado:
Cambiar los permisos en octalLa forma que hemos visto es muy intuitiva, pero es muy tediosa. Tenemos que escribir muchas cosas. Evitar esto podemos hacerlo indicando los permisos como un número en octal. La razón es que cada categoría esta representada con tres caracteres. y para especificar que permisos permitimos pondremos un uno y los que no un cero y con tres digitos en binario se pueden representar ocho números, por eso octal. Esta es la forma en la que la mayoría de la gente establece sus permisos: Tabla 1. Estableciendo permisos en octal
Para establecer estos permisos:
Permisos por defecto (máscara)Cuando creamos un fichero ¿qué permisos se le asignan? Podemos comprobarlo con el comando umask:
Los permisos estan en octal, pero con una salvedad, en lugar de representar por un 1 los permisos concedidos al fichero se representan con un 0 los permisos concedidos. Otra cosa que llama la atención es que cuando vimos los permisos y su tratamiento en octal sólo había tres números, y ahora tenemos cuatro. Eso es porque existen unos permisos especiales, que luego veremos. El primer cero que aparece hace referencia a esos permisos. Para ver los permisos con los que se crean los ficheros por defecto de forma más clara:
Hay que tener en cuenta que si creamos un fichero que no es un ejecutable no se le darán los permisos de ejecución, aunque esten especificados en el UMASK. Los permisos con los que se crean los ficheros por defecto reciben el nombre de m´scara. Estableciendo la máscara en octalLa forma de establecer la máscara es poner a cero los permisos que se quieren conceder por defecto y a uno los que no: Tabla 2. Estableciendo la máscara en octal
Para establecer una nueva máscara:
El comando newgrpMuchas veces un usuario pertenece a varios grupos, por ejemplo a los grupos contable y program. Puede darse el caso en el que un usuario se dedique a realizar tareas administrativas, como por ejemplo contabilidades, pero que de vez en cuando necesite crear y compilar un programa utilizando uno de los muchos lenguajes de programación existentes para GNU/Linux. Es altamente recomendable el dar permisos de ejecución sobre los compiladores del sistema unicamente a las personas que necesiten usarlos, evitando de esta manera que nuestros usuarios se bajen un exploit, lo compilen y se dediquen a probarlo en nuestra máquina. También para evitar que un atacante que haya podido hacerse con una cuenta en el sistema tenga acceso a los compiladores, al menos le será más complicado ya que no todos los usuarios tienen privilegios para el uso de compiladores. Volviendo al caso anterior, como nuestro usuario se dedica principalmente a realizar contabilidades su grupo por defecto será contable, pero cuando necesite compilar un programa que haya creado para calcular la conversión de Pesetas a Euros, por ejemplo, no podrá compilarlo ya que el compilador que necesita utilizar unicamente tendrán permisos de ejecución para el dueño y para aquellos que pertenezcan al grupo de programadores program. Aunque nuestro usuario pertenece a ambos grupos no podrá, a priori, utilizar el compilador ya que su grupo por defecto es contable. Para ello necesitamos cambiar de grupo utilizando el comando newgrp:
De esta forma el grupo del usuario bender será a partir de ese momento program y todos sus accesos serán en función de dicho grupo. Si el grupo program tuviera establecida una contraseña sería solicitada y dicha contraseña estaría almacenada en /etc/group o si se tiene activado el shadowing de contraseñas en /etc/gshadow.
El comando suEste comando nos permite ejecutar una shell como otro usuario con sus privilegios dentro del sistema. Imaginemos que estamos en una sesión como el usuario bender y queremos abrir una sesión como usuario lila ya que el usuario lila tiene unos privilegios que el usuario bender no tiene:
Utilizando la misma conexión hemos asumido la identidad de lila y podemos acceder a los recursos del sistema que tenga acceso lila, para ello no hemos necesitado realizar otra conexión al sistema utilizando SSH o telnet. Una vez que hayamos terminado la tarea que queremos ralizar con el usuario del que hemos asumido su identidad, lila, para volver a nuestra identidad inicial, bender, tendremos que terminar sesión y lo podremos hacer pulsando CTRL + D o tecleando exit:
Una cosa a tener en cuenta es que al cambiar la identidad con su no cambia el directorio, es decir no entramos al directorio de trabajo del usuario al que hemos "suplantado", eso es debido a que no hemos cargado sus perfiles, es decir la información de sus ficheros de "profile" que estará presente en los archivos .bash_profile o .bashrc, si usamos la shell BASH, dentro de su directorio personal. Si quisieramos cargarlos tendremos que anteponer el símbolo "-" al nombre del usuario:
De esta forma abriamos iniciado sesión de la misma forma que si lo hubieramos hecho mediante SSH, telnet o iniciando sesión directamente en una consola del equipo.
Permisos especialesHemos visto los permisos que se pueden asignar a los ficheros, pero no habiamos visto unos permisos especiales, la terna más significativa. El permiso SUIDHay veces que es necesario que un programa se ejecute con los privilegios que tiene su propietario dentro del sistema y no del usuario que lo está ejecutando. Un ejemplo de esto es el comando passwd. Este comando establece los passwords de cada usuario dentro del sistema, pero para establecerlos necesitamos los privilegios del root para poder almacenarlos en las bases de datos del sistema (/etc/passwd, /etc/shadow). Es práctica habitual, aunque a veces no muy recomendable, el permitir a los usuarios que se cambien sus contraseñas de acceso al sistema. La forma de hacerlo es:
Tenemos un problema y es que al ejecutar passwd para almacenar la nueva contraseña se debe almacenar en ficheros en los que sólo el root puede escribir. Es necesario asumir la identidad del root para hacerlo ya que cuando ejecutamos un comando no importa quién sea el propietario se ejecutará con nuestros privilegios. Utilizando el comando su podríamos hacerlo, pero esto presenta un problema y es que entonces se podría lanzar cualquier comando con los privilegios de dicho usuario y si ese usuario es el root tendríamos un gravísimo problema de seguridad. La forma en la que el comando passwd lo ha hecho es que tiene activado un permiso especial, el permiso SUID. Cuando un programa tiene activado este permiso se ejecuta con los privilegios de su propietario y no con los de la persona que lo ejecuta. SUID es un acrónimo de Set User IDentity.
El comando passwd pertenece al usuario root y tiene activado el permiso SUID, por este motivo cuando lo ejecutamos se ejecuta con privilegios de root y puede escribir en los ficheros /etc/passwd y/o /etc/shadow:
Podemos ver quiene es el propietario del comando passwd y si nos fijamos en el permiso de ejecución del propietario aparece una "s" en lugar de una "x", esto significa que tiene activado el permiso SUID y se ejecutara con los privilegios que tenga en el sistema su propietario, en este caso con los privilegios de root. Si echamos un vistazo a los ficheros /etc/passwd y /etc/shadow:
Vemos que unicamente el usuario root puede escribir en ellos. Por este motivo a la hora de actualizar las contraseñs es necesario tener privilegios de root. Estableciendo el permiso SUIDSupongamos que el comando passwd no tiene activado el permiso SUID:
Se produce un error ya que al no tener activado el permiso SUID se ejecuta con los privilegios del usuario bender, que no puede escribir en los ficheros /etc/passwd y /etc/shadow. Para activar este permiso tendremos que anteponer un "4" a los permisos normales:
El permiso SGIDSGID es un acrónimo de Set Group IDentity. El funcionamiento de este permiso es igual que el SUID sólo que el comando se ejecutará con los privilegios del grupo del propietario en lugar de los privilegios del propietario. Estableciendo el permiso SGIDPara activar este permiso tendremos que anteponer un "2" a los permisos normales:
El permiso SGID y los directoriosEste permiso afecta a los directorios de una forma especial. Cuando un directorio tiene activado este permiso todos los ficheros que se creen dentro del directorio perteneceran al grupo del propietario de dicho directorio, no importa el grupo del usuario que lo cree o que el usuario que cree el fichero no pertenezca al grupo del propietario. Esto es útil cuando se trabaja en directorios compartidos. Normalmente un determinado grupo de usuarios pueden estar desarrollando un proyecto y trabajar en un directorio común. Para evitar problemas con los permisos, ya que cada usuario puede pertenecer a varios grupos y puede que cree el fichero bajo un grupo que no sea el común y esto afectará al resto de usuarios del grupo del proyecto. De esta forma se asegura que siempre los ficheros del directorios petenezcan al grupo del proyecto y los usuarios no tengan que andar cambiando de grupo. El Sticky bitUn programa con este permiso activado permanece en memoria después de terminar su ejecución, esto hará que la proxima vez que lo ejecutemos se ejecute más rápido ya que está en memoria, pero tiene un coste asociado y es que se pierde memoria ya que el programa se queda en la memoria al terminar la ejecución y esto puede saturar la memoria de nuestro sistema. Los ficheros que tienen este permiso activado mostrarán una "t" en el permiso de ejecución del resto de usuarios, última "x":
El Sticky bit y los directoriosEl Sticky Bit afecta a los directorios de una forma especial. Este bit se utiliza para tener una mayor seguridad sobre los ficheros contenidos en él. Si un directorio tiene activado ese bit no importa los permisos que tengan los ficheros en él contenidos, los únicos usuarios que podrán borrar o renombrar ficheros serán el propietario del fichero, el propietario del directorio o el root. Esta característica permite que dentro de un directorio todos los usuarios, con acceso, puedan cambiar el contenido de los ficheros. Pero que ninguno, excepto los anteriormente citados, pueda borrar o cambiar el nombre de los ficheros. Regalando ficherosPodemos regalar ficheros, siempre y cuando estos nos pertenezcan. Esto lo podemos hacer con el comando chown. Imaginemos que el usuario bender quiere dar un fichero al usuario fry:
El regalar un fichero significa el darle la propiedad a un determinado usuario. A partir de ese momento ya no tendremos la propiedad del fichero y no podremos tener acceso a dicho fichero a menos que su nuevo propietario nos autorice. Muy probablemente si intentamos ejecutar chown como un usuario normal nos pase algo parecido a esto:
Ello es debido a que es peligrosísimo el permitir a los usuarios regalar ficheros. Por este motivo en la mayoría de los sistemas los usuarios normales no pueden regalar ficheros al resto de usuarios. Problemas de seguridad con chownVeamos un ejemplo un poco más práctico sobre la peligrosidad del comando chown. El siguiente programa lee el fichero /etc/shadow y lo reemplaza pero dejando el campo del password del root en blanco y también crea el fichero oldPass donde almacena el hashing de la contraseña del root. Esto hace que el usuario root no necesite contraseña para acceder al sistema.
Si lo compilamos e ejecutamos:
La explicación es sencilla, un usuario normal no puede acceder al fichero /etc/shadow. Supongamos que en nuestro sistema se pueden regalar ficheros con el comando chown:
Si ahora abrimos una nueva consola e intentamos hacer login como root entraremos en el sistema ya que el usuario root no tiene contraseña y cualquiera puede logearse como root. Como nuestro exploit ha realizado una copia del password antiguo del root después de nuestra pequeña incursión podemos restaurar el fichero /etc/shadow y quedará como antes de la incursión, con la excepción de la fecha de la última modificación del fichero /etc/shadow.
|