Pular para o conteúdo principal

Selinux



 Descomplicando Selinux

Lembrando que para todo sysadmin é de total importância a segurança de todo parque computacional, aconselho todo tipo de segurança a ser implementado e não deixar somente ou acerca de um firewall corporativo somente. Pois sempre lembre disso: Uma segurança não implatada pode acatar em um prejuízo de milhões.


O que é Selinux?

SELinux (Security-Enhanced Linux) é um conjunto de extensões de segurança para o kernel no qual inicialmente desenvolvido pela National Security Agency (NSA) dos Estados Unidos. O SELinux implementa um modelo de segurança obrigatório (Mandatory Access Control - MAC)

Por que utilizar Selinux?

O SELinux oferece segurança avançada em sistemas Linux por meio de políticas detalhadas e controle de acesso obrigatório. Reduz a superfície de ataque, limitando privilégios e protegendo contra exploits. Sua capacidade de auditoria detalhada facilita a detecção de atividades suspeitas. Adapta-se a diferentes ambientes e atende os padrões de segurança, sendo crucial em ambientes multiusuário. Embora potente, requer configuração cuidadosa/minuciosa para evitar complicações.

Recomenda-se a instalação de pacotes extras:

root@localhost spinal]# dnf install selinux-policy selinux-policy-targeted policycoreutils mcstrans setools -y

Primeira análise:

[root@localhost spinal]# rpm -qa | grep selinux
libselinux-3.5-1.el9.x86_64
libselinux-utils-3.5-1.el9.x86_64
python3-libselinux-3.5-1.el9.x86_64
selinux-policy-38.1.23-1.el9.noarch
selinux-policy-targeted-38.1.23-1.el9.noarch
container-selinux-2.221.0-1.el9.noarch
rpm-plugin-selinux-4.16.1.3-25.el9.x86_64
flatpak-selinux-1.12.8-1.el9.noarch

Quais os modos do selinux:

Enforcing (Imposição) --> SELinux implementa rigorosamente políticas de segurança, bloqueando e registrando violações.
Permissive (Permissivo) -->  SELinux registra violações, mas não as bloqueia, útil para ajuste de políticas sem interromper operações.
Disabled (Desabilitado) -->  SELinux está completamente desativado, sem aplicação de políticas ou registro de violações. 

Algumas comandos de referência:

[root@localhost spinal]# getenforce 
Permissive
[root@localhost spinal]# sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive --> modo atual --> Comando setenforce
Mode from config file:          enforcing --> /etc/selinux/config --> Configuração do arquivo
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      33
[root@localhost spinal]# cat /etc/selinux/config  | grep ^SELINUX=
SELINUX=enforcing

Obs: Com o comando setenforce é possível colocar o selinux no mode enforcing ou permissive. No caso permissive seria recomendável para testar a implatação de algum sistema com selinux implatado.

O foco não é firewall, mas como mencionado a segurança é feito via camadas, e o firewall padrão no Rockylinux é o firewalld. Mas para liberarmos o acesso ssh, para começar atuar no servidor, deve-se habilitar o serviço.

[root@localhost spinal]# firewall-cmd --state
running
[root@localhost spinal]# firewall-cmd --add-service=ssh --permanent
[root@localhost spinal]# firewall-cmd --reload
[root@localhost spinal]# firewall-cmd --list-all | grep services
  services: cockpit dhcpv6-client ssh

Política SELinux (Terminando de ler, talvez fique mais ou menos claro)

user --> role --> domain --> file



User (Usuário SELinux): Identificador SELinux vinculado a um usuário, conectando-o a políticas de segurança.
Role (Papel SELinux): Define permissões agrupadas para um usuário SELinux, ex: "sysadm_r" para administração do sistema.
Domain (Domínio SELinux): Agrupa processos em execução com permissões específicas, ex: "httpd_t" para servidores web.
File (Arquivo SELinux): Objeto do sistema de arquivos associado a rótulos de segurança para controlar acesso e permissões.

Com o comando ls, seu melhor amigo, será o parâmetro -Z (maiúsculo), verificando as informações referente a política no selinux.

[root@localhost .ssh]# ls -Z /etc/passwd
system_u:object_r:passwd_file_t:s0 /etc/passwd

Para facilitar o entendimento, será falado sobre boleano, de modo simples é ativar a flag do selinux ou desativa-lo.

