SELinux – Security Enhanced Linux

Autor: Luiz Vieira <ala_vieira at ig.com.br>

Conceitos iniciais

O SELinux
("Security-Enhanced Linux") foi desenvolvido pela agência nacional de
segurança dos EUA, a NSA (National Security Agency), e toma como base o
princípio do mínimo privilégio ao extremo, restringindo até o usuário
root.

SELinux foi implementado usando uma flexível e refinada
arquitetura MAC ("Mandatory Access Control"). Desta forma ele provê uma
política de segurança sobre todos os processos e objetos do sistema.
Suas decisões são baseadas em labels, e contém uma variedade de
informações relevantes à segurança. A lógica da política de tomada de
decisões é encapsulada dentro de um simples componente conhecido como
servidor de segurança ("security server") com uma interface geral de
segurança.

Ele foi integrado ao kernel do Linux usando o "framework" LSM ("Linux Security Modules").

Inicialmente sua implementação utilizou os identificadores (IDs
ou PSIDs) armazenados nos inodes livres do sistema de arquivos ext2.
Tal representação numérica era mapeada pelo SELinux como um label do
contexto de segurança. Porém, isso necessitaria de uma modificação em
cada sistema de arquivo para suportar os PSIDs, o que não é uma solução
escalável.

Assim, a próxima etapa da evolução do SELinux foi um módulo
carregável no Kernel 2.4 que armazenava os PSIDs em um arquivo normal
fazendo com que suportasse mais sistemas de arquivos.

Entretanto essa solução não possibilitava a ideal performance do sistema.

Então o código do SELinux finalmente foi integrado ao kernel
2.6.x com total suporte por LSM e contendo atributos (xattrs) no
sistema de arquivos ext3. E o SELinux foi alterado para usar xattrs
como forma de armazenamento da informação do contexto de segurança.

Atualmente vem sendo realizado um extenso trabalho com o
objetivo de deixar o kernel pronto para o SELinux bem como seu
subsequente desenvolvimento em esforços conjuntos da NSA, Red Hat, IBM
e a comunidade de desenvolvedores do SELinux.

Vantagens na utilização

O MAC mostra-se bem superior ao tradicional DAC ("Discretionary Access Control"), pois este possui diversas limitações.

Caso utilize somente o DAC, o dono de um arquivo/objeto provê
um potencial risco de corrompê-lo. Um usuário pode expôr arquivos ou
diretórios à brechas de segurança utilizando incorretamente o comando
chmod e uma não esperada propagação dos direitos de acesso. Um processo
inicializado pelo usuário como um script CGI pode fazer tudo que quiser
com quaisquer arquivos possuídos por este usuário. Por exemplo um
Servidor HTTP pode realizar qualquer operação sobre arquivos que estão
no grupo web ou softwares maliciosos podem conquistar nível root de
acesso rodando como processo de root ou utilizando setuid ou setgid.

O DAC prevê apenas duas grandes categorias de usuários:
administradores e não-administradores. Para alguns serviços e programas
rodarem com nível elevado de privilégio as escolhas são poucas e
tipicamente resolvidas dando completo acesso de administrador.

O MAC permite que sejam definidas permissões de como os
processos irão interagir com outras partes do sistema como arquivos,
devices, sockets, portas e outros processos (todos chamados de objetos
para o SELinux).

Isso é feito através de uma política de segurança definida
administrativamente sobre todos os processos e objetos. Estes processos
e objetos são controlados pelo kernel e a decisão de segurança é tomada
com todas as informações disponíveis ao invés de utilizar somente a
identidade do usuário. Com este modelo os processos podem garantir
apenas permissões necessárias pela funcionalidade seguindo um princípio
de poucos privilégios.

Sobre MAC, por exemplo, usuários que expõem seus dados
utilizando chmod estão protegidos pelo fato de seus dados têm um tipo
único associado com seu diretório "home" e outros processos não podem
tocar nestes dados sem devida permissão dentro da política.

Pré-requisitos

É muito importante ter habilidade de aprender termos técnicos e
colocá-los em prática. Também é importante que já tenha uma idéia do
que pretende fazer, como administrar configurações de serviços básicos,
satisfazer o usuário /home/servidor via Apache HTTP, manipular o
policiamento da aplicação web PHP, ou realizar um policiamento que
permita que certa aplicação seja protegida pelo SELinux.

Para isso é necessário ter:

  • Elevado conhecimento em Linux;
  • Se pretende administrar serviços, manipular ou analisar
    policiamento, conhecimento em nível de administrador e a experiência
    necessária;
  • Conhecimento em segurança no sistema Linux/UNIX;
  • Conhecimento sobre como o sistema Linux/UNIX opera em
    baixo-nível, tal como são realizadas as chamadas ao Kernel para
    operações (entrada, saída, ler, escrever, etc.);
  • Conhecimento de programação e da teoria do sistema que é usado no policiamento;
  • Familiaridade com a linguagem M4, o que ajudaria a entender algumas partes do policiamento SELinux;
  • Privilégios de administrador no sistema;
  • Algum local para examinar e testar o policiamento.Pode ser uma máquina de teste ou desenvolvimento, ou uma estação de trabalho.

