Segurança em Redes

 

 

Elgio Schlemer
elgio@inf.ufrgs.br
 
Curso de Pós graduação em Ciência da Computação
Instituto de Informática - CPGCC
Universidade Federal do Rio Grande do Sul
 
 

Resumo

 
 
 

Abstract

 
   

 

    Introdução

    Cada dia mais e mais pessoas acessam redes de computadores. Sem dúvida a mais popularizada é a Internet. Com ela você pode colocar informações em sua máquina e disponibizá-las para todo o mundo. Em uma empresa, por exemplo, você pode ter sua pequena rede de computadores PC?s diretamente conectada ao resto do mundo. Coisas como receber um pedido de compra via Internet, confirmar o pedido via e-mail e imediatamente dar baixa do produto no estoque ao mesmo tempo que sinaliza ao Departamento de entregas, para que o mesmo empacote e envie a mercadoria ao cliente; isto já há muito deixou de ser ficção. É o Shopping Virtual!

    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.

    Figura 3.1: Ilustração de um Firewall

    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.

    1
    2
    3
    4
     
    1
    2
    3
    4
      Texto original: redesdecomputadores
    r
    e
    d
    e
    1
    r
    s
    o
    t
      Texto cifrado: rsotredmaedepdsecuo
    s
    d
    e
    c
    2
    r
    e
    d
    m
       
    o
    m
    p
    u
    3
    a
    e
    d
    e
       
    t
    a
    d
    o
    4
    p
    d
    s
    e
      chave: 4 (4 colunas)
    r
    e
    s
    -
    5
    c
    u
    o
    -
       
    Tabela 4.1 

    Data Encrypton Standart (DES)

    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). 

      Nome 
      Nota prova 
      Nota trabalho
      Fulano
      9,5
      8,5
      Ciclano
      8,0
      8,5
      Beltrano
      6,0
      5,0
      Figura 4.2 - Exemplo de falha no DES
 
    Para melhorar a segurança no DES, pode-se fazer um encadeamento entre os blocos, como, por exemplo, fazer um OU EXCLUSIVO do bloco com o bloco anterior. Neste caso o "Beltrano" não alcançaria seu objetivo, pois o texto ficaria inteligível após o bloco de sua nota, porque os blocos subsequentes fizeram um OU EXCLUSIVO com a suas notas originais. Outras modificações foram sugeridas para remendar o DES, sendo uma delas fazer três vezes a criptografia com duas chaves de 56 bits (como se fosse uma de 112 bits), mas mesmo assim, o DES não deve ser usado para coisas realmente confidenciais [TAN97].


    Criptografia com chave pública e privada

    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.

Figura 4.3: Troca de Chaves Diffie-Helmann
 
 
    Resumidamente consiste no seguinte: ambos os usuários (ou máquinas) escolhem dois números primos, n e g. Obviamente isto terá que ser de acordo de ambos e portanto são públicos, pois tiveram que envia-los pela rede. Cada um, no entanto seleciona mais um número, este bem extenso (não precisa ser primo), digamos x e y (x para o remetente - R - e y para o destinatário - D). Esses números serão exclusivos de cada um e não serão compartilhados. R então começa a comunicação e envia para D os seguintes dados: (n, g, gx mod n). Observe: n e g são públicos mas x é privado e não foi enviado, foi enviado sim uma operação matemática envolvendo-o. Da mesma forma D responde com (gy mod n). Por propriedades matemáticas temos que (gy mod n)x = (gx mod n) y e cada um pode, individualmente calcular a chave. Não será possível para nenhuma outra máquina calcular a chave, pois ela não conhece nem x nem y (figura 4.3). Vejamos um simples exemplo [TAN97] (o tamanho dos números primos envolvidos define o grau de segurança). Assumiremos n=47, g=3, x=8 e y=10. Bem, n e g então são públicos e de conhecimento de todos. X e Y são exclusivos de cada máquina. A máquina X envia então para a Y: n, g, gx mod n, ou seja, envia 47, 3 e 28 (38 mod 47) e recebe de Y: 17 (310 mod 47). A máquina X calcula sua chave: (178 mod 47) e acha 4. Já a máquina Y calcula a sua: (288 mod 47) e acha 4 também. Ambas tem agora uma chave compartilhada: 4.

    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

    O conceito de desafio-resposta usado em protocolos de autentificação propõe que cada máquina gere um desafio a outra. Se a outra conseguir resolve-lo, garante-se a autenticidade dela. Como cada máquina tem sua chave pública e privada, ou ainda, ambas tem uma única chave privada compartilhada, uma delas gera um número aleatório e envia a outra. Esta, por sua vez, criptografa-o usando sua chave (privada) e envia de volta. Se esta conseguir decriptografá-la usando a chave pública da destino (ou a mesma privada, no caso de compartilhamento de chaves), confirma-se a autenticidade do destino. Se necessário, o destino também poderá enviar um desafio ao origem, para se certificar de sua autenticidade. Após ambos estarem certos em relação a outra a comunicação poderá ser estabelecida. Será impossível ao intruso estabelecer uma conexão usando pacotes originais de ambas as máquinas, porque no desafio os números gerados são aleatórios.

    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

    Uma rápida olhada na arquitetura das redes de meio compartilhado denuncia que a mesma não é segura, pois todas as mensagens podem ser "bisbilhotadas" por qualquer máquina e seus endereços podem ser falsificados. Várias maneiras existem para melhor em um ou outro aspecto a segurança. Todos porém apresentam alguma limitação ou falha. Um firewall, por exemplo, não pode simplesmente analisar o conteúdo de todos os pacotes que entram e saem de sua sub-rede porque isso seria muito custoso. Além do mais, ele só garante a segurança contra ataques externos e não os internos e deverá ser a única porta de entrada da sub-rede. Criptografia torna, sem dúvida, uma comunicação muito mais segura, mas temos o problema do estabelecimento das chaves sem falar de uma certa queda de desempenho ao fazermos uso dela. Além do mais, dependendo da forma como a criptografia é feita, isso pode atrapalhar alguns roteadores ou mesmo firewalls com filtros mais rigorosos.

    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.