Pesquisa de site

Arquivos/diretórios seguros usando ACLs (listas de controle de acesso) no Linux


Como administrador do sistema, nossa primeira prioridade será proteger e proteger os dados contra acesso não autorizado. Todos nós estamos cientes das permissões que definimos usando alguns comandos úteis do Linux, como chmod, chown, chgrp… etc. conjuntos têm algumas limitações e às vezes podem não funcionar de acordo com nossas necessidades. Por exemplo, não podemos configurar conjuntos de permissões diferentes para usuários diferentes no mesmo diretório ou arquivo. Assim, foram implementadas Listas de Controle de Acesso (ACLs).

Digamos que você tenha três usuários, ‘tecmint1‘, ‘tecmint2‘ e ‘tecmint3‘. Cada um tendo um grupo comum diz ‘acl’. O usuário 'tecmint1' deseja que apenas o usuário 'tecmint2' possaler e acessar arquivos pertencentes a ' tecmint1' e ninguém mais deveria ter acesso a isso.

ACLs (listas de controle de acesso) nos permitem fazer o mesmo truque. Essas ACLs nos permitem conceder permissões para um usuário, grupo e qualquer grupo de usuários que não estejam na lista de grupos de um usuário.

Nota: De acordo com a documentação do produto Redhat, ele fornece suporte ACL para sistemas de arquivos ext3 e sistemas de arquivos exportados por NFS.

Como verificar o suporte ACL em sistemas Linux

Antes de prosseguir, você deve ter suporte para ACLs no Kernel atual e em sistemas de arquivos montados.

1. Verifique o kernel para suporte ACL

Execute o seguinte comando para verificar o suporte ACL para o sistema de arquivos e a opção POSIX_ACL=Y (se houver N em vez de Y, então significa Kernel não suporta ACL e precisa ser recompilado).

[root@linux ~]# grep -i acl /boot/config*

CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_GENERIC_ACL=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_CIFS_ACL=y
CONFIG_9P_FS_POSIX_ACL=y

2. Verifique os pacotes necessários

Antes de começar a brincar com ACLs, certifique-se de ter os pacotes necessários instalados. Abaixo estão os pacotes necessários que precisam ser instalados usando yum ou apt-get.

[root@linux ~]# yum install nfs4-acl-tools acl libacl		[on RedHat based systems]
[tecmint@linux ~]$ sudo apt-get install nfs4-acl-tools acl	[on Debian based systems]

3. Verifique o sistema de arquivos montado para suporte a ACLs

Agora, verifique se o sistema de arquivos montado está montado com a opção ACL ou não. Podemos usar o comando 'mount' para verificar o mesmo mostrado abaixo.

[root@linux ~]# mount  | grep -i root

/dev/mapper/fedora-root on / type ext4 (rw,relatime,data=ordered)

Mas no nosso caso não está mostrando acl por padrão. Então, a seguir temos a opção de remontar a partição montada novamente usando a opção acl. Mas, antes de prosseguir, temos outra opção para garantir que a partição esteja montada com a opção acl ou não, pois para sistemas recentes ela pode estar integrada com a opção de montagem padrão.

[root@linux ~]# tune2fs -l /dev/mapper/fedora-root | grep acl

Default mount options:    user_xattr acl

Na saída acima, você pode ver que a opção de montagem padrão já tem suporte para acl. Outra opção é remontar a partição conforme mostrado abaixo.

[root@linux ~]# mount -o remount,acl /

Em seguida, adicione a entrada abaixo ao arquivo ‘/etc/fstab’ para torná-lo permanente.

/dev/mapper/fedora-root /	ext4    defaults,acl 1 1

Novamente, remonte a partição.

[root@linux ~]# mount -o remount  /

4. Para servidor NFS

No servidor NFS, se o sistema de arquivos exportado pelo servidor NSF suportar ACL e as ACLs puderem ser lidas pelos clientes NFS, as ACLs serão utilizadas pelo sistema cliente.

Para desabilitar ACLs no compartilhamento NFS, você deve adicionar a opção “no_acl” no arquivo ‘/etc/exportfs’ no servidor NFS. Para desativá-lo no lado do cliente NSF novamente, use a opção “no_acl” durante o tempo de montagem.

Como implementar suporte ACL em sistemas Linux

Existem dois tipos de ACLs:

  1. ACLs de acesso: As ACLs de acesso são usadas para conceder permissões em qualquer arquivo ou diretório.
  2. ACLs padrão: ACLs padrão são usadas para conceder/definir lista de controle de acesso somente em um diretório específico.

Diferença entre Access ACL e ACL padrão:

  1. ACL padrão pode ser usada somente no nível de diretório.
  2. Qualquer subdiretório ou arquivo criado nesse diretório herdará as ACLs de seu diretório pai. Por outro lado, um arquivo herda as ACLs padrão como suas ACLs de acesso.
  3. Usamos “–d” para definir ACLs padrão e ACLs padrão são opcionais.
Antes de definir ACLs padrão

Para determinar as ACLs padrão para um arquivo ou diretório específico, use o comando ‘getfacl’. No exemplo abaixo, o getfacl é usado para obter as ACLs padrão para uma pasta ‘Música‘.

[root@linux ~]# getfacl Music/

file: Music/
owner: root
group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:other::rw-
Depois de definir ACLs padrão

Para definir as ACLs padrão para um arquivo ou diretório específico, use o comando ‘setfacl’. No exemplo abaixo, o comando setfacl definirá novas ACLs (ler e executar) em uma pasta 'Música'.

[root@linux ~]# setfacl -m d:o:rx Music/
[root@linux ~]# getfacl Music/
file: Music/
owner: root
group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:other::r-x

Como definir novas ACLs

Use o comando ‘setfacl’ para configurar ou modificar qualquer arquivo ou diretório. Por exemplo, para conceder permissões de leitura e gravação ao usuário ‘tecmint1‘.

setfacl -m u:tecmint1:rw /tecmint1/example

Como visualizar ACLs

Use o comando ‘getfacl’ para visualizar ACL em qualquer arquivo ou diretório. Por exemplo, para visualizar ACL em ‘/tecmint1/example‘ use o comando abaixo.

getfacl /tecmint1/example

file: tecmint1/example/
owner: tecmint1
group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

Como remover ACLs

Para remover ACL de qualquer arquivo/diretório, usamos as opções x e b conforme mostrado abaixo.

setfacl -x ACL file/directory  	# remove only specified ACL from file/directory.

setfacl -b  file/directory   		#removing all ACL from file/direcoty

Vamos implementar ACLs nos seguintes cenários.

Dois usuários (tecmint1 e tecmint2), ambos com grupo secundário comum denominado ‘acl‘. Criaremos um diretório de propriedade de 'tecmint1' e forneceremos as permissões de leitura e execução nesse diretório ao usuário 'tecmint2'.

Etapa 1: crie dois usuários e remova a senha de ambos

[root@linux ~]# for user in tecmint1 tecmint2

> do
> useradd $user
> passwd -d $user
> done
Removing password for user tecmint1.
passwd: Success
Removing password for user tecmint2.
passwd: Success

Etapa 2: crie um grupo e usuários para o grupo secundário.

[root@linux ~]# groupadd acl
[root@linux ~]# usermod -G acl tecmint1
[root@linux ~]# usermod -G acl tecmint2

Etapa 3: Crie um diretório /tecmint e mude a propriedade para tecmint1.

[root@linux ~]# mkdir /tecmint1
[root@linux ~]# chown tecmint1 /tecmint1/
[root@linux ~]# ls -ld /tecmint1/

drwxr-xr-x 2 tecmint1 root 4096 Apr 17 14:46 /tecmint1/
[root@linux ~]# getfacl /tecmint1

getfacl: Removing leading '/' from absolute path names
file: tecmint1
owner: tecmint1
group: root
user::rwx
group::r-x
other::r-x

Etapa 4: Faça login com tecmint1 e crie um diretório na pasta /tecmint.

[tecmint@linux ~]$ su - tecmint1

Last login: Thu Apr 17 14:49:16 IST 2014 on pts/4
[tecmint1@linux ~]$ cd /tecmint1/
[tecmint1@linux tecmint1]$ mkdir example
[tecmint1@linux tecmint1]$ ll

total 4
drwxrwxr-x 2 tecmint1 tecmint1 4096 Apr 17 14:50 example
[tecmint1@linux tecmint1]$ whoami 
tecmint1

Etapa 5: Agora configure a ACL usando 'setfacl', para que 'tecmint1' tenha todas as permissões rwx, 'tecmint2' terá apenas permissão de leitura na pasta 'exemplo' e outros não terão permissões.

setfacl -m u:tecmint1:rwx example/
setfacl -m u:tecmint2:r-- example/
setfacl -m  other:--- example/
getfacl example/

file: example
owner: tecmint1
group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::r-x
mask::rwx
other::---

Etapa 6: Agora faça login com outro usuário, ou seja, ‘tecmint2‘ em outro terminal e mude o diretório para ‘/tecmint1‘. Agora tente visualizar o conteúdo usando o comando ‘ls’ e depois tente mudar de diretório e veja a diferença conforme abaixo.

[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:03:31 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ ls -lR example/
example/:
total 0
[tecmint2@linux tecmint1]$ cd example/

-bash: cd: example/: Permission denied
[tecmint2@linux tecmint1]$ getfacl example/

file: example
owner: tecmint1
group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

Etapa 7: Agora dê permissão 'executar' para 'tecmint2' na pasta 'exemplo' e então use < comando'cd' para ver o efeito. Agora 'tecmint2' tem permissão para visualizar e alterar o diretório, mas não tem permissão para escrever nada.

[tecmint1@linux tecmint1]$ setfacl -m u:tecmint2:r-x example/
[tecmint1@linux tecmint1]$ getfacl example/

file: example
owner: tecmint1
group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r-x
group::rwx
mask::rwx
other::---
[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:09:49 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ cd example/
[tecmint2@linux example]$ getfacl .
[tecmint2@linux example]$ mkdir test

mkdir: cannot create directory ‘test’: Permission denied
[tecmint2@linux example]$ touch test

touch: cannot touch ‘test’: Permission denied

Nota: Após implementar a ACL, você verá um sinal extra ‘+’ para a saída ‘ls –l’ conforme abaixo.

[root@linux tecmint1]# ll

total 4
drwxrwx---+ 2 tecmint1 tecmint1 4096 Apr 17 17:01 example

Links de referência

Documentação da ACL