110.1 Lição 1
Certificação: |
LPIC-1 |
---|---|
Versão: |
5.0 |
Tópico: |
110 Segurança |
Objetivo: |
110.1 Executar tarefas administrativas de segurança |
Lição: |
1 de 1 |
Introdução
A segurança é fundamental na administração de qualquer sistema. Como um bom administrador de sistemas Linux, você deve ficar atento a uma série de coisas, como permissões especiais em arquivos, validade das senhas de usuário, portas e sockets abertos, limitações no uso de recursos do sistema, gestão de usuários conectados e escalonamento de privilégios por meio su
e sudo
. Nesta lição, trataremos de cada um desses tópicos.
Verificando Arquivos com SUID e SGID
Além do conjunto de permissões tradicional de leitura, escrita e execução, os arquivos de um sistema Linux também podem ter algumas permissões especiais definidas, como os bits SUID ou SGID.
O bit SUID permite que o arquivo seja executado com privilégios de proprietário do arquivo. Numericamente, ele é representado por 4000
e, simbolicamente, por s
ou S
no bit de permissão de execução do proprietário. Um exemplo clássico de arquivo executável com a permissão SUID definida é passwd
:
carol@debian:~$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 63736 jul 27 2018 /usr/bin/passwd
O s
minúsculo em rws
indica a presença do SUID no arquivo — junto com a permissão de execução. Se, no lugar dele, houvesse um S
maiúsculo (rwS
), isso significaria que a permissão de execução presumida não foi definida.
Note
|
Trataremos de |
Por outro lado, o bit SGID pode ser definido tanto em arquivos quanto em diretórios. Nos arquivos, seu comportamento é equivalente ao de SUID, mas os privilégios serão os mesmos do proprietário do grupo. Quando definido em um diretório, no entanto, ele permite que todos os arquivos criados ali herdem a propriedade do grupo do diretório. Como o SUID, o SGID é simbolicamente representado por s
ou S
no bit de permissão de execução do grupo. Numericamente, ele é representado por 2000
. Para definir o SGID em um diretório, usamos chmod
. É necessário adicionar 2
(SGID) às permissões tradicionais (755
, em nosso caso):
carol@debian:~$ ls -ld shared_directory drwxr-xr-x 2 carol carol 4096 may 30 23:55 shared_directory carol@debian:~$ sudo chmod 2755 shared_directory/ carol@debian:~$ ls -ld shared_directory drwxr-sr-x 2 carol carol 4096 may 30 23:55 shared_directory
Para encontrar arquivos com SUID e/ou SGID definidos, use o comando find
com a opção -perm
. Podemos incluir valores numéricos e simbólicos. Os valores — por sua vez — podem ser passados sozinhos ou precedidos por travessão (-
) ou barra (/
). O significado é o seguinte:
-perm numeric-value
ou-perm symbolic-value
-
encontrar arquivos com a permissão especial exclusivamente
-perm -numeric-value
ou-perm -symbolic-value
-
encontrar arquivos com a permissão especial e outras permissões
-perm /numeric-value
ou-perm /symbolic-value
-
encontrar arquivos com qualquer uma das permissões especiais (e outras permissões)
Por exemplo, para localizar arquivos com apenas o SUID definido no diretório de trabalho atual, usaríamos o seguinte comando:
carol@debian:~$ find . -perm 4000 carol@debian:~$ touch file carol@debian:~$ chmod 4000 file carol@debian:~$ find . -perm 4000 ./file
Observe que — uma vez que não existiam arquivos contendo exclusivamente o SUID — criamos um para mostrar algumas saídas. Podemos executar o mesmo comando em notação simbólica:
carol@debian:~$ find . -perm u+s ./file
Para encontrar arquivos que correspondam ao SUID (independentemente de quaisquer outras permissões) no diretório /usr/bin/
, use um dos seguintes comandos:
carol@debian:~$ sudo find /usr/bin -perm -4000 /usr/bin/umount /usr/bin/newgrp /usr/bin/gpasswd /usr/bin/chfn /usr/bin/mount /usr/bin/passwd /usr/bin/chsh /usr/bin/sudo /usr/bin/su carol@debian:~$ sudo find /usr/bin -perm -u+s /usr/bin/umount /usr/bin/newgrp /usr/bin/gpasswd /usr/bin/chfn /usr/bin/mount /usr/bin/passwd /usr/bin/chsh /usr/bin/sudo /usr/bin/su
Se estiver procurando por arquivos no mesmo diretório com o bit SGID definido, execute find /usr/bin/ -perm -2000
ou find /usr/bin/ -perm -g+s
.
Finalmente, para encontrar arquivos com qualquer uma das duas permissões especiais definidas, adicione 4
e 2
e use /
:
carol@debian:~$ sudo find /usr/bin -perm /6000 /usr/bin/dotlock.mailutils /usr/bin/umount /usr/bin/newgrp /usr/bin/wall /usr/bin/ssh-agent /usr/bin/chage /usr/bin/dotlockfile /usr/bin/gpasswd /usr/bin/chfn /usr/bin/mount /usr/bin/passwd /usr/bin/chsh /usr/bin/expiry /usr/bin/sudo /usr/bin/bsd-write /usr/bin/crontab /usr/bin/su
Gerenciamento e validade das senhas
Como dito acima, o utilitário passwd
permite alterar nossa própria senha como um usuário regular. Além disso, com a opção -S
ou --status
podemos obter informações de status sobre nossa conta:
carol@debian:~$ passwd -S carol P 12/07/2019 0 99999 7 -1
Eis uma análise dos sete campos obtidos na saída:
carol
-
Nome de login do usuário.
P
-
Indica que o usuário possui uma senha válida (
P
); outros valores possíveis sãoL
para uma senha bloqueada eNP
para nenhuma senha. 12/07/2019
-
Data da última alteração da senha.
0
-
Idade mínima em dias (o número mínimo de dias entre mudanças de senha). Um valor de
0
significa que a senha pode ser alterada a qualquer momento. 99999
-
Idade máxima em dias (o número máximo de dias em que a senha é válida). Um valor de
99999
desabilita a expiração da senha. 7
-
Período de aviso em dias (o número de dias antes da expiração da senha em que um usuário será avisado).
-1
-
Período de inatividade da senha em dias (o número de dias inativos após a expiração da senha até que a conta seja bloqueada). Um valor de
-1
remove a inatividade de uma conta.
Além de relatar o status da conta, o comando passwd
empregado com permissão de root serve para realizar algumas manutenções básicas de conta. Ele permite bloquear e desbloquear contas, forçar um usuário a alterar sua senha no próximo login e excluir a senha de um usuário com as opções -l
, -u
, -e
e -d
, respectivamente.
Para testar essas opções, é conveniente apresentarmos o comando su
neste momento. Através do su
, você pode trocar de usuário durante uma sessão de login. Assim, por exemplo, usaríamos passwd
como root para bloquear a senha de carol
. Em seguida, mudaríamos para a conta de carol
para verificar no status da conta se a senha foi — de fato — bloqueada (L
) e não pode ser alterada. Finalmente, voltando ao usuário root, desbloqueamos a senha de carol
:
root@debian:~# passwd -l carol passwd: password expiry information changed. root@debian:~# su - carol carol@debian:~$ passwd -S carol L 05/31/2020 0 99999 7 -1 carol@debian:~$ passwd Changing password for carol. Current password: passwd: Authentication token manipulation error passwd: password unchanged carol@debian:~$ exit logout root@debian:~# passwd -u carol passwd: password expiry information changed.
Outra alternativa para bloquear e desbloquear a senha de um usuário é o comando usermod
:
- Bloquear a senha da usuária
carol
-
usermod -L carol
orusermod --lock carol
. - Desbloquear a senha da usuária
carol
-
usermod -U carol
orusermod --unlock carol
.
Note
|
Com as opções |
Além de passwd
e usermod
, o comando mais direto para lidar com senhas e validade de contas é chage
(“change age”, ou alterar idade). Como root, você pode passar para chage
a opção -l
(ou --list
) seguida por um nome de usuário para imprimir na tela a senha atual desse usuário e as informações de expiração da conta; como usuário comum, você pode ver suas próprias informações:
carol@debian:~$ chage -l carol Last password change : Aug 06, 2019 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
Quando executado sem opções e seguido apenas por um nome de usuário, chage
se comporta de maneira interativa:
root@debian:~# chage carol Changing the aging information for carol Enter the new value, or press ENTER for the default Minimum Password Age [0]: Maximum Password Age [99999]: Last Password Change (YYYY-MM-DD) [2020-06-01]: Password Expiration Warning [7]: Password Inactive [-1]: Account Expiration Date (YYYY-MM-DD) [-1]:
As opções para modificar as diferentes configurações de chage
são as seguintes:
-m days username
ou--mindays days username
-
Especifica o número mínimo de dias entre as alterações de senha (por exemplo:
chage -m 5 carol
). Um valor de0
permite que o usuário altere sua senha a qualquer momento. -M days username
ou--maxdays days username
-
Especifica o número máximo de dias em que a senha será válida (por exemplo:
chage -M 30 carol
). Para desabilitar a expiração da senha, é comum atribuir a esta opção o valor99999
. -d days username
ou--lastday days username
-
Especifica o número de dias desde que a senha foi alterada pela última vez (por exemplo:
chage -d 10 carol
). Um valor de0
força o usuário a alterar sua senha no próximo login. -W days username
ou--warndays days username
-
Especifica o número de dias em que o usuário será lembrado de que sua senha expirou.
-I days username
ou--inactive days username
-
Especifica o número de dias de inatividade após a expiração da senha (por exemplo:
chage -I 10 carol
) — o mesmo queusermod -f
ouusermod --inactive
. Transcorridos esses dias, a conta será bloqueada. Porém, se o valor for0
, a conta não será bloqueada. -E date username
ou--expiredate date username
-
Especifica a data (ou número de dias desde a época — 1º de janeiro de 1970) em que a conta será bloqueada. Normalmente é expresso no formato
AAAA-MM-DD
(por exemplo:chage -E 2050-12-13 carol
).
Note
|
Para aprender mais sobre |
Descobrindo portas abertas
Os administradores de sistema também precisam ficar de olho nas portas abertas e, para isso, existem quatro utilitários muito poderosos na maioria dos sistemas Linux: lsof
, fuser
, netstat
e nmap
. Falaremos deles nesta seção.
lsof
significa “list open files”, o que não é pouca coisa, já que — para o Linux — tudo é arquivo. Na verdade, se você digitar lsof
no terminal, aparecerá uma enorme lista de arquivos comuns, arquivos de dispositivos, sockets etc. Porém, nesta lição, vamos nos concentrar principalmente nas portas. Para imprimir a lista de todos os arquivos de rede da “Internet”, execute lsof
com a opção -i
:
root@debian:~# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME dhclient 357 root 7u IPv4 13493 0t0 UDP *:bootpc sshd 389 root 3u IPv4 13689 0t0 TCP *:ssh (LISTEN) sshd 389 root 4u IPv6 13700 0t0 TCP *:ssh (LISTEN) apache2 399 root 3u IPv6 13826 0t0 TCP *:http (LISTEN) apache2 401 www-data 3u IPv6 13826 0t0 TCP *:http (LISTEN) apache2 402 www-data 3u IPv6 13826 0t0 TCP *:http (LISTEN) sshd 557 root 3u IPv4 14701 0t0 TCP 192.168.1.7:ssh->192.168.1.4:60510 (ESTABLISHED) sshd 569 carol 3u IPv4 14701 0t0 TCP 192.168.1.7:ssh->192.168.1.4:60510 (ESTABLISHED)
Além do serviço bootpc
— que é usado pelo DHCP — a saída mostra dois serviços ouvindo conexões — ssh
e o servidor web Apache (http
) — bem como duas conexões SSH estabelecidas. Podemos especificar um determinado host com a notação @ip-address
para verificar suas conexões:
root@debian:~# lsof -i@192.168.1.7 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 557 root 3u IPv4 14701 0t0 TCP 192.168.1.7:ssh->192.168.1.4:60510 (ESTABLISHED) sshd 569 carol 3u IPv4 14701 0t0 TCP 192.168.1.7:ssh->192.168.1.4:60510 (ESTABLISHED)
Note
|
Para imprimir apenas os arquivos de rede IPv4 e IPv6, use as opções |
Da mesma forma, é possível filtrar por porta, passando para a opção -i
(ou -i@ip-address
) o argumento :port
:
root@debian:~# lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 389 root 3u IPv4 13689 0t0 TCP *:ssh (LISTEN) sshd 389 root 4u IPv6 13700 0t0 TCP *:ssh (LISTEN) sshd 557 root 3u IPv4 14701 0t0 TCP 192.168.1.7:ssh->192.168.1.4:60510 (ESTABLISHED) sshd 569 carol 3u IPv4 14701 0t0 TCP 192.168.1.7:ssh->192.168.1.4:60510 (ESTABLISHED)
Ao incluir mais de uma porta, nós as separamos com vírgulas (os intervalos são especificados com um traço):
root@debian:~# lsof -i@192.168.1.7:22,80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 705 root 3u IPv4 13960 0t0 TCP 192.168.1.7:ssh->192.168.1.4:44766 (ESTABLISHED) sshd 718 carol 3u IPv4 13960 0t0 TCP 192.168.1.7:ssh->192.168.1.4:44766 (ESTABLISHED)
Note
|
O |
O próximo na lista de comandos de rede é fuser
. Seu propósito principal é encontrar um “usuário do arquivo” — o que envolve saber quais processos estão acessando quais arquivos; ele também fornece algumas outras informações, como o tipo de acesso. Por exemplo, para verificar o diretório de trabalho atual, basta executar fuser .
. Mas quando precisamos de mais informações, é aconselhável usar a opção verbose (-v
ou --verbose
):
root@debian:~# fuser . /root: 580c root@debian:~# fuser -v . USER PID ACCESS COMMAND /root: root 580 ..c.. bash
Vamos detalhar a saída:
- Arquivo
-
O arquivo sobre o qual estamos obtendo informações (
/root
). - Coluna
USER
-
O proprietário do arquivo (
root
). - Coluna
PID
-
O identificador do processo (
580
). - Coluna
ACCESS
-
Tipo de acesso (
..c..
). Ele pode ser:c
-
Diretório atual.
e
-
Executável em execução.
f
-
Arquivo aberto (omitido no modo de exibição padrão).
F
-
Arquivo aberto para escrita (omitido no modo de exibição padrão).
r
-
Diretório raiz.
m
-
Arquivo mmap ou biblioteca compartilhada.
.
-
Espaço reservado (omitido no modo de exibição padrão).
- Coluna
COMMAND
-
O comando afiliado ao arquivo (
bash
).
Com a opção -n
(ou --namespace
), podemos encontrar informações sobre portas/sockets de rede. Também é necessário fornecer o protocolo de rede e o número da porta. Assim, para obter informações sobre o servidor web Apache, o comando seria o seguinte:
root@debian:~# fuser -vn tcp 80 USER PID ACCESS COMMAND 80/tcp: root 402 F.... apache2 www-data 404 F.... apache2 www-data 405 F.... apache2
Note
|
|
Vamos olhar o netstat
agora. O netstat
é uma ferramenta de rede muito versátil usada principalmente para imprimir “estatísticas de rede”.
Executado sem opções, netstat
exibe as conexões ativas da Internet e os sockets Unix. Devido ao tamanho da lista, vale a pena canalizar a saída para less
:
carol@debian:~$ netstat |less Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 192.168.1.7:ssh 192.168.1.4:55444 ESTABLISHED Active UNIX domain sockets (w/o servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ] DGRAM 10509 /run/systemd/journal/syslog unix 3 [ ] DGRAM 10123 /run/systemd/notify (...)
Para listar apenas as portas e sockets “ouvintes”, usamos as opções -l
ou --listening
. As opções -t
/--tcp
e -u
/--udp
podem ser adicionadas para filtrar pelos protocolos TCP e UDP, respectivamente (elas também podem ser combinadas no mesmo comando). Da mesma forma, `-e
/--extend
exibe informações adicionais:
carol@debian:~$ netstat -lu Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 0.0.0.0:bootpc 0.0.0.0:* carol@debian:~$ netstat -lt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN tcp6 0 0 [::]:http [::]:* LISTEN tcp6 0 0 [::]:ssh [::]:* LISTEN tcp6 0 0 localhost:smtp [::]:* LISTEN carol@debian:~$ netstat -lute Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN root 13729 tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN root 14372 tcp6 0 0 [::]:http [::]:* LISTEN root 14159 tcp6 0 0 [::]:ssh [::]:* LISTEN root 13740 tcp6 0 0 localhost:smtp [::]:* LISTEN root 14374 udp 0 0 0.0.0.0:bootpc 0.0.0.0:* root 13604
Se você omitir a opção -l
, apenas as conexões estabelecidas serão mostradas:
carol@debian:~$ netstat -ute Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode tcp 0 0 192.168.1.7:ssh 192.168.1.4:39144 ESTABLISHED root 15103
Se você está interessado apenas em informações numéricas sobre portas e hosts, pode usar a opção -n
or --numeric
para imprimir apenas os números de portas e endereços IP. Note como ssh
se transforma em 22
ao adicionarmos -n
ao comando acima:
carol@debian:~$ netstat -uten Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode tcp 0 0 192.168.1.7:22 192.168.1.4:39144 ESTABLISHED 0 15103
Como vemos, é possível tornar os comandos netstat
muito úteis e produtivos combinando algumas de suas opções. Navegue pelas páginas de manual para aprender mais e encontrar as combinações que melhor atendem às suas necessidades.
Finalmente, vamos falar do nmap
— ou “mapeador de rede”. Poderosíssimo, este scanner de porta é executado especificando-se um endereço IP ou nome de host:
root@debian:~# nmap localhost Starting Nmap 7.70 ( https://nmap.org ) at 2020-06-04 19:29 CEST Nmap scan report for localhost (127.0.0.1) Host is up (0.0000040s latency). Other addresses for localhost (not scanned): ::1 Not shown: 998 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 1.58 seconds
Além de um host único, o nmap
permite escanear:
- Múltiplos hosts
-
separando-os com espaços (p. ex.:
nmap localhost 192.168.1.7
). - Intervalos de hosts
-
usando um traço (p. ex.:
nmap 192.168.1.3-20
). - subredes
-
usando um curinga ou notação CIDR (p. ex.:
nmap 192.168.1.*
ounmap 192.168.1.0/24
). Podemos excluir determinados hosts (p. ex.:nmap 192.168.1.0/24 --exclude 192.168.1.7
).
Para escanear uma porta específica, use a opção -p
seguida pelo número da porta ou nome do serviço (nmap -p 22
e nmap -p ssh
terão a mesma saída):
root@debian:~# nmap -p 22 localhost Starting Nmap 7.70 ( https://nmap.org ) at 2020-06-04 19:54 CEST Nmap scan report for localhost (127.0.0.1) Host is up (0.000024s latency). Other addresses for localhost (not scanned): ::1 PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds
Também podemos escanear várias portas ou intervalos de portas usando vírgulas e travessões, respectivamente:
root@debian:~# nmap -p ssh,80 localhost Starting Nmap 7.70 ( https://nmap.org ) at 2020-06-04 19:58 CEST Nmap scan report for localhost (127.0.0.1) Host is up (0.000051s latency). Other addresses for localhost (not scanned): ::1 PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds
root@debian:~# nmap -p 22-80 localhost Starting Nmap 7.70 ( https://nmap.org ) at 2020-06-04 19:58 CEST Nmap scan report for localhost (127.0.0.1) Host is up (0.000011s latency). Other addresses for localhost (not scanned): ::1 Not shown: 57 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 1.47 seconds
Duas outras opções importantes e úteis do nmap
são:
-F
-
Executar um escaneamento rápido das 100 portas mais comuns.
-v
-
Obter uma saída detalhada (
-vv
imprime uma saída mais detalhada ainda).
Note
|
O |
Limites em logins de usuário, processos e uso de memória
Os recursos de um sistema Linux não são ilimitados, e portanto — como administrador do sistema — você deve garantir um bom equilíbrio entre os limites do usuário no uso dos recursos e o funcionamento adequado do sistema operacional. O ulimit
pode ajudá-lo nesse aspecto.
O ulimit
lida com os limites soft (flexíveis) e hard (rígidos) — especificados pelas opções -S
e -H
, respectivamente. Quando executado sem opções ou argumentos, o ulimit
exibe os blocos de arquivos flexíveis do usuário atual:
carol@debian:~$ ulimit unlimited
Com a opção -a
, o ulimit
mostra todos os limites flexíveis atuais (o mesmo que -Sa
); para exibir todos os limites rígidos atuais, use -Ha
:
carol@debian:~$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 (...) carol@debian:~$ ulimit -Ha core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 (...)
Os recursos de shell disponíveis são especificados por opções como:
-b
-
Tamanho máximo do buffer do socket
-f
-
tamanho máximo dos arquivos escritos pelo shell e seus processos-filhos
-l
-
tamanho máximo da memória que pode ser bloqueada
-m
-
tamanho máximo do conjunto residente (RSS, resident set size) — a porção atual da memória mantida por um processo na memória principal (RAM)
-v
-
quantidade máxima de memória virtual
-u
-
número máximo de processos disponíveis para um único usuário
Assim, para exibir os limites, usaríamos ulimit
seguido por -S
(soft) ou -H
(hard) e a opção referente ao recurso; se nenhum -S
ou -H
for fornecido, os limites flexíveis (soft) serão mostrados:
carol@debian:~$ ulimit -u 10000 carol@debian:~$ ulimit -Su 10000 carol@debian:~$ ulimit -Hu 15672
Da mesma maneira, para definir novos limites para um recurso determinado, especificamos -S
ou -H
seguidos pela opção de recurso desejada e o novo valor. Esse valor pode ser um número ou as palavras especiais soft
(limite flexível atual), hard
(limite rígido atual) ou unlimited
(sem limite). Se nem -S
nem -H
forem especificados, ambos os limites serão definidos. Por exemplo, vamos primeiro ler o valor do tamanho máximo atual para os arquivos gravados pelo shell e seus filhos:
root@debian:~# ulimit -Sf unlimited root@debian:~# ulimit -Hf unlimited
Agora, vamos alterar o valor de unlimited
para 500
sem especificar -S
ou -H
. Observe como os limites flexíveis e rígidos são alterados:
root@debian:~# ulimit -f 500 root@debian:~# ulimit -Sf 500 root@debian:~# ulimit -Hf 500
Por fim, diminuímos apenas o limite flexível para blocos de 200
:
root@debian:~# ulimit -Sf 200 root@debian:~# ulimit -Sf 200 root@debian:~# ulimit -Hf 500
Os limites rígidos só podem ser aumentados pelo usuário root. Por outro lado, os usuários comuns podem diminuir os limites rígidos e aumentar os limites flexíveis até o valor dos limites rígidos. Para tornar persistentes os novos valores de limites após a reinicialização, eles devem ser gravados no arquivo /etc/security/limits.conf
. Este também é o arquivo usado pelo administrador para aplicar restrições a usuários específicos.
Note
|
Saiba que não existe uma página de manual para |
Lidando com usuários conectados
Outra de suas funções como administrador do sistema envolve manter o controle dos usuários conectados. Há três utilitários que podem ajudá-lo com essas tarefas: last
, who
e w
.
O last
imprime uma lista dos últimos usuários logados, com as informações mais recentes no topo:
root@debian:~# last carol pts/0 192.168.1.4 Sat Jun 6 14:25 still logged in reboot system boot 4.19.0-9-amd64 Sat Jun 6 14:24 still running mimi pts/0 192.168.1.4 Sat Jun 6 12:07 - 14:24 (02:16) reboot system boot 4.19.0-9-amd64 Sat Jun 6 12:07 - 14:24 (02:17) (...) wtmp begins Sun May 31 14:14:58 2020
Considerando a listagem truncada, obtemos informações sobre os dois últimos usuários do sistema. As duas primeiras linhas trazem informações sobre a usuária carol
; as duas linhas seguintes, sobre a usuária mimi
. As informações são as seguintes:
-
A usuária
carol
, no terminalpts/0
do host192.168.1.4
, iniciou sua sessão emSat Jun 6
(sábado, 6 de junho) às14:25
e estástill logged in
(ainda logada). O sistema — usando o kernel4.19.0-9-amd64
— foi iniciado (reboot system boot
) emSat Jun 6
(sábado, 6 de junho) às14:24
e estástill running
(ainda em execução). -
A usuária
mimi
, no terminalpts/0
do host192.168.1.4
, iniciou sua sessão emSat Jun 6
(sábado, 6 de junho) às12:07
e se desconectou às14:24
(a sessão durou um total de(02:16)
horas). O sistema — usando o kernel4.19.0-9-amd64
— foi iniciado (reboot system boot
) emSat Jun 6
(sábado, 6 de junho) às12:07
e desligado às14:24
(tendo estado ativo por(02:17)
horas).
Note
|
A linha |
Podemos passar um nome de usuário a last
para ver apenas as entradas referentes a ele:
root@debian:~# last carol carol pts/0 192.168.1.4 Sat Jun 6 14:25 still logged in carol pts/0 192.168.1.4 Sat Jun 6 12:07 - 14:24 (02:16) carol pts/0 192.168.1.4 Fri Jun 5 00:48 - 01:28 (00:39) (...)
Em relação à segunda coluna (terminal), pts
significa Pseudo Terminal Slave — em oposição a um terminal TeleTYpewriter ou tty
; 0
refere-se ao primeiro (a contagem começa em zero).
Note
|
Para verificar se há tentativas de login incorretas, execute |
Os utilitários who
e w
concentram-se nos usuários atualmente logados e são bastante semelhantes. O primeiro exibe quem está conectado, ao passo que o último também exibe informações sobre o que eles estão fazendo.
Quando executado sem opções, o who
exibe quatro colunas correspondentes ao usuário conectado, terminal, data e hora e nome do host:
root@debian:~# who carol pts/0 2020-06-06 17:16 (192.168.1.4) mimi pts/1 2020-06-06 17:28 (192.168.1.4)
O who
aceita uma série de opções, dentre as quais podemos destacar as seguintes:
-b
,--boot
-
Exibe a hora da última inicialização do sistema.
-r
,--runlevel
-
Mostra o nível de execução atual.
-H
,--heading
-
Imprime o cabeçalho das colunas.
Comparado ao who
, o w
fornece uma saída um pouco mais detalhada:
root@debian:~# w 17:56:12 up 40 min, 2 users, load average: 0.04, 0.12, 0.09 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT carol pts/0 192.168.1.4 17:16 1.00s 0.15s 0.05s sshd: carol [priv] mimi pts/1 192.168.1.4 17:28 15:08 0.05s 0.05s -bash
A linha superior fornece informações sobre a hora atual (17:56:12
), há quanto tempo o sistema está ativo (up 40 min
), o número de usuários atualmente logados (2 users
) e os números médios de carga (load average: 0.04, 0.12, 0.09
). Esses valores referem-se ao número médio de trabalhos na fila de execução nos últimos 1, 5 e 15 minutos, respectivamente.
Vêm em seguida oito colunas; elas se dividem desta forma:
USER
-
Nome de login do usuário.
TTY
-
Nome do terminal em que o usuário está.
FROM
-
Host remoto a partir do qual o usuário se logou.
LOGIN@
-
Tempo de login.
IDLE
-
Tempo ocioso.
JCPU
-
Tempo usado por todos os processos ligados ao tty (incluindo os trabalhos atualmente em execução em segundo plano).
PCPU
-
Tempo usado pelo processo atual (que aparece sob
WHAT
). WHAT
-
Linha de comando do processo atual.
Como no caso do who
, podemos passar nomes de usuários ao w
:
root@debian:~# w mimi 18:23:15 up 1:07, 2 users, load average: 0.00, 0.02, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT mimi pts/1 192.168.1.4 17:28 9:23 0.06s 0.06s -bash
Configuração e uso básicos do sudo
Como já observado nesta lição, su
permite alternar para qualquer outro usuário no sistema, desde que você forneça a senha do usuário de destino. No caso do usuário root, ter sua senha distribuída ou conhecida por (muitos) usuários põe o sistema em risco e é uma péssima prática de segurança. O uso básico de su
é su - nome-de-usuário
. Ao alternar para root, porém, o nome de usuário de destino é opcional:
carol@debian:~$ su - root Password: root@debian:~# exit logout carol@debian:~$ su - Password: root@debian:~#
O uso do traço (-
) garante que o ambiente do usuário de destino seja carregado. Sem ele, será mantido o ambiente do antigo usuário:
carol@debian:~$ su Password: root@debian:/home/carol#
Por outro lado, existe o comando sudo
. Com ele, é possível executar um comando como usuário root — ou qualquer outro usuário. Do ponto de vista da segurança, sudo
é uma opção muito melhor do que su
, pois apresenta duas vantagens principais:
-
para executar um comando como root, você não precisa da senha do usuário root, mas apenas a do usuário atual, em conformidade com uma política de segurança. A política de segurança padrão é
sudoers
, especificada em/etc/sudoers
e/etc/sudoers.d/*
. -
O
sudo
permite executar comandos simples com privilégios elevados em vez de lançar um novo subshell para root, como fariasu
.
O uso básico de sudo
é sudo -u target-username command
. Porém, para executar um comando como usuário root, a opção -u target-username
não é necessária:
carol@debian:~$ sudo -u mimi whoami mimi carol@debian:~$ sudo whoami root
Note
|
O |
O arquivo /etc/sudoers
O arquivo de configuração principal do sudo
é /etc/sudoers
(também existe o diretório /etc/sudoers.d
). É ali que os privilégios de sudo
dos usuários são determinados. Em outras palavras, aqui você especifica quem pode executar quais comandos, sob quais nomes de usuário e em quais máquinas — bem como outras configurações. A sintaxe usada é a seguinte:
carol@debian:~$ sudo less /etc/sudoers (...) # User privilege specification root ALL=(ALL:ALL) ALL # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL (...)
A especificação de privilégio para o usuário root é ALL=(ALL:ALL) ALL
. Isso se traduz assim: o usuário root (root
) pode se logar com todos os hosts (ALL
), em nome de todos os usuários e todos os grupos ((ALL:ALL)
), além de executar todos os comandos (ALL
). O mesmo vale para os membros do grupo sudo
— note como os nomes de grupos são identificados com um símbolo de porcentagem (%
).
Assim, para que a usuária carol
seja capaz de verificar o status de apache2
de qualquer host em nome de qualquer usuário ou grupo, adicionaríamos a seguinte linha ao arquivo sudoers
:
carol ALL=(ALL:ALL) /usr/bin/systemctl status apache2
Para evitar a carol
o incômodo de precisar fornecer sua senha para executar o comando systemctl status apache2
, modificamos a linha desta maneira:
carol ALL=(ALL:ALL) NOPASSWD: /usr/bin/systemctl status apache2
Digamos que agora você queira restringir seus hosts a 192.168.1.7 e permitir que carol
execute systemctl status apache2
no nome da usuária mimi
. A linha teria de ser modificada desta forma:
carol 192.168.1.7=(mimi) /usr/bin/systemctl status apache2
Vamos então verificar o status do servidor web Apache como a usuária mimi
:
carol@debian:~$ sudo -u mimi systemctl status apache2 ● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2020-06-09 13:12:19 CEST; 29min ago (...)
Se carol
fosse promovida a sysadmin e você quisesse conceder a ela todos os privilégios, a maneira mais fácil seria incluí-la no grupo especial sudo
com usermod
e a opção -G
(e talvez também a opção -a
, que garante que o usuário não seja removido de nenhum outro grupo ao qual possa pertencer):
root@debian:~# sudo useradd -aG sudo carol
Note
|
Na família de distribuições Red Hat , o grupo |
Em vez de editar /etc/sudoers
diretamente, use simplesmente o comando visudo
como root (p. ex. visudo
), que abre /etc/sudoers
usando o editor de texto predefinido. Para alterar o editor de texto padrão, adicione a opção editor
como configuração de Defaults
em /etc/sudoers
. Assim, por exemplo, para mudar o editor para nano
, a linha seria a seguinte:
Defaults editor=/usr/bin/nano
Note
|
Outra alternativa é especificar um editor de texto por meio da variável de ambiente |
Além dos usuários e grupos, também podemos utilizar aliases em /etc/sudoers
. É possível definir três categorias principais de aliases: aliases de host (Host_Alias
), aliases de usuário (User_Alias
) e aliases de comando (Cmnd_Alias
). Eis um exemplo:
# Host alias specification Host_Alias SERVERS = 192.168.1.7, server1, server2 # User alias specification User_Alias REGULAR_USERS = john, mary, alex User_Alias PRIVILEGED_USERS = mimi, alex User_Alias ADMINS = carol, %sudo, PRIVILEGED_USERS, !REGULAR_USERS # Cmnd alias specification Cmnd_Alias SERVICES = /usr/bin/systemctl * # User privilege specification root ALL=(ALL:ALL) ALL ADMINS SERVERS=SERVICES # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL
A partir deste arquivo sudoers
de amostra, vamos explicar os três tipos de aliases com um pouco mais de detalhes:
- Aliases de host
-
Incluem uma lista separada por vírgulas de nomes de host, endereços IP, redes e grupos de rede (precedidos por
+
). Máscaras de rede também podem estar especificadas. O alias de hostSERVERS
inclui um endereço IP e dois nomes de host:Host_Alias SERVERS = 192.168.1.7, server1, server2
- Aliases de usuário
-
Incluem uma lista separada por vírgulas de usuários especificados como nomes de usuários, grupos (precedidos por
%
) e grupos de rede (precedidos por+
). Para excluir usuários específicos, usamos!
. O alias de usuárioADMINS
— por exemplo — inclui a usuáriacarol
, os membros do gruposudo
e os membros do alias de usuárioPRIVILEGE_USERS
que não pertencem ao alias de usuárioREGULAR_USERS
:User_Alias ADMINS = carol, %sudo, PRIVILEGED_USERS, !REGULAR_USERS
- Aliases de comando
-
Incluem uma lista separada por vírgulas de comandos e diretórios. Se um diretório for especificado, qualquer arquivo que esteja nesse diretório será incluído — mas os subdiretórios serão ignorados. O alias do comando
SERVICES
inclui um único comando com todos os seus subcomandos — conforme especificado pelo asterisco (*
):Cmnd_Alias SERVICES = /usr/bin/systemctl *
Como resultado das especificações de alias, a linha ADMINS SERVERS=SERVICES
na seção User privilege specification
é traduzida como: todos os usuários pertencentes a ADMINS
podem usar sudo
para executar qualquer comando em SERVICES
em qualquer servidor em SERVERS
.
Note
|
Existe um quarto tipo de alias que pode ser incluído em |
Exercícios Guiados
-
Preencha a seguinte tabela com relação às permissões especiais::
Permissão especial Representação Numérica Representação Simbólica Encontrar arquivos com somente esse conjunto de permissões SUID
SGID
-
Exibir arquivos com somente o conjunto de bits
SUID
ouSGID
normalmente não é muito prático. Execute as seguintes tarefas para demonstrar que suas buscar podem ser mais produtivas:-
Encontre todos os arquivos com o
SUID
(e outras permissões) definido em/usr/bin
: -
Encontre todos os arquivos com o
SGID
(e outras permissões) definido em/usr/bin
: -
Encontre todos os arquivos com
SUID
ouSGID
definido em/usr/bin
:
-
-
O
chage
permite alterar as informações de expiração de senha de um usuário. Como root, complete a seguinte tabela, fornecendo os comandos corretos para o usuáriomary
:Significado Comandos chage
Faça a senha ser válida por 365 dias.
Faça o usuário alterar a senha no próximo login.
Defina o número mínimo de dias entre as alterações de senha para 1.
Desative a expiração da senha.
Permita que o usuário altere sua senha a qualquer momento.
Defina o período de aviso para 7 dias e a data de expiração da conta para 20 de agosto de 2050.
Imprima as informações de validade da senha atual do usuário.
-
Preencha a seguinte tabela com o utilitário de rede apropriado:
Ação Comando(s) Mostrar os arquivos de rede do host
192.168.1.55
na porta22
usandolsof
.Mostrar os processos que acessam a porta padrão do servidor web Apache em sua máquina com
fuser
.Listar todos os sockets udp ouvintes em sua máquina usando
netstat
.Escanear as portas
80
até443
no host192.168.1.55
usandonmap
. -
Execute as seguintes tarefas relativas ao tamanho do conjunto residente (RSS) e
ulimit
como um usuário regular:-
Exiba os limites flexíveis do RSS máximo:
-
Exiba os limites rígidos do RSS máximo:
-
Defina os limites flexíveis do RSS máximo para 5.000 kilobytes:
-
Defina os limites rígidos do RSS máximo para 10.000 kilobytes:
-
Finalmente, tente aumentar o limite rígido do RSS máximo para 15.000 kilobytes. Você conseguiu? Por quê?
-
-
Considere a seguinte linha de saída de comando
last
e responda às perguntas:carol pts/0 192.168.1.4 Sun May 31 14:16 - 14:22 (00:06)
-
carol
estava conectada a partir de um host remoto? Por quê? -
Quanto tempo durou a sessão de
carol
? -
carol
estava conectada através de um terminal de texto clássico? Por quê?
-
-
Analise o seguinte trecho de
/etc/sudoers
e responda à questão abaixo.# Host alias specification Host_Alias SERVERS = 192.168.1.7, server1, server2 # User alias specification User_Alias REGULAR_USERS = john, mary, alex User_Alias PRIVILEGED_USERS = mimi, alex User_Alias ADMINS = carol, %sudo, PRIVILEGED_USERS, !REGULAR_USERS # Cmnd alias specification Cmnd_Alias WEB_SERVER_STATUS = /usr/bin/systemctl status apache2 # User privilege specification root ALL=(ALL:ALL) ALL ADMINS SERVERS=WEB_SERVER_STATUS # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL
alex
pode verificar o status do servidor web Apache em qualquer host? Por quê?
Exercícios Exploratórios
-
Além de
SUID
eSGID
, existe uma terceira permissão especial: o sticky bit. No momento, ele é usado principalmente em diretórios como/tmp
para evitar que usuários regulares excluam ou movam arquivos que não sejam seus. Realize as seguintes tarefas:-
Defina o sticky bit em
~/temporal
: -
Encontre diretórios com o sticky bit (e quaisquer outras permissões) definidas em seu diretório inicial:
-
Remova o sticky bit de
~/temporal
:
-
-
Quando a senha de um usuário é bloqueada via
passwd -l username
ouusermod -L username
, como é possível saber disso olhando em/etc/shadow
? -
Qual o equivalente do comando
usermod
parachage -E date username
ouchage --expiredate date username
? -
Forneça dois comandos
nmap
diferentes para escanear todas as 65535 no host local:
Resumo
Nesta lição, você aprendeu a executar diversas tarefas de administração ligadas à segurança. Os seguintes tópicos foram abordados:
-
Encontrar arquivos com as permissões especiais
SUID
eSGID
definidas. -
Definir e alterar as senhas dos usuários e lidar com as informações de validade da senha.
-
Usar diversos utilitários de rede para encontrar portas abertas em hosts/redes.
-
Configurar limites nos recursos do sistema.
-
Verificar os usuários que se logaram ao sistema ou que estão atualmente logados.
-
Uso e configuração básica de
sudo
(através do arquivo/etc/sudoers
).
Comandos e arquivos discutidos nesta lição:
find
-
Buscar arquivos em uma hierarquia de diretórios.
passwd
-
Trocar a senha de usuário.
chmod
-
Alterar os bits de modo do arquivo.
chage
-
Alterar as informações de expiração da senha de usuário.
lsof
-
Listar os arquivos abertos.
fuser
-
Identificar os processos que estão usando arquivos ou sockets.
netstat
-
Exibir as conexões de rede.
nmap
-
Ferramenta de exploração de rede e scanner de portas.
ulimit
-
Obter e definir os limites do usuário.
/etc/security/limits.conf
-
Arquivo de configuração para aplicar restrições a usuários.
last
-
Imprimir uma lista dos últimos usuários logados.
lastb
-
Imprimir uma lista de tentativas de login incorretas.
/var/log/wtmp
-
Banco de dados de logins de usuários.
who
-
Mostrar quem está logado.
w
-
Mostrar quem está logado e o que estão fazendo.
su
-
Trocar usuário ou entrar como superusuário.
sudo
-
Executar um comando como outro usuário (incluindo o superusuário).
/etc/sudoers
-
Arquivo de configuração padrão para a política de segurança de
sudo
.
Respostas aos Exercícios Guiados
-
Preencha a seguinte tabela com relação às permissões especiais::
Permissão especial Representação Numérica Representação Simbólica Encontrar arquivos com somente esse conjunto de permissões SUID
4000
s
,S
find -perm 4000
,find -perm u+s
SGID
2000
s
,S
find -perm 2000
,find -perm g+s
-
Exibir arquivos com somente o conjunto de bits
SUID
ouSGID
normalmente não é muito prático. Execute as seguintes tarefas para demonstrar que suas buscar podem ser mais produtivas:-
Encontre todos os arquivos com o
SUID
(e outras permissões) definido em/usr/bin
:find /usr/bin -perm -4000
orfind /usr/bin -perm -u+s
-
Encontre todos os arquivos com o
SGID
(e outras permissões) definido em/usr/bin
:find /usr/bin -perm -2000
orfind /usr/bin -perm -g+s
-
Encontre todos os arquivos com
SUID
ouSGID
definido em/usr/bin
:find /usr/bin -perm /6000
-
-
O
chage
permite alterar as informações de expiração de senha de um usuário. Como root, complete a seguinte tabela, fornecendo os comandos corretos para o usuáriomary
:Significado Comandos chage
Faça a senha ser válida por 365 dias.
chage -M 365 mary
,chage --maxdays 365 mary
Faça o usuário alterar a senha no próximo login.
chage -d 0 mary
,chage --lastday 0 mary
Defina o número mínimo de dias entre as alterações de senha para 1.
chage -m 1 mary
,chage --mindays 1 mary
Desative a expiração da senha.
chage -M 99999 mary
,chage --maxdays 99999 mary
Permita que o usuário altere sua senha a qualquer momento.
chage -m 0 mary
,chage --mindays 0 mary
Defina o período de aviso para 7 dias e a data de expiração da conta para 20 de agosto de 2050.
chage -W 7 -E 2050-08-20 mary
,chage --warndays 7 --expiredate 2050-08-20 mary
Imprima as informações de validade da senha atual do usuário.
chage -l mary
,chage --list mary
-
Preencha a seguinte tabela com o utilitário de rede apropriado:
Ação Comando(s) Mostrar os arquivos de rede do host
192.168.1.55
na porta22
usandolsof
.lsof -i@192.168.1.55:22
Mostrar os processos que acessam a porta padrão do servidor web Apache em sua máquina com
fuser
.fuser -vn tcp 80
,fuser --verbose --namespace tcp 80
Listar todos os sockets udp ouvintes em sua máquina usando
netstat
.netstat -lu
,netstat --listening --udp
Escanear as portas
80
até443
no host192.168.1.55
usandonmap
.nmap -p 80-443 192.168.1.55
-
Execute as seguintes tarefas relativas ao tamanho do conjunto residente (RSS) e
ulimit
como um usuário regular:-
Exiba os limites flexíveis do RSS máximo:
ulimit -m
,ulimit -Sm
-
Exiba os limites rígidos do RSS máximo:
ulimit -Hm
-
Defina os limites flexíveis do RSS máximo para 5.000 kilobytes:
ulimit -Sm 5000
-
Defina os limites rígidos do RSS máximo para 10.000 kilobytes:
ulimit -Hm 10000
-
Finalmente, tente aumentar o limite rígido do RSS máximo para 15.000 kilobytes. Você conseguiu? Por quê?
Não. Uma vez definido, os usuários comuns não podem aumentar os limites rígidos.
-
-
Considere a seguinte linha de saída de comando
last
e responda às perguntas:carol pts/0 192.168.1.4 Sun May 31 14:16 - 14:22 (00:06)
-
carol
estava conectada a partir de um host remoto? Por quê?Sim, o endereço IP do host remoto está na terceira coluna.
-
Quanto tempo durou a sessão de
carol
?Seis minutos (como mostrado na última coluna).
-
carol
estava conectada através de um terminal de texto clássico? Por quê?Não,
pts/0
na segunda coluna indica que a conexão foi feita por meio de um emulador de terminal gráfico (ou Pseudo Terminal Slave).
-
-
Analise o seguinte trecho de
/etc/sudoers
e responda à questão abaixo.# Host alias specification Host_Alias SERVERS = 192.168.1.7, server1, server2 # User alias specification User_Alias REGULAR_USERS = john, mary, alex User_Alias PRIVILEGED_USERS = mimi, alex User_Alias ADMINS = carol, %sudo, PRIVILEGED_USERS, !REGULAR_USERS # Cmnd alias specification Cmnd_Alias WEB_SERVER_STATUS = /usr/bin/systemctl status apache2 # User privilege specification root ALL=(ALL:ALL) ALL ADMINS SERVERS=WEB_SERVER_STATUS # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL
alex
pode verificar o status do servidor web Apache em qualquer host? Por quê?Não, pois ele é membro de
REGULAR_USERS
e esse grupo de usuários está excluído deADMINS
, que são os únicos usuários (além decarol
, dos membros do gruposudo
e deroot
) que podem executarsystemctl status apache2
nosSERVERS
.
Respostas aos Exercícios Exploratórios
-
Além de
SUID
eSGID
, existe uma terceira permissão especial: o sticky bit. No momento, ele é usado principalmente em diretórios como/tmp
para evitar que usuários regulares excluam ou movam arquivos que não sejam seus. Realize as seguintes tarefas:-
Defina o sticky bit em
~/temporal
:chmod +t temporal
,chmod 1755 temporal
-
Encontre diretórios com o sticky bit (e quaisquer outras permissões) definidas em seu diretório inicial:
find ~ -perm -1000
,find ~ -perm /1000
-
Remova o sticky bit de
~/temporal
:chmod -t temporal
,chmod 0755 temporal
-
-
Quando a senha de um usuário é bloqueada via
passwd -l username
ouusermod -L username
, como é possível saber disso olhando em/etc/shadow
?Um ponto de exclamação aparecerá no segundo campo, logo após o nome de login do usuário afetado (p. ex.:
mary:!$6$gOg9xJgv…
). -
Qual o equivalente do comando
usermod
parachage -E date username
ouchage --expiredate date username
?usermod -e date username
,usermod --expiredate date username
-
Forneça dois comandos
nmap
diferentes para escanear todas as 65535 no host local:nmap -p 1-65535 localhost
enmap -p- localhost