Permisos especiales: Sticky Bit, SUID, SGID


Hay una serie de permisos especiales sobre el sistema de archivos de Linux que pueden resultarnos útiles para determinadas tareas o para organizar directorios colaborativos entre diferentes usuarios.

Sticky bit

El Sticky bit se utiliza para permitir que cualquiera pueda escribir y modificar sobre un archivo o directorio, pero que solo su propietario o root pueda eliminarlo. Un ejemplo de uso es el directorio /tmp, que debe tener permisos para ser utilizado por cualquier proceso, pero solo el dueño o root puede eliminar los archivos que crea.

Para aplicar el Sticky bit a un directorio:

[hvivani@test archivos]$ chmod 1755 dirtest/
[hvivani@test archivos]$ ls -l
total 8
drwxr-xr-t. 2 hvivani group 4096 sep  6 09:32 dirtest

Al directorio con el Sticky Bit aplicado se le agrega la t al final del descriptor de permisos.

SUID

El bit SUID activo en un archivo significa que el que lo ejecute va a tener los mismos permisos que el que creó el archivo. Esto puede llegar a ser muy util en algunas situaciones pero hay que utilizarlo con cuidado, dado que puede generar grandes problemas de seguridad.

Para que sea efectivo el archivo debe tener permisos de ejecución.

Para activarlo:

[hvivani@test ~]$ chmod 4775 kk.sh 
[hvivani@test ~]$ ls -l kk.sh 
-rwsrwxr-x. 1 hvivani group 133 ago 27 08:25 kk.sh
[hvivani@test ~]$ chmod -x kk.sh 
[hvivani@test ~]$ ls -l kk.sh 
-rwSrw-r--. 1 hvivani group 133 ago 27 08:25 kk.sh

Vean que en la ultima línea le saqué el permiso de ejecución al archivo y en los permisos se reemplaza la s por la S. En este caso no tiene efecto el bit.

SGID

El SGID es lo mismo que en el SUID, pero a nivel de grupo. Es decir, todo archivo que tenga activo el SGID, al ser ejecutado, tendrá los privilegios del grupo al que pertenece.

Esto es muy usado cuando queremos configurar un directorio colaborativo: si aplicamos este bit al directorio, cualquier archivo creado en dicho directorio, tendrá asignado el grupo al que pertenece el directorio.

[hvivani@test tmp]$ chmod 2775 dirtest/
[hvivani@test tmp]$ ll
total 8
drwxrwsr-x. 2 hvivani grupo 4096 sep  6 09:32 dirtest
[hvivani@test tmp]$ su usuario1
Contraseña: 
[usuario1@test tmp]$ cd dirtest/
[usuario1@test dirtest]$ touch nn.txt
[usuario1@test dirtest]$ ll
total 0
-rw-r--r--. 1 usuario1 grupo 0 Sep  6 09:50 nn.txt

Al igual que con el SUID, aparece una s o una S reemplazando la x en los permisos del grupo.

Uso de disco de usuarios por consola


Este es un simple script para obtener el uso de disco de los usuarios de nuestro servidor linux. Se basa en la utilización del comando du. Puede ser muy util cuando trabajamos con home’s centralizados.

#!/bin/sh
#hvivani. 20120828
#imprime totales de uso de disco por usuario verificando cada home.

cd /home/
for f in `ls`
do
 du -sh ./$f
done

Reemplazo de disco en Software RAID


Cuando tenemos armado un RAID por soft y tenemos algún problema con un disco, la primer pregunta que se nos viene a la cabeza es: cuál es el disco quie está fallando ???

Este no es un dato que salte a la vista y debemos determinarlo bien, ya que si comenzamos a cambiar discos desordenadamente seguramente terminemos destruyendo el RAID.

La manera de determinar que disco está fallando es consultar en el sistema los números de serie de los discos activos y luego, verificar estos números con las etiquetas de los discos.

Como consultamos los números de serie de los discos ?

# smartctl -i /dev/sdb1

ó

# hdparm -i /dev/sda1

ó

# ls -l /dev/disk/by-id/

Como añadimos un disco fisico nuevo a un raid donde se removio el disco ?

# mdadm --manage -a /dev/md1 /dev/sdb

Como consultamos el estado de un RAID o el avance de su reconstrucción ?

# mdadm --detail /dev/md1

ó

# cat /proc/mdstat

 

 

Formateando un pendrive con mkfs


Formatear un pendrive con compatibilidad con sistemas de archivos FAT (Windows) es tan simple como ejecutar un solo comando de la forma:

mkfs.vfat -n <etiqueta> <dispositivo>

por ejemplo:

$ sudo mkfs.vfat -n kingston /dev/sdb1

Ahora bien, el pendrive debe estar desmontado al momento de formatear, asi que para saber que dispositivo es el que debemos formatear, antes de desmontar hacemos un

$ sudo fdisk -l

o un

dmesg | tail

para ver con que nombre está montado.

 

 

 

 

Creando un Live USB con livecd-iso-to-disk.sh


Vamos a crear un live usb booteable utilizando una imágen de Linux, de por ejemplo algún cd de rescate.

