quinta-feira, 25 de outubro de 2018

Firejail, Sandbox fácil no PCLinuxOS


Proteção dos ambientes no Linux é uma das características mais notáveis do sistema operacional.
Uma das técnicas mais conhecidas é o Chroot, ambiente virtual  criado para executar aplicações de forma segura.
Porém o Chroot é bastante complicado de configurar, o seu uso não é tão fácil assim.
Mas digamos que você necessite de características como as que o Chroot pode oferecer, como uma solução de segurança para o seu desktop.
Como fazer? Ter todo o trabalho de configurar o Chroot para situações corriqueiras?

Na verdade existe já uma solução para esse problema de segurança no Linux, que chama-se Firejail.

O que faz o Firejail ?

Firejail usa a implementação dos namespaces e sec-comp-bpf no Linux para criar um isolamento entre as aplicações, o sistema de arquivos e os recursos que o sistema operacional oferece aos programas, criando um sandbox que efetivamente isola as aplicações do sistema operacional.
Ele permite que um processo e todos os seus descendentes tenham sua própria visão particular dos recursos do kernel compartilhados globalmente, como a pilha de rede, a tabela de processos e a tabela de montagem.

Escrito em C praticamente sem dependências, o software é executado em qualquer computador Linux com uma versão do kernel 3.x ou mais recente. O sandbox é leve, o overhead  é baixo. Não há arquivos de configuração complicados para editar, nenhuma conexão de soquete aberta, nenhum daemon sendo executado em segundo plano. Todos os recursos de segurança são implementados diretamente no kernel do Linux e estão disponíveis em qualquer computador Linux. O programa é lançado sob licença GPL v2.

Para entendermos como funciona temos que analisar o que são os namespaces e o que é  sec-comp-bpf.


Namespaces

Muito se fala em containers, na verdade, é uma das tecnologias quentes da atualidade, pois permite a criação de máquinas virtuais extremamente simples. O objetivo abstrato dos contêineres é, na verdade, fornecer a um grupo de processos  a ilusão de que eles são os únicos processos no sistema. Quando implementado, esse recurso tem o potencial de realizar muitos benefícios práticos, como a virtualização leve e o ponto de verificação / restauração.
Para dar aos processos em um contêiner a ilusão de que não há outros processos no sistema, vários recursos do sistema global devem ser envolvidos em abstrações que fazem parecer que cada contêiner tem sua própria instância de recursos. Isso foi conseguido com a adição de "namespaces" para vários recursos globais. Cada namespace fornece uma visão isolada de um recurso global específico para o conjunto de processos que são membros desse namespace. Os  namespaces começaram a ser implementados no kernel 2.6.23 e chegaram à sua maturidade no kernel série 3.8
Atualmente, o Linux implementa seis tipos diferentes de namespaces: pid, user, uts, ipc, mnt e net.
Assim, cada um destes   namespaces atua de forma a criar uma embalagem, onde uma aplicação possa ser encapsulada e ter a ilusão que somente ela possui todos os recursos do sistema.
Não irei me deter muito sobre cada um deles, já que não é o escopo deste texto, e sim, discorrer sobre o Firejail. Caso haja interesse em se aprofundar nos  namespaces, sugiro a leitura deste artigo aqui: https://lwn.net/Articles/531114/

Seccomp-bpf

Seccomp-bpf significa secure computing mode(modo de computação seguro). É uma ferramenta de simulação de sandbox simples, mas eficaz, introduzida no kernel Linux 3.5. Ele permite que o usuário conecte um filtro de chamada do sistema(syscall) a um processo e a todos os seus descendentes, reduzindo assim a superfície de ataque do kernel. Os filtros Seccomp são expressos no formato Berkeley Packet Filter (BPF).

