Executando verificação de segurança...
6

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;

Carregando publicação patrocinada...
2
1