viernes, 22 de septiembre de 2017

Permisos

Los sistemas operativos tradicionales de Unix difieren de los tradicionales de MS-DOS en que no sólo son sistemas multitarea, sino que también son sistemas multiusuario.

¿Qué significa ésto exactamente? Significa que más de una persona puede estar usando el ordenador al mismo tiempo. Aunque que un ordenador típico tendrá sólo un teclado y un monitor, podrá ser usado por más de un usuario. Por ejemplo, si un ordenador está conectado a una red o a Internet, los usuarios remotos pueden acceder via ssh (secure shell) y utilizar el ordenador. De hecho, los usuarios remotos pueden ejecutar aplicaciones gráficas y hacer que la salida gráfica aparezca en una pantalla remota. El Sistema X Windows soporta ésto como una parte de su diseño básico.

La capacidad multiusuario de Linux no es una innovación reciente, sino una característica que está profundamente integrada en el diseño del sistema operativo. Considerando el entorno en el que Unix fue creado, ésto tiene todo el sentido. Hace años, antes de que los ordenadores fueran “personales”, eran grandes, caros, y centralizados. Un ordenador típico de una universidad, por ejemplo, consistía en un gran ordenador central situado en un edificio y terminales localizados a lo largo del campus, cada uno conectado al gran ordenador central. El ordenador tenía que soportar muchos usuarios al mismo tiempo.

Para hacer ésto práctico, el sistema tenía que ser ideado para proteger a los usuarios unos de otros. Después de todo, las acciones que de un usuario no podían permitirle estropear el ordenador, ni un usuario podía interferir en los archivos que pertenecía a otro usuario.

En este capítulo vamos a ver esta parte esencial de la seguridad del sistema y presentaremos los siguientes comandos:

  • id – Muestra la identidad del usuario
  • chmod – Cambia el modo de un archivo
  • umask – Establece los permisos por defecto
  • su – Ejecuta un shell como otro usuario
  • sudo – Ejecuta un comando como otro usuario
  • chown – Cambia el propietario de un archivo
  • chgrp – Cambia la propiedad de grupo de un archivo
  • passwd – Cambia la contraseña de un usuario
Propietarios, miembros del grupo, y todos los demás

Cuando estabamos explorando en sistema allá por el capítulo 3, pudimos encontrar un problema cuando intentábamos examinar un archivo como /etc/shadow:

 [me@linuxbox ~]$ file /etc/shadow
 /etc/shadow: regular file, no read permission
 [me@linuxbox ~]$ less /etc/shadow
 /etc/shadow: Permission denied

La razón de este mensaje de error es que, como usuarios normales, no tenemos permiso para leer este archivo.

En el modelo de seguridad de Unix, un usuario puede poseer archivos y directorios. Cuando un usuario posee un archivo o directorio, el usuario tiene control sobre su acceso. Los usuarios pueden, sucesivamente, pertenecer a un grupo consistente en uno o más usuarios a quienes se le ha dado acceso a archivos y directorios por sus propietarios. Además de conceder acceso a un grupo, un propietario puede también conceder algún tipo de derechos de acceso a todo el mundo, a quienes en el lenguaje de Unix nos referimos como el mundo. Para encontrar información sobre tu identidad, usa el comando id:

 [me@linuxbox ~]$ id
 uid=500(me) gid=500(me) groups=500(me)

Veamos la salida. Cuando se crea una cuenta de usuario, al usuario se le asigna un número llamado ID de usuario o uid que es, por el bien de los humanos, asignado a un nombre de usuario. Al usuario se le asigna un ID de grupo primario o gid y puede pertenecer a grupos adicionales. El ejemplo anterior es de un sistema Fedora. En otros sistemas, como Ubuntu, la salida puede ser un poco diferente:
    

[me@linuxbox ~]$ id
uid=1000(me) gid=1000(me)
groups=4(adm),20(dialout),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),108(lpadmin),114(admin),1000(me)

Como podemos ver, los números uid y gid son diferentes. Ésto simplemente es porque Fedora empieza numerando las cuentas de los usuarios normales desde el 500, mientras que Ubuntu empieza en el 1000. También podemos ver que el usuario de Ubuntu pertenece a muchos más grupos. Ésto tiene que ver con la forma en que Ubuntu maneja los privilegios para los dispositivos y servicios del sistema.

Pero ¿de dónde viene esta información? Como tantas otras muchas cosas en Linux, de un par de archivos de texto. Las cuentas de usuario está definidas en el archivo /etc/passwd y los grupos están definidos en el archivo /etc/group. Cuando las cuentas y los grupos de usuarios son creados, estos archivos son modificados junto con archivo /etc/shadow que guarda la información de las contraseñas de los usuarios. Para cada cuenta de usuario, el archivo /etc/passwd define el nombre de usuario (login), uid, gid, el nombre real de la cuenta, el directorio home y el shell de login. Si examinas el contenido de /etc/passwd y /etc/group, verás que además de las cuentas de los usuarios normales, hay cuentas para el superusuario (uid 0) y varios otros usuarios del sistema.