Recursos


    •     Linux namespaces: A principal tecnologia por trás do FireJail é o Linux Namespaces. Usamos essa tecnologia de visualização leve como o primeiro passo para isolar o aplicativo.
    •     Filesystem container: Criamos os contêineres de aplicativos automaticamente quando iniciamos o sandbox e os destruímos quando fechamos a caixa de proteção.
    •     Security filters: Os seguintes filtros de segurança estão atualmente implementados – seccomp-bpf, protocol, noroot user namespace, Linux capabilities, X11 sandboxing
    •     Networking support: O Firejail pode anexar uma nova interface de rede TCP / IP ao sandbox, com placas de rede virtuais, tabela de roteamento e firewall próprios.
    •     Security profiles: Localizados no diretório /etc/firejail, os arquivos de perfil descrevem o contêiner do sistema de arquivos, os filtros de segurança e a configuração da rede.
    •     Resource allocation: Permite alocar recursos como tempo de CPU, memória do sistema e largura de banda de rede, usando grupos de controle do Linux e limites do Linux.
    •     Universal packaging formats: O Firejail suporta o formato de empacotamento AppImage nativamente. Basta adicionar a opção de linha de comando –appimage e o pacote é montado e executado dentro da sandbox. O Firejail também suporta pacotes do Ubuntu Snap usando um perfil de segurança regular.
    •     Sandbox auditing: O recurso de auditoria permite que o usuário aponte lacunas nos perfis de segurança. A implementação substitui o programa a ser sandboxed com um programa de teste. Nós distribuímos um programa de auditoria genérico, mas o usuário também pode usar programas personalizados.
    •     Statistics and monitoring: O Firejail fornece um grande número de opções para rastrear todos os aspectos dos aplicativos no sandbox. Isso inclui o monitoramento do uso da CPU / memória / largura de banda, rastreamento de chamadas do sistema, monitoramento de exec e eventos bifurcados e o registro de acessos a arquivos e diretórios na lista negra.
    •     Graphical user interface: Um aplicativo GUI, Firetools, está disponível como um pacote de software separado.


Instalação

Para instala-lo no PCLinuxOS, num terminal, como root, digite apt-get install firejail firetools, ou no Synaptic.

Uso

Para executar um aplicativo usando as proteções padrão do firejail para esse aplicativo (o perfil padrão), execute o seguinte:

$ firejail

Para usar o Firejail com um profile específico (o Firejail possui profiles para mais de 400 aplicativos no Linux):

firejail –profile=filename.profile.

Fora os profiles que já vem com o programa, você pode criar seus próprios profiles e guardá-los em /.config/firejail
 Os profiles guardados nesta pasta tem precedência aos profiles que vêm com o programa.

Se você quiser usar todos os seus programas com o Firejail, basta digitar, como root, # firecfg
Isso cria links simbólicos em /usr/local/bin apontando para /usr/bin/firejail, para todos os programas para os quais o firejail possui perfis padrão.

Abaixo segue o profile genérico do Firejail:

################################

# Generic GUI application profile

################################

include /etc/firejail/disable-mgmt.inc

include /etc/firejail/disable-secret.inc

include /etc/firejail/disable-common.inc

blacklist ${HOME}/.pki/nssdb

blacklist ${HOME}/.lastpass

blacklist ${HOME}/.keepassx

blacklist ${HOME}/.password-store

caps.drop all

seccomp

protocol unix,inet,inet6

netfilter

noroot

Digamos, por exemplo, que você queria impedir que o aplicativo acessasse o diretório de documentos do usuário. Para fazer isso, você adicionaria o seguinte ao perfil recém-criado:

blacklist ${HOME}/Documents

Assim, o programa que rodar com este profile não poderá acessar a pasta /Documents em sua /home.
Você pode tornar pastas específicas como somente leitura, assim:
read-only ${HOME}/Documents

As possibilidades de configuração com os profiles são muito vastas, tendo-se uma granularidade bastante grande. Para se aprofundar nos comandos de configuração dos profiles, você pode acessar esta Wiki aqui: https://wiki.archlinux.org/index.php/Firejail , que é bastante completa.

Usando Firetools

Vamos dar uma olhada em como funciona a GUI FireJail, Firetools. A partir de uma janela de terminal, emita o comando firetools e inicie a ferramenta. Você deve ver duas coisas: A janela Firetools e um indicador para o aplicativo em execução na bandeja do sistema.

Aplicativos pré-configurados no Firetools
 
Você encontrará alguns aplicativos já incluídos no Firetools. Para iniciar um, você pode clicar duas vezes no inicializador de aplicativos ou clicar com o botão direito do mouse no inicializador e selecionar Executar. O Firetools inclui um monitor que você pode executar para ver quais aplicativos estão sendo executados em uma firejail. Para abrir isso, desimpeça o Firetool, clique com o botão direito do mouse em qualquer local da GUI e selecione Ferramentas. Quando o monitor é aberto, você verá todos os aplicativos sandboxed listados. 


Aplicativos rodando no sandbox do Firejail


Pensamentos Finais

Ora, para quê usaríamos o Firejail no PCLinuxOS ?
Bem, alguns cenários de uso me vêm a cabeça. O Firejail pode fortalecer a segurança de diversos aplicativos, sejam de desktop ou aplicativos de um pequeno servidor, quem sabe, para pequenos negócios ou escolas, escritórios e administração.

Criar máquinas quiosque, e, limitar o acesso do usuário, não permitir que ele saia da /home e fique xeretando o sistema.

E, principalmente, criar uma camada de segurança com aplicativos embalados em formato appimage, que estão se tornando muito populares, e, podem se tornar vetores para infecção e propagação de malwares.

Referências: