Entretanto, ao conectar-mos uma rede em outra (como no caso da Internet) temos que estar certos que somente as informações "públicas" estarão disponíveis. Sofisticados dispositivos devem garantir o sigilo das operações. E mesmo em uma rede privada, fisicamente localizada em um prédio, não podemos permitir que usuários não autorizados acessem dados confidenciais.
Os problemas relacionados com a segurança de redes e as maneiras
de solucioná-los são o objetivo deste texto. Inicialmente
será comentado os problemas de segurança referente ao tipo
de rede mais comum, as que utilizam meio físico compartilhado (CSMA/CD,
Token Ring, etc) e em seguida as técnicas disponíveis para
melhor a confiabilidade (em termos de segurança) destas redes seja
por emprego de criptografia ou através de Firewalls. Será
apresentado alguns exemplos de técnicas de criptografia e seu emprego
no estabelecimento de conexões confiáveis.
Problemas de segurança
Os problemas de segurança geralmente referem-se ao sigilo e
a identidade. O Sigilo diz respeito a quais informações estarão
disponíveis para quais usuários. Isto pode ser feito através
de atribuições de direitos para cada usuário [BER97].
A identificação consiste em verificar a autenticidade deste
usuário. Se um usuário envia um pedido, por exemplo, de um
relatório a uma máquina, esta deve então, de alguma
forma, "saber" quem é este usuário (identidade) e, ainda,
se este usuário, sendo quem é, tem direitos de requerer este
relatório (permissão). Ao tratarmos de uma rede, podemos
considerar usuários como máquinas e aplicarmos os mesmos
conceitos descritos acima. Quando uma máquina envia um pacote à
outra, junto a este pacote vai um identificador de sua origem, o seu endereço,
por exemplo. Com esta informação a máquina de destino
saberá qual é a máquina que enviou este pacote e pode
então, fornecer ou não as informações requeridas,
dependendo dos direitos atribuídos a máquina origem.
Sigilo de pacotes
Em uma rede de meio físico compartilhado, cada máquina
fica constantemente "escutando" o que passa pelo canal (figura 2.1). Se
determinada mensagem é destinada à ela, a mesma é
retirada e tratada devidamente. Senão, ela é simplesmente
ignorada. Além disso, uma rede que implemente "Broad Cast" cada
máquina pode ler uma mensagem destinada à ela sem retirá-la
do meio para que as outras também possam lê-la [TAN97].
É interessante notar, porém, que todas as máquinas
que compartilham este meio físico podem manipular qualquer uma das
mensagens, independente se esta é ou não para ela. Nada impede
que uma máquina retire mensagens que não lhe pertencem vendo
seu conteúdo ou mesmo até alterando-o. Programas instalados
nestas máquinas com esta finalidade recebem o nome de "Sniffers"
e não raramente ficam monitorando os primeiros pacotes enviados
de uma máquina para outra tentando descobrir os passos usados pelo
usuário para o conexão, inclusive a senha utilizada no login.
Em uma rede pequena, limitada a uma sala ou prédio, é fácil
evitar este problema, limitando o acesso somente à usuários
confiáveis. Em empresas maiores e mais preocupadas com segurança,
onde seus cabos passam por diversos locais, talvez até atravessando
ruas e avenidas, encontraremos medidas mais rígidas, como, por exemplo,
a passagem dos cabos de rede por dutos pressurizados, impedindo que alguém
os viole para a implantação de "grampos" (a conexão
de uma outra máquina que não pertence a rede inicial). Em
caso de violação destes dutos, o mesmo seria despressurizado
e um alarme soaria.
Autentificação de pacotes
O que define a origem da máquina que envia determinada mensagem
é o seu endereço. Mas como garantir que a mensagem vindo
de uma máquina "X" realmente foi gerada por esta máquina
e não por uma outra qualquer. Facilmente pode-se alterar o endereço
desta mensagem, fazendo a máquina destino "pensar" que foi originada
pela máquina ?X?. Isto pode ser útil aos invasores para ganhar
a confiança das máquinas invadidas, pois geralmente os níveis
de segurança são mais baixos ou mesmo inexistentes para máquinas
consideradas "confiáveis", tipicamente as de uma mesma sub-rede.
Um maneira de solucionar estes problemas é através de filtros,
conhecidos como Firewalls.
Firewalls
Como o nome sugere, um firewall serve para "separar" uma coisa de outra,
no nosso caso, uma rede de outra (figura 3.1). Já mencionamos que
em redes privadas geralmente são estabelecidos regimes de confiança
mútua, ou seja, se quem esta me enviando a mensagem é a máquina
"X" então posso aceita-la pois eu "confio" na máquina "X"
e sei que nenhuma mensagem maliciosa virá dela. sabemos também
que o endereço de uma máquina pode ser facilmente falsificado.
Neste caso, fica muito fácil a um intruso enviar mensagens de qualquer
lugar dizendo ser a máquina "X". Um firewall pode resolver facilmente
este problema: ao receber um pacote de fora da minha rede, ele verifica
qual o endereço de origem e de destino, não permitindo entrar
ou sair pacotes cujos endereços de origem e destino pertençam
a mesma rede. Mas ele pode fazer muito mais que isto.
Um firewall pode ser configurado mais rigorosamente, dependendo da necessidade da rede. Alguns são capazes até de bisbilhotar o conteúdo dos pacotes, procurando, por exemplo, códigos de vírus, mas essa idéia não é prática, pois teríamos um "gargalo" nele. Pode-se, por exemplo, configurá-lo para não aceitar comunicações somente para determinados serviços (ftp, por exemplo) ou simplesmente não aceitar nenhuma comunicação. Neste caso uma máquina da sub-rede deverá estabelecer esta comunicação e nunca uma de fora. Vemos então que um firewall mau configurado pode ser um grande transtorno para os usuários legítimos.

Existem várias formas de se construir um Firewall. Talvez a mais
simples seja apenas um filtro de pacotes [BER97] implementado em uma máquina
com duas placas de rede. Ele simplesmente verifica a origem e o destino
dos pacotes não aceitando conexões de determinadas máquinas
ou então só aceitando de algumas, ou ainda, só aceitando
para determinados serviços. Um firewall será inútil
se existirem outras entradas para a rede, como por exemplo, através
de modems.
Criptografia
A Criptografia tem suas origens a muitos anos. Comenta-se que o imperador
Romano Júlio César teria sido o primeiro a emprega-la quando
enviava cartas criptografadas, pois não confiava no mensageiro e
havia o risco dele ser capturado, no caso de uma guerra. O método
utilizado por César era simples: ele rescrevia a carta somando 3
a posição da letra, ou seja, o "A" (1) passaria a ser "D"
(4), o "B" (2) "E" (5) e assim sucessivamente, imaginado as letras dispostas
em círculo, ou seja, a lista não termina no "Z" mas continua
daí no "A" novamente.
Hoje a Criptografia utiliza técnicas muito mais complexas que as de César Augusto mais a sua idéia ainda é empregada. Uma ligeira modificação de sua idéia original consiste, em vez de trocar cada caracter por ele + 3, troca-lo por ele + "n". Para decriptografar, portanto, o receptor deverá saber o valor de "n". Introduzimos ai o conceito de "chave". Já não basta o receptor conhecer apenas o método empregado, mas também deve conhecer a chave. Esta técnica, no entanto, é fácil de ser quebrada (manualmente, pois com o auxílio de computadores é muito fácil testar se um "A" foi substituído por algum dos outros 25 caracteres existentes) tendo-se em vista uma tabela de freqüência para língua utilizada. Por exemplo, no inglês estudos comprovam que as letras mais usadas são e, t, o, a, n, i, etc. Precisaríamos apenas de uma tabela com suas freqüências. Algo do tipo: 23% de e, 19% de t, etc. Verificamos então qual a letra que se repete 23% no texto, digamos o "w". Então podemos supor que o "W" esteja aqui substituindo o "E". Com algumas tentativas logo encontraremos uma palavra que faça sentido e a "chave" foi descoberta.
Outra maneira de "embaralhar" um texto é através da transposição.
Neste método não há troca de caracteres por outro
e cada um representa ele mesmo. Há, no entanto, uma reordenação
dos mesmos, isto é, eles são escritos fora de ordem. Podemos
dizer que escrever um texto ao contrário é uma forma bastante
rudimentar de transposição. Uma outra seria dispor os caracteres
em uma tabela de "n" colunas (chave) e reescreve-los por colunas (tab 4.1).
Neste caso o número de linhas será definido pelo tamanho
do texto. Para decriptografá-lo, devemos conhecer a chave, ou seja,
o número de colunas usados, dispor o texto cifrado nestas colunas,
achando portanto o número de linhas, e rescrever o texto em outra
tabela de mesma dimensão, porém, trocando linhas por colunas.
Um exemplo mais interessante é mostrado em [TAN97]. Neste a chave
é uma string de caracteres não repetidos, e a quantidade
de caracteres define o número de colunas usadas. Numera-se, então,
as colunas de acordo com a posição do caracter no alfabeto
(a=1, b=2, etc) e reescreve-se o texto com as colunas na ordem certa.
|
|
|
|
|
|
|
|
|
Texto original: redesdecomputadores | ||
|
|
|
|
|
|
|
|
|
|
Texto cifrado: rsotredmaedepdsecuo | |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
chave: 4 (4 colunas) | |
|
|
|
|
|
|
|
|
|
|
Vamos dar uma rápida olhada em um algoritmo muito polêmico, o DES. Produzido inicialmente pela IBM, o DES utilizava uma chave de 128 bits, mas ao ser padronizado pela NSA (National Security Agency) acabou ficando com 56 bits. Havia suspeita de que a NSA definiu o tamanho em 56 bits porque conhecia técnicas de quebra-lo com esta chave [TAN97]. De qualquer forma, ele já não é mais considerado seguro.
O DES utiliza vários estágios de criptografia e utiliza várias técnicas simultaneamente, entre elas a substituição, transposição e OU exclusivo bit a bit, o que garante a não correspondência de freqüência de caracteres (verificação estatística dos caracteres que mais se repetem). São ao todo 19 estágios sendo que 16 deles utilizam chaves diferentes, todas parametrizadas da chave original de 56 bits. O texto é então cifrado em blocos de 64 bits, justamente este o fato que enfraquece sua segurança.
Quando ciframos blocos de 64 bits temos, então, que cada bloco
resultará em um novo bloco cifrado e para cada bloco igual, com
a mesma chave será gerado um mesmo bloco cifrado. Isto na verdade
é apenas um algoritmo de substituição, igualzinho
ao de Júlio César, só que ao invés de 8 bits,
usamos agora 64. Podemos dizer que cada bloco poderá ser substituído
por algum outro em um universo de 264-1 candidatos. Além disso,
um bloco de texto cifrado pode ser facilmente substituído por outro
bloco de texto cifrado sem perder a coerência. Um exemplo prático
(baseado em [TAN97]): As notas de uma disciplina criptografadas com DES
e enviadas para a secretaria. Um dos alunos não gostou de sua nota
e deseja mudar esta situação. Ele intercepta a mensagem,
mas não consegue decifrá-la, sabe porém que ela é
cifrada em blocos de 64 bits. Tudo que ele tem que fazem é descobrir
qual desses blocos corresponde a sua nota, pegar o mesmo bloco de um outro
aluno (com uma nota melhor) e copiá-lo para o seu bloco correspondente
(figura 4.2).
|
|
|
|
| Fulano |
|
|
| Ciclano |
|
|
| Beltrano |
|
|
Temos, contudo, um problema com algoritmos de chave única: como dar a conhecer a chave com segurança às partes envolvidas?
Para resolver este problema foram criados algoritmos com chave pública e privada. A idéia é a seguinte: você criptografa com a chave pública, mas só é possível decriptografar com a privada, ou vice-versa. Ou seja, se você deseja receber seu extrato do banco, por exemplo, e quer ter a certeza de que somente você o receberá, tudo o que tem a fazer é enviar a chave pública para o banco. Não importa se programas "Sniffers" capturem sua mensagem e outras pessoas conheçam sua chave pública. É por isso que é chamada de pública. Quando o banco enviar seu extrato criptografado com esta chave, só será possível decriptografá-la com a chave privada - que você não enviou! O contrário também pode ser útil: você criptografa uma mensagem com a sua chave privada e a envia. Qualquer um que conheça sua chave pública será capaz de decriptografa-la... mas então, qual é a vantagem? A vantagem disto é que quem ler sua mensagem saberá que ela só poderia ter sido escrita por você, pois somente você conhece sua chave privada. Esta última, do ponto de vista das redes (máquinas) nos interessa mais, pois permite fazer a identificação da origem.
Os algoritmos de chave pública e privada, exploram propriedades
específicas dos números primos e, principalmente, a dificuldade
de fatorá-los [TAN97], mesmo em computadores rápidos. Como
exemplo temos o RSA, nome dado pelas iniciais de seus autores (Rivest,
Shamir e Adleman) [KAU95, TAN07]. O problema desses algoritmos é
que eles são muito lentos e inviáveis em alguns casos em
que se deseja desempenho. Uma solução inteligente é
usar um algoritmo de chave pública para enviar uma chave privada
à outra parte e depois a criptografia se dá somente com a
chave privada que é mais rápida.
Uso de criptografia em redes
Podemos então garantir uma comunicação segura na rede através da implantação de criptografia. Podemos, por exemplo, implantar a criptografia na geração dos pacotes, ou seja, apenas as mensagens enviadas de máquina para máquina serão criptografadas. O único problema disso continua sendo a escolha das chaves. Se implementar-mos criptografia com chave simples (uma única para criptografar e decriptografar) temos o problema de fazer com que todas as máquinas conheçam esta chave, e mesmo que isso possa parecer fácil em uma rede pequena, redes maiores que não raramente atravessam ruas e avenidas ou mesmo bairros isto pode ser inviável. Além no mais, talvez queiramos estabelecer conexões confiáveis com máquinas fora de nossa rede e não será possível estabelecer uma chave neste caso e garantir que somente as máquinas envolvidas na comunicação a conhecem.
Se, contudo, criptografar-mos as mensagens com chave pública
e privada, temos o problema de conhecer todas as chaves públicas
de todas as máquinas com quem queremos estabelecer comunicação.
Isto pode ser difícil de controlar quando são muitas.
Compartilhamento de chave privada
Uma proposta para resolver o problema do sigilo com chave única mas sem pré-estabelecê-la foi proposto por Diffie e Hellman [TAN97]. A proposta dos autores possibilita que uma chave privada seja estabelecida e esta é compartilhada de forma segura pela rede.

