Protegendo Arquivos/Diretórios usando ACLs (Listas de Controle de Acesso) no Linux

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

Linux Access Control Lists

Vamos supor que você tem três usuários, ‘ tecmint1 ‘, ‘ tecmint2 ‘ e ‘ tecmint3 ‘. Cada um tendo um grupo comum chamado ‘ acl ‘. O usuário ‘ tecmint1 ‘ quer que apenas o usuário ‘ tecmint2 ‘ possa ler e acessar arquivos de propriedade de ‘ tecmint1 ‘ e mais ninguém deve ter acesso a isso.

As ACLs (Listas de Controle de Acesso) nos permitem fazer esse 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: Conforme a Documentação do Produto Redhat, ela fornece suporte de ACL para o sistema de arquivos ext3 e sistemas de arquivos exportados NFS.

Como Verificar o Suporte de ACL em Sistemas Linux

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

1. Verificar o Suporte de ACL no Kernel

Execute o seguinte comando para verificar o Suporte de ACL para sistema de arquivos e a opção POSIX_ACL=Y (se houver N em vez de Y, isso significa que o 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. Verificar os Pacotes Necessários

Antes de começar a trabalhar com ACLs, certifique-se de que os pacotes necessários estejam instalados. Abaixo estão os pacotes requeridos 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. Verificar o Suporte de ACLs no Sistema de Arquivos Montado

Agora, verifique o sistema de arquivos montado para saber se ele está montado com a opção de ACL ou não. Podemos usar o comando ‘mount’ para verificar o mesmo conforme 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. Assim, a próxima opção é remontar a partição montada novamente usando a opção acl. No entanto, 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 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

No resultado acima, você pode ver que a opção de montagem padrão já possui 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á-la 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 NFS suportar ACL e as ACLs puderem ser lidas pelos Clientes NFS, então as ACLs são utilizadas pelo Sistema cliente.

Para desativar ACLs em um compartilhamento NFS, você precisa adicionar a opção “no_acl” no arquivo ‘/etc/exportfs‘ no Servidor NFS. Para desativá-lo no lado do cliente NSF, use novamente a opção “no_acl” durante a montagem.

Como Implementar Suporte a ACL em Sistemas Linux

Há 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: As ACLs Padrão são usadas para conceder/configurar listas de controle de acesso em um diretório específico apenas.

Diferença entre ACL de Acesso e ACL Padrão:

  1. A ACL Padrão pode ser usada apenas no nível do diretório.
  2. Qualquer subdiretório ou arquivo criado dentro desse 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. Nós usamos o “–d” para definir ACLs padrão e as ACLs Padrão são opcionais.
Antes de Definir ACLs Padrão

Para determinar as ACLs padrão de um arquivo ou diretório específico, use o comando ‘getfacl‘. No exemplo abaixo, o getfacl é usado para obter as ACLs padrão de uma pasta ‘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::rw-
Depois de Definir ACLs Padrão

Para definir as ACLs padrão de um arquivo ou diretório específico, use o comando ‘setfacl‘. No exemplo abaixo, o comando setfacl definirá novas ACLs (leitura e execução) em uma pasta ‘Music’.

[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

Utilize o comando ‘setfacl’ para definir ou modificar em qualquer arquivo ou diretório. Por exemplo, para dar permissões de leitura e escrita ao usuário ‘tecmint1‘.

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

Como Visualizar as ACLs

Utilize o comando ‘getfacl‘ para visualizar as ACL em qualquer arquivo ou diretório. Por exemplo, para visualizar as ACL em ‘/tecmint1/exemplo‘ utilize 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 as ACLs

Para remover as ACL de qualquer arquivo/diretório, utilizamos as opções x e b como 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 as ACLs no seguinte cenário.

Dois Usuários (tecmint1 e tecmint2), ambos tendo um grupo secundário comum chamado ‘acl‘. Vamos criar um diretório de propriedade de ‘tecmint1‘ e fornecer as permissões de leitura e execução nesse diretório para o usuário ‘tecmint2‘.

Passo 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

Passo 2: Crie um Grupo e Adicione Usuários ao Grupo Secundário

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

Passo 3: Crie um Diretório /tecmint e altere 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

Passo 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

Passo 5: Agora defina o ACL usando ‘setfacl‘, para que ‘tecmint1’ tenha todas as permissões rwx, ‘tecmint2’ tenha apenas permissão de leitura na pasta ‘example’ e outros não tenham 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::---

Passo 6: Agora faça login com outro usuário, ou seja, ‘tecmint2’, em outro terminal e mude o diretório para ‘/tecmint1’. Tente visualizar o conteúdo usando o comando ‘ls’ e depois tente mudar de diretório para ver a diferença como 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::---

Passo 7: Agora dê permissão de ‘executar’ para ‘tecmint2’ na pasta ‘example’ e depois use o 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: Depois de implementar o ACL, você verá um sinal extra de ‘+’ na saída do ‘ls -l’ como abaixo.

[root@linux tecmint1]# ll

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

Links de Referência

Documentação do ACL

Source:
https://www.tecmint.com/secure-files-using-acls-in-linux/