Melhor solução alternativa para o link simbólico do arquivo com o arquivo tham do grupo diferente

2

Situação do alvo :

  • data/file.txt de propriedade de myUser: myUser e "-rw-rw-rw-" (chmod 666)
  • link simbólico /tmp/file.txt de propriedade de postgres: postgres e "-rw-rw-rw -"

Então, eu posso editar o arquivo com meu usuário, e o outro usuário (postgres) pode ler e escrever também ... Mas o link e o arquivo são de propriedade de diferentes usuários.

Situação do mundo real : o mesmo passo a passo desta outra questão ,

sudo rm /tmp/file.txt  # if exist, remove

cd ~
sudo chmod 666 data/file.txt
ls -l data/file.txt    # "-rw-rw-rw-" as expected
more data/file.txt     # working fine
sudo ln -sf $PWD/data/file.txt /tmp/file.txt  # fine
ls -l /tmp/file.txt    # "lrwxrwxrwx",  /tmp/file.txt -> /home/thisUser/file.txt
more /tmp/file.txt     # fine

sudo chown -h postgres:postgres /tmp/file.txt

sudo more /tmp/file.txt   #  NOT WORK! 

Uma solução alternativa é sysctl -w fs.protected_symlinks=0 (eles more /tmp/file.txt funcionarão bem) mas não é seguro, eu preciso de outra solução.

Veja o problema da vida real

    
por Peter Krauss 11.01.2017 / 21:17

2 respostas

3

Os diretórios /home e /tmp não são realmente apropriados para isso, e nenhum deles está usando um link simbólico. Crie um diretório para armazenar o arquivo e configurar permissões para ele usando uma ACL. Digamos que seu nome de usuário seja peter . Alguns dos comandos abaixo podem ser supérfluos, e estes são dados apenas para serem explícitos.

# Make a new directory to store the 'file.txt'.
#
sudo mkdir /var/my_dir

# Change ownership and group ownership to root.
#
sudo chown root:root /var/my_dir

# Only allow root and members of root to read the directory.
#
sudo chmod 0750 /var/my_dir

# Begin to augment standard permissions with ACLs.

# Below, allow peter rwx for all new file system objects in /var/my_dir.
# (-d means "default" and -m means "mask")
#
setfacl -d -m u:peter:rwx /var/my_dir

# Set the same mask for the directory itself.
#
setfacl -m u:peter:rwx /var/my_dir

# Below, allow postgres r-x for all new file system objects in /var/my_dir.
#
setfacl -d -m u:postgres:r-x /var/my_dir

# Set the same mask for the directory itself.
#
setfacl -m u:postgres:r-x /var/my_dir

Agora, peter pode criar arquivos em /var/my_dir e postgres pode lê-los.

Também pode ser conveniente vincular o diretório em seu diretório pessoal.

cd && ln -s /var/my_dir .

Os arquivos em /tmp devem desaparecer na reinicialização. De um modo geral, ou talvez indiscutivelmente, não seria uma boa prática vincular a arquivos em seu diretório inicial. Eu poderia explicar essa afirmação se você ainda não entende. Um local melhor para essa finalidade pode ser /usr/local/var/my_dir , mas o ponto principal é tentar obter as permissões certas em vez de usar /tmp e /home com links simbólicos para essa finalidade.

Atualizar

Isso também pode ser feito de uma maneira padrão e mais simples, que seria mais compatível com outros softwares, como clientes SFTP / SCP.

sudo mkdir /var/my_dir
sudo chown peter:postgres /var/my_dir
sudo chmod 0750 /var/my_dir

Agora, os arquivos existentes em /var/my_dir só podem ser lidos por root , peter e postgres , enquanto apenas peter e root podem escrever.

Depois, certifique-se de que seu umask crie arquivos que postgres possa ler.

cd
touch test
ls -l test

Se o resultado mostrar r para "outros", então postgres poderá ler o arquivo em /var/my_dir .

Ainda outra abordagem ...

sudo touch /usr/local/var/file.txt
sudo chown peter:postgres /usr/local/var/file.txt
sudo chmod 0640 /usr/local/var/file.txt
cd
ln -s /usr/local/var/file.txt .

Acima, trabalhamos com um único arquivo, sem diretórios. Mais uma vez, tudo isso é simplesmente definir permissões. Você apenas tem que decidir como quer abordar a situação, tendo mais conhecimento sobre o que está fazendo do que o que podemos ler na pergunta.

    
por 11.01.2017 / 21:38
1

Existe um equívoco aqui. Não faz sentido alterar os direitos de um link simbólico. Citando a página chmod (o negrito é meu):

chmod never changes the permissions of symbolic links; the chmod system call cannot change their permissions. This is not a problem since the permissions of symbolic links are never used.

Não há necessidade de links simbólicos. Para compartilhar seu arquivo com o PostgreSQL, você deve alterar o proprietário do grupo do arquivo para o grupo de usuário postgres (que é postgres em sistemas semelhantes a Debian), então chmod g+rw seu arquivo.

    
por 11.01.2017 / 21:39

Tags