6 votos

Rsync + autenticación de clave pública de seguridad

He leído varios artículos de cómo automáticamente los archivos de copia de seguridad con Rsync y autenticación de clave pública. Todos ellos son muy similares. Acabo de terminar de configurar todo y todo funciona bien, pero... acabo de encontrar un artículo en el que dice que no es seguro. Hice lo siguiente:

  1. En el servidor de copia de seguridad me genera las claves pública y privada.
  2. He copiado la clave pública para el control remoto (original) de los servidores de directorio: /var/sites/.ssh (archivo authorized_keys). El directorio es propiedad de "user12"
  3. He añadido lo siguiente al archivo authorized_keys: from="BACKUP.SERVERS.IP.ADDRESS",command="/root/validate_rsync"
  4. He creado un archivo /root/validate_rsync con el siguiente contenido:

    #!/bin/sh
    echo $SSH_ORIGINAL_COMMAND >> /var/log/synchronize-log.log
    case "$SSH_ORIGINAL_COMMAND" in
    *\&*)
    echo "Rejected"
    ;;
    *\;*)
    echo "Rejected"
    ;;
    *\(*)
    echo "Rejected"
    ;;
    *\{*)
    echo "Rejected"
    ;;
    *\<*)
    echo "Rejected"
    ;;
    *\>*)
    echo "Rejected"
    ;;
    *\`*)
    echo "Rejected"
    ;;
    *\|*)
    echo "Rejected"
    ;;
    rsync\ --server*) 
    $SSH_ORIGINAL_COMMAND
    ;;
    *)
    echo "Rejected"
    ;;
    esac
    

Puedo ejecutar el comando rsync:

rsync -avzp --del -e "ssh -p 2211" user12@ORIGINAL.SERVERS.IP:/var/sites/photos/ /var/sites/sync/photos

Recibí mensaje de error: permiso problemas con el archivo /root/validate_rsync. He movido el archivo /root/validate_rsync a /var/sites/validate_rsync y chowned a user12:user12

Ahora funciona la sincronización. Pero he encontrado un artículo que dice que es inseguro:

1 - el validate_rsync comando en sí, no debe ser propiedad ni de escritura por el id de usuario que ejecuta el comando rsync. De lo contrario, rsync puede ser usado para sobrescribir la validación de secuencia de comandos con otro script que no validar, o incluso ejecutar comandos arbitrarios.

2 - de igual manera, el autorizado-archivo de claves no deben ser de propiedad o escritura por el rsync usuario, de lo contrario rsync se puede utilizar para sobrescribir el archivo, con uno que elimina la necesidad de ejecutar validar-rsync, o con uno que corre otro comando en su lugar.

Fuente

¿Qué puedo hacer? Si validate_rsync es propiedad de root, la sincronización no se inicia debido a que user12 no puede acceder a root's archivos. Si authorized-keys archivo será propiedad de otro usuario no voy a ser capaz de iniciar sesión con nombre de usuario user12.

Mis preguntas:

  1. Donde debo poner validate_rsync y autorizado-las claves de los archivos, en que directorio? Qué permisos y propietarios deberían tener?

  2. Hay alguna manera en cómo decirle a la validate_rsync archivo para permitir sincronizar sólo 2 carpetas: /var/sites/photos/, /var/sites/photos2/

3voto

Migtor Puntos 319

Los problemas de seguridad son a la derecha. Así que, para responder a su primera pregunta: para que funcione como usted tiene gusto, usted debe poner validate_rsync en un directorio donde user12 tiene permiso de ejecución, pero no escribir. El mismo validate_rsync archivo debe tener permisos de lectura y ejecución para el usuario, pero no escribir. El problema aquí es que /root por defecto es accesible sólo por root de usuario, usted necesita un camino donde cada directorio tiene permisos de ejecución para user12. Por ejemplo, usted podría copiar validate_rsync a /usr/local/bin y hacer que sea propiedad de root. Mientras user12 puede ejecutar y leer, está bien.

Usted no necesita para proteger su authorized_keys archivo. Sería mejor para forzar user12 a ejecutar un comando de configuración, poniendo en sshd_config el siguiente:

Match user user12
  ForceCommand /usr/local/bin/validate_rsync

Creo que esta solución es mejor que jugando con authorized_keys.

También, en su validate_rsync me gustaría citar $SSH_ORIGINAL_COMMAND (más seguro), y me gustaría cambiar su case frase para comprobar la validty del comando para una expresión regular utilizando grep; más fácil, más compacto y potente:

echo "$SSH_ORIGINAL_COMMAND" >> /var/log/synchronize-log.log
if echo "$SSH_ORIGINAL_COMMAND" | grep -qE '[&;<>`|]'; then
  echo Rejected
elif [[ "${SSH_ORIGINAL_COMMAND:0:14}" == "rsync --server" ]]; then
  $SSH_ORIGINAL_COMMAND
else
  echo Rejected
fi

Para responder a su segunda pregunta, como son el registro de la SSH_ORIGINAL_COMMAND, puede ejecutar una prueba con los directorios que desea examinar y, a continuación, examine la SSH_ORIGINAL_COMMAND que usted está consiguiendo. Entonces usted podría hacer validate_rsync a validar solo comando.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: