{"id":460,"date":"2013-05-30T05:12:45","date_gmt":"2013-05-30T08:12:45","guid":{"rendered":"http:\/\/www.viazap.com.br\/?p=460"},"modified":"2013-05-30T05:12:45","modified_gmt":"2013-05-30T08:12:45","slug":"selinux-seguranca-em-servidores-gnulinux","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=460","title":{"rendered":"SELinux &#8211; Seguran\u00e7a em Servidores GNU\/Linux"},"content":{"rendered":"<table width=\"100%\" border=\"0\" cellspacing=\"3\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td colspan=\"2\"><b>O SELinux<\/b><\/p>\n<div>O Security-Enhanced <a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">Linux<\/a> &#8211; <em>SELinux<\/em> &#8211; foi desenvolvido pela Ag\u00eancia Nacional de Seguran\u00e7a dos EUA (NSA). Logo no in\u00edcio, seu objetivo principal era tornar-se um sistema operacional capaz de fornecer controles avan\u00e7ados de acesso para os \u00f3rg\u00e3os militares dos Estados Unidos.<\/p>\n<p>Por\u00e9m, com o passar do tempo, a NSA identificou que seria mais l\u00f3gico aprimorar um sistema de controle de acesso obrigat\u00f3rio, e adicion\u00e1-los a um sistema operacional j\u00e1 existente.<\/p>\n<p>A op\u00e7\u00e3o pelo <a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">GNU\/Linux<\/a> surgiu devida \u00e0 facilidade e flexibilidade de incorporar tal framework ao Kernel do sistema. Logo depois, sistemas que traziam a plataforma <em>Unix<\/em>, tamb\u00e9m usufru\u00edram desta t\u00e3o poderosa ferramenta.<\/p>\n<p>Altamente implementado e refinado em cima da arquitetura MAC (Mandatory Access Control), provendo maior seguran\u00e7a a arquivos, diret\u00f3rios, processos, sistema de arquivos, entre outros objetos, atrav\u00e9s de regras providas pelo SELinux.<\/p>\n<p>Vale ressaltar, que este n\u00edvel de seguran\u00e7a vai al\u00e9m da arquitetura DAC (Discretionary Access Control) que est\u00e1 associada \u00e0 permiss\u00e3o de arquivos e ACLs (Access Control List\u2019s) do GNU\/Linux, como exemplo, as permiss\u00f5es MAC podem ser aplicadas at\u00e9 ao usu\u00e1rio root, limitando a\u00e7\u00f5es do mesmo.<\/p>\n<p>Em um conceito pr\u00e1tico, imaginemos que a conta de sistema associada ao servi\u00e7o HTTP foi comprometida, o SELinux atrav\u00e9s de regras pr\u00e9 estabelecidas, limita este comprometimento apenas ao servi\u00e7o HTTP, impossibilitando o comprometimento de outros servi\u00e7os, ou at\u00e9 mesmo, do pr\u00f3prio sistema operacional.<\/p>\n<p>Depois deste breve conceito, vamos \u00e0 pr\u00e1tica.<\/p>\n<p>Lembrando que mais informa\u00e7\u00f5es do SELinux, podem ser obtidas na Wiki do Projeto:<\/p>\n<ul>\n<li><a href=\"http:\/\/selinuxproject.org\/page\/Main_Page\">http:\/\/selinuxproject.org\/page\/Main_Page<\/a><\/li>\n<\/ul>\n<p>Ou, na p\u00e1gina oficial da NSA:<\/p>\n<ul>\n<li><a href=\"http:\/\/www.nsa.gov\/research\/selinux\/\">http:\/\/www.nsa.gov\/research\/selinux<\/a><\/li>\n<\/ul>\n<h1>Modo de opera\u00e7\u00e3o do SELinux (conceito e pr\u00e1tica)<\/h1>\n<p>Basicamente, o SELinux pode operar em tr\u00eas tipos diferentes, que s\u00e3o:<\/p>\n<ul>\n<li><em>Enforcing<\/em> \u2013 As regras do SELinux est\u00e3o aplicadas, e est\u00e1 sendo gerado Logs de todas as opera\u00e7\u00f5es do mesmo;<\/li>\n<li><em>Permissive<\/em> \u2013 As regras do SELinux est\u00e3o desativadas, por\u00e9m, est\u00e1 gerando Logs de todas as opera\u00e7\u00f5es do mesmo (\u00fatil para Troubleshoot de aplica\u00e7\u00f5es);<\/li>\n<li><em>Disabled<\/em> &#8211; As regras e os Logs do SELinux est\u00e3o completamente desativados.<\/li>\n<\/ul>\n<p>Obs.: Para nossos testes, estou utilizando o <em>CentOS 6.3<\/em>.<\/p>\n<p>Visualizando o status do SELinux:<\/p>\n<p><strong># sestatus<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<blockquote><p>SELinux status:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0enabled<br \/>\nSELinux mount:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/selinux<br \/>\nCurrent mode:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0enforcing<br \/>\nMode from config file:\u00a0\u00a0\u00a0enforcing<br \/>\nPolicy version:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a024<br \/>\nPolicy from config file:\u00a0\u00a0\u00a0targeted<\/p><\/blockquote>\n<p>Caso se queira visualizar apenas o <em>Current mode<\/em> do SELinux, utilize o comando:<\/p>\n<p><strong># getenforce<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<blockquote><p>Enforcing<\/p><\/blockquote>\n<p>Perceba que este comando traz apenas o modo de opera\u00e7\u00e3o do SELinux.<\/p>\n<p>Para alterarmos o modo de opera\u00e7\u00e3o tempor\u00e1rio do SELinux (apenas Enforcing e Permissive), utilizaremos o seguinte comando:<\/p>\n<p><strong># setenforce MODO_DE_OPERA\u00c7\u00c2O<\/strong><\/p>\n<p>Ex.:<\/p>\n<p><strong># setenforce permissive<\/strong><\/p>\n<p>Logo, visualize o status do SELinux:<\/p>\n<p><strong># sestatus<\/strong><\/p>\n<blockquote><p>SELinux status:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0enabled<br \/>\nSELinux mount:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/selinux<br \/>\nCurrent mode:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0permissive<br \/>\nMode from config file:\u00a0\u00a0\u00a0enforcing<br \/>\nPolicy version:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a024<br \/>\nPolicy from config file:\u00a0\u00a0\u00a0targeted<\/p><\/blockquote>\n<p>Obs.: Para desabilitar, ou alterar, o &#8216;current mode&#8217; do SELinux por completo, \u00e9 necess\u00e1rio editar o arquivo de configura\u00e7\u00e3o do SELinux (\/etc\/selinux\/config) e alterar a vari\u00e1vel:<\/p>\n<div>&#8216;SELINUX=&#8217;.<\/div>\n<p>* Apenas como fonte de informa\u00e7\u00e3o:<\/p>\n<ul>\n<li>Em alguns casos com o SELinux habilitado, podemos nos deparar com servi\u00e7os que, por algum motivo, n\u00e3o est\u00e3o funcionando.<\/li>\n<li>Alguns administradores, simplesmente desativam o SELinux por completo (Modo Disabled), para resolver o &#8220;problema&#8221;.<\/li>\n<li>Por\u00e9m, para um <em>Troubleshoot<\/em> eficaz, n\u00e3o \u00e9 necess\u00e1rio desativar o SELinux por completo comprometendo a seguran\u00e7a do sistema, e sim, deix\u00e1-lo em modo &#8220;Permissive&#8221;; com isso, as regras ser\u00e3o desativadas, por\u00e9m, todo registro das atividades (logs) continuar\u00e3o sendo armazenadas.<\/li>\n<\/ul>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Contextos de seguran\u00e7a<\/b><\/p>\n<div>Em uma explica\u00e7\u00e3o b\u00e1sica, um contexto \u00e9 um valor de dado assumido pelos objetos de uma classe.<\/p>\n<p>Nome, Idade e Peso, s\u00e3o exemplos de contextos do objeto &#8220;Pessoa&#8221;. Cor, Categoria e Modelo, s\u00e3o poss\u00edveis contextos do objeto &#8220;Carro&#8221;. No caso, os contextos da arquitetura DAC s\u00e3o: Tipo, Dono, Grupo e Outros.<\/p>\n<p>Ex.:<\/p>\n<p><strong># ls \u2013ld \/etc<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<blockquote><p>drwxr-xr-x<\/p><\/blockquote>\n<p>Onde:<\/p>\n<ul>\n<li><em>d<\/em> = Diret\u00f3rio (Tipo)<\/li>\n<li><em>rwx<\/em> = Permiss\u00e3o para o dono do arquivo (Dono)<\/li>\n<li><em>r-x<\/em> = Permiss\u00e3o para o grupo do do arquivo (Grupo)<\/li>\n<li><em>r-x<\/em> = Permiss\u00e3o para os outros objetos do sistema (Outros)<\/li>\n<\/ul>\n<p>No caso da arquitetura MAC, os contextos mudam de caracter\u00edsticas, conforme: Usu\u00e1rio, Papel, Tipo e N\u00edvel.<\/p>\n<p>Onde:<\/p>\n<ul>\n<li>Usu\u00e1rio (<em>user_u<\/em>) \u2013 O campo usu\u00e1rio, indica o nome do usu\u00e1rio do SELinux, por exemplo, o usu\u00e1rio &#8220;system_u&#8221;, indica processos, arquivos de configura\u00e7\u00e3o e daemons do sistema.<\/li>\n<li>Papel (<em>role_r<\/em>) \u2013 O campo papel, \u00e9 uma forma de agrupar diferentes permiss\u00f5es a um determinado usu\u00e1rio (uma esp\u00e9cie de grupo).<\/li>\n<li>Tipo (<em>type_t<\/em>) \u2013 O campo tipo (tamb\u00e9m conhecido como dom\u00ednio), indica qual \u00e9 permiss\u00e3o prim\u00e1ria de determinado objeto do SELinux, essa \u00e9 a primeira etapa de verifica\u00e7\u00e3o de permiss\u00e3o do sistema MAC.<\/li>\n<li>N\u00edvel (<em>s*:c*<\/em>) \u2013 O campo n\u00edvel, indica em qual categoria determinado objeto se encontra, com rela\u00e7\u00e3o \u00e0 seguran\u00e7a. O mesmo utiliza a politica MCS\/MLS (Multi-Category Security\/ Multi-Level Security).\n<p>Por exemplo, o n\u00edvel <em>s0:c0<\/em> indica um objeto <em>Confidencial<\/em> para todos os que possu\u00edrem o mesmo n\u00edvel.<\/li>\n<\/ul>\n<p>Na pr\u00e1tica, com o mesmo diret\u00f3rio <em>\/etc<\/em>:<\/p>\n<p><strong># ls \u2013Zd<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<blockquote><p>System_u:object_r:etc_t:s0<\/p><\/blockquote>\n<p>Onde:<\/p>\n<ul>\n<li><em>system_u<\/em> =Usu\u00e1rio SELinux dono do objeto<\/li>\n<li><em>object_r<\/em> = Papel (ou papel) do SELinux<\/li>\n<li><em>etc_t<\/em> = Dom\u00ednio (ou tipo) do SELinux<\/li>\n<li><em>s0<\/em> = N\u00edvel de seguran\u00e7a do SELinux<\/li>\n<\/ul>\n<h1>Visualizando contextos MAC nos objetos do sistema<\/h1>\n<p>Para visualizar todos os processos que est\u00e3o rodando no sistema, juntamente com os contextos do SELinux, vamos utilizar o comando abaixo:<\/p>\n<p><strong># ps auxZ<\/strong><\/p>\n<p>Perceba que apenas adicionando a op\u00e7\u00e3o &#8220;Z&#8221; no comando <em>ps<\/em>, j\u00e1 \u00e9 suficiente para visualizarmos os contextos de todos os processos do SELinux. Isto vale para outros comandos tamb\u00e9m, como por exemplo, o comando <em>ls<\/em>.<\/p>\n<p>Vamos visualizar o contexto de um arquivo ou diret\u00f3rio qualquer do sistema:<\/p>\n<p><strong># ls \u2013Z \/boot<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<blockquote><p>system_u:object_r:boot_t:s0<\/p><\/blockquote>\n<p>Isso vale tamb\u00e9m para o comando <em>id<\/em>, que nos traz informa\u00e7\u00f5es de um determinado usu\u00e1rio:<\/p>\n<p>Ex.:<\/p>\n<p><strong># id \u2013Z<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<blockquote><p>unconfined_u: unconfined_r: unconfined_t:s0-s0:c0.c1023ls<\/p><\/blockquote>\n<p>Perceba que neste caso, todo o contexto est\u00e1 definido como: unconfined_*<\/p>\n<p>&#8230;Isto indica que o SELinux n\u00e3o ter\u00e1 influ\u00eancia alguma no objeto correspondente.<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>O comando Semanage<\/b><\/p>\n<div>Para um bom entendimento do SELinux, \u00e9 necess\u00e1rio explorar o mesmo por completo, o comando <em>semanage<\/em> traz uma s\u00e9rie de op\u00e7\u00f5es para que isso aconte\u00e7a.<\/p>\n<p>Primeiro, devemos instalar o conjunto de pacotes, que traz (al\u00e9m de v\u00e1rios outros) o comando Semanage:<\/p>\n<p><strong># yum install policycoreutils-python<\/strong><\/p>\n<p>Com o Semanage instalado em nossa m\u00e1quina, vamos listar todos os usu\u00e1rios, n\u00edvel de MLS\/MCS e pap\u00e9is (roles) do SELinux:<\/p>\n<p><strong># semanage user \u2013l<\/strong><\/p>\n<p>Onde: <em>-l<\/em> = list<\/p>\n<p>Sa\u00edda do comando:<\/p>\n<div id=\"forumCodeDiv\">\n<div id=\"highlighter_317746\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>\u00a0\u00a0\u00a0\u00a0<\/code><code>Labeling\u00a0\u00a0 MLS\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MLS\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><\/div>\n<div><code>SELinux User\u00a0\u00a0\u00a0 Prefix\u00a0\u00a0\u00a0\u00a0 MCS Level\u00a0 MCS Range\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SELinux Roles<\/code><\/div>\n<div><\/div>\n<div><code>git_shell_u\u00a0\u00a0\u00a0\u00a0 user\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 git_shell_r<\/code><\/div>\n<div><code>guest_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 user\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 guest_r<\/code><\/div>\n<div><code>root\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 user\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0-s0:c0.c1023\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 staff_r sysadm_r system_r unconfined_r<\/code><\/div>\n<div><code>staff_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 user\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0-s0:c0.c1023\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 staff_r sysadm_r system_r unconfined_r<\/code><\/div>\n<div><code>sysadm_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 user\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0-s0:c0.c1023\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sysadm_r<\/code><\/div>\n<div><code>system_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 user\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0-s0:c0.c1023\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 system_r unconfined_r<\/code><\/div>\n<div><code>unconfined_u\u00a0\u00a0\u00a0 user\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0-s0:c0.c1023\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 system_r unconfined_r<\/code><\/div>\n<div><code>user_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 user\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 user_r<\/code><\/div>\n<div><code>xguest_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 user\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xguest_r<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Pergunta: &#8220;ual a fun\u00e7\u00e3o de cada usu\u00e1rio? Permiss\u00e3o? Acessos e etc&#8230;?<\/p>\n<p>Vamos a um <em>overview<\/em> r\u00e1pido e objetivo de cada um:<\/p>\n<ul>\n<li><em>guest_u<\/em>: Este perfil \u00e9 usado para usu\u00e1rios que precisam ser rigorosamente controlados. O guest_u s\u00f3 pode fazer login usando o terminal. O mesmo n\u00e3o tem acesso a recursos de rede, programas setuid, setgid, su, sudo e interface gr\u00e1fica.<\/li>\n<li><em>xguest_u<\/em>: Este perfil \u00e9 id\u00eantico \u00e0 do &#8216;guest_u&#8217;. A exce\u00e7\u00e3o \u00e9 que &#8216;xguest_u&#8217;, os usu\u00e1rios s\u00f3 conseguem fazer login na interface gr\u00e1fica.<\/li>\n<li><em>user_u<\/em>: Assemelha a um usu\u00e1rio comum sem privil\u00e9gios administrativos. Este usu\u00e1rio pode fazer login usando interface gr\u00e1fica e terminal, tem acesso aos recursos da rede, mas n\u00e3o pode usar programas <em>setuid<\/em> e <em>setgid<\/em>.<\/li>\n<li><em>staff_u<\/em>: Este usu\u00e1rio \u00e9 id\u00eantico ao &#8216;user_u&#8217;, exceto que o &#8216;staff_u&#8217; pode acessar os programas setuid e setgid. O &#8216;staff_u&#8217; tamb\u00e9m pode fazer STAT em todos os processos do sistema, entre outros pequenos privil\u00e9gios extras, em compara\u00e7\u00e3o com &#8216;user_u&#8217;.<\/li>\n<li><em>sysadm_u<\/em>: Este usu\u00e1rio \u00e9 projetado para realizar login como root. Muito utilizado em ambientes multi n\u00edvel de seguran\u00e7a, onde n\u00e3o h\u00e1 o objeto &#8216;unconfined_u&#8217;.<\/li>\n<li><em>unconfined_u<\/em>: O &#8216;unconfined_u&#8217; \u00e9, em muitas vezes, isentos de regras do SELinux.\n<p>Usu\u00e1rios reais do <a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">GNU\/Linux<\/a>, exceto o usu\u00e1rio root, n\u00e3o devem ser mapeados para o grupo de usu\u00e1rios &#8216;unconfined_u&#8217;. Em muitos cen\u00e1rios com que os usu\u00e1rios n\u00e3o s\u00e3o confinados, o mesmos criam um buraco na seguran\u00e7a do sistema operacional.<\/li>\n<li><em>system_u<\/em>: Este perfil de usu\u00e1rio do SELinux est\u00e1 reservado para o sistema. Os usu\u00e1rios do GNU\/Linux n\u00e3o devem ser mapeado para o usu\u00e1rio SELinux &#8216;system_u&#8217;, geralmente este usu\u00e1rio esta atrelado a processos, configura\u00e7\u00f5es e daemons.<\/li>\n<\/ul>\n<p>Agora que j\u00e1 sabemos as reais permiss\u00f5es dos usu\u00e1rios do SELiux, vamos listar todos os usu\u00e1rios do sistema que est\u00e3o atrelados aos usu\u00e1rios e permiss\u00f5es do SELinux:<\/p>\n<p><strong># semanage login \u2013l<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<div id=\"forumCodeDiv\">\n<div id=\"highlighter_79870\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>Login Name\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SELinux User\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MLS<\/code><code>\/MCS<\/code> <code>Range\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><\/div>\n<div><\/div>\n<div><code>__default__\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unconfined_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0-s0:c0.c1023\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><\/div>\n<div><code>root\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unconfined_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0-s0:c0.c1023\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><\/div>\n<div><code>system_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 system_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0-s0:c0.c1023 <\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Apenas como fonte de conhecimento, vamos criar um usu\u00e1rio chamado &#8220;teste&#8221;, e referenci\u00e1-lo ao usu\u00e1rio &#8220;guest_u&#8221; do SELinux:<\/p>\n<p><strong># useradd \u2013c &#8220;Usu\u00e1rio Teste&#8221; \u2013d \/home\/teste \u2013m \u2013k \/etc\/skel \u2013s \/bin\/bash teste<br \/>\n# passwd teste<br \/>\n# semanage login \u2013a \u2013s guest_u teste<\/strong><\/p>\n<p>Onde:<\/p>\n<ul>\n<li><em>-a<\/em> = add<\/li>\n<li><em>-s<\/em> = selinux user<\/li>\n<\/ul>\n<p>Logo, liste os logins novamente:<\/p>\n<p><strong># semanage login \u2013l<\/strong><\/p>\n<div id=\"forumCodeDiv\">\n<div id=\"highlighter_172546\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>Login Name\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SELinux User\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MLS<\/code><code>\/MCS<\/code> <code>Range\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><\/div>\n<div><\/div>\n<div><code>__default__\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unconfined_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0-s0:c0.c1023\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><\/div>\n<div><code>root\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 unconfined_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0-s0:c0.c1023\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><\/div>\n<div><code>system_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 system_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0-s0:c0.c1023\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/code><\/div>\n<div><code>teste\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 guest_u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s0<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Perceba que agora, o usu\u00e1rio &#8220;teste&#8221;, est\u00e1 atrelado ao usu\u00e1rio do SELinux &#8220;guest_u&#8221;, obtendo automaticamente as mesmas permiss\u00f5es do mesmo.<\/p>\n<p>Tente logar na \u00e1rea gr\u00e1fica com o usu\u00e1rio &#8220;teste&#8221;. Depois tente logar com o mesmo usu\u00e1rio, em algum terminal.<\/p>\n<p>Perceba que as permiss\u00f5es do usu\u00e1rio &#8220;guest_u&#8221; do SELinux, n\u00e3o permitem o login na \u00e1rea gr\u00e1fica, somente no terminal.<\/p>\n<p>Agora, experimente atrelar o usu\u00e1rio &#8220;teste&#8221; ao usu\u00e1rio &#8220;xguest_u&#8221;. Neste momento, o usu\u00e1rio &#8220;teste&#8221; tem as devidas permiss\u00f5es para acessar a \u00e1rea gr\u00e1fica.<\/p>\n<p>Para remover o usu\u00e1rio &#8220;teste&#8221; das diretivas do SELinux, basta executar o comando:<\/p>\n<p><strong># semanage login -d teste<\/strong><\/p>\n<p>Onde: <em>-d<\/em> = delete<\/p>\n<p>Continuando com o comando <em>semanage<\/em>, vamos listar todos os contextos aplicados no sistema:<\/p>\n<p><strong># semanage fcontext \u2013l<\/strong><\/p>\n<p>Assim, fica muito mais f\u00e1cil saber se determinado objeto ou servi\u00e7o, est\u00e1 atrelado \u00e0s politicas MAC do SELinux.<\/p>\n<p>Mais informa\u00e7\u00f5es sobre o comando semanage:<\/p>\n<p><strong># semanage &#8211; -help<\/strong><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Os comandos Chcon e Restorecon<\/b><\/p>\n<div>Diversas vezes, nos deparamos com problemas de permiss\u00e3o de contextos no SELinux, isto acontece frequentemente, ainda mais em servi\u00e7os que t\u00eam uma alta rotatividade de objetos, como <em>File Servers<\/em> e <em>FTP<\/em>.<\/p>\n<p>Para resolver este problema, utilizaremos o comando <em>chcon<\/em>, sua fun\u00e7\u00e3o nada mais \u00e9 do que alterar contextos em objetos.<\/p>\n<p>Para os nossos testes com o <em>chcon<\/em>, vamos criar um arquivo denominado &#8220;teste.txt&#8221; dentro do diret\u00f3rio <em>\/etc<\/em>:<\/p>\n<p><strong># touch \/etc\/teste.txt<\/strong><\/p>\n<p>Verifique os contextos deste arquivo:<\/p>\n<p><strong># ls -Z \/etc\/teste.txt<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<blockquote><p>-rw-r&#8211;r&#8211;. root root unconfined_u:object_r:etc_t:s0 \/etc\/teste.txt<\/p><\/blockquote>\n<p>Perceba que o usu\u00e1rio est\u00e1 definido como &#8220;unconfined_u&#8221;. Imagine agora, que precisamos alterar (por algum motivo qualquer) para o usu\u00e1rio &#8220;user_u&#8221;. Vamos utilizar o seguinte comando:<\/p>\n<p><strong># chcon -u user_u \/etc\/teste.txt<\/strong><\/p>\n<p>Onde: <em>-u<\/em> = user<\/p>\n<p><strong># ls -Z \/etc\/teste.txt<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<blockquote><p>-rw-r&#8211;r&#8211;. root root user_u:object_r:etc_t:s0 \/etc\/teste.txt<\/p><\/blockquote>\n<p>Perceba que, agora o arquivo est\u00e1 com o contexto de usu\u00e1rio definido para &#8220;user_u&#8221;.<\/p>\n<p>Caso precisamos (por algum motivo qualquer) alterar o dom\u00ednio (type) deste objeto, para &#8220;tmp_t&#8221;:<\/p>\n<p><strong># chcon -t tmp_t \/etc\/teste.txt<\/strong><\/p>\n<p>Onde: <em>-t<\/em> = type<\/p>\n<p><strong># ls -Z \/etc\/teste.txt<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<blockquote><p>-rw-r&#8211;r&#8211;. root root user_u:object_r:tmp_t:s0 \/etc\/teste.txt<\/p><\/blockquote>\n<p>Pronto, o arquivo est\u00e1 com seu dom\u00ednio alterado, assim, todos os objetos que tem acesso ao dom\u00ednio &#8220;tmp_t&#8221;, ter\u00e3o acesso ao arquivo <em>\/etc\/teste.txt<\/em>.<\/p>\n<p>Em um \u00faltimo teste do comando <em>chcon<\/em>, imaginamos que voc\u00ea queira clonar o contexto de outro objeto?! O <em>chcon<\/em> tamb\u00e9m faz isso:<\/p>\n<p><strong># chcon &#8211;reference \/var \/etc\/teste.txt<br \/>\n# ls -Z \/etc\/teste.txt<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<blockquote><p>-rw-r&#8211;r&#8211;. root root system_u:object_r:var_t:s0 \/etc\/teste.txt<\/p><\/blockquote>\n<p>Obs.: Caso voc\u00ea queira aplicar contextos recursivamente, basta inserir a op\u00e7\u00e3o &#8220;-R&#8221; no comando <em>chcon<\/em>.<\/p>\n<p>Em muitos casos, queremos deixar o objeto de acordo com as regras do dom\u00ednio (type) no qual o mesmo est\u00e1 armazenado. Poder\u00edamos utilizar o <em>chcon<\/em> e copiar todos os contextos, ou utilizar um comando que faz exatamente isso. Este comando \u00e9 o <em>restorecon<\/em>, vamos v\u00ea-lo em detalhes:<\/p>\n<p><strong># restorecon -F \/etc\/teste.txt<\/strong><\/p>\n<p>Com este comando, o arquivo &#8220;teste.txt&#8221; herdar\u00e1 todos os contextos do diret\u00f3rio <em>\/etc<\/em> (local onde o mesmo est\u00e1 armazenado). \u00datil, n\u00e3o?! =)<\/p>\n<p>Os comandos <em>chcon<\/em> e <em>restorecon<\/em>, s\u00e3o extremamente \u00fateis e complexos, para um maior detalhamento dos mesmos, leia a Man Page oficial:<\/p>\n<p><strong># man chcon<br \/>\n# man restorecon<\/strong><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Vari\u00e1veis booleanas<\/b><\/p>\n<div>As vari\u00e1veis booleanas nada mais s\u00e3o, do que ligar(1) ou desligar(0) determinada a\u00e7\u00e3o (seja tempor\u00e1rio ou n\u00e3o).<\/p>\n<p>Um exemplo seria, imaginamos que determinada aplica\u00e7\u00e3o necessita de acesso a grava\u00e7\u00e3o no sistema, caso n\u00e3o existisse as vari\u00e1veis booleanas, ter\u00edamos que reescrever o c\u00f3digo do SELinux para permitir tal a\u00e7\u00e3o!<\/p>\n<p>As mesmas s\u00e3o extremamente \u00fateis para qualquer um que queira administrar o SELinux.<\/p>\n<p>Para uma pr\u00e1tica eficiente com as vari\u00e1veis booleanas, \u00e9 s\u00f3 lembrar dos termos 0 e 1, ou para ficar mais f\u00e1cil: <em>n\u00e30<\/em> e <em>s1m<\/em>. =)<\/p>\n<p>Vamos \u00e0 mais um case!<\/p>\n<p>Vamos instalar um servi\u00e7o de FTP (apenas de exemplo), e gerenciar as vari\u00e1veis booleanas:<\/p>\n<p><strong># yum install vsftpd<\/strong><\/p>\n<p>E, adicionar aos n\u00edveis de execu\u00e7\u00e3o:<\/p>\n<p><strong># chkconfig &#8211;level 2345 vsftpd on<\/strong><\/p>\n<p>Agora, vamos reiniciar o servi\u00e7o:<\/p>\n<p><strong># service vsftpd restart<\/strong><\/p>\n<p>Agora que j\u00e1 temos o servi\u00e7o devidamente instalado, vamos gerenciar as vari\u00e1veis booleanas.<\/p>\n<p>Primeiro, vamos list\u00e1-las:<\/p>\n<p><strong># getsebool -a<\/strong><\/p>\n<p>Onde: <em>-a<\/em> = all<\/p>\n<p>&#8211; Pergunta: Apenas com o nome das vari\u00e1veis, fica dif\u00edcil saber para que cada uma serve?<br \/>\n&#8211; Resposta: Para um maior detalhamento, vamos utilizar o <em>semanage<\/em> novamente:<\/p>\n<p><strong># semanage boolean -l<\/strong><\/p>\n<p>Onde: <em>-l<\/em> = list<\/p>\n<p>Perceba que agora, temos os nomes das vari\u00e1veis, e tamb\u00e9m uma breve descri\u00e7\u00e3o de cada uma delas.<\/p>\n<p>Vamos filtrar as vari\u00e1veis para tudo que atrela-se ao servi\u00e7o FTP:<\/p>\n<p><strong># semanage boolean -l | grep ftp<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<div id=\"forumCodeDiv\">\n<div id=\"highlighter_186328\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>ftp_home_dir\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (off\u00a0 ,\u00a0 off)\u00a0 Allow <\/code><code>ftp<\/code> <code>to <\/code><code>read<\/code> <code>and write files <\/code><code>in<\/code> <code>the user home directories<\/code><\/div>\n<div><code>tftp_anon_write\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (off\u00a0 ,\u00a0 off)\u00a0 Allow tftp to modify public files used <\/code><code>for<\/code> <code>public <\/code><code>file<\/code> <code>transfer services.<\/code><\/div>\n<div><code>allow_ftpd_full_access\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (off\u00a0 ,\u00a0 off)\u00a0 Allow <\/code><code>ftp<\/code> <code>servers to login to <\/code><code>local<\/code> <code>users<\/code> <code>and <\/code><code>read<\/code><code>\/write<\/code> <code>all files on the system, governed by DAC.<\/code><\/div>\n<div><code>allow_ftpd_use_cifs\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (off\u00a0 ,\u00a0 off)\u00a0 Allow <\/code><code>ftp<\/code> <code>servers to use cifs used <\/code><code>for<\/code> <code>public <\/code><code>file<\/code> <code>transfer services.<\/code><\/div>\n<div><code>allow_ftpd_use_nfs\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (off\u00a0 ,\u00a0 off)\u00a0 Allow <\/code><code>ftp<\/code> <code>servers to use nfs used <\/code><code>for<\/code> <code>public <\/code><code>file<\/code> <code>transfer services.<\/code><\/div>\n<div><code>allow_ftpd_anon_write\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (off\u00a0 ,\u00a0 off)\u00a0 Allow <\/code><code>ftp<\/code> <code>servers to upload files,\u00a0 used <\/code><code>for<\/code> <code>public <\/code><code>file<\/code> <code>transfer services. Directories must be labeled public_content_rw_t.<\/code><\/div>\n<div><code>ftpd_use_passive_mode\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (off\u00a0 ,\u00a0 off)\u00a0 Allow <\/code><code>ftp<\/code> <code>servers to use bind to all unreserved ports <\/code><code>for<\/code> <code>passive mode<\/code><\/div>\n<div><code>ftpd_connect_db\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (off\u00a0 ,\u00a0 off)\u00a0 Allow <\/code><code>ftp<\/code> <code>servers to use connect to mysql database<\/code><\/div>\n<div><code>httpd_enable_ftp_server\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (off\u00a0 ,\u00a0 off)\u00a0 Allow httpd to act as a FTP server by listening on the <\/code><code>ftp<\/code> <code>port.<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Por padr\u00e3o, o servi\u00e7o VSFTPD n\u00e3o permite o total gerenciamento de arquivos para o usu\u00e1rio anonymous, isso devido \u00e0s restri\u00e7\u00f5es do SELinux!<\/p>\n<p>Caso voc\u00ea queira dar tal permiss\u00e3o para o usu\u00e1rio anonymous (ou outros usu\u00e1rios), basta setar a vari\u00e1vel: allow_ftpd_full_access<\/p>\n<p>Com ela \u00e9 poss\u00edvel dar controle total a qualquer usu\u00e1rio que conecte no FTP (lembrando que esse \u00e9 apenas mais um teste).<\/p>\n<p>&#8211; Pergunta: E como fazer isso?<br \/>\n&#8211; Resposta: Simples, utilizaremos o comando <em>setsebool<\/em>.<\/p>\n<p><strong># setsebool -P allow_ftpd_full_access 1<\/strong><\/p>\n<p>Onde:<\/p>\n<ul>\n<li><em>-P<\/em> = Indica que ser\u00e1 aplicada \u00e1 altera\u00e7\u00e3o permanente, sem a op\u00e7\u00e3o &#8216;-P&#8217; no pr\u00f3ximo reboot, tudo ser\u00e1 restaurado para o seu padr\u00e3o!<\/li>\n<li><em>1<\/em> = Ativa a vari\u00e1vel (lembre-se: s1m e n\u00e30)<\/li>\n<\/ul>\n<p>Pronto! Seu servidor FTP est\u00e1 dando controle total para qualquer usu\u00e1rio. Feliz agora?!<\/p>\n<p>Bom, eu n\u00e3o ficaria, pois estamos abrindo um furo na seguran\u00e7a do sistema. Portanto, vamos desativar a vari\u00e1vel booleana correspondente:<\/p>\n<p><strong># setsebool -P allow_ftpd_full_access 0<\/strong><\/p>\n<p>Onde: <em>0<\/em> = Desativar a vari\u00e1vel.<\/p>\n<p>Lembre-se: As vari\u00e1veis booleanas s\u00e3o extremamente importantes para a boa administra\u00e7\u00e3o do SELinux, liste e teste cada uma delas, assim tudo ficara mais f\u00e1cil. \ud83d\ude09<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>O comando Semodule<\/b><\/p>\n<div>Assim, como o pr\u00f3prio sistema <a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">GNU\/Linux<\/a>, o SELinux opera em formato modular, ou seja, caso precise adicionar exce\u00e7\u00f5es, ou aprimoramento, de regras no SELinux para determinadas aplica\u00e7\u00f5es, como por exemplo um MTA, ou um servidor Web, n\u00e3o ser\u00e1 necess\u00e1ria a recompila\u00e7\u00e3o do pr\u00f3prio sistema SELinux.<\/p>\n<p>E sim, adicionar um c\u00f3digo externo (m\u00f3dulo) que indique tal a\u00e7\u00e3o. Este m\u00f3dulo pode ser fornecido tanto pela equipe que administra a aplica\u00e7\u00e3o, quanto constru\u00edda pelo pr\u00f3prio administrador do SELinux.<\/p>\n<p>Obs.: N\u00e3o confunda os m\u00f3dulos do SELinux com as vari\u00e1veis booleanas. Os m\u00f3dulos s\u00e3o fun\u00e7\u00f5es acrescentadas nas regras de determinada aplica\u00e7\u00e3o, j\u00e1 as vari\u00e1veis booleanas, s\u00e3o permiss\u00f5es referentes \u00e0 comunica\u00e7\u00e3o entre aplica\u00e7\u00e3o e objetos do sistema.<\/p>\n<p>O comando que gerencia tais m\u00f3dulos no SELinux, \u00e9 o <em>Semodule<\/em>, e sua utiliza\u00e7\u00e3o \u00e9 muito simples.<\/p>\n<p>Para listar os m\u00f3dulos do SELinux:<\/p>\n<p><strong># semodule -l<\/strong><\/p>\n<p>Onde: <em>-l<\/em> = list<\/p>\n<p>Sa\u00edda do comando (resumida):<\/p>\n<div id=\"forumCodeDiv\">\n<div id=\"highlighter_94632\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>abrt\u00a0\u00a0\u00a0 1.2.0<\/code><\/div>\n<div><code>accountsd\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1.0.0<\/code><\/div>\n<div><code>ada\u00a0\u00a0\u00a0\u00a0 1.4.0<\/code><\/div>\n<div><code>afs\u00a0\u00a0\u00a0\u00a0 1.5.3<\/code><\/div>\n<div><code>aiccu\u00a0\u00a0 1.0.0<\/code><\/div>\n<div><code>aide\u00a0\u00a0\u00a0 1.5.0<\/code><\/div>\n<div><code>aisexec 1.0.0<\/code><\/div>\n<div><code>amanda\u00a0 1.12.0<\/code><\/div>\n<div><code>amavis\u00a0 1.10.3<\/code><\/div>\n<div><code>amtu\u00a0\u00a0\u00a0 1.2.0<\/code><\/div>\n<div><code>apache\u00a0 2.1.2<\/code><\/div>\n<div><code>apcupsd 1.6.1<\/code><\/div>\n<div><code>arpwatch\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1.8.1<\/code><\/div>\n<div><code>asterisk\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1.7.1<\/code><\/div>\n<div><code>audioentropy\u00a0\u00a0\u00a0 1.6.0<\/code><\/div>\n<div><code>automount\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1.12.<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Caso precisemos desabilitar determinado m\u00f3dulo, como por exemplo, o m\u00f3dulo do Asterisk, utilizaremos a seguinte sintaxe do comando <em>semodule<\/em>:<\/p>\n<p><strong># semodule -d asterisk<\/strong><\/p>\n<p>Onde: <em>-d<\/em> = disable<\/p>\n<p>Agora, vamos listar os m\u00f3dulos, filtrando apenas o m\u00f3dulo do Asterisk:<\/p>\n<p><strong># semodule -l | grep asterisk<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<blockquote><p>asterisk\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01.7.1\u00a0\u00a0\u00a0Disabled<\/p><\/blockquote>\n<p>Perceba que este m\u00f3dulo est\u00e1 presente, por\u00e9m sem qualquer funcionalidade.<\/p>\n<p>Para remover o m\u00f3dulo por completo, utilize o comando:<\/p>\n<p><strong># semodule -r asterisk<\/strong><\/p>\n<p>Onde: <em>-r<\/em> = remove<\/p>\n<p><strong># semodule -l<\/strong><\/p>\n<p>Listando novamente os m\u00f3dulos, perceba que o mesmo n\u00e3o se encontra mais na listagem.<\/p>\n<p>&#8211; Pergunta: E se eu precisar do m\u00f3dulo do Asterisk novamente, o que eu fa\u00e7o?<br \/>\n&#8211; Resposta: Por padr\u00e3o, os arquivos de m\u00f3dulo do SELinux terminam com extens\u00e3o &#8220;.pp&#8221; (Package Policy), portanto, para instalar um m\u00f3dulo no sistema SELinux, \u00e9 necess\u00e1rio ter tal arquivo em m\u00e3os.<\/p>\n<p>Simples, n\u00e3o?! Agora basta achar tal arquivo &#8220;.pp&#8221; do Asterisk.<\/p>\n<p>Por padr\u00e3o, o diret\u00f3rio <em>\/usr\/share\/selinux\/targeted\/<\/em> cont\u00e9m diversos arquivos de pacotes de pol\u00edticas (*.pp).<\/p>\n<p>Estes arquivos est\u00e3o inclusos no pacote &#8220;selinux-policy&#8221;, e s\u00e3o utilizados para construir o arquivo de pol\u00edtica.<\/p>\n<p>Em diversas distribui\u00e7\u00f5es, como o CentOS e <em>Red Hat<\/em>, tais arquivos podem estar compactados, por\u00e9m, a descompacta\u00e7\u00e3o n\u00e3o se faz necess\u00e1ria para instala\u00e7\u00e3o.<\/p>\n<p>Como estamos trabalhando com m\u00f3dulos defaults, o arquivo &#8220;.pp&#8221; do Asterisk est\u00e1 armazenado neste diret\u00f3rio, portanto, vamos reativ\u00e1-lo:<\/p>\n<p><strong># cd \/usr\/share\/selinux\/targeted\/<\/strong> # semodule -i asterisk.pp.bz2<\/p>\n<p>Onde: <em>-i<\/em> = Install<\/p>\n<p><strong># semodule -l | grep asterisk<\/strong><\/p>\n<p>Perceba que n\u00e3o precisamos habilitar o m\u00f3dulo novamente, apenas com a instala\u00e7\u00e3o do mesmo, ele j\u00e1 fica em modo <em>enable<\/em>.<\/p>\n<p>Caso o m\u00f3dulo n\u00e3o fique em modo <em>enable<\/em>, basta executar o comando <em>semodule<\/em> com a op\u00e7\u00e3o &#8220;-e&#8221;, seguida do nome do m\u00f3dulo, no nosso caso, seria o &#8220;asterisk&#8221;.<\/p>\n<p>Para mais op\u00e7\u00f5es do comando <em>semodule<\/em>, basta executar:<\/p>\n<p><strong># man semodule<\/strong><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Auditoria e logs<\/b><\/p>\n<div>Com rela\u00e7\u00e3o \u00e0 auditoria e depura\u00e7\u00e3o de Logs, o SELinux lida muito bem com isso, a come\u00e7ar pelo pacote <em>Setroubleshoot<\/em>, a jun\u00e7\u00e3o de diversos aplicativos \u00e9 uma &#8220;M\u00e3e&#8221; para qualquer administrador SELinux. A ferramenta demonstra os alertas de AVC do SELinux, e ainda diz qual comando pode corrigir o mesmo.<\/p>\n<p>Falando em AVC, sigla para Access Vector Cache (e n\u00e3o para Acidente Vascular Cerebral), que nada mais \u00e9 do que alertas de acessos bloqueados sejam elas de aplica\u00e7\u00e3o ou usu\u00e1rios do sistema.<\/p>\n<p>Primeiramente, vamos instalar o pacote &#8220;Setroubleshoot&#8221;.<\/p>\n<p>Obs.: Caso tenha interface gr\u00e1fica no servidor, o mesmo ir\u00e1 instalar um pequeno utilit\u00e1rio, que alerta toda vez que um AVC acontecer.<\/p>\n<p><strong># yum install setroubleshoot<\/strong><\/p>\n<p>Antes de qualquer coisa, vamos gerar o nosso pr\u00f3prio AVC.<\/p>\n<p>&#8211; Pergunta: Mas como assim, o nosso pr\u00f3prio AVC?<br \/>\n&#8211; Resposta: Bom, esta \u00e9 uma tarefa f\u00e1cil, uma simples altera\u00e7\u00e3o de porta padr\u00e3o de um determinado servi\u00e7o, como o HTTP, por exemplo, deve gerar um Alerta de <em>Access Denied<\/em>.<\/p>\n<p>Vamos aos testes:<\/p>\n<p>Instale o servi\u00e7o HTTP no Servidor:<\/p>\n<p><strong># yum install \u2013y httpd<\/strong><\/p>\n<p>Abra o arquivo de configura\u00e7\u00e3o:<\/p>\n<p><strong># vim \/etc\/httpd\/conf\/httpd.conf<\/strong> Altere a seguinte linha do arquivo: Listen 80<\/p>\n<p>Para:<\/p>\n<div>Listen 8888<\/div>\n<p>Logo, reinicie o servi\u00e7o HTTP:<\/p>\n<p><strong># service httpd restart<\/strong><\/p>\n<p>Pronto, nosso AVC foi gerado com \u00eaxito. =)<\/p>\n<p>O primeiro comando para verifica\u00e7\u00e3o de AVC&#8217;s, \u00e9 o <em>ausearch<\/em>:<\/p>\n<p><strong># ausearch \u2013m avc | grep httpd<\/strong><\/p>\n<p>Onde: <em>-m<\/em> = message<\/p>\n<p>Sa\u00edda do comando (resumida):<\/p>\n<div>type=AVC msg=audit(1344678620.633:26191): avc: denied { name_bind } for pid=9429 comm=&#8221;httpd&#8221; src=8888 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0<br \/>\ntclass=tcp_socket<\/div>\n<p>Perceba que a sa\u00edda do comando demonstra claramente, o motivo dele ter alarmado tal AVC.<\/p>\n<p>&#8211; Pergunta: (Bruno, beleza!) Eu &#8220;j\u00e1 sei&#8221; o que aconteceu pela sa\u00edda do log, mas agora eu quero que a porta 8888 seja padr\u00e3o do servi\u00e7o HTTP, ir\u00e1 continuar gerando AVC&#8217;s?<br \/>\n&#8211; Resposta: N\u00e3o, n\u00e3o, por\u00e9m para que isso aconte\u00e7a, \u00e9 necess\u00e1rio informar ao SELinux, que a porta padr\u00e3o do servi\u00e7o HTTP mudou.<\/p>\n<p>Existem duas maneiras de se fazer isso, uma \u00e9 utilizar o comando <em>semanage<\/em> com a op\u00e7\u00e3o &#8220;port&#8221;, a outra \u00e9 o que iremos ver abaixo.<\/p>\n<p>Primeiro, vamos utilizar o comando <em>selatert<\/em> para analisar os logs:<\/p>\n<p><strong># sealert \u2013a \/var\/log\/audit\/audit.log | grep httpd<\/strong><\/p>\n<p>Onde:<\/p>\n<ul>\n<li><em>-a<\/em> = Analyze File<\/li>\n<li><em>\/var\/log\/audit\/audit.log<\/em> = O arquivo que ser\u00e1 analisado<\/li>\n<\/ul>\n<p>Sa\u00edda do comando (resumida):<\/p>\n<blockquote><p>SELinux is preventing \/usr\/sbin\/httpd from name_bind access on the tcp_socket.<br \/>\nIf you want to allow \/usr\/sbin\/httpd to bind to network port 8888<br \/>\nwhere PORT_TYPE is one of the following: ntop_port_t, http_cache_port_t, http_port_t, puppet_port_t, jboss_messaging_port_t, jboss_management_port_t.<br \/>\nIf you believe that httpd should be allowed name_bind access on the tcp_socket by default.<br \/>\n<strong># grep httpd \/var\/log\/audit\/audit.log | audit2allow -M mypol<\/strong><\/p><\/blockquote>\n<p>Analisando a sa\u00edda, perceba que al\u00e9m de detalhar a poss\u00edvel causa do AVC, ele sugere (caso voc\u00ea realmente queira), indicar a altera\u00e7\u00e3o de porta padr\u00e3o do servi\u00e7o HTTPD para 8888 ao SELinux.<\/p>\n<p>Vamos utilizar o comando que ele sugeriu:<\/p>\n<p><strong># grep httpd \/var\/log\/audit\/audit.log | audit2allow -M mypol<\/strong><\/p>\n<p>Onde:<\/p>\n<ul>\n<li><em>grep httpd \/var\/log\/audit\/audit.log<\/em> = Indica que iremos filtrar a palavra httpd, mediante o arquivo de logs.<\/li>\n<li><em>audit2allow<\/em> = Utilizado para Gerar pol\u00edticas do SELinux para permitir regras, a partir de logs negados.<\/li>\n<li><em>-M<\/em> = Cria um arquivo de M\u00f3dulo, com a sa\u00edda do audit2allow<\/li>\n<li><em>mypol<\/em> = Nome do arquivo de M\u00f3dulo, podendo ter qualquer nome.<\/li>\n<\/ul>\n<p>Sa\u00edda do comando:<\/p>\n<blockquote><p>******************** IMPORTANT ***********************<br \/>\nTo make this policy package active, execute:<br \/>\nsemodule -i mypol.pp<\/p><\/blockquote>\n<p>Perceba que a sa\u00edda do comando deixa bem claro que, caso voc\u00ea queira tornar tal m\u00f3dulo ativo, \u00e9 necess\u00e1rio que voc\u00ea o instale via <em>semodule<\/em>.<\/p>\n<p>Por\u00e9m, caso voc\u00ea liste o diret\u00f3rio corrente, ir\u00e1 perceber que existem 2 arquivos <em>mypol<\/em>:<\/p>\n<p><strong># ls<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<blockquote><p>mypol.te mypol.pp<\/p><\/blockquote>\n<p>O arquivo &#8220;mypol.te&#8221; indica um tipo de arquivo de execu\u00e7\u00e3o (Type Enforcement), ou seja, ele tem toda instru\u00e7\u00e3o do que ser\u00e1 executado\/alterado no sistema atrav\u00e9s do arquivo &#8220;mypol.pp&#8221;.<\/p>\n<p>J\u00e1 o arquivo &#8220;mypol.pp&#8221;, nada mais \u00e9 o que o pacote de politicas (Package Policy), ou o m\u00f3dulo propriamente dito.<\/p>\n<p>Agora que sabemos qual arquivo instalar, vamos utilizar o <em>semodule<\/em> para isso:<\/p>\n<p><strong># semodule -i mypol.pp<\/strong><\/p>\n<p>Depois de alguns segundos, o arquivo foi instalado com \u00eaxito. Ser\u00e1?<\/p>\n<p>Liste os m\u00f3dulos, e veja voc\u00ea mesmo:<\/p>\n<p><strong># semodule \u2013l | grep ^m<\/strong><\/p>\n<p>Sa\u00edda do comando:<\/p>\n<div id=\"forumCodeDiv\">\n<div id=\"highlighter_179254\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>mailman 1.7.2<\/code><\/div>\n<div><code>matahari\u00a0\u00a0\u00a0 1.0.0<\/code><\/div>\n<div><code>mediawiki\u00a0\u00a0 1.0.0<\/code><\/div>\n<div><code>memcached\u00a0\u00a0 1.1.2<\/code><\/div>\n<div><code>milter\u00a0 1.1.1<\/code><\/div>\n<div><code>modemmanager\u00a0\u00a0\u00a0 1.0.1<\/code><\/div>\n<div><code>mono\u00a0\u00a0\u00a0 1.6.1<\/code><\/div>\n<div><code>mozilla 2.1.1<\/code><\/div>\n<div><code>mpd 1.0.0<\/code><\/div>\n<div><code>mplayer 2.1.0<\/code><\/div>\n<div><code>mrtg\u00a0\u00a0\u00a0 1.8.0<\/code><\/div>\n<div><code>munin\u00a0\u00a0 1.7.0<\/code><\/div>\n<div><code>mypol\u00a0\u00a0 1.0<\/code><\/div>\n<div><code>mysql\u00a0\u00a0 1.11.3<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Olha s\u00f3, o nosso modulo &#8220;mypol&#8221; instalado e habilitado no sistema. Ou seja, funcionou! =D<\/p>\n<p>Vale refor\u00e7ar que, a cria\u00e7\u00e3o de m\u00f3dulos com o &#8220;audit2allow&#8221;, s\u00f3 \u00e9 aconselhada caso voc\u00ea saiba realmente o que esteja fazendo, utilizar o &#8220;audit2allow&#8221; apenas para resolver os alertas de AVC do SELinux, estar\u00e1 causando um grande furo de seguran\u00e7a ao sistema.<\/p>\n<p>Bom galera, \u00e9 isso.<\/p>\n<p>O artigo foi b\u00e1sico, em rela\u00e7\u00e3o \u00e0 complexidade do SELinux, por\u00e9m, espero que tenha sido \u00fatil para aqueles que est\u00e3o come\u00e7ando com esta t\u00e3o poderosa ferramenta.<\/p>\n<p>Meu muito obrigado, e at\u00e9 a pr\u00f3xima! =D<\/p><\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>O SELinux O Security-Enhanced Linux &#8211; SELinux &#8211; foi desenvolvido pela Ag\u00eancia Nacional de Seguran\u00e7a dos EUA (NSA). Logo no in\u00edcio, seu objetivo principal era tornar-se um sistema operacional capaz de fornecer controles avan\u00e7ados de acesso para os \u00f3rg\u00e3os militares dos Estados Unidos. Por\u00e9m, com o passar do tempo, a NSA identificou que seria mais [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[79,68,271],"tags":[241,40,262,272],"class_list":["post-460","post","type-post","status-publish","format-standard","hentry","category-firewall","category-redes-2","category-seguranca-2","tag-ambiente-gnulinux","tag-configuracao","tag-seguranca","tag-selinux"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/460","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=460"}],"version-history":[{"count":2,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/460\/revisions"}],"predecessor-version":[{"id":462,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/460\/revisions\/462"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=460"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=460"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=460"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}