¿Está bien configurar `sudo` sin contraseña en un servidor en la nube?

58

Me encanta la idea de acceder a los servidores a través de claves, para no tener que escribir mi contraseña cada vez que entro sshen un cuadro, incluso bloqueo la rootcontraseña ( no ) de mi usuario ( passwd -l username), por lo que es imposible iniciar sesión sin una clave.

Pero todo esto se rompe si se me solicita que ingrese la contraseña para los sudocomandos. Así que estoy tentado a configurar sin contraseñasudo para hacer que las cosas estén en línea con el inicio de sesión sin contraseña.

Sin embargo, sigo teniendo el presentimiento de que puede ser contraproducente para mí de alguna manera inesperada, solo parece de alguna manera inseguro. ¿Hay alguna advertencia con tal configuración? ¿Recomendaría / no recomendaría hacer esto para una cuenta de usuario en un servidor?

Aclaraciones

  1. Estoy hablando del uso de sudouna sesión de usuario interactiva aquí, no para servicios o scripts administrativos
  2. Estoy hablando de usar un servidor en la nube (por lo que no tengo acceso físico local a una máquina y solo puedo iniciar sesión de forma remota)
  3. Sé que sudotiene un tiempo de espera durante el cual no tengo que volver a ingresar mi contraseña. Pero mi concierto no se trata realmente de perder el tiempo extra para escribir físicamente una contraseña. Sin embargo, mi idea era no tener que lidiar con una contraseña, porque supongo que:
    • Si tengo que memorizarlo, es muy probable que sea demasiado corto para ser seguro o reutilizado
    • Si genero una contraseña larga y única para mi cuenta remota, tendré que almacenarla en algún lugar (un programa local de administración de contraseñas o un servicio en la nube) y buscarla cada vez que quiera usarla sudo. Esperaba poder evitar eso.

Entonces, con esta pregunta, quería comprender mejor los riesgos, las advertencias y las compensaciones de una posible configuración sobre las otras.

Seguimiento 1

Todas las respuestas dicen que sin contraseña sudoes inseguro ya que permite una escalada de privilegios "fácil" si mi cuenta de usuario personal se ve comprometida. Entiendo que. Pero, por otro lado, si uso una contraseña, incurrimos en todos los riesgos clásicos con las contraseñas (cadena demasiado corta o común, repetida en diferentes servicios, etc.). Pero supongo que si desactivo la autenticación de contraseña /etc/ssh/sshd_configpara que aún tenga que tener una clave para iniciar sesión, ¿puedo usar una contraseña más simple solo para sudoque sea más fácil de escribir? ¿Es esa una estrategia válida?

Seguimiento 2

Si también tengo una clave para iniciar sesión como a roottravés de ssh, si alguien tiene acceso a mi computadora y roba mis claves (¡aunque todavía están protegidas por la contraseña del llavero del sistema operativo!), También podría obtener un acceso directo a la rootcuenta , sin pasar por el sudocamino. ¿Cuál debería ser la política para acceder a la rootcuenta entonces?

