Comportamento de permissões de link físico diferente entre o CentOS 6 e o ​​CentOS 7

8

Estou recebendo um erro de permissão no CentOS 7 quando tento criar um link físico. Com as mesmas permissões definidas no CentOS 6, não recebo o erro. O problema é centrado nas permissões de grupo. Não tenho certeza de qual versão do sistema operacional está certa e qual está errada.

Deixe-me ilustrar o que está acontecendo. No meu diretório de trabalho atual, tenho dois diretórios: origem e destino. No início, o destino está vazio; source contém um arquivo 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 você pode ver, em relação às permissões, os dois diretórios são 777, com o proprietário e o grupo configurados para raiz. O proprietário e o grupo do arquivo de texto também estão definidos como raiz. No entanto, as permissões do arquivo de texto são de leitura e gravação para o proprietário, mas somente leitura para o grupo.

Quando estou logado como root, não tenho problemas para criar um link físico no diretório de destino apontando para o arquivo de texto (no diretório de origem).

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

No entanto, se eu fizer login como outro usuário, neste caso, admin, não conseguirá criar o link. Eu recebo: "Operação não 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

O que acontece realmente faz sentido para mim, mas como o acima é permitido no CentOS 6, eu queria verificar se estava entendendo algo errado. Para mim, parece um bug no CentOS 6 que foi corrigido no CentOS 7.

Alguém sabe o que dá? Estou certo de acreditar que o comportamento acima é o comportamento correto? O CentOS 6 está correto? Ou, ambos estão certos e talvez haja algum problema sutil de permissão de grupo que esteja faltando? Obrigado.


Edit: Eu tentei o mesmo teste agora em uma VM Debian v7 que eu tenho. O Debian concorda com o CentOS 7: "Operação não permitida".


Edição nº 2: tentei a mesma coisa no Mac OS X (Yosemite). Isso funcionou da maneira que o CentOS 6 funcionou. Em outras palavras, permitiu que o link fosse criado. (Nota: no OS X, o grupo raiz é chamado de "roda". Essa é a única diferença, pelo que sei.)

Mario
fonte
1
Parece que o administrador do usuário não tem permissões para afetar o link. A propriedade do link é atribuída a quem possui os arquivos / pastas que estão sendo vinculados. Admin não é o mesmo que root. Esses são meus 2 centavos. Como administrador, tente usar 'sudo ln source / test.txt destination /' Você também pode querer começar a usar o sinalizador -s. Quando você cria um link sem o sinalizador -s, está criando um link físico. É uma receita para o desastre, porque se o arquivo / pasta vinculado for destruído, o mesmo ocorre com o original. Com -s 'soft links', a destruição do arquivo vinculado ao arquivo não afeta o original.
precisa
@Baazigar - Obrigado. Eu olhei para isso. Aqui está o meu problema. Eu herdei um aplicativo Perl que depende do comportamento do CentOS 6 (poder criar o link). Estou migrando o aplicativo para o CentOS 7. Esse é realmente apenas um pequeno problema no esquema geral, mas não sei por que a função de link Perl está sendo usada, em vez da função Perl File :: Copy. Eu acho que seria suficiente apenas copiar o arquivo. No entanto, tenho que fazer minha diligência antes de mudar as coisas - e não há (é claro) nenhuma documentação ou comentários para explicar a decisão original que herdei.
Mario
Sem documentação ou justificativa para como está agora, sua solução é igualmente válida, pressupondo que funcione e mais válida se funcionar e tiver documentação. Eu não acho que houve uma alteração na manipulação de centos dos links. Eu acho que é mais provável algo que você ainda não encontrou na caixa antiga, talvez algo em / etc / group ou outro lugar que explique a aparente anomalia.
precisa
@ Baazigar - Eu apenas tentei a mesma coisa no Mac OS X, mas tive que usar o grupo "wheel" (grupo raiz) no lugar do grupo "root". Como você deve saber, o OS X é uma variante do BSD. Funcionou da mesma maneira que o CentOS 6 funcionou - em outras palavras, permitiu que o link fosse feito. Eu não sei o que é certo, neste momento. Não deveria haver uma prática unificada nos sistemas (em sua maioria) compatíveis com POSIX?
Mario

Respostas:

5

Acionei alguns CentOS 6 e 7 vm frescos e fui capaz de recriar o comportamento exato que você mostrou. Depois de fazer algumas investigações, verifica-se que essa é realmente uma alteração no kernel em relação ao comportamento padrão em relação aos links físicos e físicos por questões de segurança. As páginas seguintes me apontaram na direção certa:

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

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

Se você tornar o mundo do arquivo gravável, seu usuário administrador poderá criar o link físico.

Para reverter para o comportamento do sistema CentOS 6, foram adicionados novos parâmetros do kernel. Defina o seguinte em /etc/sysctl.conf:

fs.protected_hardlinks = 0
fs.protected_symlinks = 0

então corra

sysctl -p

Quanto ao motivo pelo qual seu programa opta por usar links em vez de copiar arquivos, por que criar uma cópia exata de um arquivo que você precisa usar quando você pode apenas criar uma entrada que aponte para os blocos originais? Isso economiza espaço em disco e a operação é menos dispendiosa em termos de CPU e E / S. O novo link físico é o mesmo arquivo, apenas com diferentes metadados / inode. Se você excluir o arquivo original após criar um link físico, ele não afetará o link. Um arquivo é apenas 'excluído' depois que todos os links forem removidos.

Sean
fonte
Obrigado. Vou dar uma olhada nesses links um pouco mais tarde hoje. (Tenha um voto positivo enquanto isso!) Entendo a diferença entre um link físico e uma cópia. O programa que eu herdei, no entanto, está criando um link do arquivo de origem para uma área de "download" (por meio de um front-end de aplicativo da web). Não acho que o espaço em disco seja um problema, pois é apenas um arquivo de texto. Além disso, apenas seguindo o significado de "download", não entendo como um link se encaixa: semanticamente, uma cópia parece fazer mais sentido. (I se preocupe, há algum outro comportamento no programa que se baseia em um link que eu vou ter que verificar..)
Mario
1
"Entendo a diferença entre um link físico e uma cópia." Righton, eu estava escrevendo minha resposta com uma audiência geral em mente para usuários futuros lendo que talvez não saibam.
Sean
Sou a favor de escrever com o público em geral em mente :-) Investigarei a melhor correção para o aplicativo, na segunda-feira. Felizmente, tenho muita margem de manobra. (Minha única restrição é "você quebra; você comprou"!) Estou marcando a sua como a resposta aceita. Obrigado novamente!
Mario
PS Acho que o pessoal do CentOS optou por links protegidos por padrão. (O que eu recebo a partir dos links que você fornecidos é que esta é uma questão controversa.)
Mario