Comportamiento de permisos de enlace duro diferente entre CentOS 6 y CentOS 7

8

Recibo un error de permisos en CentOS 7 cuando intento crear un enlace duro. Con los mismos permisos establecidos en CentOS 6, no obtengo el error. El problema se centra en los permisos de grupo. No estoy seguro de qué versión del sistema operativo es correcta y cuál es incorrecta.

Déjame ilustrar lo que está sucediendo. En mi directorio de trabajo actual, tengo dos directorios: origen y destino. Al principio, el destino está vacío; fuente contiene un archivo de texto.

[root@tc-dlx-nba cwd]# ls -l
total 0
drwxrwxrwx. 2 root root  6 Jun 12 14:33 destination
drwxrwxrwx. 2 root root 21 Jun 12 14:33 source
[root@tc-dlx-nba cwd]# ls -l destination/
total 0
[root@tc-dlx-nba cwd]# ls -l source/
total 4
-rw-r--r--. 1 root root 8 Jun 12 14:20 test.txt
[root@tc-dlx-nba cwd]# 

Como puede ver, con respecto a los permisos, los dos directorios son 777, con el propietario y el grupo configurados como root. El propietario y el grupo del archivo de texto también están configurados como root. Sin embargo, los permisos del archivo de texto son de lectura y escritura para el propietario, pero de solo lectura para el grupo.

Cuando estoy conectado como root, no tengo problemas para crear un enlace duro en el directorio de destino que apunta al archivo de texto (en el directorio de origen).

[root@tc-dlx-nba cwd]# ln source/test.txt destination/
[root@tc-dlx-nba cwd]# ls destination/
test.txt

Sin embargo, si inicio sesión como otro usuario, en este caso, administrador, no puedo crear el enlace. Me sale: "Operación no permitida".

[root@tc-dlx-nba cwd]# rm -f destination/test.txt 
[root@tc-dlx-nba cwd]# su admin
bash-4.2$ pwd
/root/cwd
bash-4.2$ ln source/test.txt destination/
ln: failed to create hard link ‘destination/test.txt’ => ‘source/test.txt’: Operation not permitted

Lo que sucede en realidad tiene sentido para mí, pero como lo anterior está permitido en CentOS 6, quería verificar si estaba malentendiendo algo. Para mí, parece un error en CentOS 6 que se ha solucionado en CentOS 7.

Alguien sabe lo que da? ¿Estoy en lo cierto al creer que el comportamiento anterior es el correcto? ¿Es CentOS 6 lo correcto? O bien, ¿tienen razón y quizás haya un problema sutil de permisos de grupo que me falta? Gracias.


Editar: Intenté la misma prueba en este momento en una máquina virtual Debian v7 que tengo. Debian está de acuerdo con CentOS 7: "Operación no permitida".


Edición n. ° 2: acabo de intentar lo mismo en Mac OS X (Yosemite). Eso funcionó de la manera que lo hizo CentOS 6. En otras palabras, permitió que se creara el enlace. (Nota: en OS X, el grupo raíz se llama "rueda". Esa es la única diferencia, por lo que puedo decir).