Dmitry Pashkevich
fuente
2
No lo recomendaría en absoluto, porque a menudo hay formas de obtener un shell como usuario (ya que todos los servicios están sujetos a violaciones de seguridad, pero generalmente se ejecutan como usuarios para evitar el acceso completo al sistema), pero con una contraseña para iniciar sesión como root evita que personas no autorizadas obtengan acceso de root. Si no hay ninguno, piensa que cualquiera que tenga acceso a su cuenta de usuario de alguna manera tiene acceso completo al servidor. Establecer una contraseña puede no ser mucho, pero ayuda.
piernov
Por favor vea mis preguntas de seguimiento
Dmitry Pashkevich
1
sudo nunca debe estar sin contraseña. la raíz debe deshabilitarse desde el inicio de sesión remoto a través de SSH, el puerto ssh no debe ser predeterminado (para deshacerse de los dumb-bots), y cualquier cuenta que necesite sudo debe limitarse solo a las potencias mínimas de sudo para lo que sea necesario (reiniciar un servicio solo, etc.), y también tienen contraseñas muy seguras.
SnakeDoc
@SnakeDoc Gracias, esa es una especie de respuesta que esperaba. ¿Te importaría escribir una respuesta detallada? Estoy feliz de aprender!
Dmitry Pashkevich
2
@EEAA en realidad es bastante fácil en Linux. Las únicas cuentas que se deben permitir sin contraseña en sudo serían las cuentas del sistema en las que uno no puede iniciar sesión y, por lo tanto, no puede elevar a esa cuenta y usar esos permisos en su contra. Establezca un shell falso para la cuenta /etc/passwd, como nologin, no configure ninguna contraseña y luego configure sin contraseña en visudo. Si hace esto, también debe asegurarse de que la configuración de visudo sea solo para lo que esa cuenta del sistema necesita absolutamente, es decir, bloquee los únicos comandos que debería ejecutar.
SnakeDoc

Respuestas:

48

Me encanta la idea de acceder a los servidores a través de claves, para no tener que escribir mi contraseña cada vez que ingreso en un cuadro, incluso bloqueo la contraseña de mi usuario (no root) (nombre de usuario passwd -l), por lo que es imposible inicie sesión sin una clave ... ¿Recomendaría / no recomendaría hacer esto para una cuenta de usuario en un servidor?

Vas a deshabilitar los inicios de sesión basados ​​en contraseña de la manera incorrecta. En lugar de bloquear la cuenta de un usuario, configure PasswordAuthentication nosu /etc/ssh/sshd_config.

Con ese conjunto, la autenticación de contraseña está deshabilitada para ssh, pero aún puede usar una contraseña para sudo.

La única vez que recomiendo configurar NOPASSWDen sudo es para cuentas de servicio, donde los procesos deben poder ejecutar comandos a través de sudo mediante programación. En esas circunstancias, asegúrese de incluir explícitamente en la lista blanca solo los comandos específicos que la cuenta necesita para ejecutarse. Para cuentas interactivas, siempre debe dejar las contraseñas habilitadas.

Respuestas a sus preguntas de seguimiento:

Pero supongo que si desactivo la autenticación de contraseña en / etc / ssh / sshd_config para que aún tenga que tener una clave para iniciar sesión, ¿puedo usar una contraseña más simple solo para sudo que sea más fácil de escribir? ¿Es esa una estrategia válida?

Si eso es correcto. Todavía recomiendo usar contraseñas de cuentas locales relativamente fuertes, pero no ridículamente fuertes. ~ 8 caracteres, generados aleatoriamente es suficiente.

Si también tengo una clave para iniciar sesión como root a través de ssh, si alguien tiene acceso a mi computadora y roba mis claves (¡aunque todavía están protegidas por la contraseña del llavero del sistema operativo!), También podría obtener un acceso directo a la cuenta raíz, sin pasar por la ruta sudo.

El acceso de raíz a través de ssh debe estar deshabilitado. Período. Establecer PermitRootLogin noen su sshd_config.

¿Cuál debería ser la política para acceder a la cuenta raíz entonces?

Siempre debe tener un medio para obtener acceso fuera de banda a la consola de su servidor. Varios proveedores de VPS proporcionan esto, al igual que los proveedores de hardware dedicado. Si su proveedor no le otorga acceso real a la consola (por ejemplo, EC2, por ejemplo), normalmente puede restaurar el acceso utilizando un proceso como el que describo en esta respuesta .