O uso de criptografia na geração de pacotes cria-se o
que se chama de túnel criptografado, mas seu emprego não
resolve todos os problemas de segurança. Nada impede, por exemplo,
que alguém capture estas mensagens e as reutilize posteriormente
(ataque por repetição). Por exemplo, digamos que uma empresa
faça uma encomenda de produtos ao seu fornecedor e que toda a transação
seja criptografada. Um intruso poderá capturar todos os pacotes.
Tudo bem, ele não conseguirá entende-los mesmo. Mas digamos
que ele comece a reenviar estes mesmos pacotes, forjando o endereço.
O fornecedor pensará que o seu cliente está comprando novamente
e na mesma quantidade! Bem, com um protocolo de desafio-resposta isto é
resolvido (o firewall também resolve se configurado para não
aceitar pacotes de fora com endereço de uma máquina interna,
mas não resolve se a máquina "intruso" pertencer à
mesma sub-rede, ou seja, não passará por ele).
Desafio-resposta
Esta técnica também pode ser usada para o caso de criptografia de todas as mensagens ser desnecessária em virtude do alto custo de performance imposto. Assim que ambas as máquinas se certificarem da autenticidade uma da outra, uma comunicação sem criptografia pode ser estabelecida. Perde-se contudo o sigilo, mas garante-se a autenticidade.
Uma alteração feita neste algoritmo foi proposta para
minimizar as comunicações. Ao invés de termos quatro
mensagens para garantirmos a autenticidade (A envia desafio, B envia resposta,
B envia desfio, A envia resposta) passaríamos a ter somente três,
pelo mesmo conceito de mensagens de "carona": A envia desafio, B envia
resposta + seu desafio, A envia resposta. Esta alteração,
contudo, possibilitou o chamado "ataque por reflexão" [TAN97] se
cada máquina aceitar várias conexões simultâneas
(na maioria dos casos). Este ataque consiste no seguinte: suponhamos que
A e B utilizem esta técnica para certificar-se da identidade uma
da outra e utilizem uma chave privada compartilhada. Por questões
de desempenho, elas não desejam criar um "túnel criptografado".
Digamos que exista também um I (intruso) que tem interesse em se
passar por A. I então começa a conexão enviando seu
desafio para B. B resolve o desfio e envia a resposta para I (pensando
ser A), juntamente com seu desafio. Bem, I não pode resolver este
desafio, pois não conhece a chave, mas como B aceita novas conexões,
I envia este mesmo desafio para B resolver em uma nova conexão.
B então resolve este desafio e retorna a resposta para I junto com
seu novo desafio. I então fecha esta última conexão
e envia a resposta recebida como resultado da primeira conexão.
Para evitar este ataque, pequenos cuidados podem ser tomados, com por exemplo,
fazer com que B "se lembre" dos desafios que gerou e não aceite
conexões com este desafio. Uma maneira mais simples, porém,
seria estabelecer um conjunto restrito de desafios para cada máquina,
por exemplo, números pares para a origem e ímpares para o
destino [TAN97].
Autentificação Centralizada
Ainda temos, contudo um problema. Mesmo usando protocolo de desafio-resposta,
cada máquina deverá conhecer a chave pública ou privada
de todas as outras com as quais deseja se conectar. Isso pode ser muito
difícil de gerenciar. Para resolver este problema criou-se os chamados
KDC (Key Distribuition Center). Fazendo uma analogia com o nosso dia-a-dia,
podemos dizer que, de certa forma, um KDC é um tabelionato. Você
não pode simplesmente conhecer todas as assinaturas existentes,
mas pode, com certeza conhecer bem a assinatura do tabelião de sua
cidade. Você então envia a assinatura suspeita a esse tabelião
e recebe de volta um "reconheço a firma ...".
No nosso caso é um pouco diferente. Cada máquina estabelece
uma chave privada com o KDC (ou então uma pública e outra
privada). Quando desejarmos estabelecer conexão com uma máquina,
enviamos o pedido ao KDC criptografado com a nossa chave (que ele conhece).
O KDC então decriptografa o pedido usando a nossa chave e envia
uma mensagem à máquina com quem desejamos estabelecer conexão,
usando para isso a chave privada que ambos conhecem. Após algumas
trocas de mensagens entre origem-KDC-destino, uma chave privada aleatória
é escolhida e dada a conhecer ao origem e ao destino para que elas
estabeleçam uma conexão segura com ela. Para evitar que mensagem
já enviadas sejam reutilizadas por um intruso, pode-se introduzir
na mensagem uma informação quanto a data, rejeitando as que
expiraram.
Conclusão
Nenhum método, porém, é completamente seguro e a prova de violações. Mesmo os algoritmos mais complexos de criptografia, que levariam séculos para serem quebrados por força bruta no melhor computador existente, estão sensíveis à falhas, seja na troca das chaves ou na arquitetura do próprio algoritmo. Também podemos concluir que trocar chaves secretas pela rede ainda tem pontos falhos, e não é confiável.
Por fim, tem o fato de que alguns países não gostam que
as pessoas troquem informações confidenciais entre si. No
USA, por exemplo, para garantir punição à quem usar
ou distribuir algoritmos de criptografia sem a permissão do governo,
a criptografia é classificada legalmente como "munição",
cuja a exportação sem autorização constitui
crime. Isto pode significar que existam muitas outras técnicas de
criptografia, bem mais seguras, mas que são mantidas em segredo
por interesses governamentais.
Referências Bibliografia
[BER97] BERNSTEIN, Terry; BHIMANI, Anish B. Segurança na Internet. Tradução do original Internet Security for business. 1997. Campus: Rio de Janeiro, RJ.
[GON97] GONÇALVES, Marcus. Segurança na Internet: Protegendo seu Web com Firewalls. 1997. Campus: Rio de Janeiro. Rj.
[KAU95] KAUFMAN, Charlie; PERLMAN, Radia; SPECINER, Mike. Network Security: Private Communication in a Public World. 1995. Prentice Hall: New Jersey.
[TAN97] TANENBAUM, Andrew S. Redes de Computadores. Tradução do original Computer Network. 3 ed. 1997. Campus: Rio de Janeiro, RJ.