viernes, 13 de abril de 2018

06 - Permisos Linux

Usuario y Grupo propietario

En Linux todos los archivos pertenecen a un usuario y a un grupo. Cuando un usuario crea un nuevo archivo, el propietario del archivo será el usuario que lo ha creado y el grupo del archivo será el grupo principal de dicho usuario.

Por ejemplo si el usuario pepe cuyo grupo principal es profesores crea un nuevo archivo, el propietario será pepe y el grupo propietario será profesores.

Nota
Se puede cambiar el usuario y el grupo propietario de un archivo o carpeta con el comando chown. Para ello hay que disponer de permisos de escritura sobre el archivo o carpeta.

La sintaxis : # chown nuevo_usuario[.nuevo_grupo] nombre_archivo

Visualizar los permisos

Con el comando ls -l podemos visualizar el usuario y el grupo propietario y también los permisos de los archivos o carpetas. Al ejecutar el comando aparece una línea por cada archivo y el primer campo de cada línea corresponde a un bloque de 10 caracteres.



El primer carácter indica de qué tipo de archivo se trata. Lo más habitual es que sea un guión - que representa un fichero regular, una d que representa un directorio o una l que significa que se trata de un enlace. Pueden aparecer otros valores que corresponden a ficheros especiales como sockets (s), tuberías (p) y dispositivos de bloque (b) entre otros.

Tipos de permisos

En los Sistemas Linux, la gestión de los permisos que los usuarios y los grupos de usuarios tienen sobre los archivos y las carpetas, se realiza mediante un sencillo esquema de tres tipos de permisos que son:
  • Lectura (r)
  • Escritura (w)
  • Ejecución (x)
El significado de éstos permisos difiere si se tienen sobre archivos o sobre carpetas. 

LECTURA (r)

Cuando un usuario tiene permiso de lectura de un archivo significa que puede leerlo o visualizarlo, bien sea con una aplicación o mediante comandos. 

Cuando un usuario tiene permiso de lectura de una carpeta, significa que puede visualizar el contenido de la carpeta, es decir, puede ver los archivos y carpetas que contiene, bien sea con el comando ls o con un explorador de archivos. Si el usuario no tiene permiso de lectura sobre la carpeta, no podrá ver lo que contiene.

ESCRITURA (w)

Cuando un usuario tiene permiso de escritura sobre un archivo significa que puede modificar su contenido, e incluso borrarlo. También le da derecho a cambiar los permisos del archivo mediante el comando chmod así como cambiar su propietario y el grupo propietario mediante el comando chown. Si el usuario no tiene permiso de escritura, no podrá modificar el contenido del archivo.

Cuando un usuario tiene permiso de escritura sobre una carpeta, puede crear y eliminar archivos y otras carpetas dentro de ella. 

EJECUCIÓN (x)

Cuando un usuario tiene permiso de ejecución de un archivo significa que puede ejecutarlo. Si el usuario no dispone de permiso de ejecución, no podrá ejecutarlo aunque sea una aplicación.

Cuando un usuario tiene permiso de ejecución sobre una carpeta, significa que puede entrar en ella, bien sea con el comando cd o con un explorador de archivos. Si no dispone del permiso de ejecución significa que no puede ir a dicha carpeta.

Nota: Los únicos archivos ejecutables son las aplicaciones y los archivos de comandos (scripts). Si tratamos de ejecutar un archivo no ejecutable, dará errores.


¿A quién se puede otorgar permisos?

Los permisos pueden ser otorgados a tres tipos o grupos de usuarios:
  • Usuario propietario
  • Grupo propietario
  • Resto de usuarios

Ejemplo

Supongamos que pepe que pertenece al grupo principal profesores tiene los permisos abajo descritos sobre examen.txt eso significa que pepe podrá leer y escribir en el fichero, los miembros del grupo profesores podrán solo leerlo y el resto no podrá hacer nada. 


Si quiero que otros usuarios tengan permisos sobre examen.txt, no me quedará más remedio que incluirlos en el grupo profesores u otorgar permisos al resto de usuarios pero si hago esto último, todos los usuarios del sistema tendrían permisos, por lo que no se recomienda salvo que esa sea nuestra intención.

Importante
  • Para poder cambiar permisos sobre un archivo, es necesario ser el propietario o poseer el permiso de escritura sobre el mismo.
  • El superusuario root puede modificar los permisos  de cualquier archivo ya que tiene acceso total sin restricciones a la administración del sistema.
  • Existe un mecanismo que implementa una extensión del clásico sistema de permisos permitiendo asignar permisos a usuarios o grupos concretos, este mecanismo se conoce como Listas de control de Acceso (ACL)

Modificar permisos

Se utiliza el comando chmod cuya sintaxis es: #chmod permiso(s) archivo(s)

Los permisos se pueden representar de dos formas:

  • Notación simbólica: empleando los símbolos u g o a para referise a los usuarios, r w x para referirse a los permisos y los operadores + - , =
Ejemplos
  # chmod g+x examen.txt
  # chmod ugo-r examen.txt
  # chmod a=rw examen.txt
  # chmod u+w,go-w examen.txt
  • Notación octal: La segunda forma de representar los permisos es mediante la transformación de los permisos a su valor en octal aprovechando su localización posicional.
Equivalencia de permisos en Notación octal
Ejemplos
  # chmod 700 examen.txt
  # chmod 550 examen.txt
  # chmod 744 *
  # chmod -R 744 *
La Máscara

Cuando se crea un archivo en Linux el sistema le asigna unos permisos por defecto que son siempre 666 para el caso de ficheros y 777 para el caso de directorios. Estos permisos de salida se ven alterados por la máscara de usuario, un número que viene a enmascarar los permisos por defecto y que da como resultado lo permisos efectivos reales con los que se crean los ficheros o directorios.

