Arquivo

Arquivo de maio, 2008

Configuração de um Firewall com Iptables

30, maio, 2008 Rafael 1 comentário

Bem, hoje resolvi postar algumas dicas sobre o iptables esse poderoso firewall que nos serve a cada dia eheh falo isso pq aqui em casa compartilho minha net 2mb com alguns vizinhos mas sempre tem um engracadinho que quer deixar emule ligado o dia todo ou então passar o dia fazendo downloads, então com Firewall + Iptraf consigo tranquilamente resolver o problema, e vou passar algumas dicas do iptables.

Na configuração do Firewall com o iptables, é preciso saber quais são as regras a serem utilizadas para rodar o Firewall:

Regras do Firewall

  • INPUT: È utilizada quando o destino final é a própria máquina firewall.
  • OUTPUT: Qualquer pacote gerado pela máquina firewall e que deva sair para a rede será tratado pela regra OUTPUT.
  • FORWARD: Qualquer pacote que atravessa o firewall, de uma máquina e direcionado à outra, será tratado pela chain FORWARD. Basicamente o IPTABLES tem as seguintes políticas:
  • DROP – Nega pacote e não manda um pacote de volta para o emitente.
  • ACCEPT – Aceita o pacote
  • REJECT – Nega pacote e manda um pacote de volta do tipo host-unreachable (Host Inalcançável) ==Comandos Principais do IPtables== – -A – Este comando acrescenta uma regra às existentes no sistema, ou seja, permite atualizar regras já existentes na estrutura do firewall. – -I – Este comando insere uma nova regra dentro das existentes no firewall. – -D – Este comando exclui uma regra específica no firewall. – -P – Este comando define a regra padrão do firewall. – -L – Este comando lista as regras existentes no firewall. – -F – Este comando ZERA todas as regras criadas no Firewall (o chamado flush). – -h – Este comando mostrará o help, ajuda de comando. – -R – Este comando substitui um regra no firewall. – -C – Este comando basicamente checa as regras. – -Z – Este comando zera uma regra específica. – -N – Este comando cria uma nova regra com um nome. – -X – Este comando exclui uma regra específica por seu nome.

Os parâmetros padrão do iptables são os seguintes:

- -p! (protocolo) – define qual o protocolo TCP/IP deverá ser tratado. São eles: TCP, UDP e ICMP

- -s! (origem)/ -d! (destino) – Define qual o endereço de origem (-S) e de destino (-D) que a regra atuará. Este comando possui dois argumentos: endereço/máscara e porta. Ex.: -S 10.0.0.1/24 80,.

- -i! (interface) – define o nome da interface de rede onde trafegará os pacotes de entrada e saída do firewall. Muito utilizado em mascaramento e técnicas de NAT. Exemplo: -W eth1.

- -j! (ir para) – Serve para redirecionar uma ação desde que as regras sejam similares.

- -f!(fragmento) – Trata datagrama fragmentados.

Os comandos e os parâmetros são exatamente iguais aos do ipchains, sem tirar nem pôr.

Extensões

Novidade do iptables que facilita as regras.

 -sport[!] [port:port] -dport[!] [port:port]

Normalmente estas extensões são utilizadas com o comando -m do iptables. Trata-se de um direcionamento de porta(s) origem (-sport), para porta(s) destino (-dport). Pode-se inclusive definir um número padrão de portas para o acesso (port:port). Este comando pode ser utilizado tanto para portas TCP ou UDP.

 -mac-source[!] endereço

especifica qual a placa de rede, através de seu endereço MAC, que irá transmitir pacotes através do firewall, limitado pela política do mesmo.

 -icmp-type[1] tipo

Especifica quais os tipos de pacotes ICMP pode passar ou não pelo firewall, São eles:

 Mensagem Tipo Código Echo-request 8 0 Echo-reply 3 0 Source-quench 4 0 Time-exceed 11 0 Destination-unreachable 3 0 Network-unreachable 3 0 Host-unreachable 3 1 Protocol-unreachable 3 2 Port-unreachable 3 3

Com isto podemos bloquear alguns ataques do tipo ping flood, bloquear ping e etc