Mario
fuente
1
Parece que el administrador de usuario no tiene permisos para afectar el enlace. La propiedad del enlace depende de quién posee los archivos / carpetas que se están vinculando. Admin no es lo mismo que root. Esa es mi 2 centavos. Como administrador, intente usar 'sudo ln source / test.txt destination /' También puede comenzar a usar el indicador -s. Cuando crea un enlace sin la bandera -s, está creando un enlace duro. Es una receta para el desastre porque si el archivo / carpeta vinculado se destruye, también lo es el original. Con -s 'enlaces blandos', la destrucción del archivo vinculado no afecta al original.
Baazigar
@Baazigar - Gracias. He investigado eso. Aquí está mi problema. Heredé una aplicación Perl que se basa en el comportamiento de CentOS 6 (poder crear el enlace). Estoy migrando la aplicación a CentOS 7. Esto es realmente un pequeño problema en el esquema general de las cosas, pero no sé por qué se está utilizando la función de enlace Perl, en lugar de la función Perl File :: Copy. Creo que sería suficiente simplemente copiar el archivo. Sin embargo, tengo que hacer mi diligencia debida antes de cambiar las cosas, y (por supuesto) no hay documentación ni comentarios para explicar la decisión original que heredé.
Mario
Sin documentación o justificación de cómo está ahora, su solución es igualmente válida asumiendo que funciona, y más válida si funciona y tiene documentación. No creo que haya habido un cambio en el manejo de centos de los enlaces. Creo que es más probable que algo que no haya encontrado todavía en la caja anterior, tal vez algo en / etc / group o en otro lugar que explique la anomalía aparente.
Baazigar
@Baazigar: acabo de intentar lo mismo en Mac OS X, aunque tuve que usar la "rueda" del grupo (grupo de la raíz) en lugar de la "raíz" del grupo. Como sabrás, OS X es una variante BSD. Eso funcionó de la misma manera que funcionaba CentOS 6; en otras palabras, permitió que se estableciera el enlace. No sé lo que está bien, en este momento. ¿No debería haber una práctica unificada en lo que son (en su mayoría) sistemas compatibles con POSIX?
Mario

Respuestas:

5

Hice algunos CentOS 6 y 7 vm nuevos y pude recrear el comportamiento exacto que mostraste. Después de investigar un poco, resulta que esto es en realidad un cambio en el núcleo con respecto al comportamiento predeterminado con respecto a los enlaces duros y blandos en aras de la seguridad. Las siguientes páginas me apuntaron en la dirección correcta:

http://kernel.opensuse.org/cgit/kernel/commit/?id=561ec64ae67ef25cac8d72bb9c4bfc955edfd415

http://kernel.opensuse.org/cgit/kernel/commit/?id=800179c9b8a1

Si hace que el mundo del archivo sea editable, su usuario administrador podrá crear el enlace duro.

Para volver al comportamiento del sistema CentOS 6 en todo el sistema, se agregaron nuevos parámetros del kernel. Establezca lo siguiente en /etc/sysctl.conf:

fs.protected_hardlinks = 0
fs.protected_symlinks = 0

entonces corre

sysctl -p

En cuanto a por qué su programa opta por usar enlaces en lugar de copiar archivos, ¿por qué crear una copia exacta de un archivo que necesita usar cuando puede crear una entrada que apunte a los bloques originales? Esto ahorra espacio en disco y la operación es menos costosa en términos de CPU y E / S. El nuevo enlace duro es el mismo archivo, solo que con metadatos / inodo diferentes. Si tuviera que eliminar el archivo original después de crear un enlace duro, no afectará el enlace. Un archivo solo se 'elimina' una vez que se han eliminado todos los enlaces.

Sean
fuente
Gracias. Voy a echar un vistazo a estos enlaces un poco más tarde hoy. (¡Mientras tanto, tenga un voto positivo!) Entiendo la diferencia entre un enlace duro y una copia. Sin embargo, el programa que heredé está creando un enlace desde el archivo fuente a un área de "descarga" (a través de una aplicación web front-end). No creo que el espacio en disco sea un problema, ya que es solo un archivo de texto. Además, solo por lo que comúnmente significa "descargar", no entiendo cómo encaja un enlace: semánticamente, una copia parece tener más sentido. (Me preocupa que haya algún otro comportamiento en el programa que dependa de un enlace. Tendré que verificarlo)
Mario
1
"Entiendo la diferencia entre un enlace duro y una copia". Righton, solo estaba escribiendo mi respuesta con una audiencia general en mente para futuros usuarios que quizás no lo sepan.
Sean
Estoy dispuesto a escribir con una audiencia general en mente :-) Investigaré la mejor solución para la aplicación, el lunes. Afortunadamente, tengo mucho margen de maniobra. (¡Mi única restricción es "lo rompes; lo compraste"!) Estoy marcando la tuya como la respuesta aceptada. ¡Gracias de nuevo!
Mario
PD: Supongo que la gente de CentOS ha optado por enlaces protegidos por defecto. (Lo que obtengo de los enlaces que ha proporcionado es que este es un tema polémico)
Mario