newrole-r role_r -t domain_t
(normalmente há apenas um único domínio permitido para uma determinada função, o parâmetro -t
pode, assim, muitas vezes, ser deixado de fora). Este comando autentica você pedindo que você digite sua senha. Este recurso proíbe programas mudarem automaticamente os papéis. Tais mudanças só podem acontecer se forem expressamente permitidas pela política SELinux.
ssh
) é marcado com ssh_exec_t
, e quando o programa é iniciado, ele muda automaticamente no domínio ssh_t
). Este mecanismo de transição automática de domínio torna possível conceder apenas os direitos necessários para cada programa. É um princípio fundamental do SELinux.
apt install selinux-basics selinux-policy-defaulti auditd
command will automatically install the packages required to configure an SELinux system.
unconfined
(gerenciamento de módulos está detalhada ainda nesta seção).
fixfiles relabel
.
selinux=1 security=selinux
para o kernel Linux. O parâmetro audit=1
habilita o log SELinux que registra todas as operações negadas. Finalmente, o parâmetro enforcing=1
traz as regras para aplicação: sem ele SELinux funciona no modo padrão permissive onde as ações negadas são registradas, mas ainda executadas. Você deve, portanto, modificar o arquivo de configuração do GRUB para anexar os parâmetros desejados. Uma maneira fácil de fazer isso é modificar a variável GRUB_CMDLINE_LINUX
em /etc/default/grub
e executar update-grub
. SELinux estará ativo após uma reinicialização.
selinux-activate
automatiza as operações e força uma rotulagem na próxima inicialização (o que evita criação de novos arquivos não-rotulados enquanto o SELinux ainda não estiver ativo, e enquanto a rotulagem estiver acontecendo).
semodule
. Além disso, você deve ser capaz de definir as funções que cada usuário pode endossar, e isso pode ser feito com o comando semanage
.
/etc/selinux/default/
. Ao contrário de outros arquivos de configuração que você pode encontrar em /etc/
, todos esses arquivos não devem ser alterados manualmente. Você deve usar os programas concebidos para este proposito.
/usr/share/selinux/default/
. Para habilitar um desses módulos na configuração atual, você deve usar semodule -i module.pp.bz2
. A extensão pp.bz2 significa pacote política (compactada com bzip2).
semodule -r module
. Finalmente, o comando semodule -l
listas os módulos que estão atualmente instalados. Também mostra seus números de versão. Módulos podem ser seletivamente habilitados com semodule -e
e desabilitados com semodule -d
.
#
semodule -i /usr/share/selinux/default/abrt.pp.bz2
libsemanage.semanage_direct_install_info: abrt module will be disabled after install as there is a disabled instance of this module present in the system. #
semodule -l
accountsd acct [...]
#
semodule -e abrt
#
semodule -d accountsd
#
semodule -l
abrt acct [...]
#
semodule -r abrt
libsemanage.semanage_direct_remove_key: abrt module at priority 100 is now active.
semodule
imediatamente carrega a nova configuração, a menos que você use sua opção -n
. É interessante notar que o programa atua por padrão na configuração atual (que é indicada pela variável SELINUXTYPE
em /etc/selinux/config
), mas que você pode modificar outra, especificando-a com a opção -s
.
semanage
.
-a
to add, -d
to delete, -m
to modify, -l
to list, and -t
to indicate a type (or domain).
semanage login -l
lista o atual mapeamento entre identificadores de usuário e identidades SELinux. Os usuários que não têm entrada explícita obter a identidade indicado na entrada __default__
. O comando semanage login -a -s user_u user
irá associar a identidade user_u ao determinado usuário. Finalmente,semanage login -d user
exclui a entrada de mapeamento atribuído a este usuário.
#
semanage login -a -s user_u rhertzog
#
semanage login -l
Login Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * rhertzog user_u s0 * root unconfined_u s0-s0:c0.c1023 * #
semanage login -d rhertzog
semanage user -l
lista o mapeamento entre as identidades de usuários do SELinux e papéis permitidos. Adicionar uma nova identidade requer definir os papéis correspondentes e um prefixo de marcação que é usado para designar um tipo de arquivo pessoal (/home/usuário/*
). O prefixo deve ser escolhido entre user
, o staff
, e o sysadm
. O prefixo "staff
" resulta em arquivos do tipo "staff_home_dir_t
". Criar uma nova identidade de usuário SELinux é feita com semanage usuário -a -R papéis -P prefixo identidade
. Finalmente, você pode remover uma identidade de usuário SELinux com semanage usuário -d identidade
.
#
semanage user -a -R 'staff_r user_r' -P staff test_u
#
semanage user -l
Labeling MLS/ MLS/ SELinux User Prefix MCS Level MCS Range SELinux Roles root sysadm s0 s0-s0:c0.c1023 staff_r sysadm_r system_r staff_u staff s0 s0-s0:c0.c1023 staff_r sysadm_r sysadm_u sysadm s0 s0-s0:c0.c1023 sysadm_r system_u user s0 s0-s0:c0.c1023 system_r test_u staff s0 s0 staff_r user_r unconfined_u unconfined s0 s0-s0:c0.c1023 system_r unconfined_r user_u user s0 s0 user_r #
semanage user -d test_u
/srv/www/
, você pode executar semanage fcontext-a-t httpd_sys_content_t "/srv/www(/.*)? "
seguido de restorecon -R /srv/www/
. O comando anterior registra as novas regras de rotulagem e redefine o último dos tipos de arquivos de acordo com as atuais regras de rotulagem.
semanage port -m -t http_port_t -p tcp 8080
.
getsebool
utility can be used to inspect those options (getsebool boolean
displays one option, and getsebool -a
them all). The setsebool boolean value
command changes the current value of a Boolean option. The -P
option makes the change permanent, it means that the new value becomes the default and will be kept across reboots. The example below grants web servers an access to home directories (this is useful when users have personal websites in ~/public_html/
).
#
getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off #
setsebool -P httpd_enable_homedirs on
#
getsebool httpd_enable_homedirs
httpd_enable_homedirs --> on
/usr/share/doc/selinux-policy-doc/html/
) e arquivos de amostra que podem ser usados como modelos para criar novos módulos. Instale esses arquivos e estude-os mais de perto:
$
cp /usr/share/doc/selinux-policy-doc/Makefile.example Makefile
$
cp /usr/share/doc/selinux-policy-doc/example.fc ./
$
cp /usr/share/doc/selinux-policy-doc/example.if ./
$
cp /usr/share/doc/selinux-policy-doc/example.te ./
.te
é o mais importante. Ele define as regras. O arquivo .fc
define os arquivos de contextos", isto é, os tipos atribuídos a arquivos relacionados a este módulo. Os dados dentro do arquivo .fc
são utilizados durante a etapa de rotulagem do arquivo. Finalmente, o arquivo if
define a interface do módulo: é um conjunto de "funções públicas" que outros módulos podem usar para interagir adequadamente com o módulo que você está criando.
myapp_domtrans
") controla quem pode executar o aplicativo. O segundo ("myapp_read_log
") concede direitos de leitura nos arquivos de log do aplicativo.
.te
. Você deve, portanto, declarar todos os tipos que você utiliza (com a macro gen_require
), e usar diretivas padrão de concessão de direitos. Note, no entanto, que você pode usar interfaces fornecidas por outros módulos. A próxima seção irá dar mais explicações sobre a forma de expressar esses direitos.
Exemplo 14.3. Arquivo example.if
## <summary>Myapp example policy</summary> ## <desc> ## <p> ## More descriptive text about myapp. The desc ## tag can also use p, ul, and ol ## html tags for formatting. ## </p> ## <p> ## This policy supports the following myapp features: ## <ul> ## <li>Feature A</li> ## <li>Feature B</li> ## <li>Feature C</li> ## </ul> ## </p> ## </desc> # ######################################## ## <summary> ## Execute a domain transition to run myapp. ## </summary> ## <param name="domain"> ## <summary> ## Domain allowed to transition. ## </summary> ## </param> # interface(`myapp_domtrans',` gen_require(` type myapp_t, myapp_exec_t; ') domtrans_pattern($1,myapp_exec_t,myapp_t) ') ######################################## ## <summary> ## Read myapp log files. ## </summary> ## <param name="domain"> ## <summary> ## Domain allowed to read the log files. ## </summary> ## </param> # interface(`myapp_read_log',` gen_require(` type myapp_log_t; ') logging_search_logs($1) allow $1 myapp_log_t:file read_file_perms; ')
example.te
:
policy_module(example,1.0.0) # a non-base module name must match the file name ######################################## # # Declarations # type myapp_t; type myapp_exec_t; domain_type(myapp_t) domain_entry_file(myapp_t, myapp_exec_t) type myapp_log_t; logging_log_file(myapp_log_t) type myapp_tmp_t; files_tmp_file(myapp_tmp_t) ######################################## # # Myapp local policy # allow myapp_t myapp_log_t:file { read_file_perms append_file_perms }; allow myapp_t myapp_tmp_t:file manage_file_perms; files_tmp_filetrans(myapp_t,myapp_tmp_t,file)
O módulo deve ser identificado pelo seu nome e número da versão. Esta diretiva é obrigatória.
| |
Se o módulo introduz novos tipos, deve declará-los com as diretivas como este. Não hesite em criar tantos tipos quantas forem necessários em vez de conceder muitos direitos inúteis.
| |
Estas interfaces definem o tipo myapp_t como uma área processo que deve ser utilizada por qualquer executável rotulado com myapp_exec_t . Implicitamente, isso adiciona um atributo exec_type sobre esses objetos, que por sua vez permite que outros módulos de concessão de direitos para executar esses programas: por exemplo, o módulo userdomain , permite que os processos com domínios user_t , staff_t e sysadm_t execute os. Os domínios de outras aplicações confinadas não terão direitos para executar los, a menos que as regras lhes concedem direitos semelhantes (este é o caso, por exemplo, do dpkg com o seu domínio dpkg_t ).
| |
logging_log_file é uma interface fornecida pela política de referência. Ela indica que os arquivos marcados com o tipo de dado são arquivos de log que deveriam beneficiar das regrassociadas (por exemplo, concedem direitos ao logrotate para que possa manipulá los).
| |
O diretiva allow é a diretiva de base utilizada para autorizar uma operação. O primeiro parâmetro é o domínio processo que tem a permissão para executar a operação. A segunda define o objeto que um processo do domínio anterior pode manipular. Este parâmetro é a forma "tipo: classe" onde tipo é o seu tipo SELinux e classe descreve a natureza do objeto (arquivo, diretório, socket, fifo, etc.) Finalmente, o último parâmetro descreve as permissões (as operações permitidas).
As permissões são definidas como o conjunto de operações permitidas e segue este modelo: { operação1operação2} . No entanto, você também pode usar macros que representam as permissões mais úteis. O /usr/share/selinux/devel/include/support/obj_perm_sets.spt os lista.
A página web a seguir fornece uma lista relativamente exaustiva de classes de objetos e permissões que podem ser concedidas.
|
avc: denied { read write } for pid=1876 comm="syslogd" name="xconsole" dev=tmpfs ino=5510 scontext=system_u:system_r:syslogd_t:s0 tcontext=system_u:object_r:device_t:s0 tclass=fifo_file permissive=1
Tabela 14.1. Análise de um rastreamento SELinux
Mensagem | Descrição |
---|---|
avc: denied | Uma operação foi negada. |
{ read write } | Esta operação precisou das permissões de leitura e escrita . |
pid=1876 | O processo com PID 1876 executou a operação (ou tentou executa la). |
comm="syslogd" | O processo foi um exemplo do programa syslogd . |
name="xconsole" | O objeto alvo foi nomeado xconsole . Às vezes, você pode também ter uma variável “path” — com o caminho completo — como opção. |
dev=tmpfs | O dispositivo que hospeda o objeto de destino é um tmpfs (um sistema de arquivos em memória). Para um disco real, você poderia ver a partição que hospeda o objeto (por exemplo, "sda3"). |
ino=5510 | O objeto esta identificado pelo inode numero 5510. |
scontext=system_u:system_r:syslogd_t:s0 | Este é o contexto de segurança do processo que executou a operação. |
tcontext=system_u:object_r:device_t:s0 | Este é o contexto de segurança do objeto destino. |
tclass=fifo_file | O objeto destino é um arquivo FIFO. |
allow syslogd_t device_t:fifo_file { read write }
. Este processo pode ser automatizado, e é exatamente o que o comando audit2allow
oferece (do pacote policycoreutils). Esta abordagem só é útil se os vários objetos já estão corretamente rotulados de acordo com o que deve ser confinado. Em qualquer caso, você terá que analisar cuidadosamente as regras geradas e as validar de acordo com o seu conhecimento da aplicação. Efetivamente, essa abordagem tende a conceder mais direitos do que são realmente necessários. A solução adequada é muitas vezes criar novos tipos de concessão de direitos apenas sobre esses tipos. Acontece também de uma operação negada não ser fatal para a aplicação, neste caso pode ser melhor adicionar uma regra "dontaudit
" para evitar a entrada de log, apesar da efetiva negação.
example.if
, example.fc
e example.te
) corresponderem às suas expectativas para as novas regras, renomeie-os para myapp.extension
e execute make NAME=devel
para gerar um módulo no arquivo myapp.pp
(você pode carrega-lo imediatamente com semodule -i myapp.pp
). Se vários módulos forem definidos, make
criará todos os arquivos .pp
correspondentes.