EEAA
fuente
2
+1 debería dejar contraseñas ...
Chris S
66
+1 la contraseña de sudo no está realmente allí para la seguridad (por lo que puedo ver) sino más bien como una verificación idiota. No tener allí podría causar un havok incalculable.
Boris the Spider
1
si pierde su llave, ya está, a menos que tenga una puerta trasera, pero también lo hace un atacante. la única forma de arreglar una clave perdida si se hace correctamente, sería sentarse físicamente en la terminal real. Si necesita el tipo de protección que proporcionan las claves ssh, debe tener en cuenta las dificultades y, simplemente ... simplemente no pierda sus claves.
SnakeDoc
1
Un comentario sobre su último párrafo y sobre la pérdida de acceso en general para cualquier VPS ... algunos proveedores de VPS realmente lo ayudarán si queda bloqueado. He tenido un arranque de mi VM en modo de usuario único y hago algunas cosas por mí cuando me bloqueé (sucede ... regla de firewall incorrecta jajaja). Dependiendo de su host, pueden cobrarle por el servicio; son , después de todo, dedicándole una atención especial. Además, algunos harán copias de seguridad / instantáneas por un pequeño precio o, a veces, de forma gratuita, lo que puede valer la pena si está a punto de cometer un gran cambio, posiblemente disruptivo.
SnakeDoc
1
@DmitryPashkevich: con respecto a PasswordAuthenticationafectar a todos los usuarios, siempre puede usar Matchsecciones en sshd_config para volver a activarlo para ciertos usuarios o grupos.
Matt Thomason
11

Generalmente restrinjo el uso de los NOPASSWORDcomandos que se ejecutan mediante un proceso automatizado. Es preferible tener una cuenta de servicio para estos comandos y restringir el uso de sudo a los comandos requeridos.

Al permitir NOPASSWORDcomandos generales, permite que cualquier persona que tenga acceso a su ID de usuario ejecute cualquier comando. Esto podría resultar de un compromiso de sus credenciales, pero podría ser tan simple como alguien sentado en su escritorio cuando se aleja por un segundo.

Me parece que no tengo que ingresar mi contraseña con tanta frecuencia. Una vez que ingrese su contraseña, puede ejecutar varios comandos si no espera demasiado entre ellos. El tiempo de espera es configurable.

BillThor
fuente
8

Solo usaría esto en dos circunstancias:

  • Cuando es absolutamente necesario para un script automatizado que se ejecuta como un usuario específico
  • Para tareas administrativas específicas (solo lectura tareas administrativas, no aquellas que toman medidas para alterar el sistema) y luego solo para usuarios específicos, por supuesto

Por defecto, la mayoría de las sudoconfiguraciones no le volverán a preguntar durante un tiempo en la misma sesión (si abre un nuevo shell que no tiene ningún efecto). Puede controlar este comportamiento hasta cierto punto con la timestamp_timeoutconfiguración.

Sin contraseña sudono es tan peligroso como las sshclaves sin contraseña , ya que un atacante remoto necesita sus credenciales para ingresar en primer lugar, pero si han entrado de alguna manera comprometiendo su clave privada (o si son físicamente locales para usted) y te has dejado conectado y desbloqueado mientras estás lejos de la máquina), entonces la solicitud de contraseña es una valiosa defensa adicional entre ellos y un acceso privilegiado.

En cuanto al seguimiento 2:

Si también tengo una clave para iniciar sesión como root a través de ssh

Es mejor evitar esto también, exactamente por la razón que usted describe. Si una conexión remota debe tener acceso privilegiado, inicie sesión a través de una cuenta de servicio y déle el control suficiente para hacer su trabajo a través de sudo. Esto es más fácil de configurar, por supuesto, muchos no se molestan (lo que funciona a su favor si lo hace, ya que hay mucha fruta más baja que usted para que los atacantes pasen tiempo allí), por lo que se reduce a compromiso antiguo entre seguridad y conveniencia (consejo profesional: ¡elija seguridad!).

