Agrupando a gente

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.

social