En el próximo capítulo, veremos procesos, y verás que algunos de esos otros usuarios están, de hecho, muy ocupados.

Mientras que muchos sistemas como-Unix asignan los usuarios normales a un grupo común como “users”, la práctica en los Linux modernos es crear un único grupo, con un único usuario y el mismo nombre que el usuario. Ésto hace más fácil asignar ciertos tipos de permisos.


Leer, escribir y ejecutar

Los derechos de acceso a archivos y directorios se definen en términos de derechos de lectura, escritura y ejecución. Si miramos la salida del comando ls, podemos obtener alguna pista de cómo se implementan:

 [me@linuxbox ~]$ > foo.txt
 [me@linuxbox ~]$ ls -l foo.txt
 -rw-rw-r-- 1 me me 0 2008-03-06 14:52 foo.txt

Los primeros diez caracteres de la lista son los atributos del archivo. El primero de éstos caracteres es el tipo de archivo. Aquí tenemos los tipos de archivo que se ven más a menudo (hay otros, menos comunes):


Tipos de archivo:

-    Archivo normal


d    Directorio

l    Enlace simbólico. Fíjate que con los enlaces simbólicos, el resto de los atributos del archivo son siempre “rwxrwxrwx” y que son valores de relleno. Los atributos reales son los del archivo al que el enlace simbólico apunta.

c    Archivo de carácter especial. Este tipo de archivo se refiere a un dispositivo que soporta datos como una cadena de bytes, como un terminal o un modem.


b    Archivo de bloque especial. Este tipo de archivo se refiere a un dispositivo que soporta datos en bloques, como un disco duro o una unidad de CD. 
Los nueve caracteres restantes de los atributos del archivo, se llaman modo de archivo, y representan los permisos de lectura, escritura y ejecución del propietario de archivo, del grupo del propietario del archivo y del resto de usuarios:

Propietario    Grupo    Mundo
   rwx          rwx      rwx

Cuando establecemos los atributos de modo r, w y x tienen el siguiente efecto sobre los archivos y directorios:


r  Archivos:    Permite que un archivo sea abierto y leído.

   Directorios: Permite que el contenido del directorio sea listado si el atributo de ejecución también está configurado.

w  Archivos:    Permite que un archivo sea escrito o truncado, sin embargo este atributo no permite renombrar o borrar los archivos. La capacidad de borrar o renombrar archivos viene determinada por los atributos del directorio.

   Directorios: Permite crear, borrar y renombrar archivos dentro de un directorio si el atributo de ejecución también está establecido.

x  Archivos:    Permite que un archivo sea tratado como un programa y ejecutarlo. Los archivos de programas escritos en lenguajes de script deben ser también configurados como legibles para ser ejecutados.

   Directorios: Permite entrar en el directorio, p.ej., cd directorio

Aquí tenemos algunos ejemplos de configuraciones de atributos de archivo:


Ejemplos de atributos de permisos

-rwx------            
Un archivo normal que se puede leer, escribir y ejecutar por el propietario del archivo. Nadie más tiene acceso.

-rw-------            

Un archivo normal que se puede leer y escribir por el propietario del archivo. Nadie más tiene acceso.

-rw-r—r--             

Un archivo normal que se puede leer y escribir por el propietario del archivo. Los miembros del grupo del propietario del archivo puede leerlo. El archivo lo puede leer todo el mundo.

-rwxr-xr-x            

Un archivo normal que lo puede leer, escribir y ejecutar el propietario del archivo. El archivo puede ser leído y ejecutado por todos los demás.

-rw-rw----            

Un archivo normal que lo puede leer y escribir el propietario del archivo y los miembros de su grupo nada más.

lrwxrwxrwx            

Un enlace simbólico. Todos los enlaces simbólicos tienen permisos de relleno. Los permisos reales se guardan en el archivo real al que apunta el enlace simbólico.

drwxrwx---            

Un directorio. El propietario y los miembros de su grupo pueden entrar en el directorio y crear, renombrar y borrar archivos dentro del directorio.

drwxr-x---            

Un directorio. El propietario puede entrar en el directorio y crear, renombrar y borrar archivos dentro del directorio. Los miembros del grupo del propietario pueden entrar en el directorio pero no pueden crear, borrar o renombrar archivos.

chmod – Cambiando el modo de archivo