Esta es una herramienta útil en cualquier momento para salvar algún servidor o hacer una instalación por red.

OJO: supongo que el pendrive está vacío. De otro modo, tomar los recaudos necesarios.

Para esto primero descargamos el script livecd-iso-to-disk.sh que es el que realizará el trabajo de instalación de la imágen al usb.

Necesitaremos el archivo imágen de linux a instalar previamente descargado. yo voy a utilzar una de Fedora 7 Rescue.

Necesitamos tener instalado syslinux, si no lo tenemos:

$ sudo yum install syslinux

Debemos tener marcada la partición del usb como booteable, si no es así, la modificamos con fdisk:

$ sudo fdisk /dev/sdc

Orden (m para obtener ayuda): p

Disco /dev/sdc: 1940 MB, 1940226048 bytes
16 heads, 32 sectors/track, 7401 cylinders, 3789504 sectores en total
Units = sectores of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificador del disco: 0xc3072e18

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sdc1            8064     3789503     1890720    6  FAT16

Orden (m para obtener ayuda): h
h: orden desconocida
Orden  Acción
   a   Conmuta el indicador de iniciable
   b   Modifica la etiqueta de disco bsd
   c   Conmuta el indicador de compatibilidad con DOS
   d   Suprime una partición
   l   Lista los tipos de particiones conocidos
   m   Imprime este menú
   n   Añade una nueva partición
   o   Crea una nueva tabla de particiones DOS vacía
   p   Imprime la tabla de particiones
   q   Sale sin guardar los cambios
   s   Crea una nueva etiqueta de disco Sun
   t   Cambia el identificador de sistema de una partición
   u   Cambia las unidades de visualización/entrada
   v   Verifica la tabla de particiones
   w   Escribe la tabla en el disco y sale
   x   Funciones adicionales (sólo para usuarios avanzados)

Orden (m para obtener ayuda): a
Número de partición (1-4): 1

Orden (m para obtener ayuda): p

Disco /dev/sdc: 1940 MB, 1940226048 bytes
16 heads, 32 sectors/track, 7401 cylinders, 3789504 sectores en total
Units = sectores of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificador del disco: 0xc3072e18

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sdc1   *        8064     3789503     1890720    6  FAT16

Orden (m para obtener ayuda): w
¡Se ha modificado la tabla de particiones!

Llamando a ioctl() para volver a leer la tabla de particiones.
Se están sincronizando los discos.

Ahora procedemos a ejecutar el script pasandole como parámetros la imágen a instalar y la partición del usb donde debe instalarse:

OJO: Desmontar el pendrive antes de ejecutar.

$ su -c "./tools_livecd-iso-to-disk.sh --format --reset-mbr Fedora7-i386-rescuecd.iso /dev/sdc1"
Contraseña:
Verifying image...
./tools_livecd-iso-to-disk.sh: línea 806: checkisomd5: no se encontró la orden
Are you SURE you want to continue?
Press Enter to continue or ctrl-c to abort

/home/hvivani/TMP/Fedora7-i386-rescuecd.iso uses initrd.img w/o install.img
Copying DVD image to target device.
Updating boot config file
Installing boot loader
Target device is now set up with a Live image!

Listo !

 

 

 

Cambiar fecha de Creación o Modificación de un archivo – Change File Timestamp


Supongamos que tenemos este archivo:

[root@galileo db]# ls -l arba*
-rwxr–r–. 1 user sistemas 14125053 Mar 17 09:42 arba_db_20110217050004.rar

Con touch -t cambiamos el timestamp del archivo
pasandole al parámetro -t la fecha con el siguiente formato: YYMMDDhhmm.ss

[root@galileo db]# touch -t 201102170500.04 arba_db_20110217050004.rar

Quedando así:
[root@galileo db]# ls  -l arba*
-rwxr–r–. 1 user sistemas 14125053 Feb 17 05:00 arba_db_20110217050004.rar

Podemos usar touch con la opción -m para modificar solamente el timestamp de modificación o -a para modificar solo el timestamp de acceso

Creando RAID 1 por software


En un par de discos nuevos en un servidor vamos a crear un
RAID 1 (espejo) para tener algo de tolerancia a fallos:

Identificamos los discos/dispositivos a utilizar:
/dev/sdc
/dev/hdc

En uno de los discos debemos crear la particion:

Creamos partición de tipo raid en la totalidad del disco:
#fdisk /dev/sdc
new partition: n
primary partition: p
particion number: 1
First cylinder: 1
Last cylinder: (last)

Change partition type: t
Hex code: fd (Linux raid autodetect)

grabamos cambios y salimos: w

Creamos el dispositivo RAID:
# mdadm –create –level=1 –raid-devices=2 /dev/md1 /dev/sdc /dev/hdc

Podemos monitorear el proceso de espejado de los discos con:
# cat /proc/mdstat

o

# mdadm –detail /dev/md1

Formateamos file system ext3:
#mkfs.ext3 /dev/md1

Armamos el montaje del raid:
Creamos el directorio de montaje:
# mkdir /data

Editamos el /etc/fstab y agregamos el punto de montaje:
/dev/md1                /data                   ext3    defaults        1 1

