Sudo

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Sudo and the translation is 64% complete.
Outdated translations are marked like this.

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

Nota
sudo is not part of the system set, so it must be installed manually, if it is needed.
Consejo
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.

Importante
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:

CÓDIGO Sintaxis básica de /etc/sudoers
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:

CÓDIGO Ejemplo real del fichero /etc/sudoers
larry localhost = /usr/bin/emerge
Nota
El nombre del equipo debe coincidir con el que devuelve la orden hostname.
Nota
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.
Advertencia
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:

CÓDIGO Permitir a cualquier miembro del grupo wheel lanzar 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:

CÓDIGO Multiples órdenes
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.

Importante
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.

ARCHIVO /etc/ldap.conf.sudoPor favor, haga chmod 400 cuando haya terminado
# 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
ARCHIVO /etc/nsswitch.confPor favor, añada la línea sudoers
sudoers: ldap files

También necesitará añadir la siguiente entrada LDAP para sudo.

Nota
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
CÓDIGO Ldap Entry for Sudo
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
CÓDIGO Ldap Entry for wheel Group
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:

CÓDIGO Declararar alias en /etc/sudoers
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:

CÓDIGO Permitir que cualquier usuario puede ejecutar shutdown
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:

CÓDIGO Permitir al usuario lanzar una aplicación independientemente de su localizació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:

CÓDIGO Utilizar un alias para usuarios y órdenes
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:

CÓDIGO Sintaxis de ejecución para usuarios no root
usuarios  equipos = (lanzar-cómo) órdenes

Por ejemplo, para permitir a larry lanzar la herramienta kill como el usuario apache o el usuario gorg:

CÓDIGO Ejemplo de ejecución como usuario no root
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):

CÓDIGO Cambiar el valor para el tiempo de expiración
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:

CÓDIGO Solicitar la contraseña de root en lugar de la del usuario
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:

CÓDIGO Mantener viva la variable DISPLAY
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í:

CÓDIGO Permitir lanzar emerge como root sin solicitar la contraseña
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.

ARCHIVO .zprofileAñadir completado de órdenes en zshell
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
ARCHIVO .zshrcAñadir completado de órdenes en zshell
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'.

Advertencia
This alias will disrupt sudo configurations specifying commands like
CÓDIGO Allowing emerge to be run as root without asking for a password
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.

  • doas — provides a way to perform commands as another user.
  • su — used to adopt the privileges of other users from the system

References