Para cambiar el modo (los permisos) de un archivo o un directorio, se utiliza el comando chmod. Ten en cuenta que sólo el propietario del archivo o el superusuario pueden cambiar el modo de un archivo o un directorio. chmod soporta dos formas distintas de especificar los cambios de modo: representación en números octales o representación simbólica. Veremos la representación en números octales primero.

Con la notación octal usamos números octales para especificar el patrón de los permisos que queremos. Como cada dígito en un número octal representa tres dígitos binarios, esto coincide muy bien con la forma de almacenar el modo de archivo. Esta tabla muestra lo que queremos decir:

Modos de archivo en Binario y Octal

Octal    Binario    Modo de archivo
0        000        ---
1        001        --x
2        010        -w-
3        011        -wx
4        100        r--
5        101        r-x
6        110        rw-

7        111        rwx

Usando tres dígitos octales, podemos establecer el modo de archivo para el propietario, el grupo del propietario y el mundo:

 [me@linuxbox ~]$ > foo.txt
 [me@linuxbox ~]$ ls -l foo.txt
 -rw-rw-r-- 1 me me 0 2008-03-06 14:52 foo.txt
 [me@linuxbox ~]$ chmod 600 foo.txt
 [me@linuxbox ~]$ ls -l foo.txt
 -rw------- 1 me me 0 2008-03-06 14:52 foo.txt

Pasándole el argumento “600”, podemos establecer los permisos del propietario para leer y escribir mientras borramos todos los permisos para el grupo del propietario y el mundo. Aunque recordar la correspondencia entre octal y binario puede parecer un inconveniente, normalmente sólo tendrás que usar algunos muy comunes: 7(rwx), 6(rw-), 5(r-x), 4(r--), y 0(---).

chmod también soporta notación simbólica para especificar los modos de archivo. La notación simbólica se divide en tres partes: a quien afecta el cambio, que operación se realizarán, y que permisos se establecerán. Para especificar quien se ve afectado se usa una combinación de los caracteres “u”, “g”, “o” y “a” de la siguiente manera:

Notación simbólica de chmod


u  Abreviatura de “usuario” pero significa el propietario del archivo o el directorio.

g  El grupo del propietario.

o  Abreviatura de “otros”, pero se 
refiere al mundo.

a  Abreviatura de “all” (todos). Es la combinación de “u”, “g” y “o”

Si no se especifica ningún carácter, se asume “all”. La operación puede ser un “+” indicando que un permiso ha de ser añadido, un “-” indicando que un permiso ha de ser retirado, o un “=” indicando que sólo los permisos especificados deben ser aplicados y todos los demás han de ser eliminados.

Los permisos se especifican con los caracteres “r”, “w” y “x”. Aquí tenemos algunos ejemplos de la notación simbólica:

Ejemplos de notación simbólica de chmod

u+x
Añade permisos de ejecución para el propietario

u-x
Elimina permisos de ejecución del propietario

+x
Añade permisos de ejecución para el propietario, el grupo y el mundo. Equivalente a a+x

o-rw
Elimina los permisos de lectura y escritura para todos incluyendo el propietario y el grupo del propietario.

go=rw
Configura al grupo del propietario y todo el mundo incluido del propietario para que tengan permisos de lectura y escritura. Si el grupo del propietario o el mundo previamente tenían permisos de ejecución, los elimina.

u+x, go=rx
Añade permisos de ejecución para el propietario y establece los permisos para el grupo y para otros de lectura y ejecución. Múltiples especificaciones pueden ser separadas por comas.


Algunos prefieren usar la notación octal, otros prefieren la simbólica. La notación simbólica ofrece la ventaja de permitirte establecer un atributo individual sin molestar a los otros.

Échale un vistazo a la man page de chmod para más detalles y una lista de opciones. Un aviso de precaución acerca de la opción “--recursive”: actúa tanto en archivos como en directorios, así que no es tan útil como uno esperaría, raras veces queremos que archivos y directorios tengan los mismos permisos.

¿Qué diablos es un octal?


Octal (base 8), y su primo, hexadecimal (base 16) son sistemas numéricos que se utilizan a menudo para expresar números en ordenadores. Nosotros los humanos, debido al hecho de que (al menos la mayoría de nosotros) hemos nacido con diez dedos, contamos usando un sistema numérico en base 10. Los ordenadores, por otra parte, han nacido sólo con un dedo y por tanto todo lo cuentan en sistema binario (base 2). Su sistema numérico sólo tiene dos numerales, 0 y 1. Así que contar en binario tiene esta pinta:

0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011...

En octal, se cuenta con los números de cero al siete, así:

0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21...

Contar en hexadecimal usa los números de cero a nueve más las letras "A" a "F":

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13...

Mientras que podemos ver el sentido del binario (ya que los ordenadores sólo tienen un dedo), ¿para que sirven los octales y los hexadecimales? La respuesta tiene que ver con la conveniencia humana. Muchas veces, pequeños trozos de datos se representan en los ordenadores como patrones de bits. Tomemos como ejemplo un color RGB. En la mayoría de las pantallas de ordenador, cada pixel se compone de tres componentes de color: ocho bits para el rojo, ocho bits para el verde y ocho bits para el azul. Un bonito azul claro podría ser un número de 24 dígitos:

010000110110111111001101

¿Te gustaría leer y escribir este tipo de números todos los días? Creo que no. Aquí es donde otro sistema numérico nos puede ayudar. Cada dígito en hexadecimal representa cuatro dígitos en binario. En octal, cada dígito representa tres dígitos binarios. Así que nuestro azul claro de 24 dígitos podría reducirse a un número hexadecimal de seis dígitos:

436FCD

Cómo los dígitos en el número hexadecimal "se alinean" con los dígitos del número binario, podemos ver que el componente rojo de nuestro color es 43, el verde 6F, y el azul CD.
Hoy en día, la notación hexadecimal (a menudo llamada "hex") es más común que la octal, pero como veremos pronto, la capacidad de los octales para expresar tres bits de binario será muy útil...

Configurando el modo de un archivo con la GUI


Ahora que hemos visto como se configuran los permisos en archivos y directorios, podemos entender mejor los diálogos de permisos en la GUI. Tanto en Nautilus (GNOME) como en Konqueror (KDE), pulsar con el botón derecho en el icono de un archivo o un directorio nos mostrará un cuadro de diálogo de propiedades. Aquí tenemos un ejemplo de KDE 3,5:

Cuadro de diálogo de propiedades
de un archivo en KDE 3.5

Aquí podemos ver la configuración para el propietario, el grupo y el mundo. En KDE, pulsando el botón “Advanced Permissions” (Permisos avanzados), nos mostrará un nuevo diálogo que nos permitirá establecer cada uno de los atributos de modo individualmente. ¡Otra victoria a la comprensión proporcionada por la línea de comandos!



umask – Establecer los permisos por defecto

El comando umask controla los permisos por defecto dados a un archivo cuando éste es creado. Usa notación octal para expresar una máscara de bits que serán eliminados de los atributos del modo de un archivo. Echemos un vistazo:



 [me@linuxbox ~]$ rm -f foo.txt

 [me@linuxbox ~]$ umask

 0002
 [me@linuxbox ~]$ > foo.txt
 [me@linuxbox ~]$ ls -l foo.txt
 -rw-rw-r-- 1 me me 0 2008-03-06 14:53 foo.txt

Primero hemos eliminado cualquier copia antigua de foo.txt para asegurarnos de que empezamos de cero. A continuación, hemos ejecutado el comando umask sin argumentos para ver el valor actual. Ha respondido con el valor 0002 (el valor 0022 es otro valor por defecto muy común), que es la representación octal de nuestra máscara. Luego hemos creado una nueva instancia de foo.txt y hemos observado sus permisos.

Podemos ver que tanto el propietario como el grupo tienen permisos de lectura y escritura, mientras que los demás sólo tienen permisos de lectura. La razón por la que el mundo no tiene permisos de escritura es por el valor de la máscara. Repitamos nuestro ejemplo, esta vez estableciendo la máscara nosotros mismos:

 [me@linuxbox ~]$ rm foo.txt
 [me@linuxbox ~]$ umask 0000
 [me@linuxbox ~]$ > foo.txt
 [me@linuxbox ~]$ ls -l foo.txt
 -rw-rw-rw- 1 me me 0 2008-03-06 14:58 foo.txt

Cuando establecemos la máscara como 0000 (en la práctica la desactivamos), podemos ver que el archivo ahora es editable por el mundo. Para entender como funciona, tenemos que mirar a los números octales de nuevo. Si tomamos la máscara y la expandimos a binario, y luego la comparamos con los atributos, podemos ver lo que sucede: 

 Modo de archivo original    --- rw- rw- rw-  
 Máscara                     000 000 000 010
 Resultado                   --- rw- rw- r--

Olvida por el momento los ceros a la izquierda (volveremos a ellos en un minuto) y observa que donde aparece el 1 en nuestra máscara, el atributo se elimina – en este caso, los permisos de escritura del mundo. Ésto es lo que hace la máscara. Donde aparezca un 1 en el valor binario de la máscara, un atributo es desactivado. Si miramos el valor de máscara 0022, podemos ver lo que hace:

 Modo de archivo original    --- rw- rw- rw-
 Máscara                     000 000 010 010
 Resultado                   --- rw- r-- r--

De nuevo, donde aparece un 1 en el valor binario, el correspondiente atributo es desactivado. Prueba con algunos valores (prueba algunos sietes) para acostumbrarte a su funcionamiento. Cuando lo hayas hecho, recuerda limpiar:

 [me@linuxbox ~]$ rm foo.txt; umask 0002

