![Conceder permissões de grupo aos arquivos de outros usuários](https://rvso.com/image/109222/Conceder%20permiss%C3%B5es%20de%20grupo%20aos%20arquivos%20de%20outros%20usu%C3%A1rios.png)
Estou usando o Debian 7 e criei um novo usuário (site) com um diretório htdocs como este:
$ sudo adduser website
$ sudo mkdir -p /home/website/htdocs
$ sudo chown -R website /home/website
Agora gostaria que usuários de outro grupo (desenvolvedores) tivessem acesso ao diretório do usuário. Eu tentei:
$ sudo chown -R :developers /home/website
Posso ver que o grupo está atribuído (com ls -la
ou stat
) e que os usuários estão no grupo, mas não têm acesso, certo?
drwxr-xr-x 3 website developers 4096 May 3 09:09 website
Eu também quero:
Permitir que outro grupo, 'contratantes', acesse os arquivos do site
Restringir o acesso dos usuários do site apenas aos seus diretórios pessoais
Garanta que os novos arquivos do site herdem essas permissões
Você precisa usar listas de controle de acesso - ou existe uma maneira melhor de fazer isso (como não usar um usuário separado para cada site)?
Responder1
É difícil dar comandos precisos sem conhecer o sistema operacional ou a distribuição; e sim! ACL funcionaria, mas também existe uma maneira padrão.
Existe adduser
e useradd
, um deles na sua distribuição pode criar o diretório inicial do usuário automaticamente. Nesse caso, o conteúdo do /etc/skel/
diretório seria copiado para o diretório inicial do usuário, as permissões seriam definidas e talvez algumas outras ações apropriadas pudessem ser realizadas.
Podem existir grupos pré-definidos para partilha, como por exemplo ‘staff’; mas, se quisermos criar nosso próprio grupo para compartilhar, não há nada de errado nisso. Portanto, crie um novo grupo ou use um grupo existente. Certifique-se de que os usuários que serão membros do grupo foram definidos como tal com usermod
, moduser
ou vigr
talvez, de acordo com o sistema operacional. Cada usuário conectado no momento deve sair e entrar novamente para se tornar membro de um novo grupo.
Crie um diretório comum para todos os usuários, como /home/share_directory/
ou qualquer outro diretório que faça mais sentido para sua situação. Uma prática recomendada relevante é não usar um diretóriodentro dediretório inicial de qualquer usuário. Se ninguém, exceto o proprietário e o grupo, puder ver os arquivos no diretório, altere as permissões do diretório para 0770. Se a leitura estiver correta por "outros", use 0775. O proprietário do diretório quase certamente deve ser root.
chown root:group_name /home/share_directory/
Em seguida, altere o bit setuid.
chmod +s /home/share_directory/
Se nenhum usuário puder modificar o arquivo de outro usuário, defina também o stick bit.
chmod +t /home/share_directory/
Esses exemplos definem os bits setuid e sticky ao mesmo tempo usandonotação octal.
chmod 5775 /home/share_directory/
ou
chmod 5770 /home/share_directory/
Para a pergunta atualizada, parece que o ACL é a ferramenta certa. A maioria das distribuições Linux agora inclui a acl
opção na defaults
opção. Se a sua distribuição não inclui a acl
opção por padrão, então é necessário um pouco de trabalho para começar a usá-la. Primeiro monte os sistemas de arquivos com a acl
opção em /etc/fstab.
sudo vim /etc/fstab
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 defaults,acl 0 1
Se necessário, remonte o sistema de arquivos: sudo mount -o remount,acl /
. Em seguida, crie um grupo ao qual um usuário possa pertencer para esse fim. Talvez seja necessário instalar também as ferramentas ACL: apt-get install acl
.
sudo groupadd developers
sudo usermod -a -G developers $username
(Ou o grupo pode ser "contratantes".) Um usuário conectado no momento deve sair e entrar novamente para se tornar membro do novo grupo. Claro, não faça isso se você tiver conteúdo no diretório /var/www que deseja manter, mas apenas para ilustrar a configuração inicial:
sudo rm -rf /var/www
sudo mkdir -p /var/www/public
sudo chown -R root:developers /var/www/public
sudo chmod 0775 /var/www/public
sudo chmod g+s /var/www/public
sudo setfacl -d -m u::rwx,g::rwx,o::r-x /var/www/public
sudo setfacl -m u::rwx,g::rwx,o::r-x /var/www/public
sudo setfacl -d -m u::rwx,g:contractors:rwx,o::r-x /var/www/public
sudo setfacl -m u::rwx,g:contractors:rwx,o::r-x /var/www/public
Acima, as diferenças entre os setfacl
comandos são estas: a primeira instância usa o grupo padrão (proprietário do grupo do diretório) enquanto a segunda especifica um grupo explicitamente. A -d
opção estabelece a máscara padrão ( -m
) para todos os novos objetos do sistema de arquivos dentro do diretório. No entanto, também precisamos executar o comando novamente sem a -d
opção para aplicar a ACL ao próprio diretório. Em seguida, substitua as referências a "/var/www" por "/var/www/public" em um arquivo de configuração e recarregue.
sudo vim /etc/apache2/sites-enabled/000-default
sudo /etc/init.d/apache2 reload
Se quiséssemos restringir a exclusão e renomeação de todos, exceto do usuário que criou o arquivo: sudo chmod +t /var/www/public
. Dessa forma, se quisermos criar diretórios para frameworks que existem fora da raiz do documento Apache ou talvez criar diretórios graváveis pelo servidor, ainda é fácil.
Diretório de logs graváveis do Apache:
sudo mkdir /var/www/logs
sudo chgrp www-data /var/www/logs
sudo chmod 0770 /var/www/logs
Diretório da biblioteca legível pelo Apache:
sudo mkdir /var/www/lib
sudo chgrp www-data /var/www/logs
sudo chmod 0750 /var/www/logs
Um pouco de "brincadeira" em um diretório que não importa deve ajudar a fazer isso da maneira certa para sua situação.
Quanto às restrições, utilizo duas abordagens diferentes: o shell, rssh
, foi feito para fornecer acesso SCP/SFTP, mas sem acesso SSH; ou, para restringir o uso a um diretório inicial, você pode usar o subsistema internal-sftp, configurado em /etc/ssh/sshd_config
.
Subsystem sftp internal-sftp
Match group sftponly
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
Crie um grupo chamado, por exemplo, sftponly. Torne os usuários membros do grupo sftponly. Mude seus diretórios pessoais para /
por causa do chroot. O diretório, /home/username, deve pertencer ao root. Você também pode definir o shell do usuário como /bin/false para impedir o acesso SSH. Estou principalmente preocupado com o acesso interativo, então geralmente siga o rssh
caminho. (Eles não podem escrever em nenhum lugar, exceto onde eu defini a capacidade de gravação.)