110.1 Tarefas de Segurança do sistema
Vamos ver algumas tarefas de segurança do sistema.
Su e Sudo
O comando su
é usado para mudar de usuário, você passa a estar logado com outro usuário e ficará com ele até que decida mudar de volta.
Quando você usa o comando su - <login>
, você vai estar mudando de usuário e carregando as variáveis de ambiente do usuário que vai logar, com isso, voce muda a home, as variáveis de ambiente, no caso, está fazendo um novo processo de login. Quando você muda de usuário sem alterar isso, acontece que o usuário muda mas não é feito todo o processo de um novo login.
# O comando abaixo tem o mesmo efeito que o comando sudo:
$ su -c "COMANDO"
# O problema é que aqui, você deve informar a senha do usuário root.
O comando sudo
é usado para mudar de usuário, normalmente virando um super usuário, mas esse mudança é temporária, você ficará logado somo super usuário somente enquanto o processo que estiver rodando existir, quando o processo morrer, você será deslogado da conta com super usuário e ficará com a conta normal.
Exemplo. se voce rodar o comando sudo apt update
, você passará a estar logado como super usuário somente enquanto o apt
estiver sendo atualizado, quando o processo do apt
terminar, você não estará mais logado como super usuário.
Vamos entender um pouco como funciona o arquivo sudoers
.
$ sudo cat /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
Tudo que começar com %
indica um grupo, por padrão temos 2 grupos definidos, o grupo admin
e o grupo sudo
.
%sudo ALL=(ALL:ALL) ALL
│ │ │ │
│ │ │ │
│ │ │ └──> Pode executar qualquer comando.
│ │ │
│ │ └──> Pode assumir qualquer usuário.
│ │
│ └──> A partir de qualquer terminal.
│
└──> Nome do Grupo.
Para criar uma variável dentro do arquivo sudoers, usamos o comando Cmnd_Alias NOME = "VALOR"
.
who
Comando usado para mostrar quem está logado no momento.
$ who
vagrant pts/0 2021-06-22 12:23 (192.168.121.1)
$ who -H
NAME LINE TIME COMMENT
vagrant pts/0 2021-06-22 12:23 (192.168.121.1)
$ who -Ha
NAME LINE TIME IDLE PID COMMENT EXIT
system boot 2021-06-22 12:20
run-level 5 2021-06-22 12:21
LOGIN tty1 2021-06-22 12:21 623 id=tty1
vagrant + pts/0 2021-06-22 12:23 . 861 (192.168.121.1)
w
Semelhante ao comando who
mas ele da mais detalhes.
$ w
18:04:56 up 5:44, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
vagrant pts/0 192.168.121.1 12:23 0.00s 0.95s 0.01s w
# IDLE = Quanto tempo o usuário está inativo.
# WHAT = Qual atividade o usuário esta executando no momento.
last
Usado para mostrar o histórico de logins na máquina.
$ last
vagrant pts/0 192.168.121.1 Tue Jun 22 12:23 still logged in
reboot system boot 5.4.0-70-generic Tue Jun 22 12:20 still running
vagrant pts/0 192.168.121.1 Sun Jun 20 23:50 - 00:13 (00:23)
reboot system boot 5.4.0-70-generic Sun Jun 20 23:50 - 00:13 (00:23)
reboot system boot 5.4.0-70-generic Fri Apr 2 12:48 - 13:05 (00:17)
reboot system boot 5.4.0-42-generic Fri Apr 2 12:40 - 12:48 (00:07)
wtmp begins Fri Apr 2 12:40:26 2021
# Escolhendo o arquivo de log:
$ last -f wtmp.1
# Vendo os ultimos logins do usuário:
$ last vagrant
vagrant pts/0 192.168.121.1 Tue Jun 22 12:23 still logged in
vagrant pts/0 192.168.121.1 Sun Jun 20 23:50 - 00:13 (00:23)
wtmp begins Fri Apr 2 12:40:26 2021
Os logins são armazenadas no arqui /var/log/wtmp
.
lastb
Mostra as tentativas de logins que falharam.
$ sudo lastb
btmp begins Fri Apr 2 12:32:54 2021
# Vou tentar logar e digitar a senha errada:
$ sudo lastb
vagrant ssh:notty 192.168.121.1 Tue Jun 22 18:08 - 18:08 (00:00)
vagrant ssh:notty 192.168.121.1 Tue Jun 22 18:07 - 18:07 (00:00)
vagrant ssh:notty 192.168.121.1 Tue Jun 22 18:07 - 18:07 (00:00)
btmp begins Tue Jun 22 18:07:55 2021
# No caso, eu fiz 3 tentativas, as 3 falhadas.
# Escolhendo o arquivo de log (usa o last mesmo):
$ last -f btmp.1
As tentativas de logins são armazenadas no arqui /var/log/btmp
.
lastlog
Mostra quando o usuário fez login pela ultima vez, mostra de todos os usuários.
$ lastlog
Username Port From Latest
root **Never logged in**
daemon **Never logged in**
bin **Never logged in**
sys **Never logged in**
sync **Never logged in**
games **Never logged in**
man **Never logged in**
lp **Never logged in**
mail **Never logged in**
news **Never logged in**
uucp **Never logged in**
proxy **Never logged in**
www-data **Never logged in**
backup **Never logged in**
list **Never logged in**
irc **Never logged in**
gnats **Never logged in**
nobody **Never logged in**
systemd-network **Never logged in**
systemd-resolve **Never logged in**
systemd-timesync **Never logged in**
messagebus **Never logged in**
syslog **Never logged in**
_apt **Never logged in**
tss **Never logged in**
uuidd **Never logged in**
tcpdump **Never logged in**
landscape **Never logged in**
pollinate **Never logged in**
sshd **Never logged in**
vagrant pts/0 192.168.121.1 Tue Jun 22 12:23:40 +0000 2021
systemd-coredump **Never logged in**
# Vendo a última vez que o usuário fez login:
$ lastlog -u vagrant
Username Port From Latest
vagrant pts/0 192.168.121.1 Tue Jun 22 12:23:40 +0000 2021
chage
Para relembrar o comando chage
, clique aqui.
passwd
Usado principalmente para trocar a senha do usuário, mas seu trabalho é gerenciar a senha dos usuários.
Opções | Descrição |
---|---|
-S (usuário) | Mostra o status do usuário. P = Password, indica que tem senha. NP = No Password, não tem senha. L = Locked, não pode usar esse usuário. |
-x (number) | Define o tempo em dias para expirar a senha (máximo). |
-n (number) | Define o mínimo de dias que o usuário pode trocar a senha. |
-w (number) | Quantos dias antes da expiração o usuário vai ser avisado. |
-i (number) | Depois da senha ter expirado, o usuário vai ter X dias para trocar, se não trocar, a conta vai ser desativada. |
-l username | Tranca a conta do usuário, impedindo o acesso. |
-u username | Destranca a conta do usuário. |
# Exibindo o status:
$ passwd -S vagrant
vagrant P 04/02/2021 0 99999 7 -1
usermod
Outro comando que podemos usar para trancar a conta do usuário é o usermod
, lembrando que, o que estamos vendo aqui, apesar de ser gerência de usuário, está voltada para segurança, como troca de senhas, inativar uma conta etc.
Opções | Descrição |
---|---|
-L username | Tranca uma conta. |
-U username | Destranca a conta do usuário. |
-e (number) | Configura uma data de expiração da conta |
-f (number) | Depois da senha ter expirado, o usuário vai ter X dias para trocar, se não trocar, a conta vai ser desativada. |
SUID/SGID
O SUID
permite que qualquer usuário rode o script/binário (no caso de scripts e binários) como se fosse o dono do script/binário que estivesse executando, dessa forma, caso esse bit especial existisse para o comando rm
, o usuário comum poderia apagar qualquer arquivo do sistema.
O SGID
funciona da mesma forma, mas usa a permissão do grupo do script/binário. Observe que isso é para scripts e binários, para diretórios o funcionamento é outro; somente o sgid
se aplica a diretórios, e quando aplicado a diretórios, fará com que cada arquivo ou diretório criado herde o grupo do diretório pai.
Para relembrar, clique aqui.
Para procurar arquivos com esses bits ativos, use o comando abaixo:
$ sudo find / -perm -4000 -ls
find: ‘/proc/3635/task/3635/fd/6’: No such file or directory
find: ‘/proc/3635/task/3635/fdinfo/6’: No such file or directory
find: ‘/proc/3635/fd/5’: No such file or directory
find: ‘/proc/3635/fdinfo/5’: No such file or directory
7871932 40 -rwsr-xr-x 1 root root 39144 Mar 7 2020 /usr/bin/fusermount
7864550 68 -rwsr-xr-x 1 root root 68208 May 28 2020 /usr/bin/passwd
7864368 52 -rwsr-xr-x 1 root root 53040 May 28 2020 /usr/bin/chsh
7867185 40 -rwsr-xr-x 1 root root 39144 Jul 21 2020 /usr/bin/umount
7873806 32 -rwsr-xr-x 1 root root 31032 Aug 16 2019 /usr/bin/pkexec
7867184 56 -rwsr-xr-x 1 root root 55528 Jul 21 2020 /usr/bin/mount
7873310 56 -rwsr-sr-x 1 daemon daemon 55560 Nov 12 2018 /usr/bin/at
7864537 44 -rwsr-xr-x 1 root root 44784 May 28 2020 /usr/bin/newgrp
7874178 164 -rwsr-xr-x 1 root root 166056 Jan 19 14:21 /usr/bin/sudo
7864450 88 -rwsr-xr-x 1 root root 88464 May 28 2020 /usr/bin/gpasswd
7866971 68 -rwsr-xr-x 1 root root 67816 Jul 21 2020 /usr/bin/su
7864362 84 -rwsr-xr-x 1 root root 85064 May 28 2020 /usr/bin/chfn
7864799 52 -rwsr-xr-- 1 root messagebus 51344 Jun 11 2020 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
1706750 24 -rwsr-xr-x 1 root root 22840 Aug 16 2019 /usr/lib/policykit-1/polkit-agent-helper-1
1705697 128 -rwsr-xr-x 1 root root 130152 Feb 2 08:21 /usr/lib/snapd/snap-confine
1576584 464 -rwsr-xr-x 1 root root 473576 Mar 9 14:17 /usr/lib/openssh/ssh-keysign
7864809 16 -rwsr-xr-x 1 root root 14488 Jul 8 2019 /usr/lib/eject/dmcrypt-get-device
# Para ver o SGID
$ sudo find / -perm -2000 -ls
# Ou para ver os dois:
$ sudo find / -perm -4000 -o -perm -2000 -ls
# Procurar arquivos que não tenham nenhum usuário:
$ sudo find / -path /proc -prune -o -nouser -ls
4328915 4 drwxr-xr-x 3 62803 62803 4096 Jun 22 18:36 /var/cache/private/fwupdmgr
4328968 4 drwxr-xr-x 2 62803 62803 4096 Jun 22 18:36 /var/cache/private/fwupdmgr/fwupd
4328969 612 -rw-r--r-- 1 62803 62803 622980 Jun 22 18:36 /var/cache/private/fwupdmgr/fwupd/lvfs-metadata.xml.gz
4328970 4 -rw-r--r-- 1 62803 62803 488 Jun 22 18:36 /var/cache/private/fwupdmgr/fwupd/lvfs-metadata.xml.gz.asc
ulimit
Usado para controlar o que o usuário pode fazer com recursos dado a ele na máquina, dessa forma conseguimos criar um controle até mesmo no que o usuário tem permissão para fazer. Os limites definidos aqui são vão servidor para a sessão atual, para configurar isso de forma definitiva, usamos o arquivo /etc/security/limits.conf
.
Opção | Descrição |
---|---|
-a | Mostra todos os limites atuais reportados |
-u | Mostra o número máximo de processos que o usuário pode ter. |
-H | Usa limite Hard |
-S | Usa limite soft |
# Listando todos os limites:
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7601
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7601
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
# Configurando o limite máximo de processos:
\# ulimit -Hu 10000
#### Para configurar definitivamente, segue um exemplo abaixo:
username tipo item valor
#### tipo pode ser: hard ou soft.
#### Para 'item' veja em 'man limits.conf'.
# Vamos fazer um exemplo:
vagrant soft nofile 1000
vagrant hard nofile 2000
# Ao deslogar e logar de novo, já teremos os limites aplicados.
netstat ou ss
lsof
Lista os arquivos abertos, só que no Linux, conexões sao armazenadas em arquivos, os arquivos de sockets, então nós também podemos ver as conexões com esse comando, além de ver qualquer outro arquivo que esteja aberto.
Se iniciado o comando informando um arquivo, poderemos ver quem criou o arquivo (PID que está atrelado ao arquivo), apenas se ele estiver aberto no momento.
Opção | Descrição |
---|---|
-u (username ou UID) | Lista os arquivos do usuário. |
-p (PID) | Filtra a busca pelo PID. |
-i | Mostra as conexões de Rede aberta. Podemos escolher um protocolo ou porta para filtrar a busca. |
# Listando os arquivos abertos pelo usuário vagrant:
$ lsof -u vagrant | head -5
lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 878 vagrant cwd DIR 252,3 4096 2 /
systemd 878 vagrant rtd DIR 252,3 4096 2 /
systemd 878 vagrant txt REG 252,3 1620224 7867979 /usr/lib/systemd/systemd
systemd 878 vagrant mem REG 252,3 1369352 7867465 /usr/lib/x86_64-linux-gnu/libm-2.31.so
# Vendo as conexões de rede estabelecidas:
$ lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mosh-clie 10802 vagrant 14u IPv4 811695 0t0 UDP *:52506
signal-de 13427 vagrant 40u IPv4 479911 0t0 TCP ubuntu:42158->ac88393aca5853df7.awsglobalaccelerator.com:https (ESTABLISHED)
signal-de 13427 vagrant 128u IPv4 813439 0t0 TCP ubuntu:40408->65.8.214.66:https (ESTABLISHED)
signal-de 13427 vagrant 172u IPv4 813449 0t0 TCP ubuntu:40418->65.8.214.66:https (ESTABLISHED)
signal-de 13427 vagrant 174u IPv4 813450 0t0 TCP ubuntu:40420->65.8.214.66:https (ESTABLISHED)
firefox 21495 vagrant 43u IPv4 812268 0t0 TCP ubuntu:58866->149.154.175.209:https (ESTABLISHED)
firefox 21495 vagrant 54u IPv4 749147 0t0 TCP ubuntu:57190->149.154.175.209:https (ESTABLISHED)
# Listando uma porta especifica (Ao invés de usar 22, podemos colocar 'ssh'):
$ lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 39693 bsilva 3u IPv4 505052 0t0 TCP krypton:45604->192.168.121.52:ssh (ESTABLISHED)
# Listando por protocolo:
$ lsof -i tcp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 495 systemd-resolve 13u IPv4 20133 0t0 TCP localhost:domain (LISTEN)
sshd 643 root 3u IPv4 23947 0t0 TCP *:ssh (LISTEN)
sshd 643 root 4u IPv6 23958 0t0 TCP *:ssh (LISTEN)
sshd 864 root 4u IPv4 25424 0t0 TCP lpic2:ssh->_gateway:52904 (ESTABLISHED)
sshd 946 vagrant 4u IPv4 25424 0t0 TCP lpic2:ssh->_gateway:52904 (ESTABLISHED)
# Verificando um arquivo aberto:
$ lsof /home/vagrant
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 949 vagrant cwd DIR 252,3 4096 3543906 /home/vagrant
sudo 981 root cwd DIR 252,3 4096 3543906 /home/vagrant
bash 985 root cwd DIR 252,3 4096 3543906 /home/vagrant
lsof 1738 root cwd DIR 252,3 4096 3543906 /home/vagrant
lsof 1739 root cwd DIR 252,3 4096 3543906 /home/vagrant
nmap
O Nmap (“Network Mapper”) é uma ferramenta de código aberto para exploração de rede e auditoria de segurança. Ela foi desenhada para escanear rapidamente redes amplas, embora também funcione muito bem contra hosts individuais. O Nmap utiliza pacotes IP em estado bruto (raw) de maneira inovadora para determinar quais hosts estão disponíveis na rede, quais serviços (nome da aplicação e versão) os hosts oferecem, quais sistemas operacionais (e versões de SO) eles estão executando, que tipos de filtro de pacotes/firewalls estão em uso, e dezenas de outras características.
Embora o Nmap seja normalmente utilizado para auditorias de segurança, muitos administradores de sistemas e rede consideram-no útil para tarefas rotineiras tais como inventário de rede, gerenciamento de serviços de atualização agendados, e monitoramento de host ou disponibilidade de serviço.
Opção | Descrição |
---|---|
-p $porta | Especifica a porta para o scan. |
-O | Mostra o sistema operacional (usa o stack fingerprint) |
-F | Fast Scan, faz scan nas 100 portas principais. |
-sV | Pega a versão da aplicação que está rodando na porta. |
-sU | Faz busca usando UDP. |
-sT | Faz buscas usando TCP. |
$ nmap localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2021-06-22 20:24 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000064s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 999 closed ports
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
# Verificando o S.O.:
$ sudo nmap -O localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2021-06-22 20:26 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000094s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 999 closed ports
PORT STATE SERVICE
22/tcp open ssh
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6.32
OS details: Linux 2.6.32
Network Distance: 0 hops
OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1.66 seconds
fuser
Retorna qual processo está usando uma determinada porta.
$ sudo fuser 22/tcp
22/tcp: 625 861 955
# Verificando o nome do dono do processo:
$ sudo fuser -u 22/tcp
22/tcp: 625(root) 861(root) 955(vagrant)
# Usando verbose:
$ sudo fuser -vu 22/tcp
USER PID ACCESS COMMAND
22/tcp: root 625 F.... (root)sshd
root 861 F.... (root)sshd
vagrant 955 F.... (vagrant)sshd