Peso: 4
TCP wrappers
Daemons de serviços de rede compilados com suporte à biblioteca libwrap podem utilizar-se do mecanismo chamado TCP wrappers para controlar o acesso por hosts na rede. Esse controle é estabelecido através de regras criadas nos arquivos /etc/hosts.allow e /etc/hosts.deny. O arquivo /etc/hosts.allow contém as regras para os hosts que poderão acessar a máquina local. Se um host corresponder a uma regra em /etc/hosts.allow, o mesmo será liberado e o arquivo /etc/hosts.deny não será consultado.
O arquivo /etc/hosts.deny contém as regras para os hosts que não poderão acessar a máquina local. Se um host não constar em /etc/hosts.allow nem em /etc/hosts.deny, o mesmo será liberado.
Cada regra é escrita em uma linha e o formato é o mesmo tanto para /etc/hosts.allow quanto para /etc/hosts.deny:
serviço : host : comando | | | | | `--> Executar comando no | | caso de cumprimento | | da regra (opcional) | | | `--> Um ou mais endereços ou | instruções especiais | `--> Um ou mais nomes de daemon de serviço ou instruções especiais
Hosts podem vir na forma de domínios, IPs de rede ou IPs incompletos. Caracteres coringa “?” e “*” podem ser utilizados.
Instruções especiais são ALL, LOCAL, KNOW, UNKNOW E PARANOID. O operador EXCEPT exclui um host ou grupo hosts de uma determinada regra.
Em /etc/hosts.allow, liberar todos os serviços a todos os hosts da rede 192.168.1.0 com exceção do 192.168.1.20:
ALL: 192.168.1.* EXCEPT 192.168.1.20
Bloquear todos os serviços a todo host que não constar em regra de /etc/hosts.allow, em /etc/hosts.deny:
ALL: ALL
A documentação completa para a criação de regras pode ser encontrada na página manual hosts_access(5).
Tópico 114: Segurança
SUID/SGID
Arquivos com permissão SUID e SGID garantem privilégios especiais a quem os executa. Portanto, é importante monitorar quais arquivos detém essas permissões para evitar que programas estranhos ou alterações nos programas conhecidos com essa permissão possam possibilitar a invasão ou dano ao sistema.
Encontrar arquivos SUID e SGID com o find:
# find / -perm -4000 -or -perm -2000 /bin/su /bin/ping /bin/mount /bin/ping6 /bin/umount (...)
Para gerar uma lista detalhada, passar a saída para o comando ls:
# find / \( -perm -4000 -or -perm -2000 \) -exec ls -l '{}' \; -rws--x--x 1 root bin 35780 2004-06-21 16:20 /bin/su
-rws--x--x 1 root bin 29364 2005-09-07 17:46 /bin/ping -rwsr-xr-x 1 root bin 61308 2005-09-13 01:42 /bin/mount -rws--x--x 1 root bin 26764 2005-09-07 17:46 /bin/ping6 -rwsr-xr-x 1 root bin 32212 2005-09-13 01:42 /bin/umount (...)
Essa lista pode ser salva diariamente (provavelmente por um agendamento no crontab) através do comando:
# find / \( -perm -4000 -or -perm -2000 \) \ -exec ls -l '{}' \; > /var/log/setuid-$(date +%F)
Que gerará um arquivo de nome setuid-ano-mês-dia, que poderá ser comparado ao arquivo do dia anterior através do comando diff:
# diff /var/log/setuid-2006-05-02 /var/log/setuid-2006-05-03 2c2
< -rws--x--x 1 root bin 29364 2005-09-07 17:46 /bin/ping ---
> -rws--x--x 1 root bin 29974 2005-09-07 17:46 /bin/ping
Essa saída mostra que o tamanho do arquivo /bin/ping mudou de tamanho em relação ao registro anterior. Supõe-se que tenha sido substituído por um programa malicioso, devendo ser excluído e reinstalado adequadamente. É importante rastrear os logs do sistema atrás de possíveis origens dessa alteração.
Outras buscas por brechas no sistema:
Procurar por arquivos com permissão de escrita para todos usuário, com exceção do diretório
/dev:
# find / -path /dev -prune -perm -2 -not -type l
Arquivos de configuração do sistema poderiam ser alterados com intuito de viabilizar invasões ou danos ao sistema.
Procurar por arquivos sem dono ou sem grupo:
# find / \( -nouser -o -nogroup \)
Tópico 114: Segurança A existência de arquivos sem dono ou sem grupo indica que o sistema pode ter sido invadido.
Verificação de pacotes
Semelhante à verificação nativa de pacotes .deb e .rpm, é possível verificar a maioria dos pacotes compilados ou de códigos fonte fornecidos por um desenvolvedor. As maneiras mais comuns de verificação são a soma MD5 e as assinaturas PGP, cujas ferramentas são disponíveis na maioria das distribuições.
Praticamente todos os pacotes de programas tradicionais oferecem assinaturas de verificação PGP, como o código fonte do kernel do Linux disponível em ftp://ftp.kernel.org/pub/. Além do arquivo .tar.gz ou .bz2, deve ser copiado um arquivo de mesmo nome acrescido do sufixo .sign (ocasionalmente este arquivo aparece com o sufixo .asc). Para verificação, primeiro é necessário importar a chave pública referente ao do kernel:
# gpg --keyserver wwwkeys.pgp.net --recv-keys 0x517D0F0E
Esse procedimento é necessário somente uma vez. A chave pública deve ser obtida somente de fonte confiável, especificada pelo próprio desenvolvedor do programa. Informações sobre obtenção da chave pública do kernel podem ser consultadas em http://www.kernel.org/signature.html.
Agora a verificação do arquivo propriamente:
# gpg --verify linux-2.6.16.13.tar.bz2.sign linux-2.6.16.13.tar.bz2
gpg: Signature made Ter 02 Mai 2006 19:15:20 BRT using DSA key ID 517D0F0E gpg: Assinatura correta de "Linux Kernel Archives Verification Key
Essa saída informa que o referido arquivo é autêntico.
De maneira mais simples agem as verificações MD5. Um arquivo com sufixo .md5 correspondente ao arquivo .tar.gz ou .bz2 contém um número referente ao resultado de cálculo envolvendo os bytes contidos no pacote. Para verificar a soma MD5 do pacote copiado bluefish-
1.0.5.tar.bz2, através do seu arquivo MD5 correspondente bluefish- 1.0.5.tar.bz2.md5:
# md5sum -c bluefish-1.0.5.tar.bz2.md5 bluefish-1.0.5.tar.bz2: A soma coincide
Como no caso das assinaturas PGP, é fundamental que o arquivo MD5 tenha sido copiado de fonte segura, indicada pelo próprio desenvolvedor do programa.
Senhas
As definições sobre a vida útil de senhas e aspectos relacionados são armazenadas no arquivo /etc/shadow (quando usado o sistema de senhas shadow). Cada linha corresponde a uma conta, em campos separados por “:”, representando:
1. Nome de acesso. 2. Senha criptografada.
3. Dias decorridos entre 1 de janeiro de 1970 e a última alteração da senha. 4. Número de dias até que a senha deva ser alterada.
5. Número de dias após o qual a senha deve ser alterada.
Tópico 114: Segurança
7. Número de dias após a expiração da senha que a conta deve ser bloqueada. 8. Dias decorridos entre 1 de janeiro de 1970 e a data em que a conta foi bloqueada. 9. Campo reservado.
Além de alterar senhas, o comando passwd também pode alterar essas definições, através das opções:
-x dias
Número máximo de dias que a senha permanecerá válida.
-n dias
Mínimo de dias até que o usuário possa trocar uma senha modificada.
-w dias
Dias anteriores ao fim da validade da senha nos quais será emitido um aviso a respeito.
-i dias
Inatividade, tolerância de dias após a senha ter expirado até que a conta seja bloqueada.
Exemplo - Alterar validades de senha para a conta “ataliba”:
# passwd -x 30 -n 1 -w 7 -i 7 ataliba
A opção -e provoca a expiração imediata da senha e -d apaga a senha para a conta especificada. Quando a opção -g é usada, a senha do grupo especificado é alterada; seguido de -r remove a senha e de -R restringe o acesso à todos usuários. Essa tarefa só pode ser realizada pelo super-usuário ou pelo administrador do grupo.
A conta especificada pode ser bloqueada através da opção -l e liberada pela opção -u. O estado da conta pode ser verificado fornecendo a opção -S:
# passwd -S ataliba
ataliba P 05/03/2006 1 30 7 7
Onde a saída representa:
ataliba P 05/03/2006 1 30 7 7 | | | | | | |
| | | | | | `--> Limite de dias de inatividade após a senha | | | | | | ter expirado até a conta ser bloqueada. | | | | | |
| | | | | `--> Dias de aviso | | | | |
| | | | `--> Limite máximo de dias da senha. | | | |
| | | `--> Limite mínimo de dias da senha. | | |
| | `--> Data da última mudança de senha. | |
| `--> “P”: Tem senha usável, “NP”: Não tem senha, | “L”: Conta bloqueada.
|
`--> Login respectivo a conta.
Os atributos da senha também podem ser alterados através do comando chage, através dos argumentos:
Tópico 114: Segurança
-m dias
Mínimo de dias até que o usuário possa trocar uma senha modificada.
-M dias
Número máximo de dias que a senha permanecerá válida.
-d dias
Número de dias decorridos em relação a 01/01/1970 em que a senha foi mudada. Também pode ser expresso no formato de data local (dia/mês/ano).
-E dias
Número de dias decorridos em relação a 01/01/1970 a partir do qual a conta não estará mais disponível. Também pode ser expresso no formato de data local (dia/mês/ano).
-I dias
Inatividade, tolerância de dias após a senha ter expirado até que a conta seja bloqueada.
-W dias
Dias anteriores ao fim da validade da senha nos quais será emitido um aviso a respeito.
Exemplo – determinar data de bloqueio de uma conta:
# chage -E 04/05/2006 ataliba
O uso do chage é restrito ao super-usuário (root). Porém usuários comuns podem usar o chage com a opção -l para checar as definições de suas respectivas contas:
$ chage -l ataliba Minimum: 1 Maximum: 30 Warning: 7 Inactive: 1
Last Change: Mai 03, 2006 Password Expires: Jun 02, 2006 Password Inactive: Jun 03, 2006 Account Expires: Abr 05, 2006
Tanto passwd quanto chage entram em modo de configuração interativa se não forem passadas opções. O usuário assumido será sempre o atual se um usuário não for especificado como argumento.
Atualização de programas
Como nenhum programa é imune à falhas, é recomendado instalar todas as correções disponibilizadas pelo desenvolvedor. Programas desatualizados com falhas conhecidas são alvos fáceis para invasão e possível danificação do sistema.
Todas as principais distribuições mantém atualizações para seus programas compilados. A anúncio das atualizações é geralmente feito através de mala direta por email, cuja inscrição pode ser realizada no site da distribuição.
Grupos especializados em segurança também informam sobre falhas e procedimentos necessários para correção. O CERT (Computer Emergency Response Team) - www.cert.org – e BUGTRAQ - www.securityfocus.com – divulgam questões pertinentes à falhas e correções de sistemas.
Tópico 114: Segurança
Filtragem de Pacotes – iptables
A filtragem de pacotes de dados em rede permite controlar o fluxo das transmissões através de regras específicas. Dessa forma é possível criar um firewall ou um redirecionamento do tipo NAT (Network Address Translation).
O programa utilizado para criação dessas regras é o iptables. É necessário que o kernel em uso seja capaz de trabalhar com filtragem de pacotes, o que é regra nos kernels recentes. O item de configuração do kernel para filtragem de pacotes é “Network Packet Filtering”.
Para cada tipo de operação há uma tabela específica. Cada tabela contém chains (correntes) onde são definidos targets (ações) para os pacotes que corresponderem à determinada regra na corrente. São as tabelas naturais filter, nat e mangle:
filter
É a tabela padrão. Contém as chains embutidas INPUT (para pacotes que chegam ao host local), FORWARD (para pacotes sendo roteados pelo host local) e OUTPUT (para pacotes gerados no host local). Essa é a tabela utilizada para construção de firewalls.
nat
Para pacotes que criam novas conexões. Contém as chains embutidas PREROUTING,
OUTPUT e POSTROUTING. mangle
Para alterações especializadas de pacotes. Contém as chains INPUT, OUTPUT,
PREROUTING, FORWARD e POSTROUTING.
A tabela de atuação é indicada através da opção -t do comando iptables. Se nenhuma tabela for especificada, a tabela assumida será a filter. As operações dentro de uma chain são determinadas através de argumentos-comando:
-A → Adicionar regra na chain
-I → Inserir regra numa posição específica dentro da chain -R → Substituir regra na chain
-D → Apagar chain
-N → Criar chain personalizada -X → Apagar chain vazia
-P → Definir política para uma chain embutida -L → Listar a(s) regra(s) em uma chain
-F → Apagar todas as regras em uma chain
-Z → Zerar os contadores de pacotes em todas as regras de uma chain Especificações de regras (interceptam os pacotes que corresponderem): -s endereço
Ou --source endereço. Endereço de origem do pacote. Pode ser nome de rede, nome de host, IP de rede/máscara de rede ou simplesmente um endereço IP. Se endereço precedido de “!” intercepta os pacotes que não corresponderem à condição.
Tópico 114: Segurança
-d endereço
Ou --destination endereço. Endereço de destino do pacote. Mesmo formato de -s. Se endereço precedido de “!” intercepta os pacotes que não corresponderem à condição.
-p protocolo
Ou --protocol protocolo. Define o protocolo. Pode ser tcp, udp, icmp ou all. Se protocolo precedido de “!” intercepta os pacotes que não corresponderem à condição.
-i interface
Ou --in-interface interface. Interface através da qual o pacote chegou. Se o nome interface for seguida do sinal “+” (interface+) aplicará a todas interfaces cujos nomes comecem por “interface”. Se interface precedido de “!” intercepta os pacotes que não corresponderem à condição. Se -i interface não existir, toda interface será assumida.
-o interface
Ou --out-interface interface. Interface através da qual o pacote será enviado. Se o nome interface for seguida do sinal “+” (interface+) aplicará a todas interfaces cujos nomes comecem por “interface”. Se interface precedido de “!” intercepta os pacotes que não corresponderem à condição. Se interface for omitido, toda interface será assumida.
-j ação
Ou --jump ação. Targets (ações) para o(s) pacote(s) interceptados. Targets comuns para firewall:
ACCEPT → Permite a passagem normal do pacote DROP → Descarta o pacote
-m módulo
Ou --match módulo. Usar módulo estendido “módulo”. Há muitos tipos de módulos de controle adicionais e opções extras para cada um deles. Um muito usado para firewall é o módulo state, cuja opção --state estado permite determinar qual a relação de um pacote com as conexões existentes. Possíveis valores para estado são INVALID (o estado não pode ser determinado), ESTABLISHED (o pacote pertence a uma conexão ativa), NEW (indicando que o pacote inicia nova conexão e RELATED (o pacote inicia outra conexão, porém
relacionada a uma conexão existente).
Exemplo de criação de firewall simples.
Apagar todas as regras da tabela filter:
# iptables -t filter -F
Estabelecer política de descartar todos os pacotes em todas chains da tabela filters:
# iptables -t filter -P INPUT DROP # iptables -t filter -P FORWARD DROP # iptables -t filter -P OUTPUT DROP
Tópico 114: Segurança
# iptables -t filter -A INPUT -i lo -s 0/0 -d 0/0 -j ACCEPT # iptables -t filter -A OUTPUT -o lo -s 0/0 -d 0/0 -j ACCEPT
Liberar todos os pacotes saindo através da interface eth0:
# iptables -t filter -A OUTPUT -o eth0 -s 0/0 -d 0/0 -j ACCEPT
Liberar para entrar pela interface eth0 somente os pacote pertencentes (ESTABLISHED) ou relacionados (RELATED) a uma conexão existente:
# iptables -t filter -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED \ -s 0/0 -d 0/0 -j ACCEPT
Listando as novas configurações de filtros:
# iptables -t filter -L -v
Chain INPUT (policy DROP 39 packets, 12431 bytes)
pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo any anywhere anywhere 0 0 ACCEPT all -- eth0 any anywhere anywhere state RELATED,ESTABLISHED
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 12 packets, 816 bytes)
pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- any lo anywhere anywhere 0 0 ACCEPT all -- any eth0 anywhere anywhere
Este firewall simples irá descartar qualquer tentativa de conexão por programas remotos, inclusive compartilhadores de arquivos e programas de mensagens instantâneas.
Voltar à configuração padrão (aceite indiscriminado):
# iptables -t filter -F INPUT
# iptables -t filter -P INPUT ACCEPT # iptables -t filter -F FORWARD
# iptables -t filter -P FORWARD ACCEPT # iptables -t filter -F OUTPUT
# iptables -t filter -P OUTPUT ACCEPT
É necessário que se respeite as letras maiúsculas e minúsculas das opções.
Verificando portas abertas no sistema
O programa nmap é utilizado para rastrear sistemas em busca de portas de serviços ativas. Seu uso mais simples é sem argumentos, especificando apenas um nome ou endereço de host a ser rastreado:
$ nmap localhost
Starting nmap 3.93 ( http://www.insecure.org/nmap/ ) at 2006-05-08 01:39 BRT Interesting ports on localhost (127.0.0.1):
(The 1666 ports scanned but not shown below are in state: closed) PORT STATE SERVICE
631/tcp open ipp 6000/tcp open X11
A saída mostra que as portas 631/tcp (Serviço de impressão do cups) e 6000/tcp (servidor de janelas X) estão abertas à conexões. Portanto é fundamental estabelecer restrições ao seu uso através da 80
Tópico 114: Segurança configuração do tcpwrapper ou através da configuração do próprio daemon do serviço.
O nmap possui muitas opções de rastreamento que podem ser consultadas através de sua página manual (man nmap). É possível, por exemplo, fazer um rastreamento para tentar descobrir as portas passíveis de conexão e qual o sistema operacional do host em questão:
# nmap -sS -O localhost
Starting nmap 3.93 ( http://www.insecure.org/nmap/ ) at 2006-05-08 01:50 BRT Interesting ports on localhost (127.0.0.1):
(The 1666 ports scanned but not shown below are in state: closed) PORT STATE SERVICE
631/tcp open ipp 6000/tcp open X11
Device type: general purpose Running: Linux 2.4.X|2.5.X|2.6.X
OS details: Linux 2.4.0 - 2.5.20, Linux 2.6.3 - 2.6.7 (X86) Nmap finished: 1 IP address (1 host up) scanned in 3.240 seconds
Programa que desempenha função semelhante é o netstat. Entre outras funções, com o netstat é possível monitorar as conexões ativas. Algumas opções do netstat:
-t → Mostra todas as conexões tcp ativas -l → Mostra todas as portas abertas à conexões
-c → Execução contínua, renova as informações a cada segundo.
O netstat é capaz de obter e mostrar várias outras informações (tabelas de rotas, estatísticas de interface, etc). Mais detalhes sobre sua operação na página manual man netstat.