Releemos el fstab para verificar y montar de acuerdo a la nueva entrada:
# mount -a

Creamos la entrada en el /etc/mdadm.conf para definir el nuevo raid:
# mdadm –examine –scan  >> /etc/mdadm.conf

Script de notificación de uso de quota de disco / Disk Quota Notification Script


Estuve un rato buscando si alguien se había tomado el trabajito de armar un script para enviar un mail a los usuarios cuando estos estuvieran superando la quota de disco (al menos la SOFT quota) pero no econtré nada similar, así que no me quedó otra que hacerlo… Aquí dejo mi aporte para los que lo necesiten:

Lo que hace es recorrer los usuarios existentes en el /etc/passwd con UID >= 500. Esto es para Linux CentOS, Fedora, Redhat, pero pueden modificarlo para otros linuxes.
Para cada uno de ellos utiliza el comando repquota y compara los campos soft y hard para calcular el espacio utilizado.
En base a esto envía un mail de notificación al usuario y otro a sistemas para que nos enteremos que determinado usuario tiene problemas de quota.

#!/bin/sh
#hvivani. 20101217
#verifica quotas de usuario en filesystem y envía mail notificando exceso de soft quota.

for name in $(awk -F: ‘($3>=500) && ($3!=65534) {print $1}’ /etc/passwd)
do
      limiteSoft=`/usr/sbin/repquota /  |grep “$name ” |awk ‘($3>$4) && ($4!=0) {print $4}’`
      usado=`/usr/sbin/repquota /  |grep “$name ” |awk ‘($3>$4) && ($4!=0) {print $3}’`
      limiteHard=`/usr/sbin/repquota /  |grep “$name ” |awk ‘($3>$4) && ($4!=0) {print $5}’`

      ### si el limite soft no es nulo
      if [ -n “$limiteSoft” ]
      then
         ### si el limite soft supera el espacio utilizado
         if [ “$usado” -ge “$limiteSoft” ]
         then
            nota=”Usuario: $name, Ud. esta excediendo su espacio en disco: Limite: $limiteSoft Bytes. Utilizado: $usado Bytes. Por favor, libere espacio en su carpeta personal o sistema de correo.”
            echo $nota | mail -s “ATENCION: Uso de Disco !!” $name@dominio.com.ar
            echo “El usuario $name ha superado SOFT quota. Limite: $limiteSoft Bytes. Utilizado: $usado Bytes.” | mail -s “ATENCION: Uso de Disco $name !!” sistemas@dominio.com.ar
         fi
         ### si el limite hard supera el espacio utilizado
         if [ “$usado” -ge “$limiteHard” ]
         then
            nota=”Usuario $name, Ud, esta excediendo su espacio en disco: Limite: $limiteHard Bytes. Utilizado: $usado Bytes. No podrá escribir en su sistema hasta que libere espacio en su carpeta personal o sistema de correo.”
            echo $nota | mail -s “Uso de Disco !!” $name@dominio.com.ar
            echo “El usuario $name ha superado HARD quota. Limite: $limiteSoft Bytes. Utilizado: $usado Bytes.” | mail -s “ATENCION: Uso de Disco $name !!” sistemas@dominio.com.ar
         fi
      fi

done

Configurando Quotas de disco


Para poder establecer quotas de disco en una determinada partición debemos indicar un parametro adicional en el momento del montaje de la partición.
Esto lo hacemos agregando el parametro “usrquota” (para usuarios) o el parametro “grpquota” (para grupos) en el /etc/fstab.
Por ejemplo, para establecer las quotas de usuario y grupo en el punto de montaje “home”:
/dev/hda2 /home ext3 defaults, usrquota 1 1

Remontamos la partición para que tengan efectos los cambios que hicimos en el fstab:
# mount -o remount /home

Creamos la base de datos de quotas en el filesystem:
# quotacheck -vcugm /home

Iniciamos las quotas:
# quotaon -a /home

Para establecer las quotas:
# edquota usuario

Disk quotas for user usuario (uid 500):
  Filesystem                                               blocks       soft       hard     inodes     soft     hard
  /dev/mapper/VolGroup00-LogVol00    2044          0          0           315         0         0

Significado de cada campo:
Blocks: Son bloques utilizados. 1k blocks.
soft: Limite Soft, a partir de donde avisa.
hard: Limite Hard, a partir de donde niega la escritura.
Inodes: Limite de inodos utilizados.
soft: Limite Soft, a partir de donde avisa.
hard: Limite Hard, a partir de donde niega la escritura.

O podemos hacer directamente 
# setquota usuario 4096 5120 40 50 /home

Para consultar las quotas podemos usar los comandos quota o repquota entre otros.

Buscar y eliminar archivos por antiguedad


Esto siempre resulta útil para realizar taréas de mantenimiento del filesystem:
Buscar y eliminar archivos con mas de 3 días de antiguedad:

# find /home/ -mtime +3 -exec rm -rf {} \;

Si queremos que sean los que tienen menos de 3 días de antiguedad, reemplazamos el +3 por -3.
Si queremos que sean los que tienen exactamente 3 días de antiguedad, reemplazamos el +3 por 3.