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 ssh
en un cuadro, incluso bloqueo la root
contraseñ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 sudo
comandos. 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
- Estoy hablando del uso de
sudo
una sesión de usuario interactiva aquí, no para servicios o scripts administrativos - 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)
- Sé que
sudo
tiene 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 sudo
es 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_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?
Seguimiento 2
Si también tengo una clave para iniciar sesión como a root
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 root
cuenta , sin pasar por el sudo
camino. ¿Cuál debería ser la política para acceder a la root
cuenta entonces?
/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.Respuestas:
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 no
su/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
NOPASSWD
en 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:
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.
El acceso de raíz a través de ssh debe estar deshabilitado. Período. Establecer
PermitRootLogin no
en susshd_config
.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 .
fuente
PasswordAuthentication
afectar a todos los usuarios, siempre puede usarMatch
secciones en sshd_config para volver a activarlo para ciertos usuarios o grupos.Generalmente restrinjo el uso de los
NOPASSWORD
comandos 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
NOPASSWORD
comandos 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.
fuente
Solo usaría esto en dos circunstancias:
Por defecto, la mayoría de las
sudo
configuraciones 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 latimestamp_timeout
configuración.Sin contraseña
sudo
no es tan peligroso como lasssh
claves 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:
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!).
fuente
root
directamente, 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?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/sudo
o el equivalente de su sistema: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:
fuente
sudo
comandos o uso la misma que se usó para la autenticación SSH?~/.ssh/authorized_keys
, podría administrar otro archivo,~/.ssh/authorized_keys_sudo
por ejemplo, o/etc/ssh/authorized_keys_sudo
.Como lo preguntaste, aquí tienes mi consejo general sobre cómo abordar el
sudo
problema.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) ALL
configuració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 elsudo su -
comando. Pero, por razones prácticas, si necesita una cuenta totalmente privilegiada para la administración, al menos tener a alguien que emita elsudo 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 no
configuració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
AllowUsers
configuració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/directory
o 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):
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.
fuente
sudo su -
y variaciones,sudoreplay
podría ser útil.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
sudo
y 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
, osudo -s
para obtener un intérprete de comandos. Ingresará su contraseña una vez y luego eso es todo.fuente
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.
fuente
Si bien no responde estrictamente a su pregunta, otra opción puede ser establecer una opción más larga
timestamp_timeout
para 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 :
Esta publicación de blog muestra algunos ejemplos que se utilizan
visudo
para establecer el tiempo de espera en minutos, como:Tal vez este es un punto medio feliz entre la seguridad y la facilidad de uso.
fuente
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!
fuente