Leer archivos propiedad de otro usuario como no root


9

Estoy respaldando servidores en un servidor de respaldo. Cada servidor que está respaldado tiene su propia cuenta en el servidor de respaldo, y los archivos están sincronizados. Es importante que los permisos permanezcan intactos (usando rsync -p) para simplificar las restauraciones.

Estoy tratando de crear un script que pueda leer los archivos y crear algunas estadísticas. No me gusta que el script se ejecute bajo el usuario root, y también es imposible ejecutarlo para cada usuario de respaldo, ya que el script debería poder leer todos los archivos de todos los usuarios. Sin embargo, esto crea un problema cuando un archivo es, por ejemplo, chmodded 600. No quiero tocar los permisos, pero otro usuario excepto el root y el propietario no pueden leerlo.

Un usuario específico, no root, debería poder leer todos los archivos en un directorio o partición, independientemente de los niveles de permiso (y el propietario de los archivos no debería tener forma de evitarlo). ¿Hay una manera de lograr esto? Estoy ejecutando FreeBSD con un volumen ZFS.


Esta fue mi primera pregunta en este sitio :) Probablemente también puedas echarle un vistazo a esto. unix.stackexchange.com/questions/91488/…
Ramesh

Respuestas:


4

Uso sudo.

Si su sudoersarchivo enumera un comando exacto y específico, entonces el comando debe llamarse exactamente como se indica en sudoerso se rechazará.

P.ej:

backupuser  ALL=(root) /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

En este ejemplo, el usuario backuppuede ejecutar el comando exactamente como se muestra:

sudo /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Si llaman en sudo rsync...lugar del sudo /usr/bin/rsynccomando falla, o si los indicadores o las rutas son diferentes, el comando falla.

Si está haciendo esto en un script, entonces desea habilitar el uso sin contraseña de esos comandos:

backupuser  ALL=(root) NOPASSWD: /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Para más información, vea la sudoers(5)página del manual debajo Cmnd_list.


Gran idea. Agregué los comandos ls, cat, head, tail, etc. al archivo sudoers y ahora puedo ejecutarlos con privilegios de root y leer todos los archivos. Puede que no sea la mejor solución para todos, ya que el usuario puede leer todos los archivos del sistema, pero eso no es un problema en mi configuración.
Evianon

Bueno, si estuvieras usando Solaris, habría sugerido RBAC y pfexec. Pero como estás en BSD, sudotendrá que hacerlo.
bahamat

4

Puede escribir una suidversión de cateso que solo sea ejecutable por su usuario de respaldo (haga un grupo exclusivo para el usuario de respaldo y haga que el ejecutable sea legible solo por ese grupo). Esto catsolo le permitiría leer archivos en el directorio que le interesa. (Probablemente desee no permitir enlaces simbólicos y estar atento a trucos como /dir/../otherdir/).

Entonces su script puede usar este ejecutable para leer archivos sin tener privilegios de root.


4

ADVERTENCIA: Como Stephane señaló en los comentarios a continuación, los propietarios de los archivos aún podrán revocar la ACL.

Si tiene acceso de root a la máquina, puede hacer esto con las ACL :

setfacl -R -m u:USERNAME:r /path/to/direcory

Esto le dará USERNAMEacceso de lectura a todos los archivos y directorios en /path/to/directory.


Los propietarios de los archivos aún podrían eliminar esas ACL.
Stéphane Chazelas

@StephaneChazelas oh. ¿Incluso si esto fue hecho por root? No me di cuenta de eso. ¿Conoces alguna forma de evitarlo?
terdon

No, en Linux habría mirado una combinación de capacidades de Linux y LSM. En FreeBSD no tengo idea.
Stéphane Chazelas

1

Bindfs es un sistema de archivos FUSE que proporciona vistas de un árbol de directorios con diferentes permisos y propiedad. No hay puerto para FreeBSD, pero puede compilar desde la fuente.

Para darle al usuario backupper(y solo a ese usuario) una vista de /some/filesdónde se pueden leer todos los archivos, monte una vista de lectura mundial /some/filesen un directorio privado de backupper.

mkdir -p ~backupper/spyglass/files
chown backupper ~backupper/spyglass
chmod 700 ~backupper/spyglass
bindfs -p a+rX-w /some/files ~backupper/spyglass/files

0

ZFS tiene algunos mecanismos para esto.

Uno de los mecanismos aún está en proceso y aún no está implementado, pero permite que un conjunto de datos se monte con una anulación de "propietario". En este caso, podría clonar una instantánea, montarla con el propietario anulado al usuario de copia de seguridad, hacer una copia de seguridad y luego destruir el clon. La desventaja es que no respaldas la propiedad real de los archivos.

La mejor solución es probablemente las ACL de estilo ZFS nfsv4


0

Tengo dos ideas sobre cómo resolver este problema utilizando tecnologías específicas de FreeBSD, aunque tampoco lo he intentado:

  • Use pimiento. Este es mi método preferido. Además, dado que recientemente se ha portado a Linux, también debería funcionar allí. Iría así:

    1. Cree un comando drop-cap-write que suelte CAP_WRITE y luego ejecute un comando suministrado en la línea de comando
    2. Use sudo para permitir que el usuario de respaldo ejecute ese comando sin una contraseña
    3. Opcionalmente, use la directiva ForceCommand de sshd_config para ejecutar automáticamente ese comando cada vez que el usuario de respaldo inicie sesión. De esa manera, el usuario remoto no necesitaría especificar drop-cap-write en su script de respaldo.
  • Utilice el control de acceso obligatorio. Esto no funciona en Linux AFAIK, y es más difícil de configurar. Iría así:

    1. Cree una cárcel de respaldo cuyo directorio raíz sea /. Codifica la cárcel.
    2. ejecute sshd en la cárcel de respaldo. Permita que root inicie sesión aquí, incluso si no permite inicios de sesión de root en el sshd regular
    3. Establezca ugidfw_enable = "YES" en /etc/rc.conf
    4. Use una regla ugidfw que se parezca a esto:

    ugidfw agregar sujeto uid root jailid BACKUP_JAIL_ID modo rsx

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.