Apparmor no Linux (Ubuntu/Debian)
O AppArmor é um módulo de segurança no Linux que é carregado e gerenciado pelo kernel. Ele funciona em nível de kernel para fornecer um sistema de controle de acesso baseado em perfis.
Ubuntu/Debian geralmente vem instalado, do contrário baixe; Inclusive baixe o pacote adicional:
sudo apt install apparmor-profiles && sudo apt install apparmor-utils
&& = Executa o comando, se somente se, o primeiro for executado.
Há dois perfils para modo de operação padrão:
- Complaning
- Enforced
Complaining, apenas registras violações.
Enforced, como próprio nome indica em português, ele aplica uma política imposta; além de registrar ação violada.
Para entender melhor ou conhecer, você pode acessar o site oficial https://apparmor.net/. Além disso estou me baseando na documentação feita pelo Ubuntu. Segurança essencial, tanto para servidor, quanto para desktop.
Vamos executar na prática! Isso porque perfils são encontrados em /etc/apparmor.d/
. Podemos criar perfils ou editar. Segue um exemplo de script em Shell que tenta criar algo na pasta /temp
do sistema Linux.
#!usr/bin/env bash
# t.sh é o nome deste arquivo.
echo "Este é um script de teste."
touch /tmp/test_file
Após salvo o script no caminho /home/USERNAME/
, abre outra janela de linha de comando. Crie um perfil para AppArmor:
sudo nano /etc/apparmor.d/usr.bin.t
Usando editor de texto "nano".
# Perfil para /home/USERNAME/t.sh
/home/USERNAME/t.sh {
# Negar acesso ao diretório /tmp
deny /tmp/** rw,
# Permitir execução do próprio script
/home/jeiel/t.sh rix,
}
Após salvo, vamos entender melhor o código. De forma simples, a sintaxe é especificar o caminho do serviço/arquivo inserir dentro de duas chaves e usar metódos para esta ação, no caso deny
de "negar". Por fim lida com permissões.
rix
r = Permissão de leitura (read)
x = Permissão de execuação (eXecute)
i = Herda permissões do pai.
** = Coringa a qulquer diretório ou sub.
Agora aplicando configurações realizadas para AppArmor:
sudo apparmor_parser -a /etc/apparmor.d/usr.bin.t
apparmor_parser = Utilitário para gerenciamento de perfils.
-a = adicionar perfil.
Feito isso, execute o script estando no caminho /home/USERNAME/
seguido com o comando:
chmod 777 t.sh && ./t.sh
chmod = Lida com permissões de arquivos e grupos.
777 = Todas permissões de leitura, escrita, execução para todos os grupos.
Observação:
Só irá funcionar se o AppArmor estiver instalado nativamente. Do contrário, deverá reiniciar o sistema para ele fazer alterações e aplicar, bem como o seu GRUB. Caso o sistema entre em modo de emergência do Linux, dê ENTER e desabilite o AppArmor e reinicie, após salvar o arquivo.
GRUB alterado:
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash security=apparmor" # Alterado
# SELinux extramente forte!
#GRUB_CMDLINE_LINUX="security=selinux"
Instalei o SELinux, porém usando nível militar, me "tranquei do lado de fora". Por isso a linha comentada, para não dá efeito. Esse assunto pode ser abordado em outro momento, mas funciona semelhante ao AppArmor.
GRUB padrão:
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" # Alterado
Após reiniciado o sistema (sudo reboot
) e salvado o arquivo GRUB, segue o comando novamente ./t.sh
.
GRUB
O GRUB (Grand Unified Bootloader) é um carregador de inicialização (bootloader) amplamente utilizado em sistemas Linux e outros sistemas operacionais. Ele é responsável por carregar o sistema operacional no início do processo de inicialização do computador.
Por si só, executar sem modo sudo
, você terá permissão negada.
sudo
O sudo é um comando no Linux e em sistemas Unix-like que permite a um usuário executar comandos com privilégios de superusuário (root).
Logo você executa sudo ./t.sh
. Aì que entra em ação o nosso AppArmor.
Saída do comando:
sudo: ./t.sh: comando não encontrado
Nem com argumento pôde ser possível ser executado. Isso porque definimos uma política rigorosa no nível do Kernel! Veja os logs do sistema:
set 06 11:41:24 jeiel-pc audit[23059]: USER_ACCT pid=23059 uid=1000 auid=1000 ses=2 subj=unconfined msg='op=PAM:accounting grantors=pam_permit,pam_localuser acct="jeiel" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/3 res=success'
set 06 11:41:24 jeiel-pc audit[23059]: USER_CMD pid=23059 uid=1000 auid=1000 ses=2 subj=unconfined msg='cwd="/home/jeiel" cmd="./t.sh" exe="/usr/bin/sudo" terminal=pts/3 res=failed'
Aqui está o que os logs nos mostram:
Autenticação do Usuário, no meu caso "jeiel":
Data/Hora: 6 de setembro, 11:41:24
Usuário: jeiel
Comando: /usr/bin/sudo
Resultado: Sucesso
O log indica que o usuário jeiel foi autenticado com sucesso ao usar o sudo para executar um comando. O comando foi executado a partir do terminal /dev/pts/3.
Execução do Comando:
Data/Hora: 6 de setembro, 11:41:24
Diretório de Trabalho: /home/jeiel
Comando: ./t.sh
Resultado: Falha
O mesmo comando sudo foi usado para tentar executar o script ./t.sh, mas a execução falhou. Isso ocorreu enquanto o usuário estava no terminal pts/3.
O comando foi inspecionado executando:
sudo journalctl -fx
journalctl
É a ferramenta de linha de comando para consultar e manipular os logs gerados pelo systemd-journald, o serviço de logging do systemd. -f: Sigla para "follow". -x: Fornece explicações detalhadas para entradas de log, se disponíveis.
O AppArmor desempenhou um papel vital em proteger o sistema, impedindo a execução não autorizada do script ./t.sh
. Embora a autenticação com sudo tenha sido bem-sucedida, a segurança adicional fornecida pelo AppArmor garantiu que apenas operações permitidas fossem realizadas. Para saber o status e demais detalhes como perfils usado pelo pacote:
sudo aa-status
Saída:
apparmor module is loaded.
72 profiles are loaded.
60 profiles are in enforce mode.
/home/jeiel/t.sh
/snap/core/17200/usr/lib/snapd/snap-confine
/snap/core/17200/usr/lib/snapd/snap-confine//mount-namespace-capture-helper
/snap/snapd/21465/usr/lib/snapd/snap-confine
/snap/snapd/21465/usr/lib/snapd/snap-confine//mount-namespace-capture-helper
/snap/snapd/21759/usr/lib/snapd/snap-confine
/snap/snapd/21759/usr/lib/snapd/snap-confine//mount-namespace-capture-helper
/usr/bin/evince
/usr/bin/evince-previewer
/usr/bin/evince-previewer//sanitized_helper
/usr/bin/evince-thumbnailer
/usr/bin/evince//sanitized_helper
/usr/bin/evince//snap_browsers
/usr/bin/freshclam
/usr/bin/lxc-start
/usr/bin/man
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/NetworkManager/nm-dhcp-helper
/usr/lib/connman/scripts/dhclient-script
/usr/lib/cups/backend/cups-pdf
/usr/lib/snapd/snap-confine
/usr/lib/snapd/snap-confine//mount-namespace-capture-helper
/usr/sbin/cups-browsed
/usr/sbin/cupsd
/usr/sbin/cupsd//third_party
/usr/sbin/haveged
/{,usr/}sbin/dhclient
docker-default
libreoffice-senddoc
libreoffice-soffice//gpg
libreoffice-xpdfimport
lsb_release
lxc-container-default
lxc-container-default-cgns
lxc-container-default-with-mounting
lxc-container-default-with-nesting
man_filter
man_groff
nvidia_modprobe
nvidia_modprobe//kmod
snap-update-ns.code
snap-update-ns.core
snap-update-ns.dalfox
snap-update-ns.docker
snap-update-ns.node
snap-update-ns.rustscan
snap.core.hook.configure
snap.dalfox.dalfox
snap.docker.compose
snap.docker.docker
snap.docker.dockerd
snap.docker.help
snap.docker.hook.configure
snap.docker.hook.connect-plug-graphics-core22
snap.docker.hook.install
snap.docker.hook.post-refresh
snap.docker.nvidia-container-toolkit
snap.rustscan.rustscan
system_tor
tcpdump
12 profiles are in complain mode.
adbd
android_app
libreoffice-oosplash
libreoffice-soffice
lxc-waydroid
snap.code.code
snap.code.url-handler
snap.node.node
snap.node.npm
snap.node.npx
snap.node.yarn
snap.node.yarnpkg
0 profiles are in kill mode.
0 profiles are in unconfined mode.
5 processes have profiles defined.
5 processes are in enforce mode.
/usr/sbin/cups-browsed (1265)
/usr/sbin/cupsd (630)
/usr/sbin/haveged (491)
/snap/docker/2932/bin/dockerd (1184) snap.docker.dockerd
/snap/docker/2932/bin/containerd (1640) snap.docker.dockerd
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
0 processes are in mixed mode.
0 processes are in kill mode.
apparmor module is loaded.
You do not have enough privilege to read the profile set.
Isso indica que o perfil do AppArmor está funcionando corretamente e está efetivamente protegendo o sistema contra acessos não autorizados. Um aliado à segurança;