[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 17 ] [ 18 ] [ 19 ] [ 20 ] [ next ]

Guia Foca GNU/Linux
Chapter 19 - Introdução ao uso de criptografia para transmissão/armazenamento de dados


Este capítulo explica como dados transmitidos em uma rede pode ser capturados, isto ajudará a entender a vulnerabilidade de serviços comuns que não utilizam criptografia para a transmissão de dados e alternativas/programas equivalentes que fazem transmissão de dados usando métodos criptográficos para deixar a mensagem somente legível para origem e destino.


19.1 Introdução

Quando enviamos um tráfego de nossa máquina para outra (e-mails, mensagens de ICQ, navegação, ftp, etc) os dados passam por várias máquinas até atingir o seu destino (isto se chama roteamento). Se algum cracker instalou algum capturador de pacotes (sniffer) em alguma das máquinas de nossa rota os dados poderão facilmente visualizados.

Crackers normalmente configuram estes programas a procura de campos como "passwd" e outras expressões que sejam úteis para acesso ao seu sistema ou espionagem. Quem gosta de ter sua privacidade violada? A internet definitivamente é uma rede insegura e nem todos os administradores de servidores são responsáveis o suficiente para fazer uma configuração restrita para evitar acesso de pessoas mal intencionadas.

Este capítulo mostra (na prática) como um sniffer funciona para captura de pacotes, isto ajudará a entender como serviços que enviam seus dados em forma texto plano são vulneráveis a isto e alternativas para transmissão segura de dados. Este capítulo tem a intenção de mostrar alternativas seguras de proteção dos dados que trafegam em sua rede e a segurança de suas instalações.


19.2 Sniffer

O sniffer (farejador) é um programa que monitoram/registram a passagem de dados entre as interfaces de rede instaladas no computador. Os dados coletados por sniffers são usados para obtenção de detalhes úteis para solução de problemas em rede (quando usado com boas intenções pelo administrador do sistema) ou para ataques ao sistema (quando usado pelo cracker para obter nomes/senhas e outros detalhes úteis para espionagem).

Os sniffers mais conhecidos para sistemas Linux são tcpdump, ethereal. Este último apresenta uma interface gráfica GTK para fácil operação em máquinas que executam o servidor X. Para explicar o funcionamento de um sniffer, vou assumir o ethereal instalado (ele não requer modificações no sistema além de ser fácil de executar e fazer pesquisa de expressões específicas). Instale o ethereal com o comando apt-get install ethereal.

Agora vamos a prática para entender como o sniffer funciona e a importância da criptografia de dados (só assim mesmo, não da para entender falando muita teoria :-):

  1. Conecte-se a Internet
  2. Execute o ethereal como usuário root.
  3. Pressione CTRL+K para abrir a tela de captura de pacotes. Em Interface selecione sua interface de internet. Nesta tela clique no botão "FILE" e coloque um nome de arquivo que a captura será gravada. Opcionalmente marque a opção "Update list of packets in real time" para monitorar a passagem de pacotes em tempo real.
  4. Clique em "OK". A captura de pacotes será iniciada
  5. Conecte-se a um site ftp qualquer (digamos ftp.debian.org.br). Entre com o usuário "anonymous" e senha "minhasenha@segura.com.br"
  6. Finalize a captura de pacotes clicando no botão "STOP"

Agora vá em "File"/"Open" e abra o arquivo capturado. Ele está no formato usado pelo sniffer tcpdump como padrão. Procure no campo "INFO" a linha "Request: USER anonymous", logo abaixo você verá a senha digitada pelo usuário. Entendeu agora a importância da criptografia na transferência segura de dados? não só o nome/senha pode ser capturado mas toda a seções feitas pelo usuário. Scanners como o tcpdump e ethereal são flexívelmente configuráveis para procurar por dados específicos nas conexões e salva-los para posterior recuperação.


19.2.1 Detectando a presença de sniffers

Uma característica comum de sniffers é mudar o modo de operação das interfaces monitoradas para o "Modo Promíscuo" com o objetivo de analisar todo o tráfego que passa por aquele segmento de rede (mesmo não sendo destinados para aquela máquina).