Novas ferramentas

A nova versão do SELinux possui várias ferramentas novas, dentre elas citaremos as mais importantes:

Sistema de arquivos /selinux

O sistema de arquivos /selinux foi incluído. Assim uma parte do processo de instalação requer a edição do /etc/fstab. Este sistema de arquivos é similar ao /proc, que por sua vez também é um pseudo sistema de arquivos.

O comando "ls -l /selinux" mostra:

total 0
-rw-rw-rw- 1 root root 0 Sep 11 9:16 access
-rw-rw-rw- 1 root root 0 Sep 11 9:16 context
-rw-rw-rw- 1 root root 0 Sep 11 9:16 create
-rw——- 1 root root 0 Sep 11 10:34 enforce
-rw——- 1 root root 0 Sep 11 10:34 load
-r–r–r– 1 root root 0 Sep 11 10:34 policyvers

Executando o comando cat no arquivo enforce, será mostrada 1 para o modo enforcing ou 0 para o modo permitido.

Carregando o policiamento SELinux por meio de init

O responsável por montar o arquivo de sistemas /selinux é o init, depois disso deve ser carregado o policiamento.

Não usa-se SIDs e PSIDs

Os SIDs (Security Identifiers) eram usados no antigo SELinux na
interface com o kernel . E os PSIDs (Persistent SIDs) eram usados no
código do kernel para mapear arquivos de contexto para diretórios no
disco rígido. No novo SELinux, os atributos estendidos contém o
contexto, assim SIDs ePSIDs não são mais necessárias.

Opção -Z

Esta opção pode ser usada no lugar de –context, depois de um comando como ls ou ps.

Comando chcon ao invés de chsid

O comando chsid era usado no antigo SELinux para alterar o
contexto de um arquivo. O novo SELinux usa o comando chcon para mudar
contextos de arquivo.

Instalando o SELinux

Caso utilize uma distribuição Linux que não possua suporte a SELinux, é necessário instalar os seguintes pacotes:

  • libselinux1: contém as bibliotecas necessárias para o novo SELinux;
  • selinux-policy-default: contém arquivos de policiamento para a maioria dos programas usados, como postfix, sendmail etc;
  • checkpolicy: contém o compilador do policiamento de segurança;
  • policycoreutils: contém utilidades, como setfiles, load_policy, newrole etc;
  • selinux-utils: contém utilitários para algumas aplicações, como para pesquisar o policiamento;
  • selinux-doc: contém documentações;
  • libsemanage: contém algumas bibliotecas;
  • libsepol: contém algumas bibliotecas.

Pacotes adicionais a serem instalados no Debian

  • coreutils: contém versões modificadas de comandos, como cp, mv e ls;
  • procps: contém versões modificadas de comandos, como ps e top;
  • sysvinit: contém um "pach" para carregar o policiamento;
  • dpkg: é necessário para rotular os arquivos corretamente, após o pacote ser instalado;
  • logrotate: contém uma versão modificada do pacote logrotate, o qual preserva a segurança dos contextos dos novos arquivos no SELinux;
  • cron: é necessário para rodar scripts nos domínios corretos.

Para isso basta usar o comando "apt-get install" em seu
terminal de comandos. E não é necessário realizar o boot na máquina
antes de instalá-los, então eles podem ser instalados a qualquer
momento.

Configurações básicas

Editando seu arquivo /etc/fstab e criando o /etc/selinux:

Antes de fazer o "reboot" do sistema, primeiramente é
necessário editar o arquivo /etc/fstab, criar o diretório /etc/selinux
e configurar as permissões para o modo 500. Então edite seu /etc/fstab
incluindo o seguinte:

none /selinux selinuxfs noauto 0 0

Executando o comando "make relabel"

Se seu kernel é 2.6.x com
suporte a XATTR, depois de criar o diretório /etc/selinux e editar o
arquivo /etc/fstab, é necessário executar o comando:

# make -C /etc/selinux relabel

Este comando dá um novo rótulo para o arquivo de sistemas, com o correto contexto de segurança.

Porém se seu Kernel é 2.4.x, este comando não pode ser dado agora.

Editando /etc/pam.d/login e etc/pam.d/ssh

Antes de fazer o
"reboot" do sistema é necessário editar os arquivos /etc/pam.d/login e
/etc/pam.d/ssh para que o shell seja iniciado no contexto correto,
então adicione "session required pam_selinux.so" em ambos estes
arquivos.

Contas de usuários

Criando novas contas de usuários

Verifique se seu domínio de
contexto é sysadm_r:sysadm_t role, depois basta usar o comando useradd
para adicionar um novo usuário. Para verificar se seu uid é 0 e se está
em sysadm_r:sysadm_t role, digite o seguinte comando:

$ id
uid=0(root) gid=0(root) groups=0(root) context=faye:sysadm_r:sysadm_t

Caso seu uid seja o da sua conta regular, então faça o login com "su" primeiramente e siga os comandos abaixo:

