SUDO y /etc/sudoers

El comando SUDO nos permite ejecutar scripts, aplicaciones como root u otro usuario sin saber la contraseña de estos usando la de nuestro usuario pudiendo configurar infinidad de opciones para tener un mayor control de la seguridad de nuestro sistema.

La configuración está en el fichero /etc/sudoers (Linux) o /private/etc/sudoers (OSX) y debe ser editado (realmente se puede usar cualquier editor pero es recomendable hacerlo) con el comando visudo, que a parte de ejecutar nuestro editor favorito (usando la variable de entorno EDITOR) para editar el fichero antes de salir hace una comprobación del fichero, por si hubiera algún error.

En este artículo solo expongo algunas nociones y apuntes muy resumidos de lo que se puede hacer para ver en profundidad todo lo que se puede hacer lo mejor es ir a la página del manual, man sudoers desde consola o aquí.

Estructura del fichero sudoers

1. Definiciones de alias

Aquí lo que hacemos es definir un alias, que es básicamente una abreviación o agrupación de otros nombres o alias. Su formato es:

Alias_Type NAME = item1, item2, ...

Alias_Type -> puede ser:

  • Cmnd_Alias para comandos por ejemplo:
    Cmnd_Alias ADMIN = /usr/bin/apt-get, /usr/bin/dpkg
  • User_Alias para usuarios
    User_Alias COLEGAS = Eduardo, Alex
  • Runas_Alias para usuarios privilegiados
    Runas_Alias ADMINS = root, operator
  • Host_Alias para hosts
    Host_Alias REDES = 128.138.0.0/255.255.0.0, 129.32.2.0/24

NAME -> Es el nombre del alias. Debe empezar por letra mayúscula y sólo se permiten letras mayúsculas y números.
itemx puede ser un elemento o un alias el cual será expandido.

NOTA: Existe un alias especial, ALL, que se utiliza para englobar a todos los comandos, usuarios, hosts.

2. Ajuste de opciones

Aquí es donde definimos los valores por defecto de cada usuario para que tenga unas opciones diferentes o específicas. La sintaxis es la siguiente:

Defaults             lista_opciones
Defaults:usuario     lista_opciones
Defaults@host        lista_opciones

La lista_opciones es una lista de opciones separadas por comas. Existen cuatro tipos de opciones:

  1. Booleanos: Que se activan con sólo escribir el nombre de la opción y se desactivan con el símbolo ! delante.
  2. Enteros: De la forma nombre_opcion = valor
  3. Strings: Igual que los enteros nombre_opcion = “valor”
  4. Listas: Que pueden ser de la forma nombre_opcion = “valor1 valor2″. Éstas opciones también pueden utilizar += y -= en lugar de = para añadir elementos y quitar elementos respectivamente.

NOTA: para ver la lista completa de opciones y su descripción aquí.

3. Reglas de acceso

Aquí es donde definimos que usuario puede ejecutar qué comando bajo que usuario (por defecto root) y en que host lo pueden hacer (por defecto localmente). El formato es (lo que va entre [ ] es opcional):

usuario    host = [(usuario_privilegiado)] [NOPASSWD:] comando

Como se puede ver es bastante simple, pero aquí va una breve explicación:
usuario es el usuario al que vamos a permitir ejecutar algo con privilegios.
host es en que máquina puede ejecutar, por defecto (y comodidad) se suele poner ALL.
NOPASSWD: sirve para que SOLO en este comando NO pida nuestra contraseña para validar y ejecutar el comando.
comando, es lo que queremos ejecutar con privilegios, y debe tener el path completo.

4. Ejemplos

#
# Aliases
#

# Comandos para instalar paquetes en Debian
Cmnd_Alias APT = /usr/bin/apt-get, /usr/bin/dpkg

# Usuarios que pueden instalar paquetes
User_Alias ADMIN = paco, felix

# Usuarios privilegiados
Runas_Alias OP = root, operator

#
# Reglas de acceso
# 

# Sólo pueden instalar paquetes los usuarios de ADMIN
# (por defecto, como root). No necesitan contraseña.
ADMIN           ALL = NOPASSWD: APT

# El usuario edu puede des/montar como si fuese root
edu             ALL = (OP) /sbin/mount

# El root puede hacer lo que quiera.
root            ALL = (ALL) ALL

Compilar Netatalk con soporte de encriptación

