Publicado em Sat 12 September 2015
Por Rafael Laboissière
Na seção Sistema .
Recentemente, eu apresentei as novas regras
para a gestão de grupos POSIX no CEFALA. Como eu já mencionei em outras
ocasiões, grupos POSIX existem única e exclusivamente para facilitar
compartilhamento de arquivos em sistemas UNIX-like.
Entretanto, o grande obstáculo para o compartilhamento de arquivos é o fato
de que os nossos diretórios de login têm direitos de acesso muito restritos
(drwx------
). Isto também causa problemas de acesso do diretório
~/public_html
pelo servidor Apache.
Para contornar este problema, foram criados diretórios para cada usuário em
/home/shared/
, com direitos de acesso drwxr-xr-x
. Os diretórios
~/public_html
foram também transferidos para /home/shared/*
e
substituídos por links simbólicos apropriados. O script cefala-add-user
também foi modificado de acordo com o que acabei de expor. Eis um exemplo
de criação de usuário do CEFALA com a versão mais recente do script:
# cefala-add-user foo
[snip]
# ls -ld /home/foo /home/shared/foo
drwx------ 2 foo foo 4096 Sep 12 04:37 /home/foo
drwxr-xr-x 3 foo foo 4096 Sep 12 04:37 /home/shared/foo
# ls -l /home/foo /home/shared/foo
/home/foo:
total 0
lrwxrwxrwx 1 root root 28 Sep 12 04:37 public_html -> /home/shared/foo/public_html
/home/shared/foo:
total 4
drwxr-xr-x 2 foo foo 4096 Sep 12 04:37 public_html
A configuração do Apache teve de ser modificada, ficando o arquivo
/etc/apache2/mods-enabled/userdir.conf
desta maneira:
<IfModule mod_userdir.c >
UserDir /home/shared/*/public_html
UserDir disabled root
<Directory /home/shared/*/public_html >
AllowOverride FileInfo AuthConfig Limit Indexes
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS >
Require all granted
</Limit>
<LimitExcept GET POST OPTIONS >
Require all denied
</LimitExcept>
</Directory>
</IfModule>
Para terminar este artigo, aqui vai uma dica sobre o uso de diretórios
compartilhados onde os direitos de acesso ao grupo se propagam
automaticamente. Como exemplo, eu usarei o meu nome de login (rlaboiss
)
e um dos grupos ao qual pertenço (issp2006
):
$ getent group issp2006
issp2006:*:503:hani,rlaboiss
Imaginem que eu crie um diretório a ser compartilhado pelo outro membro
deste grupo:
$ cd /home/shared/rlaboiss
$ mkdir test-bad
$ chgrp issp2006 test-bad
$ chmod o-rx,g= u test-bad
$ ls -ld test-bad
drwxrwx--- 2 rlaboiss issp2006 4096 Sep 12 09:39 test-bad
Agora, imaginem que eu crie um arquivo e um sub-diretório dentro do
diretório recém-criado:
$ cd test-bad
$ mkdir foo
$ touch bar
$ ls -l
total 4
-rw-r--r-- 1 rlaboiss rlaboiss 0 Sep 12 09:41 bar
drwxr-xr-x 2 rlaboiss rlaboiss 4096 Sep 12 09:41 foo
Se eu quiser também compartilhar os arquivos foo e bar com membros do grupo
issp2006
, então eu terei que rodar os comandos chgrp
e chmod
com os
argumentos adequados.
É possível automatizar o processo graças ao uso dos comandos newgrp
e
umask
, além do flag s
("set group ID on execution") do comando chmod
.
A coisa seria assim:
$ newgrp issp2006
$ umask 2
$ cd /home/shared/rlaboiss
$ mkdir test-good
$ chmod o-rx,g+s test-good
$ cd test-good/
$ mkdir foo
$ touch bar
e o resultado seria este:
$ ls -ld ../test-good
drwxrws--- 3 rlaboiss issp2006 4096 Sep 12 09:49 ../test-good
$ ls -l
total 4
-rw-rw-r-- 1 rlaboiss issp2006 0 Sep 12 09:49 bar
drwxrwsr-x 2 rlaboiss issp2006 4096 Sep 12 09:49 foo
Notem que não foi preciso usar os comandos chgrp
e chmod
para ajustar
os direitos de acesso do diretório foo
e do arquivo bar
. O comando
newgrp
abre um novo shell, de tal maneira que o umask, que normalmente
deve ser 22
, não se propagará ao shell superior. Não se esqueça de rodar
o commando exit
ou teclar Ctrl-D
para voltar à seção shell original,
uma vez terminadas as ações relacionadas com o compartilhamento de
arquivos.