Sudo
La orden sudo ofrece una forma sencilla y segura de escalar los privilegios de un usuario, esto es, permite que los usuarios normales lancen algunas (o incluso todas) las órdenes como el usuario root o como otro usuario, bien facilitando una contraseña o no.
Cuando quiera que varias personas realicen ciertas tareas administrativas en su sistema sin que tenga que concederles un acceso total como root, el uso de sudo es la mejor opción. Con sudo puede controlar quién puede hacer según qué. Esta guía le ofrece una pequeña introducción a esta potente herramienta.
Este artículo pretende ser una introducción rápida. El paquete app-admin/sudo es mucho más potente que lo que aquí se describe. Tiene características especiales para la edición de ficheros con un usuario distinto (sudoedit), se puede lanzar desde un guión (por lo que puede estar en segundo plano, leer la contraseña desde la entrada estándar en lugar del teclado, ...), etc.
Por favor, lea las páginas del manual de sudo y de sudoers para obtener más información.
Instalación
sudo is not part of the system set, so it must be installed manually, if it is needed.
The su command should always be available, in case sudo is not installed.
Ajustes USE
USE flags for app-admin/sudo Allows users or groups to run commands as other users
+secure-path
|
Replace PATH variable with compile time secure paths |
+sendmail
|
Allow sudo to send emails with sendmail |
gcrypt
|
Use message digest functions from dev-libs/libgcrypt instead of sudo's |
ldap
|
Add LDAP support (Lightweight Directory Access Protocol) |
nls
|
Add Native Language Support (using gettext - GNU locale utilities) |
offensive
|
Let sudo print insults when the user types the wrong password |
pam
|
Add support for PAM (Pluggable Authentication Modules) - DANGEROUS to arbitrarily flip |
sasl
|
Add support for the Simple Authentication and Security Layer |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
skey
|
Enable S/Key (Single use password) authentication support |
ssl
|
Add support for SSL/TLS connections (Secure Socket Layer / Transport Layer Security) |
sssd
|
Add System Security Services Daemon support |
verify-sig
|
Verify upstream signatures on distfiles |
Emerge
root #
emerge --ask app-admin/sudo
Configuración
Registrar la actividad
Una ventaja adicional de sudo es que puede registrar cualquier intento (satisfactorio o no) de lanzar una aplicación. Esto es de gran utilidad si le quiere seguir la pista al que cometió ese error fatal que le llevó diez horas arreglar :)
Conceder permisos
El paquete app-admin/sudo permite al administrador del sistema otorgar permiso a otros usuarios para lanzar una o más aplicaciones sobre las que, normalmente, no tendría permiso. A diferencia de usar el bit setuid
en estas aplicaciones, sudo proporciona un control más fino acerca de quién puede lanzar cierta orden y cuándo puede hacerlo.
Con sudo puede hacer una lista completa de "quién" puede ejecutar una aplicación determinada. Si estableciera el bit setuid en un ejecutable, cualquier usuario podría ejecutar la aplicación (o cualquier usuario de un grupo en concreto, dependiendo de los permisos empleados). Con sudo se puede (e incluso se debe) exigir al usuario que proporcione una contraseña cuando éste quiera ejecutar la aplicación.
La configuración de sudo se gestiona mediante el fichero /etc/sudoers. Este fichero no se debe editar con nano /etc/sudoers o vim /etc/sudoers o cualquier otro editor que se utilice normalmente. Cuando quiera modificar el fichero /etc/sudoers debe utilizar siempre visudo. Esta herramienta asegura que dos administradores no están editando este fichero en el mismo momento, mantiene los permisos sobre el mismo y realiza una comprobación de la sintaxis para asegurar que no se han incluido errores fatales en el el fichero.
The /etc/sudoers should never be edited through nano /etc/sudoers or vim /etc/sudoers, or any other editor that is normally used. When altering the /etc/sudoers file, always use visudo. This tool makes sure that no two system administrators are editing this file at the same time, preserves the permissions on the file, and performs some syntax checking to make sure no fatal mistakes in the file.
Sintaxis básica
La parte más difícil de sudo es la sintaxis de /etc/sudoers. La sintaxis básica se muestra a continuación:
usuario nombre_de_equipo = orden
Esta línea le indica a sudo que el usuario, identificado como usuario
y conectado al sistema nombre_de_equipo
, puede ejecutar la orden orden
(que también puede ser una lista de órdenes separadas por comas).
Un ejemplo más cercano a una situación real podría clarificar esto: Para permitir que el usuario larry lance emerge cuando está en localhost:
larry localhost = /usr/bin/emerge
El nombre del equipo debe coincidir con el que devuelve la orden hostname.
En el caso más sencillo, las órdenes deben ser rutas completas cualificadas a los ejecutables: Por ejemplo:
/usr/bin/emerge
no solo emerge
. Las rutas pueden también contener caracteres comodín y pueden hacer referencia a directorios enteros. Leer la página del manual para obtener más detalles.No permita que un usuario normal lance una aplicación que le permita escalar sus privilegios. Por ejemplo, al permitir que los usuarios lancen Portage#emerge como root puede ofrecerles acceso total como root al sistema ya que se puede manipular emerge para cambiar el sistema de ficheros del sistema al antojo del usuario. Si no confía en sus usuarios sudo, no les otorgue ningún privilegio adicional.
El nombre de usuario también se puede sustituir por un nombre de grupo en cual al nombre se le antepone el símbolo %
al nombre del grupo. Por ejemplo, para permitir que cualquier usuario del grupo wheel pueda correr emerge:
%wheel localhost = /usr/bin/emerge
Para habilitar más de una orden para un usuario dado en cierta máquina, se pueden listar varias órdenes en la misma línea. Por ejemplo para permitir que larry no solo pueda lanzar emerge sino también ebuild y emerge-webrsync como root:
larry localhost = /usr/bin/emerge, /usr/bin/ebuild, /usr/sbin/emerge-webrsync
Puede incluso especificar una línea de órdenes precisa (incluyendo parámetros y argumentos) no solo el nombre del ejecutable. Esto es útil para restringir el uso de cierta herramienta a un grupo específico de argumentos. La herramienta sudo permite el uso de caracteres comodín del estilo del intérprete de órdenes (también conocidos como metacaracteres o caracteres "glob") en los nombres de ruta así como en argumentos de la línea de órdenes dentro del fichero sudoers. Observe que estos "no" son expresiones regulares.
A continuación se muestra un ejemplo de sudo desde la perspectiva de un usuario de la herramienta que está comenzando a utilizarla y al cual se le han dado plenos poderes con emerge:
user $
sudo emerge -uDN world
Confiamos en que haya recibido las indicaciones normales del Administrador del Sistema Local. Normalmente consisten en estas tres cosas: #1) Respect the privacy of others (Respete la privacidad del resto). #2) Think before you type (Piense antes de escribir). #3) With great power comes great responsibility (Grandes poderes conllevan grandes responsabilidades). Contraseña: ## (Introduzca la contraseña del usuario ¡No la de root!)
La contraseña solicitada por sudo es la del propio usuario. Esto es para asegurarse de que ninguna terminal abierta accidentalmente a otros por error sea utilizada con fines dañinos.
sudo no altera el valor de la variable
${PATH}
: cualquier orden escrita después de sudo es ejecutada dentro del propio entorno del usuario. De esta forma si un usuario quiere usar una herramienta en /sbin, por ejemplo, dicho usuario debe ofrecer a sudo la ruta completa a la orden de esta forma:
user $
sudo /usr/sbin/emerge-webrsync
Sintaxis básica con LDAP
Los ajustes USE ldap
y pam
son necesarios para ofrecer soporte LDAP.
Cuando se utiliza sudo con LDAP, sudo también leerá la configuración del servidor LDAP, por lo que necesitará editar estos dos ficheros.
# Lea ldap.conf(5) y README.LDAP para más detalles
# Este fichero debería poder leerlo únicamente root
# Directivas ofrecidas: host, port, ssl, ldap_version
# uri, binddn, bindpw, sudoers_base, sudoers_debug
# tls_{checkpeer,cacertfile,cacertdir,randfile,ciphers,cert,key}
host ldap.example.com
port 389
base dc=example,dc=com
uri ldap://ldap.example.com/
#uri ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock
ldap_version 3
#ssl start_tls
sudoers_base ou=SUDOers,dc=example,dc=com
#sudoers_debug 2
bind_policy soft
sudoers: ldap files
También necesitará añadir la siguiente entrada LDAP para sudo.
Debido al diseño, la rama Sudoers está encima del árblo por razones de seguridad. Puede tener distintos derechos de acceso desde ldap para leer o escribir en esta rama
version: 1
DN: ou=SUDOers,dc=example,dc=com
objectClass: organizationalUnit
objectClass: top
objectClass: domainRelatedObject
associatedDomain: example.com
ou: SUDOers
DN: cn=defaults,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: defaults
description: Las opciones por defecto de sudo van aquí
sudoOption: env_reset
DN: cn=root,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: root
sudoCommand: ALL
sudoHost: ALL
sudoUser: root
DN: cn=%wheel,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: %wheel
sudoCommand: ALL
sudoHost: ALL
sudoOption: !authenticate
sudoUser: %wheel
version: 1
DN: cn=wheel,ou=Group,dc=example,dc=com
objectClass: top
objectClass: posixGroup
cn: wheel
description: Grupo Wheel
gidNumber: 10
memberUid: useradmin1
memberUid: root
Las configuraciones del sudoer en LDAP son similares a los ficheros con algunas diferencias. Por favor, lea más sobre sudo con LDAP en el enlace de abajo [1]
Utilizar alias
En entornos más extensos que tengan que dar acceso a todos los usuarios una y otra vez (o equipos u órdenes) las tareas pueden ser más costosas de realizar. Para facilitar la administración de /etc/sudoers, puede definir "alias". El formato para declarar los alias es muy fácil:
Host_Alias hostalias = equipo1, equipo2, ...
User_Alias useralias = usario1, usuario2, ...
Cmnd_Alias cmndalias = orden1, orden2, ...
Un alias que siempre funciona, en cualquier posición, es ALL
(para distinguir correctamente entre lo que son y no son alias, se recomienda utilizar mayúsculas para los alias). Como indudablemente habrá deducido, el alias ALL
sirve para todas los valores posibles.
Un ejemplo de uso del alias ALL
para permitir a "cualquier" usuario lanzar la orden shutdown si ha accedido al sistema local es:
ALL localhost = /sbin/shutdown
Otro ejemplo es permitir al usuario larry lanzar la orden emerge como root, independientemente del equipo donde haya iniciado sesión:
larry ALL = /usr/bin/emerge
Más interesante es definir un conjunto de usuarios que puedan correr aplicaciones de software administrativo (como por ejemplo emerge y ebuild) en el sistema y un grupo de administradores que puedan cambiar la contraseña de cualquier usuario, excepto la de root:
User_Alias SOFTWAREMAINTAINERS = larry, john, danny
User_Alias PASSWORDMAINTAINERS = larry, sysop
Cmnd_Alias SOFTWARECOMMANDS = /usr/bin/emerge, /usr/bin/ebuild
Cmnd_Alias PASSWORDCOMMANDS = /usr/bin/passwd [a-zA-Z0-9_-]*, !/usr/bin/passwd root
SOFTWAREMAINTAINERS localhost = SOFTWARECOMMANDS
PASSWORDMAINTAINERS localhost = PASSWORDCOMMANDS
Ejecución como no root
También es posible que un usuario lance una aplicación como otro usuario distinto que no sea root. Esto puede ser muy interesante si corre aplicaciones como un usuario diferente (por ejemplo, apache para el servidor web) y desea permitir que ciertos usuarios realicen labores administrativas (por ejemplo, acabar con procesos zombi) como ese usuario.
Dentro de /etc/sudoers se lista el o los usuarios entre (
y )
antes del listado de órdenes:
usuarios equipos = (lanzar-cómo) órdenes
Por ejemplo, para permitir a larry lanzar la herramienta kill como el usuario apache o el usuario gorg:
Cmnd_Alias KILL = /bin/kill, /usr/bin/pkill
larry ALL = (apache, gorg) KILL
Con esta configuración definida, el usuario puede lanzar sudo -u para seleccionar al usuario con el que desea lanzar la aplicación:
user $
sudo -u apache pkill apache
Mediante la directiva Runas_Alias
se puede establecer un alias para el usuario con el que se va a lanzar una aplicación. Su uso es idéntico al de otras directivas _Alias
mostradas anteriormente.
Contraseñas y configuraciones por defecto
Por defecto, sudo pide al usuario que se identifique con su propia contraseña. Una vez que la introduce, sudo la recuerda durante cinco minutos permitiendo al usuario centrarse en sus tareas sin tener que escribir su contraseña cada vez.
Este comportamiento, por supuesto, se puede cambiar: se puede establecer la directiva Defaults:
en /etc/sudoers para cambiar el comportamiento por defecto para un usuario.
Por ejemplo, para cambiar los cinco minutos preestablecidos a cero (no recordarla nunca):
Defaults:larry timestamp_timeout=0
Definiendo la opción a -1
permite recordar la contraseña indefinidamente (hasta que se reinicie el sistema).
Una configuración diferente consistiría en solicitar la contraseña del usuario con el que se ejecutaría la orden y no la propia contraseña personal de los usuarios. Esto se puede conseguir mediante runaspw
. En el siguiente ejemplo, también definiremos el número de intentos (cuántas veces puede el usuario introducir de nuevo la contraseña antes de que sudo falle) a 2
, en el lugar del valor 3 predeterminado:
Defaults:john runaspw, passwd_tries=2
Otra característica interesante es mantener definida la variable DISPLAY
de modo que se puedan lanzar herramientas gráficas:
Defaults:john env_keep=DISPLAY
Puede cambiar muchas de las opciones predeterminadas mediante la directiva Defaults:
. Abra la página del manual de sudoers y busque Defaults
.
Si, no obstante, desea permitir a cierto usuario lanzar un conjunto de órdenes sin proporcionar ningún tipo de contraseña, necesita entonces lanzar las órdenes con NOPASSWD:
, así:
larry localhost = NOPASSWD: /usr/bin/emerge
Completado de órdenes en bash
Los usuarios que quieran tener completado de órdenes en bash con sudo, tendrán que lanzar esto una sola vez.
user $
sudo echo "complete -cf sudo" >> $HOME/.bashrc
Completado de órdenes en zshell
Los usuarios que deseen completado de órdenes en zsh para sudo pueden definir lo siguiente en .zprofile y en .zshrc respectivamente.
if [[ $EUID != 0 ]]; then
typeset -xT SUDO_PATH sudo_path
typeset -U sudo_path
sudo_path=({,/usr/local,/usr}/sbin(N-/))
alias sudo="sudo env PATH=\"SUDO_PATH:$PATH\""
fi
zstyle ':completion:*:sudo:*' environ PATH="$SUDO_PATH:$PATH"
Con el cambio de arriba, todas las órdenes en las localizaciones /sbin, /usr/sbin y /usr/local/sbin estarán disponibles al intérprete de órdenes para completado cuando a la orden se le anteponga 'sudo'.
This alias will disrupt sudo configurations specifying commands like
larry localhost = NOPASSWD: /usr/bin/emerge
Utilización
Listar privilegios
Ejecute sudo -l para informarse de cuáles son sus capacidades:
user $
sudo -l
El usuario larry puede lanzar las siguiente órdenes en este equipo: (root) /usr/libexec/xfsm-shutdown-helper (root) /usr/bin/emerge (root) /usr/bin/passwd [a-zA-Z0-9_-]* (root) !/usr/bin/passwd root (apache) /usr/bin/pkill (apache) /bin/kill
Si tiene cualquier orden en /etc/sudoers que no le pida que introduzca una contraseña, tampoco se le pedirá una contraseña para listar las entradas. De no ser así, se le podría pedir su contraseña si no se recuerda.
Prolongar la caducidad de la contraseña
Por defecto, si un usuario introdujo su contraseña para autenticarse ante sudo, ésta se recuerda durante cinco minutos. Si el usuario quiere prolongar este periodo, puede ejecutar sudo -v para reiniciar la marca de tiempo de modo que pasen otros cinco minutos antes de que sudo pregunte de nuevo por la contraseña.
user $
sudo -v
Lo contrario es quitar la marca de tiempo con sudo -k.