Permitir que apache escriba en el directorio .ssh de los usuarios

2

Sé que el título es simplemente el cebo de "su configuración es insegura", pero permítame explicarlo.

Estoy trabajando en una aplicación que tiene como objetivo permitir a los clientes sincronizar a través de SSH a nuestro servidor. Necesitamos una aplicación web desde la cual podamos crear / rotar claves SSH para nuestros usuarios. Esta aplicación devolverá una clave SSH privada al usuario para su uso futuro y almacenará el archivo authorized_keys del usuario de clave pública.

Al registrarse, tendremos que crear automáticamente el usuario y el directorio y las claves iniciales .ssh.

Estamos en CentOS 5 ahora, pero somos flexibles si hay razones suficientes para migrar. Este servidor ejecutará solo esta aplicación web en Apache (como apache: apache) y no se almacenarán más datos que los datos de usuario sincronizados en el sistema.

He estado pensando en la siguiente solución, pero he tenido problemas:

  1. Otorgue privilegios de sudo useradd al usuario de apache para permitirles crear nuevos usuarios
  2. Llame a sudo useradd desde el script PHP en la aplicación web con una suma de 000 en el directorio de inicio que se acaba de crear.
  3. chgrp el nuevo directorio de inicio a apache para que apache pueda crear un nuevo directorio .ssh y escribir las claves. *
  4. chmod el nuevo directorio de inicio a 770 para que solo el usuario y apache tengan acceso. *
  5. mkdir .ssh en el nuevo directorio de inicio y ssh-keygen para crear la nueva clave, almacenando la clave pública en authorized_keys y devolviendo la clave privada al cliente que llama.

Los problemas que encuentro son con los puntos * d: parece que, incluso con chmod 777, no puedo chgrp o chmod el directorio, ya que se creó con el propietario y el grupo. Perteneciente al nuevo usuario.

He observado cambiar el grupo predeterminado del usuario a algo que le permita a apache escribir en él, pero no puedo encontrar una manera de hacerlo sin tener que otorgarle a apache usermod sudo privilegios, lo que parece una muy mala idea.

¡Cualquier pensamiento sería apreciado!

    
pregunta Jeff Allen 10.04.2012 - 22:49
fuente

2 respuestas

4

Cree un script que realice todas las acciones privilegiadas con una validación estricta y haga que se audite.

El script solo obtiene el nombre de usuario como parámetro y debe validarlo:

  • solo contiene caracteres de nombre de usuario válidos
  • el usuario con ese nombre no existe (no es una cuenta administrativa, etc.)

Si realmente necesita generar la clave privada en el servidor (busque alternativas), la secuencia de comandos debe enviar la clave privada a la salida estándar.

Conceda sudo a este script para el usuario de apache. El script contiene los comandos chmod / chgrp pero solo después de realizar la validación. Por lo tanto, el usuario de apache no necesita permisos sudo para esos comandos.

Es posible ejecutar el script como un tercer usuario que tiene permiso sudo para los comandos del sistema en lugar de ejecutar el script como root. Si este paso adicional es útil depende de la evaluación de riesgos del script.

Apache ejecuta el script utilizando sudo y recopila stdout con la clave privada para enviarlo al navegador web.

    
respondido por el Hendrik Brummermann 11.04.2012 - 00:34
fuente
4

Probablemente sugeriría tener a cron disparar un script que no haga nada más que editar esos archivos con cualquier cosa que esté en cola en la base de datos para hacer.

Permita que esa parte de la secuencia de comandos actúe completamente fuera del dominio del usuario de apache y pueda bloquear la cuenta para realizar solo esa tarea.

Eso está fuera de mi cabeza como una solución más simple.

    
respondido por el StrangeWill 10.04.2012 - 22:54
fuente

Lea otras preguntas en las etiquetas