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):
Brincadeiras a parte. kkkkkkkk
Comentários
Postar um comentário