A entrada/saída de interfaces no modo promíscuo é monitorada nos logs do sistema:

     Sep 25 16:53:37 myserver kernel: device eth0 left promiscuous mode
     Sep 25 16:53:56 myserver kernel: device eth0 entered promiscuous mode
     Sep 25 16:54:18 myserver kernel: device eth0 left promiscuous mode
     Sep 25 16:54:31 myserver kernel: device eth0 entered promiscuous mode

O logcheck monitora estas atividades e classificam esta mensagem como prioridade "Violação" (dependendo da configuração dos seus filtros em /etc/logcheck. Veja logcheck, Section 6.4.1 para detalhes sobre este programa.

OBS: A utilização de switches dificulta a captura de pacotes em redes distribuídas porque somente os dados destinados a máquina onde o sniffer está instalado poderão ser capturados.


19.3 Alternativas seguras a serviços sem criptografia


19.3.1 http

Isto é indispensável em servidores que servem páginas de comércio eletrônico, banco de dados, sistemas bancários, administração via web ou que tenham dados que oferecem risco, se capturados.

Existem duas alternativas: instalar o servidor Apache-ssl (pacote apache-ssl ou adicionar o módulo mod-ssl na instalação padrão do Apache. Esta segunda é a preferida por ser mais rápida e simples de se administrar, por usar o servidor Web Apache padrão e sua configuração. Veja (veja Uso de criptografia SSL, Section 12.13) para detalhes de como configurar um servidor Web para transmissão de dados criptografados.


19.3.2 Transmissão segura de e-mails

A codificação padrão usada para o envio de mensagens em muitos clientes de e-mail é o MIME/base64. Isto não oferece muita segurança porque os dados podem ser facilmente descriptografados se pegos por sniffers (veja Sniffer, Section 19.2) ou abertos por administradores não confiáveis no diretório de spool do servidor.

A alternativa mais segura para a transmissão de mensagens/arquivos através do correio eletrônico é usando o PGP (veja Usando pgp (gpg)para criptografia de arquivos, Section 19.5) em conjunto com um MUA (Mail User Agent - cliente de e-mails) que suporte o envio de mensagens criptografadas/assinadas usando PGP. Os dois programas mais usados em sistemas Unix são o mutt e o sylpheed. O mutt é um MUA para modo texto e o sylpheed para modo gráfico. Ambos são muito flexíveis, permitem uma grande variedade de configurações, personalizações, possuem agenda de endereços e gerenciam diversas contas de e-mails em um só programa.

Para encriptar/assinar uma mensagem no mutt escreva/responda seu e-mail normalmente, quando aparecer a tela onde você tecla "y" para enviar a mensagem, tecle "p" e selecione uma das opções para criptografar/assinar uma mensagem.

Para fazer a mesma operação no sylpheed, escreva/responda seu e-mail normalmente e clique no menu "Mensagem" e marque "assinar", "criptografar" ou ambos. A chave pública deverá estar disponível para tal operação (veja Adicionando chaves públicas ao seu chaveiro pessoal, Section 19.5.8 e Extraindo sua chave pública do chaveiro, Section 19.5.7).


19.3.3 Servidor pop3

A alternativa mais segura é a utilização do protocolo IMAP com suporte a ssl. Nem todos os clientes de e-mail suportam este protocolo.


19.3.4 Transferência de arquivos

Ao invés do ftp, use o scp ou o sftp para transferência segura de arquivos. Veja scp, Section 15.2.2 e sftp, Section 15.2.3.


19.3.5 login remoto

Ao invés do uso do rlogin, telnet e rsh utilize o ssh (veja ssh, Section 15.2.1) ou o telnet com suporte a ssl (veja Instalação, Section 14.1.6).


19.3.6 Bate papo via IRC

O programa SILC (Secure Internet Live Conference) é um sistema IRC que realiza a criptografia de dados durante o bate papo entre diversos usuários conectados via rede.


19.3.7 Transmissão de mensagens via ICQ

O protocolo ICQ padrão além dos dados trafegarem sem nenhuma proteção, operam sobre o protocolo UDP. O protocolo UDP é limitado a pacotes de 512 bytes e não possui muitos campos para a checagem da autenticidade de endereços. Isto é bom para transmitir dados em alta velocidade e consumir menos MTU em sua interface de rede mas isto facilita a falsificação de pacotes enviados ao destinatário como se fossem outra pessoa. Outro ponto fraco é que se alguma coisa acontecer com os pacotes UDP, eles serão simplesmente descartados perdendo a mensagem.

O programa licq (cliente de ICQ para Linux) pode ser compilado com o suporte a ssl para transmissão segura de dados.


19.4 Sistemas de arquivos criptográfico

Esta é uma forma excelente para armazenamento seguro de seus dados, pois estarão criptografados e serão somente acessados após fornecer uma senha que só você conhece. O sistema usado é a montagem de um arquivo comum como um sistema de arquivos via loopback você pode escolher um nome de arquivo discreto para dificultar sua localização (use a imaginação) e poderá ser armazenado até mesmo em partições não-ext2. Siga estes passos para criar seu sistema de arquivos criptografado (baseado no Loopback-Encripted-Filesystem):

Suporte no kernel
Baixe o patch criptográfico de ftp://ftp.kernel.org/pub/linux/kernel/crypto de acordo com a sua versão do kernel e aplique os patches. Este suporte não pode ser incluído nativamente no kernel devido a restrições de uso e importação de criptografia impostas pelos EUA e outros países, com este suporte embutido o kernel não poderia ser distribuído livremente.

Se o patch para seu kernel não existir, pegue a versão anterior mais próxima (se não existir o patch para seu kernel 2.2.19, pegue a versão 2.2.18 do patch internacional). Isto certamente funcionará.

Opções de compilação do kernel
Na seção Crypto Support ative Crypto Ciphers e ative o suporte aos ciphers Twofish, blowfish, cast128, e serpent (estes são distribuídos livremente e sem restrições). Todos possuem cifragem de 128 bits, exceto o blowfish que é 64 bits. Também é recomendado ativar os módulos em Digest algorithms.

Na seção Block Devices: ative o suporte a loopback (necessário para montar arquivos como dispositivos de bloco) e Use relative block numbers as basis for transfer functions (isto permite que um backup do sistema de arquivos criptografado seja restaurado corretamente em outros blocos ao invés dos originais). Ative também o suporte para General encription support e o suporte aos cyphers cast128 e twofish.

Não ative as opções de criptografia para a seção "Networking" (a não ser que saiba o que está fazendo). Recompile e instale seu kernel .

Crie um arquivo usando os números aleatórios de /dev/urandom:
dd if=/dev/urandom of=/pub/swap-fs bs=1M count=15

Será criado um arquivo chamado swap-fs (um arquivo de troca tem características que ajudam a esconder um sistema de arquivos criptografado que é o tamanho e não poderá ser montado pelo usuário comum, evitando desconfianças).

O processo de criação deste arquivo é lento, em média de 1MB a cada 10 segundos em um Pentium MMX.

Monte o arquivo como um sistema de arquivos loop
losetup -e twofish /dev/loop0 /pub/swap-fs

O algoritmo de criptografia é selecionado pela opção -e. Algoritmos recomendados são o serpent e twofish (ambos possuem cifragem de 128 bits), sendo o serpent o preferido. O gerenciamento do sistema loop encriptado é feito através do módulo loop_gen.

Quando é executado pela primeira vez, será lhe pedida uma senha que será usada para montagens futuras de seu sistema de arquivos. Digite-a com atenção pois ela será lhe pedida apenas uma vez. Para desativar o sistema de arquivos loop, execute o comando:

losetup -d /dev/loop0

OBS: Se errou a senha será necessário desmontar, apagar o arquivo criado e repetir o procedimento.

Crie um sistema de arquivos ext2 para armazenamento de dados
mkfs -t ext2 /dev/loop0 ou mkfs.ext2 /dev/loop0
Monte o sistema de arquivos
Crie um diretório que será usado para montagem do seu sistema de arquivos, se preferir monta-lo dentro de seu diretório pessoal para armazenar seus arquivos, crie um diretório com as permissões "0700".

mount /pub/swap-fs /pub/criptofs -t ext2 -o loop

Agora poderá gravar seus arquivos dentro deste diretório normalmente como qualquer outro. O comando df -hT listará a partição loop como uma partição do tipo ext2 comum.

Desmontando/Protegendo os dados
Após usar o sistema de arquivos criptográfico, desmonte-o e desative o dispositivo loopback:
     umount /pub/criptofs
     losetup -d /dev/loop0
Remontando o sistema de arquivos criptografado
Execute novamente os comandos:
     losetup -e twofish /dev/loop0 /pub/swap-fs
     mount /pub/swap-fs /pub/criptofs -t ext2 -o loop

Será pedida a senha que escolheu e seu sistema de arquivos será montado em /pub/swap-fs.

Com este sistema, seus dados estarão protegidos mesmo do usuário root.


19.5 Usando pgp (gpg)para criptografia de arquivos

O gpg (GNU pgp, versão livre da ferramenta pgp) permite encriptar dados, assim somente o destinatário terá acesso aos dados, adicionalmente poderá verificar se a origem dos dados é confiável (através da assinatura de arquivos). O sistema PGP se baseia no conceito de chave pública e privada: Sua chave pública é distribuída para as pessoas que deseja trocar dados/mensagens e a chave privada fica em sua máquina (ela não pode ser distribuída). As chaves públicas e privadas são armazenadas nos arquivos pubring.gpg e secring.gpg respectivamente, dentro do subdiretório ~/.gnupg. Veja Criando um par de chaves pública/privada, Section 19.5.2 para criar este par de chaves.

Os dados que recebe de outra pessoa são criptografados usando sua chave pública e somente você (de posse da chave privada) poderá desencriptar os dados. Quando assina um arquivo usando o pgp, ele faz isto usando sua chave privada, o destinatário de posse da chave pública poderá então confirmar que a origem dos dados é confiável.

O gpg vem largamente sendo usado para transmissão segura de dados via internet. Muitos programas de e-mails como o mutt e sylpheed incluem o suporte a pgp embutido para envio de mensagens assinadas/encriptadas (MIME não tem uma codificação segura e não garante que a mensagem vem de quem realmente diz ser). Um servidor de e-mail no Linux configurado como as mesmas configurações/endereços do provedor da vítima pode enganar com sucesso um usuário passando-se por outro.


19.5.1 Instalando o PGP

apt-get install gnupg

Após instalar o gnupg, execute o comando gpg para criar o diretório ~/.gnupg que armazenará as chaves pública e privada.


19.5.2 Criando um par de chaves pública/privada

Para gerar um par de chaves pessoais use o comando gpg --gen-key. Ele executará os seguintes passos:

  1. Chave criptográfica - Selecione DSA e ELGamal a não ser que tenha necessidades específicas.
  2. Tamanho da chave - 1024 bits traz uma boa combinação de proteção/velocidade.
  3. Validade da chave - 0 a chave não expira. Um número positivo tem o valor de dias, que pode ser seguido das letras w (semanas), m (meses) ou y (anos). Por exemplo, "7m", "2y", "60".

    Após a validade, a chave será considerada inválida.

  4. Nome de usuário - Nome para identificar a chave
  5. E-mail - E-mail do dono da chave
  6. comentário - Uma descrição sobre a chave do usuário.
  7. Confirmação - Tecle "O" para confirmar os dados ou uma das outras letras para modificar os dados de sua chave.
  8. Digite a FraseSenha - Senha que irá identificá-lo(a) como proprietário da chave privada. É chamada de FraseSenha pois pode conter espaços e não há limite de caracteres. Para alterá-la posteriormente, siga as instruções em Mudando sua FraseSenha, Section 19.5.11.
  9. Confirme e aguarde a geração da chave pública/privada.

19.5.3 Encriptando dados

Use o comando gpg -e arquivo faz a encriptação de dados:

     gpg -e arquivo.txt

Será pedida a identificação de usuário, digite o nome que usou para criar a chave. O arquivo criado será encriptado usando a chave pública do usuário (~/.gnupg/pubring.gpg) e terá a extensão .gpg adicionada (arquivo.txt.gpg). Além de criptografado, este arquivo é compactado (recomendável para grande quantidade de textos). A opção -a é usada para criar um arquivo criptografado com saída ASCII 7 bits:

     gpg -e -a arquivo.txt

O arquivo gerado terá a extensão .asc acrescentada (arquivo.txt.asc) e não será compactado. A opção -a é muito usada para o envio de e-mails.

Para criptografar o arquivo para ser enviado a outro usuário, você deverá ter a chave pública do usuário cadastrado no seu chaveiro (veja Adicionando chaves públicas ao seu chaveiro pessoal, Section 19.5.8) e especificar a opção -r seguida do nome/e-mail/ID da chave pública:

     gpg -r kov -e arquivo.txt

O exemplo acima utiliza a chave pública de kov para encriptar o arquivo arquivo.txt (somente ele poderá decriptar a mensagem usando sua chave privada).

OBS: É recomendável especificar o nome de arquivo sempre como último argumento.


19.5.4 Descriptando dados com o gpg

Agora vamos fazer a operação reversa da acima, a opção -d é usada para decriptar os dados usando a chave privada:

     gpg -d arquivo.txt.asc >arquivo.txt
     gpg -d arquivo.txt.gpg >arquivo.txt

Descriptografa os arquivos arquivo.txt.asc e arquivo.txt.gpg recuperando seu conteúdo original. A sua "FraseSenha" será pedida para descriptografar os dados usando a chave privada (~/.gnupg/secring.gpg).


19.5.5 Assinando arquivos

Assinar um arquivo é garantir que você é a pessoa que realmente enviou aquele arquivo. Use a opção -s para assinar arquivos usando sua chave privada:

     gpg -s arquivo.txt

A "FraseSenha" será pedida para assinar os dados usando sua chave privada. Será gerado um arquivo arquivo.txt.gpg (assinado e compactado). Adicionalmente a opção --clearsign poderá ser usada para fazer uma assinatura em um texto plano, este é um recurso muito usado por programas de e-mails com suporte ao gpg:

     gpg -s --clearsign arquivo.txt

Será criado um arquivo chamado arquivo.txt.asc contendo o arquivo assinado e sem compactação.


19.5.6 Checando assinaturas

A checagem de assinatura consiste em verificar que quem nos enviou o arquivo é realmente quem diz ser e se os dados foram de alguma forma alterados. Você deverá ter a chave pública do usuário no seu chaveiro para fazer esta checagem (veja Adicionando chaves públicas ao seu chaveiro pessoal, Section 19.5.8). Para verificar os dados assinados acima usamos a opção --verify:

     gpg --verify arquivo.txt.asc

Se a saída for "Assinatura Correta", significa que a origem do arquivo é segura e que ele não foi de qualquer forma modificado.

     gpg --verify arquivo.txt.gpg

Se a saída for "Assinatura INCORRETA" significa que ou o usuário que enviou o arquivo não confere ou o arquivo enviado foi de alguma forma modificado.


19.5.7 Extraindo sua chave pública do chaveiro

Sua chave pública deve ser distribuída a outros usuários para que possam enviar dados criptografados ou checar a autenticidade de seus arquivos. Para exportar sua chave pública em um arquivo que será distribuído a outras pessoas ou servidores de chaves na Internet, use a opção --export:

     gpg --export -a -r usuario >chave-pub.txt

A opção -r especifica que chave pública será exportada (podem existir várias no seu chaveiro, além de sua chave pública) podem ser usados o nome do usuário/e-mail/IDchave. A opção -a permite que os dados sejam gravados usando ASCII 7 bits.


19.5.8 Adicionando chaves públicas ao seu chaveiro pessoal

Isto é necessário para o envio de dados criptografados e checagem de assinatura do usuário, use a opção --import:

     gpg --import chave-pub-usuario.txt

Assumindo que o arquivo chave-pub-usuario.txt contém a chave pública do usuário criada em Extraindo sua chave pública do chaveiro, Section 19.5.7. O gpg detecta chaves públicas dentro de textos e faz a extração corretamente. Minha chave pública pode ser encontrada em Chave Pública PGP, Section 20.7 ou http://pgp.ai.mit.edu.


19.5.9 Listando chaves de seu chaveiro

Use o comando gpg --list-keys para listar as chaves pública do seu chaveiro. O comando gpg --list-secret-keys lista suas chaves privadas.


19.5.10 Apagando chaves de seu chaveiro

Quando uma chave pública é modificada ou por qualquer outro motivo deseja retira-la do seu chaveiro público, utilize a opção --delete-key:

     gpg --delete-key usuario

Pode ser especificado o nome de usuário, e-mail IDchave ou qualquer outro detalhe que confira com a chave pública do usuário. Será pedida a confirmação para excluir a chave pública.

OBS: A chave privada pode ser excluída com a opção --delete-secret-key. Utilize-a com o máximo de atenção para excluir chaves secretas que não utiliza (caso use mais de uma), a exclusão acidental de sua chave secreta significa é como perder a chave de um cofre de banco: você não poderá descriptografar os arquivos enviados a você e não poderá enviar arquivos assinados.

Mesmo assim se isto acontecer acidentalmente, você poderá recuperar o último backup da chave privada em ~/.gnupg/secring.gpg~.


19.5.11 Mudando sua FraseSenha

Execute o comando gpg --edit-key usuário, quando o programa entrar em modo de comandos, digite passwd. Será lhe pedida a "Frase Senha" atual e a nova "Frase Senha". Digite "save" para sair e salvar as alterações ou "quit" para sair e abandonar o que foi feito.

O gpg --edit-key permite gerenciar diversos aspectos de suas chaves é interessante explora-lo digitando "?" para exibir todas as opções disponíveis.


19.5.12 Assinando uma chave digital

A assinatura de chaves é um meio de criar laços de confiança entre usuários PGP. Assinar uma chave de alguém é algo sério, você deve ter noção do que isto significa e das conseqüências que isto pode trazer antes de sair assinando chaves de qualquer um.

O próprio teste para desenvolvedor da distribuição Debian requer como primeiro passo a identificação do candidato, caso sua chave pgp seja assinada por algum desenvolvedor desta distribuição, imediatamente o teste de identificação é completado. A partir disso você deve ter uma noção básica do que isto significa. Para assinar uma chave siga os seguintes passos:

  1. Importe a chave pública do usuário (veja Adicionando chaves públicas ao seu chaveiro pessoal, Section 19.5.8).
  2. Execute o comando gpg --edit-key usuario (onde usuario é o nome do usuário/e-mail/IDchave da chave pública importada).
  3. Digite list, e selecione a chave pública (pub) do usuário com o comando uid [numero_chave]. Para assinar todas as chaves públicas do usuário, não selecione qualquer chave com o comando uid.
  4. Para assinar a chave pública do usuário digite sign, será perguntado se deseja realmente assinar a chave do usuário e então pedida a "FraseSenha" de sua chave privada.
  5. Digite "list", repare que existe um campo chamado trust: n/q no lado direito. O primeiro parâmetro do "trust" indica o valor de confiança do dono e o segundo (após a /) o valor de confiança calculado automaticamente na chave. As seguintes possuem o seguinte significado:

    O valor de confiança da chave pode ser modificado com o comando trust e selecionando uma das opções de confiança. Os valores de confiança para a chave pública pessoal é -/u (não é necessário calcular a confiança/indiscutivelmente confiável).


19.5.13 Listando assinaturas digitais

Execute o comando gpg --list-sigs para listas todas as assinaturas existentes no seu chaveiro. Opcionalmente pode ser especificado um parâmetro para fazer referência a assinatura de um usuário:gpg --list-sigs usuario.

O comando gpg --check-sigs adicionalmente faz a checagem de assinaturas.


[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 17 ] [ 18 ] [ 19 ] [ 20 ] [ next ]

Guia Foca GNU/Linux

Versão 6.10 - Sunday, 03 de November de 2002
Gleydson Mazioli da Silva gleydson@cipsga.org.br