Comando para lista os módulos (Não mostrado pois existem vários)

[root@localhost .ssh]# semodule -l

Exemplo de informação de flags com boleanos com ssh (Detalhe da flag):

[root@localhost .ssh]# semanage boolean -l | grep ssh
fenced_can_ssh                 (off  ,  off)  Allow fenced to can ssh
selinuxuser_use_ssh_chroot     (off  ,  off)  Allow selinuxuser to use ssh chroot
ssh_chroot_rw_homedirs         (off  ,  off)  Allow ssh to chroot rw homedirs
ssh_keysign                    (off  ,  off)  Allow ssh to keysign
ssh_sysadm_login               (off  ,  off)  Allow ssh to sysadm login
ssh_use_tcpd                   (off  ,  off)  Allow ssh to use tcpd
sshd_launch_containers         (off  ,  off)  Allow sshd to launch containers
virt_qemu_ga_manage_ssh        (off  ,  off)  Allow virt to qemu ga manage ssh

Lista os boleanos de outra forma com ssh:

[root@localhost .ssh]# getsebool -a | grep ssh
fenced_can_ssh --> off
selinuxuser_use_ssh_chroot --> off
ssh_chroot_rw_homedirs --> off
ssh_keysign --> off
ssh_sysadm_login --> off
ssh_use_tcpd --> off
sshd_launch_containers --> off
virt_qemu_ga_manage_ssh --> off

Agora a parte no qual você mais gosta, com o selinux habilitado, habilitar um boleano.
Para isto vamos utilizar o serviço de ftp para conexão de anonimato, para facilitar a implatação e configuração do mesmo:

Instalação básica do ftp:

[root@localhost .ssh]# dnf install vsftpd -y

Verificando informações do serviço:

[root@localhost .ssh]# systemctl enable vsftpd --now
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.
[root@localhost .ssh]# ss -lnt
State  Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
LISTEN  0       128     0.0.0.0:ssh         0.0.0.0:*           users:(("sshd",pid=748,fd=3))
LISTEN  0       32      *:ftp               *:*                 users:(("vsftpd",pid=4820,fd=3))
LISTEN  0       128     [::]:ssh            [::]:*              users:(("sshd",pid=748,fd=4))
[root@localhost .ssh]# ip r
default via 192.168.15.1 dev enp0s3 proto dhcp src 192.168.15.127 metric 100 
192.168.15.0/24 dev enp0s3 proto kernel scope link src 192.168.15.127 metric 100 

Observa-se que o serviço e sua porta está aberta:
Primeiro detalhe a porta está aberta somente localmente pois não há regra de firewall.

[root@localhost .ssh]# firewall-cmd --add-service=ftp --permanent
success
[root@localhost .ssh]# firewall-cmd --reload
success
[root@localhost .ssh]# firewall-cmd --list-all | grep services
  services: cockpit dhcpv6-client ftp ssh

Apartir de outro local ou outro servidor verifique se a porta está do serviço de ftp:

spinal@lenovo-legion5:~/.ssh$ timeout 1 telnet 192.168.15.127 22
Trying 192.168.15.127...
Connected to 192.168.15.127.
Escape character is '^]'.

Obs:  Não esqueça de aplicar segurança no servidor ftp, utilizado ssl por exemplo e de preferência com chroot. Com o serviço do ftp vou deixar, você mandar bala, pois o intuito é focar no selinux.

[root@localhost .ssh]# getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off

Vamos utilizar a seguinte situação, lembrando que somente é para exemplo: 
Vamos supor que a missão seja habilitar usuários anônimos ou convivados tenham permissão de criar arquivos ou pastas em algum diretório X. Vamos liberar a flag, lembrando que o comando precisa do argumento (-P) para aplicar permanentemte.

[root@localhost .ssh]# setsebool -P ftpd_anon_write on
[root@localhost .ssh]# getsebool -a | grep ftpd_anon_write
ftpd_anon_write --> on
[root@localhost .ssh]# 

Um exemplo de teste pode ser utilizado a ferramenta filezilla (Cliente FTP):


Espero ter contribuído para sua vida, para segurança de vários ambientes e esqueça disso:
Brincadeiras a parte. kkkkkkkk



Ass: Luiz Guilherme Nunes Fernandes
Email: narutospinal@gmail.com
Informativo: Entusiasta e colaborador em Software Livre.

Comentários