Por defecto el paquete de netatalk de Debian (al menso en Etch) no viene con soporte de encriptación debido a las políticas de Debian, por lo que si usamos por ejemplo Leopard nos daremos cuanta que nuestro server de APF no funciona ya que Leopard obliga a las contraseñas vayan cifradas no en textos plano como en Tiger. Así que vamos a compilar nuestro propio paquete DEB de Netatlak con soporte de encriptación.

Primero nos vamos a un directorio temporal donde vamos a trabajar (luego se puede borrar a que solo es necesario para compilar):

mkdir /usr/src/netatalk
cd /usr/src/netatalk

Y procedemos a bajar los ficheros necesarios para compilar, primero comprobamos que tenemos las librerías y paquetes necesarios (puede que ya tengamos estos paquetes instalados, si es así seguimos):

apt-get install openssl cracklib2 libpam-cracklib cracklib2-dev wspanish

Nos bajamos el source de Netatalk (y sus ficheros complementarios .diff y .dsc):

apt-get source netatalk

Comprobamos que tenemos los paquetes requeridos para compilar el paquete Netatalk:

apt-get build-dep netatalk

Ya tenemos todo lo necesario para compilar, por lo que procedemos a modificar la configuración para indicarle que queremos soporte de encriptación:

cd netatalk-2.0.3/
vi debian/rules

Y añadimos la línea siguiente justo antes del comentario que dice ## FIXME:

DEB_BUILD_OPTIONS=ssl debuild 

y solo nos queda compilar y que todo vaya bien:

dpkg-buildpackage

Si todo ha ido bien (seguro que si) en el directorio superior a donde estamos se habrá creado el paquete Debian del Netatalk con soporte de encriptación, así que lo instalamos:

dpkg -i netatalk_2.0.3-4_i386.deb

Compilar un paquete Debian

En algunas ocasiones he necesitado compilar un paquete Debian para modificar algo o para tener una versión concreta que no está de momento en la distribución estable pero si en la inestable.

Para compilar un paquete de la distribución estable (o en la que estemos) para modificar algo o simplemente para compilarlo nosotros (no recomendado), primero nos vamos a un directorio temporal, por ejemplo:

cd /usr/src/nombre_del_paquete

Luego nos bajamos el fuente y los ficheros necesarios, como el .diff y el .dsc:

apt-get source nombe_del_paquete

Para asegurarnos  de que tenemos los paquetes necesarios para compilar:

apt-get build-dep netatalk

Ahora podemos ir al directorio donde están las fuentes y demás ficheros y directorios y modificar lo que necesitemos. Un fichero importante donde casi siempre añadiremos variables y opciones que por defecto no vienen es:

debian/rules

Una vez modificado lo que necesitemos, compilamos y generamos el o los paquetes tal cual lo haría un desarrollador:

dpkg-buildpackage

Una vez que termine (si no ha dado ningún eror) un nivel por encima de donde estamos habrá generado el/los .deb que podremos instarlar o actualizar y tendremos el paquete modificado casi como si fuera el oficial.

Soporte de GPG Keyring en APT v0.6 o superior

Instalar el paquete debian-keyring de la siguiente manera:

apt-get install debian-keyring

Si sale este error o similar:

W: GPG error: http://secure-testing.debian.net etch/security-updates
Release: The following signatures couldn't be verified because the public
key is not available: NO_PUBKEY 946AA6E18722E71E

Coger los últimos 8 dígitos de la pubkey (en el ejemplo de arriba: 8722E71E) y ejecutar los siguientes comandos:

$ gpg --keyserver pgp.mit.edu --recv-keys 8722E71E
$ gpg --armor --export 8722E71E | apt-key add -

Cómo instalar Sun Java en Debian Etch

Instalar el paquete sun-java5-jdk de la siguiente manera:

apt-get update
apt-get install sun-java5-jdk

Después, establecer la alternativa por defecto de la VM de java:

/usr/sbin/update-alternatives --config java

Elegir la opción que dice: /usr/lib/jvm/java-1.5.0-sun/jre/bin/java.

Hacer lo mismo con javac:

/usr/sbin/update-alternatives --config javac

Elegir la opción que dice: /usr/lib/jvm/java-1.5.0-sun/bin/javac.

Si todo salió bien, deberías poder ver algo así:

# java -version
java version ?1.5.0_08?
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_08-b03)
Java HotSpot(TM) Client VM (build 1.5.0_08-b03, mixed mode, sharing)

Cómo poner el plugin de java en el firefox

Hacer el enlace simbólico al directorio donde esté instalado el firefox:

ln -s /usr/lib/jvm/java-1.5.0-sun/jre/plugin/i386/ns7/libjavaplugin_oji.so /donde_este_firefox/plugins/