$ useradd -c "SE Linux test user" -m -d /home/setest -g users -s /bin/bash -u 1005 nome_de_usuário
$ finger nome_de_usuário

Login: nome_de_usuário Name: SE Linux test user
Directory: /home/nome_de_usuário Shell: /bin/bash
Never logged in.
No mail.
No Plan.
$ passwd nome_de_usuario
Enter new UNIX password: senha
Retype new UNIX password: senha
passwd: password updated successfully

Assim o novo usuário "nome_de_usuário" foi criado.

Configurando regras para usuários

Como exemplo, para que o usuário tenha acesso a user_r, é necessário configurar o arquivo /etc/selinux/users. Para isso, insira no final de seu arquivo:

user usuario roles { user_r };

Assim o usuário "usuário" é autorizado a ter acesso à user_r role.

Então é necessário atualizar o arquivo /etc/selinux/users executando o seguinte comando:

# make -C /etc/selinux load

Ao terminar aparecerá algo como:

Success
touch tmp/load
make: Leaving directory `/usr/share/selinux/policy/current’

Agora deve-se configurar um contexto de segurança default, o que será visto numa seção seguinte.

Editando domínios de usuários

O arquivo de configuração que contém os domínios dos usuários é /etc/selinux/domains/user.te, altere-o adicionando as seguintes linhas:

full_user_role(second)
allow system_r second_r
allow sysadm_r second_r

Também adicione o seguinte comentário:

#Ao adicionar novas regras, edite o macro in_user_role em macros/user_macros.te

Para editar o arquivo /etc/selinux/macros/user_macros.te, entre num editor de texto e procure (no final do arquivo) a string in_user_role e adicione: "role second_r types $1;"

  • A linha full_user_role(second) cria o domínio second_t e os diretórios second_home_dir_t e second_home_t;
  • O diretório second_tmp_t é criado para arquivos que estão em níveis inferiores a /tmp;
  • O diretório second_tmpfs_t é criado para dividir o espaço de memória criado no contexto tmpfs;
  • Os diretórios second_tty_device_t e second_devpts_t são criados para rotular os "tty devices" e os "pseudo tty devices".

Agora que já criamos um novo domínio de usuário (second_t), criaremos um novo usuário para usá-lo.

Criando um novo usuário (newuser) para o novo domínio criado

Com o próprio comando useradd, crie um novo usuário e o adicione a /etc/selinux/users, que só tenha acesso a regra second_r. Execute o comando:

# make -C /etc/selinux load

Para aplicar o policiamento:

Deve-se configurar o domínio default para a nova regra, editando o arquivo /etc/security/default_type e adicionando a linha:

second_r:second_t

Agora é necessário rotular manualmente o arquivo /home/newuser executando o seguinte comando:

# find /home/newuser | xargs chcon -h system_u:object_r:second_home_t ; chcon -h system_u:object_r:second_home_dir_t /home/spike

Agora que o novo usuário foi criado, tente fazer o login como sendo ele.

Regras

Alterando regras no SELinux

Fornecendo um contexto de usuário no login:

Bem, aqui supõe-se que o "reboot" na máquina já tenha sido feito. Ao instalar o pacote selinux-policy-default,
os arquivos de policiamento foram instalados de modo a permitir que se
realize o login no sistema como usuário default (caso não tenha
adicionado novos usuários).

Então, fazendo o login como root, o contexto de segurança será:

root:user_r:user_t

Assim o id e seu contexto de segurança devem ser similares a:

uid=0(root) gid=0(root) groups=0(root) context=root:user_r:user_t

Existem duas maneiras para mudar para uma nova regra:

1) Ao fazer o login:

Se um usuário está autorizado a entrar no domínio sysadm_t,
então basta que essa pessoa faça o login no terminal. Em "Your default
context is faye:user_r:user_t. Do you want to choose a different one? "
selecione a opção desejada, e clique em enter.

[1]user:user_r:user_t
[2]user:sysadm_r:sysadm_t
Enter number of choice:

Neste exemplo o usuário user já tinha acesso a sysadm_r role e
a sysadm_t domain. Assim as opções que serão mostradas são somente
aquelas que o usuário tem o acesso permitido.

Assim, se o usuário user selecionar a opção 2, terá o contexto
de segurança: context=faye:sysadm_r:sysadm_t, que significa que está na
regra sysadm_r.

2) Com o comando newrole -r

A sintaxe deste comando é:

newrole -r regra

Substitui-se "regra" pela nova regra desejada.

Então será preciso entrar com a senha do usuário, que poderá
ser verificada com o comando id. Porém, caso não seja possível que você
altere a regra, será retornado algo como:

user:sysadm_r:sysadm_t is not a valid context

Esta mensagem significa que o usuário "user" não pode ter este contexto, porque não está autorizado.

Após mudar regras, execute o comando id para verificar seu contexto de segurança.

É isso! Agora aproveite a instalação e crie novos usuários e grupos para testar diferentes configurações de regras.

Espero que testem e gostem.

[ ]’s a todos!


http://www.vivaolinux.com.br/artigo/SELinux-Security-Enhanced-Linux

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s