La mayoría de las veces no tendrás que cambiar la máscara; la que tu distribución trae por defecto irá bien. En algunas situaciones de alta seguridad, sin embargo, querrás controlarla.

Algunos permisos especiales

Aunque a veces vemos la máscara octal de permisos expresada como un número de tres dígitos, es más correcto técnicamente expresarla en cuatro dígitos ¿por qué? Porque, además de permisos de lectura, escritura y ejecución, hay algunas otras configuraciones de permisos menos usadas.

El primero de ellos es el setuid bit (octal 4000). Cuando lo aplicamos a un archivo ejecutable, cambia la ID efectiva de usuario del usuario real (el usuario que realmente está utilizando el programa) a la del propietario del programa. Muy a menudo esto se aplica a unos pocos programas cuyo propietario es el superusuario. Cuando un usuario ordinario ejecuta un programa que está “setuid root”, el programa funciona con los privilegios efectivos del superusuario. Esto permite al programa acceder a archivos y directorios a los que un usuario ordinario tendría normalmente prohibido su acceso. Por supuesto, debido que esto plantea problemas de seguridad, el número de programas setuid debe reducirse al mínimo necesario.

El segundo permiso menos usado es el setgid bit (octal 2000) el cual, como el setuid bit, cambia el ID efectivo de grupo de el ID real de grupo al del propietario del archivo. Si el setgid bit se aplica en un directorio, los nuevos archivos que se creen en el directorio tendrán como grupo del propietario el del directorio en lugar del de creador del archivo. Esto es útil en un directorio compartido cuando los miembros de un grupo común necesitan acceso a todos los archivos del directorio, independientemente del grupo del propietario primario del archivo.

El tercero se llama el sticky bit (octal 1000). Esto es una reliquia del antiguo Unix, donde era posible marcar un archivo ejecutable como “no intercambiable”. En archivos, Linux ignora el sticky bit, pero si se aplica a un directorio, previene que los usuarios borren o renombren archivos a menos que el usuario sea el propietario del directorio, el propietario del archivo o el superusuario. Esto, a menudo, se usa para controlar el acceso a un directorio compartido, como /tmp.

Aquí hay algunos ejemplos de uso de chmod con notación simbólica para establecer estos permisos especiales. Primero asignaremos setuid a un programa:

 chmod u+s program

A continuación, asignaremos setgid a un directorio:

 chmod g+s dir

Finalmente, asignaremos el sticky bit a un directorio:

 chmod +t dir

Cuando vemos la salida de ls, podemos determinar los permisos especiales. Aquí tenemos algunos ejemplos, primero un programa que tiene setuid:

 -rwsr-xr-x

Un directorio que tiene el atributo setgid:

 drwxrwsr-x

Un directorio con el sticky bit establecido:

 drwxrwxrwt

Cambiar identidades


Muchas veces, encontraremos necesario tomar la identidad de otro usuario. A menudo querremos ganar permisos de superusuario para manejar tareas administrativas, pero también es posible “convertirse” en otro usuario normal para cosas como probar una cuenta. Hay tres formas para tomar una identidad alternativa:
  1. Cerrar la sesión y volver a abrirla como el usuario alternativo.
  2. Usar el comando su.
  3. Usar el comando sudo.
Nos saltaremos la primera técnica ya que sabemos como hacerlo y además no tiene las ventajas de las otras dos. Desde dentro de nuestra propia sesión de shell, el comando su nos permite asumir la identidad de otro usuario, abriendo una nueva sesión de shell con la ID de ese usuario o ejecutar un comando como ese usuario. El comando sudo permite a un administrador modificar un archivo de configuración llamado /etc/sudoers, y definir comandos específicos que usuarios particulares tienen permiso ejecutar bajo un identidad asumida. La elección de qué comando usar está muy condicionada por la distribución Linux que uses. Tu distribución probablemente incluya los dos comandos, pero su configuración favorecerá un comando u otro. Empezaremos con su.

su – Ejecutar un Shell con Ids sustitutos de usuarios y grupos


El comando su se usar para arrancar un shell como otro usuario. La sintaxis del comando es así:

 su [-[l]] [user]

Si se incluye la opción “-l”, la sesión shell resultante es un shell de login para el usuario especificado. Ésto significa que el entorno del usuario se carga y el directorio de trabajo se cambia al directorio home del usuario. Ésto es lo que queremos normalmente. Si no especificamos el usuario, se asume el superusuario. Fíjate que (extrañamente) puede ser abreviada como “-”, que es como se usa más a menudo. Para arrancar una shell para el superusuario, haríamos esto:

 [me@linuxbox ~]$ su -

 Password:
 [root@linuxbox ~]#

Después de introducir el comando, nos pide la contraseña del superusuario. Si la introducimos correctamente, un nuevo prompt de shell aparece indicando que ésta nueva shell tiene privilegios de superusuario (“#” en lugar de “$”) y el directorio de trabajo actual es ahora el directorio home del superusuario (normalmente /root.). Una vez que estamos en el nuevo shell, podemos ejecutar comandos como superusuario. Cuando terminemos, escribimos “exit” para volver al shell previo:

 [root@linuxbox ~]# exit

 [me@linuxbox ~]$

También es posible ejecutar un único comando en lugar de comenzar un nuevo comando interactivo usando su de la siguiente forma:
su -c 'comando'
Usando esta forma, un única línea de comandos es pasada al nuevo shell para su ejecución. Es importante incluir el comando entre comillas simples, ya que no queremos que se realice una expansión en nuestro shell, ni tampoco en el nuevo shell:

 [me@linuxbox ~]$ su -c 'ls -l /root/*'

 Password:
 -rw------- 1 root root 754 2007-08-11 03:19 
 /root/anaconda-ks.cfg
 /root/Mail:total 0
 [me@linuxbox ~]$

sudo – Ejecutar un comando como otro usuario


El comando sudo es como su en muchos aspectos, pero tiene algunas capacidades adicionales importantes. El administrador puede configurar sudo para permitir a los usuarios ordinarios ejecutar comandos como un usuario diferente (normalmente el superusuario) de una forma muy controlada. En particular, un usuario estaría limitado a uno o más comandos específicos y no a otros. Otra diferencia importante es que el uso de sudo no requiere la contraseña del superusuario. Para autenticarse usando sudo, el usuario utiliza su propia contraseña. Digamos, por ejemplo, que sudo ha sido configurado para permitirnos ejecutar una programa ficticio de copias de seguridad llamado “backup_script”, que requiere privilegios de superusuario. Con sudo podría hacerse así:

 [me@linuxbox ~]$ sudo backup_script
 Password:
 System Backup Starting...

Después de introducir el comando, somo preguntados por nuestra contraseña (no la del superusuario) y una vez que la autenticación está completada, el comando especificado se lleva a cabo. Una diferencia importante entre su y sudo es que sudo no abre una nueva shell, ni carga el entorno de otro usuario. Esto significa que los comandos no necesitan ser entrecomillados de forma diferente a la que lo estarían si lo ejecutáramos sin usar sudo. Ten en cuenta que este comportamiento puede ser anulado especificando varias opciones. Mira la man page de sudo para más detalles.

Para ver qué privilegios están aceptados por sudo, usa la opción “-l” para listarlos:

 [me@linuxbox ~]$ sudo -l

 User me may run the following commands on this host:
     (ALL) ALL

Ubuntu y sudo


Uno de los problemas recurrentes para los usuarios normales es ejecutar ciertas tareas que requieren privilegios de superusuario. Estas tareas incluyen instalar y actualizar software, editar archivos de configuración del sistema, y acceder a dispositivos. En el mundo Windows, se hace a menudo dando a los usuarios privilegios de administrador. Ésto permite a los usuarios ejecutar estas tareas. Sin embargo, también permite que los programas ejecutados por el usuario tengan las mismas capacidades. Esto no es deseable en la mayoría de los casos, ya que permite al malware (sortware malicioso) como virus tener dominio absoluto del ordenador. En el mundo Unix, siempre ha habido una gran división entre los usuarios normales y los administradores, debido a la herencia multiusuario de Unix. El enfoque tomado en Unix es proporcionar privilegios de superusuario sólo cuando se necesite. Para hacer ésto, se usan comúnmente los comando su y sudo.

Hasta hace pocos años, la mayoría de las distribuciones Linux confiaban en su para éste propósito. su no requiere la configuración que requiere sudo, y tener una cuenta root es tradicional en Unix. Esto creaba un problema. Los usuarios tendían a operar como root cuando no era necesario. De hecho, algunos usuarios operaban sus sistemas como root exclusivamente, ya que eliminaban todos esos molestos mensajes de “permiso denegado”. Así es como se reduce la seguridad de un sistema Linux a la de un sistema Windows. No es una buena idea.

Cuando apareció Ubuntu, sus creadores tomaron un rumbo diferente. Por defecto, Ubuntu desactiva el acceso a la cuenta root (impidiendo establecer una contraseña para la cuenta), y en lugar utiliza sudo para proporcionar privilegios de superusuario. La cuenta de usuario inicial tiene acceso a privilegios completos de superusuario vía sudo y pueden proporcionar poderes similares a posteriores cuentas de usuario.

chown – Cambia el propietario y el grupo de un archivo


El comando chown se utiliza para cambiar el propietario y el grupo del propietario de un archivo o un directorio. Se requieren privilegios de superusuario para utilizar este comando. La sintaxis de chown tiene este aspecto:

 chown [propietario][:[grupo]] archivo...

chown puede cambiar el propietario del archivo y/o el grupo del propietario dependiendo del primer argumento del comando. Aquí tenemos algunos ejemplos:

Ejemplos de argumentos de chown


bob
Cambia el propietario del archivo del propietario actual al usuario bob.

bob:users
Cambia la propiedad del archivo de su actual propietario al usuario bob y cambia el grupo del propietario del archivo al grupo users.

:admins
Cambia el grupo del propietario al grupo admins. El propietario del archivo no cambia

bob:
Cambia el propietario del archivo del propietario actual al usuario bob y cambia el grupo del propietario al grupo de acceso del usuario bob. 
Digamos que tenemos dos usuarios; janet, quien tiene acceso a privilegios de superusuario y tony, que no los tiene. El usuario janet quiere copiar un archivo de su directorio home al directorio home del usuario tony. Como el usuario janet quiere que tony pueda editar el archivo, janet cambia la propiedad del archivo copiado de janet a tony:

 [janet@linuxbox ~]$ sudo cp myfile.txt
 ~tony
 Password:
 [janet@linuxbox ~]$ sudo ls -l ~tony/myfile.txt
-rw-r--r-- 1 root root 8031 2008-03-20 14:30
 /home/tony/myfile.txt
 [janet@linuxbox ~]$ sudo chown tony: ~tony/
 myfile.txt[janet@linuxbox ~]$ sudo ls -l ~tony/myfile.txt
 -rw-r--r-- 1 tony tony 8031 2008-03-20 14:30 /home/tony/myfile.txt

Aquí vemos que el usuario janet copia el archivo de su directorio al directorio home del usuario tony. A continuación, janet cambia la propiedad del archivo de root (como resultado de usar sudo) a tony. Usando los dos puntos en el primer argumento, janet también ha cambiado el grupo del propietario del archivo al grupo de acceso de tony, que resulta ser el grupo tony.

Fíjate que tras el primer uso de sudo, janet ¿no es preguntada por su usuario? Ésto es porque sudo, en la mayoría de las configuraciones, “confía” en ti unos minutos antes de que su temporizador se cierra.

chgrp – Cambiando el grupo del propietario

En antiguas versiones de Unix, el comando chown sólo cambiaba la propiedad del archivo, no el grupo del propietario. Para ese propósito, un comando a parte, chgrp era el utilizado. Funciona de forma muy parecida a chown, excepto en que es mucho más limitado.


Ejercitando nuestros privilegios

Ahora que hemos aprendido como funciona esto de los permisos, es hora de lucirse. Vamos a demostrar la solución a un problema común – configurar un directorio compartido. Imaginemos que tenemos dos usuarios llamados “bill” y “karen”. Ambos tiene colecciones de CDs de música y les gustaría crear un directorio compartido, donde cada uno guarde sus archivos de música como Ogg Vorbis o MP3. El usuario bill tiene acceso a privilegios de superusuario vía sudo.
La primera cosa que tiene que ocurrir es crear un grupo que tenga a bill y a karen como miembros. Usando la herramienta gráfica de gestión de usuarios, bill crea un grupo llamado music y le añade los usuarios bill y karen:

Creando un nuevo grupo con GNOME

A continuación, bill crea el directorio para los archivos de música:

 [bill@linuxbox ~]$ sudo mkdir
 /usr/local/share/Music
 Password:

Como bill está manipulando archivos fuera de su directorio home, requiere privilegios de superusuario. Después de crear el directorio, tendrá los siguientes propietarios y permisos:

 [bill@linuxbox ~]$ ls -ld
 usr/local/share/Music
 drwxr-xr-x 2 root root 4096 2008-03-21 18:05 /usr/local/share/Music

Como podemos ver, el directorio tiene como propietarios al root y tiene permisos 755. Para hacer este directorio compartible, bill necesita cambiar el grupo del propietario y sus permisos para permitir la escritura:

 [bill@linuxbox ~]$ sudo chown :music
 /usr/local/share/Music
 [bill@linuxbox ~]$ sudo chmod 775 /usr/local/share/Music
 [bill@linuxbox ~]$ ls -ld /usr/local/share/Music
 drwxrwxr-x 2 root music 4096 2008-03-21 18:05 /usr/local/share/Music

¿Pero qué significa todo ésto? Significa que ahora tenemos un directorio, 
/usr/local/share/Music 
cuyo propietario es root y permite acceso de lectura y escritura al grupo music. El grupo music tiene como miembros al bill y karen, tanto bill como karen pueden crear archivos en el directorio /usr/local/share/Music. Otros usuarios pueden listar el contenido del directorio pero no pueden crear archivos dentro.

Pero aún tenemos un problema. Con los permisos actuales, los archivos y directorios creados en el directorio Music tendrán los permisos normales de los usuarios bill y karen:

 [bill@linuxbox ~]$ > /usr/local/share/Music/test_file

 [bill@linuxbox ~]$ ls -l /usr/local/share/Music
 -rw-r--r-- 1 bill bill 0 2008-03-24 20:03 test_file


Realmente tenemos dos problemas. Primero, la umask en este sistema es 0022 la cual previene que los miembros del grupo no puedan escribir archivos pertenecientes a otros miembros del grupo. Ésto no sería un problema si el directorio compartido sólo contuviera archivos, pero como este directorio contendrá música, y la música suele organizarse en una jerarquía de artistas y álbumes, los miembros del grupo necesitarán la capacidad de crear archivos y directorios dentro de los directorios creados por otros miembros. Necesitamos modificar la umask utilizada por bill y karen a 0002.

Segundo, cada archivo y directorio creado por un miembro será adjudicado al grupo primario del usuario en lugar de al grupo música. Ésto se puede arreglar estableciendo el setgid bit en el directorio:

    [bill@linuxbox ~]$ sudo chmod g+s
    /usr/local/share/Music[bill@linuxbox ~]$ ls -ld 
    /usr/local/share/Musicdrwxrwsr-x 2 root music 4096 
    2008-03-24 20:03 /usr/local/share/Music

Ahora probaremos a ver si los nuevos permisos arreglan el problema. bill establece su umask a 0002, elimina el anterior archivo de prueba, y crea un nuevo archivo y directorio de pruebas:

 [bill@linuxbox ~]$ umask 0002
 [bill@linuxbox ~]$ rm /usr/local/share/Music/test_file
 [bill@linuxbox ~]$ > /usr/local/share/Music/test_file
 [bill@linuxbox ~]$ mkdir /usr/local/share/Music/test_dir
 [bill@linuxbox ~]$ ls -l /usr/local/share/Music
 drwxrwsr-x 2 bill music 4096 2008-03-24 20:24 test_dir
 -rw-rw-r-- 1 bill music 0 2008-03-24 20:22 test_file
 [bill@linuxbox ~]$

Tanto archivos como directorios se crean ahora con los permisos correctos para permitir a todos los miembros del grupo music crear archivos y directorios dentro del directorio Music.

El único problema que queda es umask. La configuración necesaria sólo dura hasta el final de la sesión y debe ser reconfigurada. En el Capítulo 11, veremos como hacer el cambio de umask permanente.

Cambiando tu contraseña


El último asunto que veremos en este capítulo es establecer contraseñas para tí mismo (y para otros usuarios si tienes acceso a privilegios de superusuario). Para establecer o cambiar una contraseña, se usa el comando passwd. La sintaxis del comando es así:

 passwd [usuario]

Para cambiar tu contraseña, sólo introduce el comando passwd. Serás preguntado por tu contraseña anterior y por la nueva:

 [me@linuxbox ~]$ passwd
 (current) UNIX password:
 New UNIX password:

El comando passwd tratará de obligarte a usar contraseñas “fuertes”. Ésto significa que rechazará contraseñas que son muy cortas, muy parecidas a contraseñas anteriores, palabras del diccionario, o muy fácilmente adivinables:

 [me@linuxbox ~]$ passwd

 (current) UNIX password:
 New UNIX password:
 BAD PASSWORD: is too similar to the old one
 New UNIX password:
 BAD PASSWORD: it is WAY too short
 New UNIX password:
 BAD PASSWORD: it is based on a dictionary word

Si tienes privilegios de superusuario, puedes especificar un nombre de usuario como argumento en el comando passwd para establecer la contraseña de otro usuario. Hay otras opciones disponibles para el superusuario como, el bloqueo de cuentas, caducidad de la contraseña, etc. Mira la man page de passwd para más detalles.

Resumiendo


En este capítulo hemos visto como los sistemas como-Unix, por ejemplo Linux manejan los permisos de usuario para permitirles acceso para leer, escribir y ejecutar archivos y directorios. La idea básica de este sistema de permisos viene de los primeros días de Unix y se han mantenido muy bien con el paso del tiempo. Pero el mecanismo nativo de permisos en los sistemas Unix-like carecen de lCuadro de diálogo de propiedades de un archivo en KDE 3.5 a granularidad precisa de sistemas más modernos.

Para saber más


Wikipedia tiene un buen artículo sobre malware:

Hay numerosos programas de línea de comandos para crear y mantener usuarios y grupos. Para más información, mira las man pages de los siguientes comandos:
  • adduser
  • useradd
  • groupadd

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.