David Spillett
fuente
Gracias por abordar mi seguimiento # 2. Sin embargo, todavía estoy confundido: trato de evitar iniciar sesión tan rootdirectamente, pero necesito ALGUNA forma de acceder a la cuenta, ¿verdad? Entonces, ¿cómo lo hago entonces? Con una contraseña, no clave ssh? ¿Pero no son las claves mejores que las contraseñas?
Dmitry Pashkevich
Siempre puede iniciar sesión localmente como root, pero se recomienda que los inicios de sesión directos a root desde hosts remotos (a través de ssh o similar) estén completamente deshabilitados. Si tiene una cuenta que puede convertirse en root a través de sudo (con contraseña, por supuesto), nunca perderá todo el acceso a la cuenta.
David Spillett
7

Puede tener lo mejor de ambos mundos: autenticación SSH tanto para inicio de sesión como para sudo. Si integra el módulo pam_ssh_agent_auth , puede usar claves SSH para autenticarse sin dar una contraseña cuando sudo.

He estado usando esto en producción durante más de cinco años.

Para configurarlo, instale el módulo PAM y luego agregue una línea /etc/pam.d/sudoo el equivalente de su sistema:

auth    sufficient     pam_ssh_agent_auth.so file=~/.ssh/authorized_keys

Si hace esto, asegúrese de proteger sus claves en su computadora con una frase de contraseña. De esa forma, alguien tendría que ingresar a su computadora y robar las claves para ingresar. Podrían hacerlo extrayéndolos de la memoria mientras estaban desbloqueados si tienen acceso a su cuenta, descifrando su frase de contraseña o robándola. un keylogger u hombro navegando mientras lo escribes (¡mira detrás de ti!).

Puede usar la misma clave SSH que lo hace para iniciar sesión, o puede configurar una clave separada que solo agrega a su agente cuando sudo. Por lo tanto, si desea ser más cuidadoso, puede mantener un archivo autorizado de claves autorizadas que tenga una clave SSH separada que solo agregue a su agente cuando necesite sudo:

auth    sufficient     pam_ssh_agent_auth.so file=~/.ssh/authorized_keys_sudo
obscurerichard
fuente
Wow, eso suena genial! Entonces, ¿genero una clave separada para ejecutar sudocomandos o uso la misma que se usó para la autenticación SSH?
Dmitry Pashkevich
1
Esto es increíble. Te votaría varias veces si pudiera.
nyuszika7h
Puede usar la misma clave que usa para la autenticación SSH normal, o para mayor seguridad, puede agregar temporalmente una clave que usa para suplantar a su agente de autenticación SSH. Esto requeriría que especifique un archivo diferente de ~/.ssh/authorized_keys, podría administrar otro archivo, ~/.ssh/authorized_keys_sudopor ejemplo, o /etc/ssh/authorized_keys_sudo.
obscurerichard
6

Como lo preguntaste, aquí tienes mi consejo general sobre cómo abordar el sudoproblema.

Sudo no fue diseñado para proporcionar más seguridad (aunque puede en cierto sentido) ... sino más bien proporcionar una buena pista de auditoría de quién está haciendo qué en su sistema con qué privilegios.

Un Sudo configurado correctamente no usará la ALL=(ALL) ALLconfiguración, sino algo más limitado a lo que sea específicamente que el usuario necesita. Por ejemplo, si necesita que un usuario pueda iniciar sesión y reiniciar un servicio atascado, probablemente no necesite la capacidad de instalar un nuevo software o apagar su servidor, cambiar las reglas del firewall, etc.

A veces es común que las personas usen sudo para elevarse a la cuenta raíz, es decir. sudo su -. Una vez que lo hacen, deja de ver quién está haciendo qué desde la cuenta raíz (la raíz puede iniciar sesión varias veces al mismo tiempo). Entonces, a veces las personas también quieren deshabilitar el sudo su -comando. Pero, por razones prácticas, si necesita una cuenta totalmente privilegiada para la administración, al menos tener a alguien que emita el sudo su -comando registraría quién se elevó a root y cuándo.

Cómo aseguro mis cajas:

Cambie el puerto SSH a otro que no sea el predeterminado. Esto es para evitar que los bots tontos que buscan números de puerto luego golpeen hasta que entren (o no).

