
Estoy administrando un servidor RedHat donde los usuarios inician sesión a través de SSH con autenticación basada en clave privada/pub.
Me gustaría evitar que cambien, eliminen o modifiquen accidentalmente el contenido de su~/.sshcarpetas. Algunos de ellos ya han modificado de forma recursiva 777 toda su propia carpeta de inicio porque "era más fácil compartir archivos con colegas de esta manera" y se dispararon en el pie.
¿Alguna idea de cómo puedo lograr esto? Preferiblemente con sistema de permisos estándar de Linux.
Respuesta1
La respuesta corta es que no puedes.
SSH es muy exigente con los permisos y no reproduce archivos que no le gustan. Además, los usuarios ssh_config
se analizan.antesla configuración de todo el sistema.
Dicho esto,puedeSerá posible colocar los archivos en otro lugar y montar el directorio como un sistema de archivos de solo lectura $HOME/.ssh
para cada usuario. (Es posible, pero no sé cómo tratarían esto ssh y las herramientas asociadas).
Algunos de ellos ya han modificado de forma recursiva 777 toda su propia carpeta de inicio.
Entonces tienes problemas de SEGURIDAD y capacitación mucho mayores.
Respuesta2
Es difícil proteger a los usuarios de su propia ignorancia e incompetencia.
Pero dependiendo de cuánto necesite permitir que sus usuarios se administren por sí mismos y cuánto administre usted por ellos: puede configurar sshd para buscar claves en una ubicación alternativa fuera de su directorio de inicio y en otro lugar que no sea ~/.ssh/authorized_keys
.
Comando de claves autorizadas
Una solución relativamente compleja es la/etc/ssh/sshd_config
AuthorizedKeysCommand
directiva que, en lugar de depender de archivos de claves_autorizadas, especifica un programa que se utilizará para buscar las claves públicas del usuario, por ejemplo:
un servicio web (trivial)
o cuando sus nombres de usuario son idénticos a los nombres de usuario de Github, puede permitir que los usuarios se autentiquen con los pares de claves que cargaron allí:
AuthorizedKeysCommand /usr/bin/curl https://github.com/%u.keys
Como se menciona enesta respuesta; Deberá crear una política SELinux adecuada para AuthorizedKeysCommand, ya que las políticas predeterminadas la bloquean.
Me encanta este enfoque porque puede resolver muchos problemas relacionados con la administración de claves autorizadas: agrega administración centralizada, elimina el problema del huevo y la gallina de obtener claves autorizadas para los servidores cuando desea deshabilitar la autenticación de contraseña en ssh y más.
Aprovecha el hecho de que las claves públicas no son particularmente sensibles (a diferencia de sus claves privadas asociadas), por lo que centralizar su administración no agrega riesgo en mi humilde opinión y probablemente incluso mejore sus capacidades de control y generación de informes.
Archivo de claves autorizadas
Un poco menos complejo es almacenar claves en un directorio fuera de su directorio de inicio. Por ejemplo, usar /etc/ssh/<username>
(reemplazar <username>
con su nombre de usuario real). Este directorio debe tener 755 permisos y ser propiedad del usuario. Mueva el authorized_keys
archivo a él. El archivo autorizado_keys aún debe tener permisos 644 y ser propiedad del usuario.
En/etc/ssh/sshd_config
ajustar elAuthorizedKeysFile
configuración
AuthorizedKeysFile /etc/ssh/%u/authorized_keys
Y reinicie el demonio ssh
Respuesta3
La mejor solución que se me ocurre es crear .ssh
y authorized_keys
ser de propiedad raíz.
.ssh/claves_autorizadas de propiedad raíz
SSH es exigente con los permisos, pero no sin razón. En primer lugar, requiere que el propio usuario tenga acceso de lectura authorized_keys
(lo que requiere acceso de lectura a todos los directorios principales). En segundo lugar, niega el acceso si cualquier usuario que no sea el propio usuario o root tiene acceso de escritura a /home
, .ssh
o authorized_keys
. Esto no lo permite o+w
y g+w
para un grupo que tiene otros usuarios en él.
Esta configuración me funciona, el usuario puede iniciar sesión:
drwxr-xr-x 19 root root 4096 Sep 22 11:24 /
drwxr-xr-x 3 root root 4096 Sep 22 11:19 /home/
drwx------ 14 test test 4096 Sep 22 11:44 /home/test/
drwxr-x--- 2 root test 4096 Sep 22 11:42 /home/test/.ssh/
-rw-r--r-- 1 root test 98 Sep 22 11:36 /home/test/.ssh/authorized_keys
Dado que .ssh
y authorized_keys
son propiedad de root, el usuario no puede cambiar los permisos sobre ellos ni eliminarlos. Tampoco pueden editar su propio authorized_keys
archivo.
Si desea permitir que el usuario edite su archivo authorized_keys
, puede agregar permisos de escritura grupal. Esto requiere que el test
grupo no tenga más miembros que test
él mismo:
-rw-rw-r-- 1 root test 99 Sep 22 12:04 /home/test/.ssh/authorized_keys
Con cualquiera de los dos enfoques, el usuario ya no puede crear sus propios archivos en .ssh
, por lo que es posible que desee proporcionarles también algunos archivos adicionales. Algunas que me vienen a la mente son: known_hosts
, config
y id_rsa{.pub,}
otros tipos de claves.
Alternativa: chattr
Algunos sistemas de archivos Linux son compatiblesatributos de archivo, en particular unbandera inmutable. Los archivos/directorios con el indicador inmutable establecido no se pueden eliminar, modificar ni cambiar sus permisos. Sólo el root puede establecer/borrar este indicador.
Este comando funcionaría, incluso con la propiedad/permisos predeterminados:
# chattr +i ~test/.ssh/{authorized_keys,}
Ahora .ssh
ya authorized_keys
no se puede modificar de ninguna manera, ni siquiera por root. Si root necesita actualizar estos archivos, los necesitará chattr -i
primero. Se utiliza lsattr
para comprobar los atributos.
Este enfoque es más simple, pero menos flexible. También necesita soporte para el sistema de archivos; Creo que es compatible al menos con ext2/3/4, XFS y btrfs.
¿ACL Posix?
También hayACL Posix(Listas de control de acceso), que permiten un control un poco más detallado. No estoy muy familiarizado con ellos y no estoy seguro de si son de alguna ayuda aquí.
Modos estrictos
Nota:Se desaconseja mucho, pero se prevé que esté completo.
El servidor OpenSSHtiene una directiva de configuraciónllamado StrictModes
, que determina qué tan exigente es SSH con los permisos:
Especifica si sshd debe verificar los modos de archivo y la propiedad de los archivos y el directorio de inicio del usuario antes de aceptar el inicio de sesión. Esto normalmente es deseable porque los principiantes a veces dejan accidentalmente que su directorio o archivos se puedan escribir en todo el mundo. El valor predeterminado es
yes
.
Si desactiva esa opción, tendrá más libertad sobre cómo configurar la propiedad y los permisos. Sin embargo, SSH es estricto por defecto por buenas razones. Un usuario que modifica 777 sus archivos SSH es un riesgo para la seguridad.
Respuesta4
Ejecute un trabajo cron para arreglar los permisos cada noche.
Eliminar archivos es un poco más difícil. Posiblemente también puedas restaurar los archivos faltantes desde la copia de seguridad desde cron. Pero parece que podrías meterte en casos extremos extraños con eso... puede que necesites más inteligencia de la que un script puede proporcionar. Comenzaría poco a poco y agregaría funciones con cautela a una función de restauración.