La máscara es un parámetro que el usuario puede definir en cualquier momento con el comando umask, en Ubuntu 14.04 la máscara se encuentra definida a 002.


Calcular los permisos efectivos a partir de la máscara
  1. Expresar la máscara en octal
  2. Hacer el complemento a 1 de la máscara (negarla)
  3. Hacer un AND lógico entre el punto anterior y los permisos por defecto, 666 si es un fichero o 777 si es un directorio
Ejemplo

Calcular los permisos efectivos para ficheros y directorios sabiendo que la máscara está definida en 136
- La máscara 136 en octal es 001 011 110
- Hacemos complemento a 1 de la máscara 110 100 001
- Hacemos un AND lógico entre el complemento a 1 y los permisos por defecto de ficheros 666=110 110 110 y directorios 777=111 111 111  
- ficheros:    110 110 110 && 110 100 001 = 110 100 000 = 640
- directorios: 111 111 111 && 110 100 001 = 110 100 001 = 641


Como se puede observar en la imagen con una máscara de 136 los ficheros al crearse salen con permisos 640 y los directorios con permisos 641

Se puede fijar la máscara por defecto para todos los usuarios en el archivo /etc/profile o para cada usuario en el archivo /home/usuario/.bashrc

martes, 10 de abril de 2018

05 - Empaquetar y Comprimir

Es muy probable que en sistemas operativos como MS-DOS o Windows hayamos utilizado programas compresores de ficheros como pueden ser arj o winzip. Estas aplicaciones almacenan un conjunto de ficheros, manteniendo la estructura jerárquica de directorios y subdirectorios, en un único fichero, y los comprimen para reducir el espacio que utilizan. Es decir, realizan dos funciones: empaquetan y comprimen.

Linux dispone de comandos diferenciados para realizar cada una de estas tareas:
  • tar realiza únicamente la función de archivar, es decir, crea un fichero que contiene a su vez uno o varios ficheros guardando la estructura de directorios.
  • gzip,bzip,compress son programas compresores que normalmente se utilizan conjuntamente con el comando tar.
Extensiones

.tar - Fichero empaquetado con tar.
.tar.gz -  Fichero tar comprimido con gzip.
.tar.bz2 - Fichero tar comprimido con bzip2.
.tar.Z - Fichero tar comprimido con compress. 
Estos comandos son de uso muy extendido, ya que la mayoría de las aplicaciones se distribuyen utilizando estos formatos.

tar

El comando tar exclusivamente realiza la función de empaquetar en un archivo un conjunto de ficheros respetando su estructura de directorios. Además, puede reconocer y conserva todas las peculiaridades del sistema de ficheros de Linux, como el propietario y grupo de los ficheros, permisos y enlaces duros y simbólicos. El formato del comando tar es el siguiente: 

tar opciones ficheroacrearoextraer ficherosaempaquetar
El comando tar tiene asociado una serie de opciones que nos permite determinar su comportamiento. La primera opción que se debe especificar es la que indica la acción que debe realizar el comando tar, pudiendo elegir entre:

  • c: Crea un fichero tar.
  • t: Lista el contenido de un fichero tar.
  • x: Extrae el contenido de un fichero tar.
  • r: Añade archivos a un fichero tar.
Las opciones más utilizadas que podemos incluir posteriormente son las siguientes:

  • v: Muestra el nombre de los ficheros que se archivan.
  • p: Conserva los permisos de los ficheros.
  • M: Para trabajar con ficheros tar multivolumen
  • f fich_tar: Nombre del fichero tar que queremos utilizar

Ejemplos

tar cvf empaqueto.tar /home
Creará un fichero denominado empaqueto.tar donde se archivarán los ficheros del directorio /home. La opción v permite visualizar una lista de los archivos que se van insertando.

tar xvf empaqueto.tar
Extraer ficheros contenidos en empaqueto.tar al directorio actual. Ojo, los ficheros antiguos se sobreescriben por defecto

tar cvf usuarios.tar /etc/group /etc/passwd
Empaquetar los ficheros group y passwd en el fichero usuarios.tar

Observación

Por defecto tar solo hará la extracción correcta de los ficheros si lo ejecutamos desde el mismo sitio desde donde se hizo el empaquetado, y por eso es muy interesante la opción -t para poder ver la ruta que se alamacenó durante el empaquetado

gzip, bzip, compress

Son programas compresores que permiten reducir el tamaño de los ficheros. Normalmente los utilizaremos para comprimir los ficheros tar, pero pueden utilizarse con cualquier fichero.

gzip: Es el más utilizado ya que ofrece un factor de compresión mayor. Su formato es el siguiente:

gzip fichero
Comprimir
gzip -9 empaqueto.tar
El factor -9 me proporciona el mayor nivel de compresión (de 1 a 9) y es el que se utiliza con más frecuencia. El fichero que obtendremos se denominará empaqueto.tar.gz

Descomprimir
gunzip empaqueto.tar.gz
bzip2 o compress son otros compresores similares a gzip con extensiones bz2 y Z respectivamente. El funcionamiento es identico y sus extractores serían
bunzip2
y uncompress 

tar+gzip, tar+bzip2

Debido a que es muy usual utilizar estos comandos para primero archivar con tar un conjunto de archivos y posteriormente comprimirlos con gzip, existen opciones del comando tar que automáticamente comprimen el fichero obtenido.

La opción z de tar automáticamente comprime con gzip. La opción j hace lo propio con bzip2

Ejemplos

tar cvfz comprimo.tar.gz /home 
Esta orden empaqueta y comprime el directorio /home

tar xvfz comprimo.tar.gz /home 
Esta orden desempaqueta y descomprime el directorio /home