Introdução aos conceitos e gerenciamento da Selinux
- 4117
- 693
- Robert Wunsch DVM
Objetivo
Introdução aos conceitos e gerenciamento da Selinux
Sistema operacional e versões de software
- Sistema operacional: - Distribuição Linux AGNOSTIC
Requisitos
- Acesso raiz em uma instalação do Linux Work
- Pacote PolicyCoreUtils: fornece getSeBool, setsebool, RestoreCon Utilities
- Pacote CoreUtils: fornece utilitário CHCON
- Pacote Policicoreutils-Python: fornece comando semanage
- PolicyCoreutils-Newrole: fornece o programa NewRole
- Setools-Cononsole: fornece comando seinfo
Dificuldade
MÉDIO
Convenções
- # - requer que os comandos Linux sejam executados com privilégios root diretamente como usuário root ou por uso de
sudo
comando - $ - Requer que os comandos do Linux sejam executados como um usuário não privilegiado regular
Introdução
O Selinux (Linux de segurança aprimorado) é uma implementação de um sistema de permissão de controle de acesso obrigatório (MAC) no kernel Linux. Esse tipo de controle de acesso difere dos sistemas de controle de acesso discricionário (DAC), como as ACLs e as permissões Standard UNIX UGO/RWX, em como o acesso a um recurso é fornecido. No caso do Mac, não é o proprietário de um recurso quem decide quem e como pode acessá -lo: esse acesso é baseado nas relações entre domínios e rótulos, ditados por uma política e aplicados no nível do kernel. É importante dizer que as regras aplicadas por Selinux e as permissões de sistema padrão não são mutuamente exclusivas, e as primeiras são implementadas após o último.
Possível status do Selinux
Existem três status possível de Selinux: desativado, permissivo e aplicação. No primeiro caso, o Selinux está completamente desligado: não tem nenhum efeito no sistema em execução. Quando no modo permissivo Selinux está ativo: ele registra as violações da política, mas não faz nada para bloqueá -las. Finalmente, quando no modo de aplicação, a Selinux realmente aplica sua política.
Existem muitas maneiras de verificar o status do Selinux em seu sistema. O primeiro é usar o comando chamado getenforce. Este comando apenas relata o que os três status mencionados acima Selinux é. Para ter uma saída mais detalhada, você pode usar o utilitário sestatus. Esta é a saída do comando no meu sistema (Centos 7):
Selinux Status: habilitado Selinuxfs MOUNT:/SYS/FS/Selinux Selinux ROOT Diretório:/etc/Selinux Nome da política: Modo atual direcionado: Modo de aplicação do arquivo de configuração: Política de aplicação do status da política MLS: : 28
Algumas informações úteis são fornecidas: antes de tudo Selinuxfs MountPoint
, Nesse caso/sys/fs/selinux. Selinuxfs
é um sistema de arquivos pseudo, assim como /proc: é preenchido em tempo de execução pelo kernel Linux e contém arquivos úteis para documentar o status do Selinux. O Diretório raiz do Selinux
Em vez disso, é o caminho usado para manter os arquivos de configuração do Selinux, o principal de ser/etc/Selinux/config (um link simbólico para este arquivo também está presente em/etc/sysconfig/selinux). Alterar este arquivo diretamente é a maneira mais direta de alterar o status e o modo Selinux. Vamos dar uma breve olhada em seu conteúdo:
$ CAT/etc/Selinux/Config # Este arquivo controla o estado de Selinux no sistema. # Selinux = pode levar um desses três valores: # aplicação - a Política de Segurança do Selinux é aplicada. # Permissivo - Selinux impressa avisos em vez de aplicar. # desativado - nenhuma política de Selinux é carregada. Selinux = Aplicação # SelinuxType = pode levar um dos dois dois valores: # direcionados - os processos direcionados são protegidos, # mínimo - modificação da política direcionada. Somente processos selecionados estão protegidos. # MLS - Proteção de segurança de vários níveis. SelinuxType = direcionado
O arquivo é muito bem comentado: ao alterar os valores das variáveis Selinux e SelinuxType, podemos definir respectivamente o status Selinux e o modo Selinux. Os modos possíveis são: direcionados (o padrão), o mínimo e o MLS. O modo direcionado é o padrão: quando este modo está ativo, todos os processos direcionados são protegidos. O modo mínimo é um subconjunto do primeiro, no qual apenas processos específicos são protegidos. Finalmente, a política do MLS é a mais sofisticada, com base no conceito de classificação de segurança: do não classificado ao topo secreto: usa o modelo Bell-La Padula, desenvolvido para o Departamento de Defesa dos EUA.
Alterando o status do Selinux
Para alterar o status do Selinux em tempo de execução, você pode usar o setEnforce
comando. Sua sintaxe é realmente simples: você especifica o status em que deseja colocar o Selinux, escolhendo entre cumprir ou permissivo ou fornecer um valor booleano referido ao status de aplicação. O que você não pode fazer com este comando é desativar o Selinux completamente. Para fazer isso (não recomendado) e fazer outras mudanças persistentes, você deve editar o arquivo de configuração principal, como visto acima. Alterações feitas neste arquivo são aplicadas após uma reinicialização.
Como funciona o Selinux?
Basicamente, Selinux funciona sobre o conceito de entidades: assuntos, objetos e ações. Um assunto é um aplicativo ou um processo (um servidor HTTP, por exemplo), um objeto é um recurso no sistema, como um arquivo, um soquete ou uma porta. Finalmente, uma ação é o que esse sujeito específico pode executar no objeto. Um sujeito é executado sob um determinado domínio, que, por exemplo, no caso do daemon httpd é httpd_t
. Isso é fácil verificável, verificando um processo em execução com o comando PS: tudo o que precisamos fazer é adicionar o switch -z (o switch -z é frequentemente associado ao SELinux nos comandos que o suportam, como LS, por exemplo):
$ ps -auxz | grep httpd
O comando acima fornece o seguinte resultado (saída truncada):
System_u: System_r: httpd_t: S0 Apache 2340 0.0 0.2 221940 2956 ? S 14:20 0:00/usr/sbin/httpd -dforeground
Executando sob o domínio HTTPD_T, o serviço HTTPD (sujeito) pode acessar apenas recursos (ACTION) (Objetos) dentro dos tipos de Selinux associados. Uma maneira muito simples de verificar isso é verificando o diretório /var /www. O daemon httpd deve poder acessá -lo, então vamos verificar que tipo esse diretório tem. Podemos fazer isso usando o comando ls com o interruptor -z:
$ ls -dz /var /www
Os comandos nos dão este resultado:
System_u: object_r: httpd_sys_content_t: s0 /var /www
A saída nos mostra o contexto completo do Selinux e o diretório /var /www sendo rotulado com o TTPD_SYS_CONTENT_T TIPO. Isso faz perfeitamente sentido: a política de Selinux direcionada permite um processo em execução no domínio HTTPD_T para acessar (no modo somente leitura) todos os arquivos rotulados com o tipo HTTPD_SYS_CONTENT_T, independentemente das permissões DAC definidas no arquivo. Se o processo tentará qualquer ação não esperada pela política, o Selinux registrará o erro e, se estiver no modo de aplicação, bloqueará a própria ação.
Usuários do Selinux
Vimos acima como uma representação de um contexto completo de Selinux parece estar estruturado:
System_u: object_r: httpd_sys_content_t: s0
Vamos analisar essa estrutura levando em consideração as três primeiras partes (a quarta é encaminhada ao modo MLS). A primeira seção é sobre os usuários do Selinux: todo usuário do Selinux tem um conjunto diferente de restrições e é autorizado
Para desempenhar apenas um conjunto específico de funções de Selinux, que dão acesso a domínios específicos do Selinux, que, por sua vez, podem acessar apenas os tipos de Selinux.
Os usuários do Selinux podem desempenhar funções de Selinux podem ir para os domínios Selinux, têm acesso aos tipos de Selinux
Para ter uma idéia clara dos usuários do Selinux disponíveis, podemos executar:
# Usuário semanage -l
Este comando nos dá uma visão geral clara dos usuários - Relacionamentos de Papéis:
Selinux User prefixo MCS Nível MCS Range Flores Selinux Guest_U User S0 S0 Guest_R ROOT User S0 S0-S0: C0.C1023 Staff_R sysadm_r System_R UNNFINED_R STAFF_U USUSY S0 S0-S0: C0.C1023 Staff_R sysadm_r System_R UNNFINED_R SYSADM_U Usuário S0 S0-S0: C0.c1023 sysadm_r system_u user s0 s0-s0: c0.C1023 System_R UNNFINED_R UNNIFINED_U User S0 S0-S0: C0.C1023 SYSTEM_R UNNFINED_R User_U User S0 S0 User_R XGuest_U User S0 S0 XGuest_R
Vamos ver brevemente o que alguns dos usuários descritos do Selinux estão autorizados a fazer:
- Guest_U: Este tipo de usuário não tem acesso à rede, nenhum privilégio de execução de scripts em /home, nem pode usar os comandos sudo ou su para obter privilégios mais altos. Ele só pode usar a função Guest_R
- Staff_u: Os usuários do sistema mapeados para este usuário do Selinux tem acesso à GUI, à rede e ao uso do comando sudo para obter privilégios. Ele pode alternar entre as funções STIDAS_R, SYSADM_R, SYSTEM_R e UNNFINED_R
- sysadmin_u: O mesmo que acima, além de usar também o comando SU. Só pode desempenhar a função sysadm_r
- System_u: Este é o usuário atribuído aos serviços do sistema, nenhum usuário do sistema deve ser mapeado para ele
- não confinado_u: Este tipo de usuário não tem restrições. Possui funções não confinadas e system_r associadas a ele
- xguest_u: Este usuário do Selinux tem acesso à GUI e à rede, mas apenas através do navegador Firefox. Não possui direitos de execução para arquivos sob /domiciliar e tem apenas a função xguest_r associada a ele
Como você pode ver, o usuário do Selinux é identificável, no contexto, tendo o sufixo _u. Deve ficar claro que eles são uma coisa totalmente diferente dos usuários do sistema. Existe um mapa entre os dois, e é possível vê -lo executando Semanage Login -l
comando:
# Semanage -l Login
Que nos dá a seguinte saída:
Nome de login Selinux User MLS/MCS Range Service __default__ não confinado_u S0-S0: C0.C1023 * raiz não confinada_u s0-s0: c0.c1023 *
A raiz do usuário do sistema é mapeada para o usuário não confinado_u Selinux, portanto, não tem restrições. Nenhum outro usuário é mapeado explicitamente, então estão, por padrão, associados ao usuário não confinado_u Selinux.
Alterando o usuário do Selinux
Neste ponto, você pode perguntar como é possível definir um mapa entre um usuário do sistema e um selinux One. Realizamos esta tarefa usando o comando semanage login. No exemplo seguinte, altero o mapeamento padrão, associando o usuário fictício no meu sistema ao usuário do Guest_U Selinux:
# semanage login -a -s hóspedes_u manequim
O switch -a é curto para -Add e usado para adicionar um registro, enquanto o -s ONE (abreviação --euser) especifica o usuário do Selinux que o usuário do sistema deve ser mapeado para. Vamos agora executar novamente o Login Semanage -l para ver se algo mudou:
Nome de login Selinux User MLS/MCS Range Service __default__ não confinado_u S0-S0: C0.c1023 * dummy hóspedes_u s0 * raiz não confinada_u s0-s0: c0.C1023 * System_u System_u S0-S0: C0.c1023 *
Como esperado, o usuário do System agora está associado ao usuário do Guest_U Selinux, que, como dito antes, não tem acesso à rede. Vamos verificar da maneira mais simples: tentamos ping no Google e ver qual é o resultado:
[dummy@linuxconfig ~] $ ping google.com: soquete: permissão negada
Como esperado, o usuário fictício não tem permissão para usar a rede, então o comando ping falha. Para excluir o mapeamento, usamos o switch -d (curto para -Delete):
# semanage login -d -s hóspedes_u
Não tendo um mapeamento específico, o usuário fictício fará fallback para o usuário não confinado_u Selinux. Como o último não tem restrições, se tentarmos novamente o comando acima, agora deve ter sucesso:
[dummy@linuxconfig ~] $ ping google.com Ping Google.com (216.58.205.206) 56 (84) bytes de dados. 64 bytes de MIL04S29-in-F14.1E100.rede (216.58.205.206): icmp_seq = 1 ttl = 52 tempo = 29.2 ms []
Lembre -se de que as mudanças no mapeamento entre usuários e usuários do Selinux serão eficazes somente após um novo login.
Funções de Selinux
A segunda parte de um contexto de Selinux é sobre papéis. Como você pode ver na saída de Usuário semanage -l
Acima, cada usuário do Selinux pode desempenhar um conjunto especificado de funções de Selinux: quando existem várias funções para um usuário do Selinux, o usuário também pode alternar entre eles usando o Novo papel
comando, usando a seguinte sintaxe:
$ newRole -r newRole
Para verificar quais domínios uma função específica pode acessar, você deve executar o Seinfo
comando. Isso é fornecido pelo Setools-Console
pacote. Por exemplo, para verificar quais domínios são acessíveis a partir da função stuff_r, nós executamos:
# seinfo -rstuff_r -x
$ seinfo -rstaff_r -x (saída truncada) Staff_r Dominou Funções: Staff_R Tipos: Abrt_helper_t ALSA_HOME_T ANTIVIRUS_HOME_T HTTPD_USER_CONTENT_T HTTPD_USER_HTACSES_T […]
Domínios e tipos
A terceira parte de um contexto de Selinux é sobre domínios e tipos e é identificável por ter o sufixo _t na representação de contexto. Nós nos referimos a ele como tipo se estivermos falando sobre um objeto ou como domínio se estivermos falando sobre um processo. Vamos dar uma olhada.
Eu criei um simples .Arquivo HTML dentro do Apache VirtualHost padrão na minha máquina CentOS 7: Como você pode ver o arquivo herdado o contexto do Selinux do diretório em que foi criado:
-rw-r-r--. root root unconfined_u: object_r: httpd_sys_content_t: teste s0.html
Com o httpd_sys_content_t
, O arquivo pode ser lido pelo processo HTTPD, conforme confirmado pela navegação no navegador.
Agora vamos tentar alterar o tipo de arquivo e ver o efeito que essa alteração tem. Para manipular o contexto de Selinux, usamos o Chcon
comando:
# chcon -t user_home_t/var/www/html/teste.html
Alteramos o tipo de selinux do arquivo para user_home_t
: Este é o tipo usado pelos arquivos localizados nos usuários
diretórios domésticos por padrão. A execução de LS -z no arquivo nos dá a confirmação:
UNNFINED_U: Object_R: user_home_t: S0/var/www/html/teste.html
Se agora tentarmos alcançar o arquivo do navegador, como esperado.
O Chcon
O comando pode ser usado não apenas para alterar o tipo de arquivo, mas também o usuário e a parte da função do contexto Selinux. Ao usá -lo para alterar um contexto de diretório, ele também pode ser executado recursivamente com o comutador -r e pode atribuir um contexto também por referência: neste caso, não especificamos as partes do contexto a serem alteradas diretamente, mas fornecemos a referência a o arquivo ou diretório o contexto deve estar em conformidade com. Por exemplo, vamos fazer o teste.Arquivo HTML acima, adquira o contexto do diretório/var/www/html:
# CHCON -Referência/var/www/html/var/www/html/teste.html && ls -z/var/www/html/teste.html
Podemos ver na saída dos comandos acima, que agora o contexto do arquivo mudou novamente e agora é o mesmo que o do diretório/var/www/html:
System_u: object_r: httpd_sys_content_t: s0/var/www/html/teste.html
Observe que as alterações feitas com o comando CHCON sobreviverão a uma reinicialização, mas não uma reabastecimento dos arquivos: nesse caso, os arquivos serão definidos de acordo com a política original do Selinux, e as alterações serão perdidas. Então, como podemos tornar a mudança persistente? Devemos adicionar uma nova regra à política do Selinux usando o comando semanage.
Digamos que queremos adicionar uma regra ditando que todos os arquivos criados no diretório/home/egdoc/teste devem ter, por padrão, o HTTPD_SYS_CONTENT_T TIPO
. Aqui está o comando que devemos executar:
semanage fcontext -a -t httpd_sys_content_t/home/egdoc/teste (/.*)?
Primeiro, invocamos o comando semanage especificando fContext
Para modificar os contextos dos arquivos, então adicionamos o -a
mudar para adicionar um registro e o -t
um, para especificar, queremos alterar o tipo parte do contexto para o que se segue imediatamente.
Finalmente, fornecemos o caminho do diretório junto com uma expressão regular que significa: /Caminho da casa /Egdoc /teste seguido pelo caráter, seguido por qualquer número de qualquer personagem, sendo toda a expressão corresponder 0 ou 1 tempo. Esta expressão regular corresponderá a todos os nomes dos arquivos.
Nós agora executamos o RestoreCon
comando com o -R
opção (recursiva) no diretório, para aplicar a política. Como agora a regra que adicionamos acima faz parte da própria política, todos os arquivos contidos no diretório e também os recém -criados terão o contexto que especificamos na regra.
Configurações booleanas de Selinux
As configurações de Selinux booleans podem alterar o comportamento do Selinux e são gerenciados pelo uso de valores booleanos. Podemos interagir com eles pelo uso de dois comandos: getSeBool
e SetSeBool
, o primeiro sendo usado para consultar o estado de uma opção e o segundo para alterá -lo.
Se passarmos a opção que queremos verificar o getSeBool, ela nos dará apenas o estado dessa opção, se o fornecermos com o -a
Switch, em vez disso, nos mostrará todas as configurações disponíveis e seu respectivo estado booleano. Por exemplo, se quisermos verificar o status das opções relacionadas ao HTTPD, poderíamos executar:
$ getsebool -a | grep httpd
Aqui está um trecho muito curto da saída:
[[email protected] ~] $ getsebool -a | grep httpd httpd_anon_write -> off httpd_builtin_scripting -> em […]
Vamos agora tentar alterar o estado da opção httpd_anon_write e ativá -la. Como mencionado acima, usamos o SetSeBool para a tarefa:
# setsebool httpd_anon_write 1
Se agora verificarmos o valor da opção, ele deveria ter sido ativado:
[[email protected] ~] $ getsebool -a | grep httpd_anon_write httpd_anon_write -> on
Tudo foi como esperado. No entanto, as mudanças feitas dessa maneira não sobreviverão a uma reinicialização. Para realizar esta tarefa, devemos usar o mesmo comando, mas adicionando o -P
Switch: ao usá -lo, as alterações serão escritas para a política e elas persistirão.
Há muitas coisas que se deve considerar ao usar o Selinux e ajustá-las para obter um comportamento específico, mantendo as permissões menos possíveis pode ser uma tarefa demorada. No entanto, não é uma boa ideia, em miopinion, para desligá -la completamente. Continue experimentando até ficar satisfeito com os resultados e atingir a configuração desejada:
Você ganhará tanto em segurança quanto de conhecimento.
Tutoriais do Linux relacionados:
- Coisas para instalar no Ubuntu 20.04
- Uma introdução à automação, ferramentas e técnicas do Linux
- Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
- Comandos Linux: os 20 comandos mais importantes que você precisa para…
- Arquivos de configuração do Linux: os 30 primeiros mais importantes
- Comandos básicos do Linux
- Download do Linux
- Instale Arch Linux na estação de trabalho VMware
- Linux pode obter vírus? Explorando a vulnerabilidade do Linux…
- Loging e auditoria avançados no Linux
- « Como instalar o bitcoin-node no Debian 9 Stretch Linux
- Permissão negada em operação de sistema de arquivos HPFS/NTFS/EXFAT não suportado »