No permita el inicio de sesión de Root a través de SSH utilizando la AllowRootLogin noconfiguración en su sshd_config. Esto evita que alguien fuerce a su cuenta raíz. En general, es una buena práctica nunca permitir que alguien inicie sesión directamente en la cuenta de administrador / raíz por razones de auditoría, así como por seguridad. Si permite el inicio de sesión de root directamente, no sabe quién inició sesión, de quién obtuvieron la contraseña, etc. Pero, si alguien inicia sesión en la cuenta de Jimmy, luego eleva sus permisos a root, tiene una mejor idea de dónde comenzar su auditar búsqueda (y quién es la cuenta para restablecer).

Solo permita a los usuarios SSH que lo requieran. Use la AllowUsersconfiguración y la especificidad para especificar qué cuentas necesitan acceso SSH. Esto, por defecto, bloqueará todas las otras cuentas de SSH.

Edite Sudoers a través de visudo y solo permita los comandos que el usuario necesita. Hay muchas guías detalladas sobre cómo hacer esto, así que no detallaré aquí. Aquí hay un principiante: http://ubuntuforums.org/showthread.php?t=1132821

La esencia de esto es evitar que una cuenta comprometida ponga en peligro su máquina. es decir. Si la cuenta de Sally se rompe, y Sally solo puede usar sudo para reiniciar el servidor web, bueno, el atacante podría divertirse reiniciando su servidor web en un bucle, pero al menos no pueden rm -rf /your/webserver/directoryo abren todos sus puertos de firewall, etc.

Configure buenas reglas de firewall que solo permitan los puertos necesarios para que su caja funcione. En general, desea dejar todo y solo permitir explícitamente lo que necesita. Hay muchas iptables decentes y otros cortafuegos se inician en línea, aquí hay uno que uso (es un iniciador básico):

# Generated by iptables-save v1.4.7 on Mon Mar  3 17:55:02 2014
*filter
:INPUT DROP [4528:192078]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [39845:27914520]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4254 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8080 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8443 -m state --state NEW -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Mon Mar  3 17:55:02 2014

También una contraseña segura es clave.Incluso si usa claves SSH para su acceso remoto, aún debe solicitar una contraseña para usar Sudo. Este es un caso donde sudo podría proporcionar más seguridad. Si alguien robara sus claves ssh, aún se les impediría hacer algo significativo en su caja si aún tienen que forzar de forma bruta la contraseña de su cuenta para usar sudo. Las contraseñas no deben ser una palabra, sino una frase de contraseña. Piensa en una oración y úsala. Esto generalmente le dará algo más de 8 caracteres de longitud, proporcionando mucha entropía, pero también es más fácil de recordar que una contraseña aleatoria. Por supuesto, las buenas prácticas de contraseña dicen usar una contraseña aleatoria generada por la máquina para engañar a las herramientas de descifrado como John the Ripper, que atravesará la mayoría de las frases y contraseñas. No, cambiar E con 3 no funciona, John también obtiene esas permutaciones.

SnakeDoc
fuente
Gracias por una respuesta integral! Definitivamente necesito usar todos estos consejos para asegurar mis cajas. Sin embargo, todavía aceptaré la respuesta de EEAA, ya que es un poco más específica de lo que estaba preguntando.
Dmitry Pashkevich
1
@DmitryPashkevich está bien, EEAA tiene una respuesta buena y adecuada. Me pediste que detallara mi comentario anterior, así que lo hice. No te preocupes :)
SnakeDoc
En cuanto a sudo su -y variaciones, sudoreplaypodría ser útil.
nyuszika7h
3

En algunos casos es necesario hacer esto. por ejemplo, algunas API de hipervisor necesitan inicio de sesión sin contraseña y sin contraseña sudo. Pero aún puede restringir eso sin romper.

Por lo que estás tratando de lograr. Yo diría, acostumbrarse a escribir una contraseña. La seguridad es más conveniente que la conveniencia aquí. Además, si realmente necesita acceso a la raíz, puede usarlo sudoy almacenará en caché las credenciales durante un tiempo, de modo que si ejecuta varios comandos sudo seguidos, solo solicitará la contraseña la primera vez. Por lo tanto, no es un inconveniente tan grande como supones.

Además, si usted está escribiendo un montón de comandos privilegiados de la raíz y no desea poner sudo en el frente de ellos todo el tiempo que sea posible su, o sudo -spara obtener un intérprete de comandos. Ingresará su contraseña una vez y luego eso es todo.

Mate
fuente
2

He sido mordido por sudo sin contraseña una vez. Era un script de shell, algún instalador que llamaba a sudo en mi nombre en lugar de, ya sabes, simplemente requerir sudo o error.

Las imágenes teclean 'make' y el script que hace la parte 'sudo make install' para usted, sin establecer o mostrar la ruta de base, y el script es tan mentalmente confuso en primer lugar que no está seguro de que sepan sobre / usr / local y entonces comienzas a verificar / usr por modificaciones ...

Prometí no volver a usar NOPASSWD nuevamente y también cambié esa configuración de tiempo de espera a 0.

aib
fuente
1

Si bien no responde estrictamente a su pregunta, otra opción puede ser establecer una opción más larga timestamp_timeoutpara que no necesite escribir su contraseña con tanta frecuencia. Esto evitará que cualquiera gane privilegios de administrador, pero reducirá su molestia.

Desde la página de manual de sudoers :

timestamp_timeout

Número de minutos que pueden transcurrir antes de que sudo solicite nuevamente una contraseña. El tiempo de espera puede incluir un componente fraccional si la granularidad minuto es insuficiente, por ejemplo 2.5. El valor predeterminado es 5. Establezca esto en 0 para solicitar siempre una contraseña. Si se establece en un valor inferior a 0, la marca de tiempo del usuario nunca caducará. Esto se puede utilizar para permitir a los usuarios crear o eliminar sus propias marcas de tiempo a través de "sudo -v" y "sudo -k" respectivamente.

Esta publicación de blog muestra algunos ejemplos que se utilizan visudopara establecer el tiempo de espera en minutos, como:

Defaults timestamp_timeout=60

Tal vez este es un punto medio feliz entre la seguridad y la facilidad de uso.

daveharris
fuente
¡Gracias por el aporte! Mi pregunta original era sobre no tener que usar (y recordar) una contraseña, ya que puedes usar claves para ingresar en la máquina, no sobre la frecuencia con la que debo ingresarla. Sin embargo, otras personas dejaron en claro que es una mala idea.
Dmitry Pashkevich
1

Las otras respuestas aquí son geniales y tocan la mayoría de los puntos importantes. Una cosa que no he visto mencionada es el hecho de que cualquier tipo de autenticación que realice cuando inicie sesión usted mismo puede ser capturada por un atacante remoto que ya ha establecido un punto de apoyo en su cuenta. Pueden modificar sus archivos de inicio de sesión de shell o PATH para instalar un keylogger para que se les envíe todo lo que escriben, incluida su contraseña de sudo. Podrían agregar un binario sudo pirateado a su RUTA para recopilar su contraseña. Pueden secuestrar la conexión del agente ssh de nuevo a su máquina de conexión para vencer a pam_ssh_agent_auth y convertirse en root tan pronto como se conecte. Entonces, en términos de seguridad absoluta, no veo una diferencia entre usar una contraseña para sudo y no. Por supuesto, lo hace un ataque más complicadoj,

En resumen, creo que la única forma de evitar absolutamente que una cuenta de usuario comprometida se convierta en root si tiene acceso a sudo es eliminar el acceso a sudo de usted mismo, o nunca usarlo. Si no está de acuerdo, hágamelo saber, ¡ya que me encantaría estar equivocado!

Ian Hinder
fuente