[!] — syn – especifica o uso dos bits ACK e FIN em requisições SYN TCP.

Especificamente, a opção -m state' aceita uma opção adicional–state’, que é uma lista de estados de ativação separados por vírgula. (a flag ‘!’ não indica a ativação desses estados). Esses estados são:

NEW Um pacote que cria uma nova conexão.

ESTABLISHED Um pacote que pertence a uma conexão existente (isto é, um pacote de resposta).

RELATED Um pacote que está relacionado com (mas não faz parte de) uma conexão existente, como um ICMP error, ou (com o módulo FTP inserido),um pacote que estabelecido por uma conexão de dados ftp.

INVALID Um pacote que não poderia ser identificado por alguma razão: isto inclui execução fora da memória e erros de ICMP que não correspondam a nenhuma conexão existente. Geralmente estes pacotes devem ser barrados (drop).

Exemplos do Firewall

 #iptables -A INPUT -p icmp -j DROP

Esta regra nega todos os pacotes ICMP vindos do servidor, em que se encontra o firewall.

 #iptables -D INPUT -p icmp -j DROP

Esta regra exclui a regra criar acima.

 #iptables -A INPUT -s 192.168.1.0/24 -j DROP

Esta regra acima faz com que todos os pacotes vindo de qualquer endereço da classe de ip 192.168.1.1 á 192.168.1.255 nega os pacotes.

 #iptables -A OUTPUT -p icmp -d ! 192.168.1.0/24 -j ACCEPT

Esta regra acima faz com que todos os pacotes vindo de qualquer endereço da classe de ip 192.168.1.1 á 192.168.1.255 aceita os pacotes.

 #echo 1 > /proc/sys/net/ipv4/ip_forward

Habilitando o recurso de IP forwarding

Configurando o Firewall contra ataque

Proteção contra Syn-floods

 # iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

Port scanners ocultos

 # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit
 1/s -j ACCEPT

Ping da morte

 # iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

Proteção Contra IP Spoofing

 # iptables -A INPUT -s 10.0.0.0/8 -i Interface da NET -j DROP
 # iptables -A INPUT -s 172.16.0.0/16 -i Interface da NET -j DROP
 # iptables -A INPUT -s 192.168.0.0/24 -i Interface da NET -j DROP

Obs.: Interface da NET pode ser ppp0, ethX e etc.

Log a portas proibidas e alguns backdoors

Porta FTP

 # iptables -A INPUT -p tcp --dport 21 -j LOG --log-prefix "Serviço: FTP"

Porta Wincrash

 # iptables -A INPUT -p tcp --dport 5042 -j LOG --log-prefix "Serviço: Wincrash"

Portas BackOrifice

 # iptables -A INPUT -p tcp --dport 12345 -j LOG --log-prefix "Serviço: BackOrifice"
 # iptables -A INPUT -p tcp --dport 123456 -j LOG --log-prefix "Serviço: BackO

Redirecionamento de Portas (Usado em DMZ)

Redirecionar Porta SMTP

 # iptables -t nat -A PREROUTING -i ethx -p tcp --dport 25 -j DNAT --to 192.168.1.1

Redirecionar Porta POP

 # iptables -t nat -A PREROUTING -i ethx -p tcp --dport 110 -j DNAT --to 192.168.1.1

OBS.:Sendo que ethx é sua interface de entrada da WAN.

Bloqueando Kazaa Lite

Para ativar o módulo String match support (EXPERIMENTAL) tem que aplicar o patch e logo depois compilar o kernel.

 # iptables -m string --string "X-Kazaa-Username:" -j DROP
 # iptables -m string --string "X-Kazaa-Network:" -j DROP
 # iptables -m string --string "X-Kazaa-IP:" -j DROP
 # iptables -m string --string "X-Kazaa-SupernodeIP:" -j DROP

Bloqueando cmd.exe

Neste caso você tenha atrás do seu firewall linux um servidor de web IIS da microsoft, e deseja evitar que worms com código arbitrários que usam o comando cmd.exe:

Bloqueando em Silêncio

 # iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe"

Bloqueando e reportando por uma hora

 # iptables -I INPUT -j LOG -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe" -m limit --limit 1/hour
 Scripts Cases Ruleset 1 Ruleset 2 Ruleset 3 Ruleset 4 Ruleset 5 Ruleset 6

