110.2 Configurar segurança de Host
Antigamente, o x
localizado no /etc/passwd
, ficava a senha do usuário. Como todos os usuário devem ler esse arquivo, não é interessante que a senha seja armazenada ali, dessa forma, ela foi migrada para o /etc/shadow
.
Um técnica interessante que impede um usuário de logar é adicionando um shell chamado /bin/false
, isso vai impedir que o usuário consiga logar via cli, mas ele ainda vai poder logar por interface gráfica, mesmo que depois de logar não consiga abrir um shell.
Caso você configure o shell do usuário como /bin/nologin
e esse binário não existir, ele vai poder logar e vai poder usar um shell normalmente, mas não vai poder logar via Cli. Você pode escrever uma mensagem dentro de nologin
para que ela seja exibida quando o usuário tentar efetuar login.
Outra forma de manter a segurança é impedir que serviços em desuso fiquem rodando, para isso podemos desativar eles no boot pelo SystemD, ou pelo inittab em sistemas com SysV.
INETD
Alguns serviços funcionam de uma forma que chamamos de standalone, ou seja, eles funcionam sozinhos, mas existem/existiram serviços que funcionam/funcionavam através do inetd
.
O diretório /etc/inet.d/
e /etc/inetd.conf
definem quais os processos que vão ser iniciados pelo inetd. Vale ressaltar que só poder ter inetd
ou xinetd
, ter os dois ao mesmo tempo não é possível.
Para os testes, instale os pacotes abaixo:
$ sudo apt install -y telnetd ftpd inetutils-inetd
# Verificando se o inet está rodando:
$ ps aux | grep -i inet
root 1412 0.0 0.0 2632 1736 ? S 14:15 0:00 /usr/sbin/inetutils-inetd
# Verificando o arquivo de configuração:
$ cat /etc/inetd.conf
# /etc/inetd.conf: see inetd(8) for further informations.
#
# Internet superserver configuration database
#
#
# Lines starting with "#:LABEL:" or "#<off>#" should not
# be changed unless you know what you are doing!
#
# If you want to disable an entry so it isn't touched during
# package updates just comment it out with a single '#' character.
#
# Packages should modify this file by using update-inetd(8)
#
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
#
#:INTERNAL: Internal services
#discard stream tcp nowait root internal
#discard dgram udp wait root internal
#daytime stream tcp nowait root internal
#time stream tcp nowait root internal
#:STANDARD: These are standard services.
telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd
ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.ftpd
#:BSD: Shell, login, exec and talk are BSD protocols.
#:MAIL: Mail, news and uucp services.
#:INFO: Info services
#:BOOT: TFTP service is provided primarily for booting. Most sites
# run this only on machines acting as "boot servers."
#:RPC: RPC based services
#:HAM-RADIO: amateur-radio services
#:OTHER: Other services
Vamos verificar se o processo do ftp e do telnet estão rodando:
$ sudo lsof -i :21,23
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
inetutils 1412 root 4u IPv4 28954 0t0 TCP *:telnet (LISTEN)
inetutils 1412 root 5u IPv4 28955 0t0 TCP *:ftp (LISTEN)
Dessa forma, os serviços de telnet e ftp estão sendo fornecidos pelo inetd
.
TCP Wrappers
O TCP Wrappers é uma ferramenta que adiciona uma camada a mais de proteção no acesso a serviços de rede, sua principal função é controlar quais são os endereços IP que podem ser comunicar com a aplicação. Para usar o tcp wrapper você deve ter a biblioteca libwrap
, essa proteção a mais é implementada pelo Linux (sistema) e independe da aplicação, mas para que ela funcione, a aplicação tem que usar conexões TCP.
Para o bom funcinamento, dois arquivos são consultados:
/etc/host.allow
Primeiro arquivo a ser consultado, ele tem quais IPs podem se comunicar a um determinado serviço, se o IP não existir nesse arquivo, o arquivo abaixo será consultado.
/etc/host.deny
Caso o endereço não esteja no arquivo
host.allow
, ele será verificado aqui, e se existir aqui dentro, o IP será negado, impedindo a conexão, mas caso não esteja aqui, ele será autorizado.
Vamos ver um exemplo do uso desse arquivo:
### /etc/host.allow:
# A linha abaixo permite que qualquer endereço da rede 10.0.0.0/24 acesse qualquer serviço, menos o IP 10.0.0.1 (ele será negado):
ALL: 10.0.0.* EXCEPT 10.0.0.1
# A linha abaixo permite que o IP de loopback acesse qualquer serviço:
ALL: 127.0.0.1
### /etc/host.deny:
# A linha abaixo impede que qualquer endereço acesse qualquer serviço:
ALL: ALL
#########
# Com essa configuração, só é liberado para os hosts que configurarmos.
XINETD
Foi uma evolução ao inetd
, também sendo um intermediário em conexões para proteção, algumas coisas são diferentes nele.
# Instale o xinetd:
$ sudo apt install xinetd -y
# Verificando se o xinet está rodando:
$ ps aux | grep -i xinet
root 2587 0.0 0.1 7924 2172 ? Ss 14:38 0:00 /usr/sbin/xinetd -pidfile /run/xinetd.pid -stayalive -inetd_compat -inetd_ipv6
Para o xinetd temos basimente o mesmo arquivo e diretório:
$ cat /etc/xinetd.conf
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
# Please note that you need a log_type line to be able to use log_on_success
# and log_on_failure. The default is the following :
# log_type = SYSLOG daemon info
}
includedir /etc/xinetd.d
# Criado pelo administrador:
$ cat /etc/xinetd.d/telnet
# default: off
# description: An internal xinetd service, listing active servers.
service telnet
{
flags = REUSE
port = 23
socket_type = stream
protocol = tcp
wait = no
disable = no
only_from = 0.0.0.0
# Especificando um IP que não deva acessar:
# no_access = IP
# Especificando somente de onde deve ser realizado o acesso:
# access_only = IP
}
Essas regras mais acima só são verificadas se a conexão for liberada, por exemplo se passar no host.allow, caso ela seja bloqueada, as regras mais acima nem chegam a ser verificadas.
Systemd Sockets
É umam unit que temos no systemd, sua funcionalidade é permitir que processos se comuniquem, trocando informações, ele também permite que duas máquinas remotas possam se comunicar. Essa funcionalidade é semelhante ao funcionamento do xinetd
, mas hoje o recurso de sockets é melhor.
Para mais detalhes, veja o man em man systemd.socket
.
# Listando os sockets do sistema:
$ sudo systemctl list-units --type=socket
UNIT LOAD ACTIVE SUB DESCRIPTION >
dbus.socket loaded active running D-Bus System Message Bus Socket >
dm-event.socket loaded active listening Device-mapper event daemon FIFOs >
iscsid.socket loaded active listening Open-iSCSI iscsid Socket >
lvm2-lvmpolld.socket loaded active listening LVM2 poll daemon socket >
multipathd.socket loaded active running multipathd control socket >
snapd.socket loaded active listening Socket activation for snappy daemon >
syslog.socket loaded active running Syslog Socket >
systemd-fsckd.socket loaded active listening fsck to fsckd communication Socket >
systemd-initctl.socket loaded active listening initctl Compatibility Named Pipe >
systemd-journald-audit.socket loaded active running Journal Audit Socket >
systemd-journald-dev-log.socket loaded active running Journal Socket (/dev/log) >
systemd-journald.socket loaded active running Journal Socket >
systemd-networkd.socket loaded active running Network Service Netlink Socket >
systemd-rfkill.socket loaded active listening Load/Save RF Kill Switch Status /dev/rfkill>
systemd-udevd-control.socket loaded active running udev Control Socket >
systemd-udevd-kernel.socket loaded active running udev Kernel Socket >
uuidd.socket loaded active listening UUID daemon activation socket >
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
17 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
# Vendo o conteúdo de um socket:
$ sudo cat /lib/systemd/system/ssh.socket
[Unit]
Description=OpenBSD Secure Shell server socket
Before=ssh.service
Conflicts=ssh.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Socket]
ListenStream=22
Accept=yes
[Install]
WantedBy=sockets.target
# Verificando o serviço que o socket vai chamar:
$ sudo cat /lib/systemd/system/ssh@.service
[Unit]
Description=OpenBSD Secure Shell server per-connection daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=auditd.service
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStart=-/usr/sbin/sshd -i $SSHD_OPTS
StandardInput=socket
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
Crie um socket para teste:
# Verificando o serviço que o socket vai chamar:
$ sudo cat /lib/systemd/system/teste.socket
[Unit]
Description=Teste
[Socket]
ListenStream=12345
Accept=yes
[Install]
WantedBy=sockets.target
Agora crie o serviço que o socket vai chamar:
$ sudo cat /lib/systemd/system/teste@.service
[Unit]
Description=Teste
[Service]
Type=single
ExecStart=/home/vagrant/socket.sh
StandardInput=socket
Crie o script:
$ sudo cat ~/socket.sh
#!/bin/bash
echo "bem vindo!"
date
hostname
echo "tchau!"
# De permissão de execução no script:
$ sudo chmod +x ~/socket.sh
Ative o nosso socket.
$ sudo systemctl start teste.socket
# Verifique se tem algum serviço escutando nossa porta:
$ ss -nalp | grep 12345
tcp LISTEN 0 4096 *:12345 *:*
# Faça um teste:
$ nc localhost 12345
bem vindo!
Sat 26 Jun 2021 08:34:14 PM UTC
ubuntu2004.localdomain
tchau!