Referência:

Validando login com Ajax

10, maio, 2008 Rafael 1 comentário

Criei este sistema que valida se o usuário esta cadastrado antes mesmo de acabar de concluir o cadastro.

Se tentarem se cadastrar com um nome de usuário que já existe aparecerá uma mensagem quando o campo nome perder o foco.

O sistema é muito simples e não tem segredo e eu não fiquei perdendo tempo enfeitando o código com CSS nem nada, o foco aqui é o AJAX e mostrar que ele retorna true ou false depois de digitar o nome de usuário.

Arquivo cadastro.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1257" />
    <title>Login</title>
<style>
<!--
html, body {
    margin:0;
    padding:0;
}    

fieldset {
    width:260px;
    margin:0 auto;
    padding:30px;
}

.texto {
    width:250px;
    border:1px solid gray;
}

.erro {
    width:250px;
    border:1px solid red;
}

.alerta2 {
    border:1px solid gray;
}
-->
</style>
<script src="ajax.js" type="text/javascript"></script>
<script src="funcoes.js" type="text/javascript"></script>
</head>
<body>
<fieldset>
    <legend>Usuario</legend>
        <form id="form1" name="form1" method="post" action="login.php">
            <div id="alerta"></div>
            <label>Login</label><br />
            <input name="login" id="login" type="text" maxlength="30" class="texto" onblur="javascript: envia('receber.php', 'POST', false);" /><br />
            <labeL>Senha</labeL><br />
            <input name="senha" id="senha" type="password" maxlength="30" class="texto" /><br />
          <input name="botao" type="submit" value="Enviar" />
    </form>
</fieldset>
</body>
</html>
Arquivo ajax.js:

function ajax() {
};
ajax.prototype.iniciar = function() {

    try{
        this.xmlhttp = new XMLHttpRequest();
    }catch(ee){
        try{
            this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        }catch(e){
            try{
                this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }catch(E){
                this.xmlhttp = false;
            }
        }
    }
    return true;
}

ajax.prototype.ocupado = function() {
    estadoAtual = this.xmlhttp.readyState;
    return (estadoAtual && (estadoAtual < 4));
}

ajax.prototype.processa = function() {
    if (this.xmlhttp.readyState == 4 && this.xmlhttp.status == 200) {
        return true;
    }
}

ajax.prototype.enviar = function(url, metodo, modo) {
    if (!this.xmlhttp) {
        this.iniciar();
    }
    if (!this.ocupado()) {
        if(metodo == "GET") {
            this.xmlhttp.open("GET", url, modo);
            this.xmlhttp.send(null);
        } else {
            this.xmlhttp.open("POST", url, modo);
            this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
            this.xmlhttp.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
            this.xmlhttp.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
            this.xmlhttp.setRequestHeader("Pragma", "no-cache");
            this.xmlhttp.send(url);
        }    

        if (this.processa) {
            return unescape(this.xmlhttp.responseText.replace(/\+/g," "));
        }
    }
    return false;
 }
Arquivo funcoes.js:

function envia(url, metodo, modo)
{
    var login = document.getElementById('form1').login.value;
    remoto  = new ajax();
    xmlhttp = remoto.enviar(url + "?login=" + login, metodo, modo );
    if(xmlhttp) {
        document.getElementById('login').className = 'erro';
        document.getElementById('alerta').className = 'alerta2';
        document.getElementById("alerta").innerHTML = 'Esse usuario ja esta cadastrado';
    } else {
        document.getElementById('login').className = 'texto';
        document.getElementById('alerta').className = '';
        document.getElementById("alerta").innerHTML = '';
    }
}

Arquivo receber.php:

<?php
$texto = $_REQUEST["login"];
// no lugar do if basta fazer uma conexao com o banco e um select pesquisando o nome do usuario se ja existe
//acho que todos sabem fazer isso ne?
if($texto == "Fulano") {
    echo true;
} else {
    echo false;
}
Tá ai só com o funcional para vocês adaptarem do jeito que achar melhor!
?>
Categories: Ajax Tags:
Navigation »