Por Patrick Brandão
http://www.patrick.eti.brcontato@patrick.eti.br
O programa
NoCatAuth, criado pela
nocat.net tem o propósito de evitar que pessoas não autorizadas tenham acesso a internet em rede wireless. Para isso, esse programa em Perl captura o tráfego na porta 80 e o desvia para um servidor HTTP, onde haverá uma página solicitando usuário e senha, e opcionalmente, uma página para cadastro.
O NoCat também pode ser usado para simplesmente obrigar o usuário a ler uma página de splash antes de navegar, onde se pode colocar um termo de uso, um aviso ou simplesmente a página do provedor de acesso.
O NoCat pode ser configurado para rodar em três modos:
- OPEN - O tráfego na porta 80 é capturado e redirecionado para uma página de splash, após a página ter sido carregada, o acesso à internet é liberado para o host.
- PASSIVE - O tráfego dos usuários não autenticados para a porta 80 será capturado, após a autenticação, uma regra de firewall (iptables ou ipchains) permitirá o acesso à internet por meio de NAT.
- CAPTIVE - Semelhante ao PASSIVE, porém, ao se identificar com sucesso, o acesso à internet será liberado, mas sem NAT.
O NoCatAuth funciona com duas instâncias nos modos PASSIVE e CAPTIVE, uma, NoCat Gateway, e outra NoCat Auth, o Gateway redirecionará o tráfego HTTP para a porta 80 do servidor Auth que após autenticar o usuário, se conectará na porta 5280 do Gateway para dar permissão de passagem ao host. A conexão do servidor Auth na porta 5280 do Gateway é criptografada com PGP para dar suporte a casos em que o servidor Auth tem uma conexão não confiável com o servidor Gateway.
Tomei a iniciativa de escrever este tutorial ao ver que não encontrava, nem no Google, nem na própria página no NoCat, um tutorial que me ensinasse com clareza como se usa este programa.
Objetivo
|
- Permitir acesso à internet somente a usuários autenticados;
- A autenticação terá que ser feita em uma página web e a base de dados deverá ser armazenada em um banco de dados MySQL;
- Usar HTTPS na página de autenticação;
- Os hosts devem receber um endereço IP dinâmico e inválido (não roteável);
- Os usuários devem ter acesso por NAT, que será feito no gateway;
- Os servidores NoCatAuth e NoCatGateway deverão ser instalados no mesmo computador.
Tecnologias usadas e ambiente de laboratório - Linux 2.4.26 (distribuição Slackware 10.0 - instalação FULL)
- Apache 2.0.50/mod_ssl
- OpenSSL 0.9.7d
- GnuPG 1.2.2
- NocatAuth 0.82
- MySQL 4.0.20
- Perl 5.8.4
- DHCPD 1.3.0pl2
- BIND 9.2.3
- IPTABLES 1.2.10
Computador de laboratório: - Processador: K6-II 500MHz
- Memória: 128 MB
- HD: 15GB ( Particionamento: 1 - 512 MB Swap, 2 - 14200 MB EXT3)
- Placas de rede: 2 - 3COM (eth0 192.168.150.21, eth1 192.168.10.1)
- Sistema operacional: Linux Slackware 10.0 (instalação FULL).
- CDROM 52x
Material mínimo necessário: Computador com 2 interfaces de rede e drive cdrom/dvdrom, cd de instalação do Slackware 10.0, acesso a internet no momento da instalação (downloads de pendências).
|
Instalação dos programas O Slackware 10.0 vem com o Apache 1.3, mas eu particularmente prefiro o Apache 2.0.50, por isso vou usá-lo nesta solução. Se você tem experiência como Apache 1.3.x, fique a vontade em usá-lo, senão:
Removendo Apache 1.3:
# removepkg apache-1.3.31-i486-2
O OpenSSL versão 0.9.7.d, GnuPG 1.2.4, MySQL 4.0.20 e Perl 5.8.4 (e modulo perl Digest::MD5) já vêem instalados por padrão (instalação FULL) no Slack 10.
Instalação do Apache 2.0.50
# cd /usr/local/src # wget http://apache.usp.br/httpd/httpd-2.0.50.tar.gz # tar xvzf httpd-2.0.50.tar.gz # cd httpd-2.0.50 # ./configure --enable-ssl --enable-cgi --enable-suexec --enable-so # make # make install
O Apache será instalado no diretório /usr/local/apache2, os arquivos de configuração ficarão na pasta usr/local/apache2/conf.
Módulos Perl
Os módulos usados pelo NoCat para esta solução são: - Net::Netmask
- DBI
- DBD::mysql
- Digest::MD5
Se você deseja usar outro tipo de autenticação, consulte a documentação do NoCat. Várias tecnologias são suportadas: IMAP, LDAP, SAMBA, PAM, RADIUS, etc.
A primeira vez que você invocar o CPAN do Perl, ele solicitará algumas configurações do sistema e da localidade, basta responder N que ele usará a configuração padrão. Necessário estar conectador.
# perl -MCPAN -e shell cpan> install Bundle::CPAN (ENTER para todas as perguntas) cpan> install DBI cpan> install DBD::mysql cpan> install Digest::MD5 cpan> install Net::Netmask cpan> exit
Atenção, as linhas seguintes testam os módulos e não podem retornar erros:
# perl -MDBI # perl -MDBD::mysql # perl -MDigest::MD5 # perl -MNet::Netmask
Agora o Perl está completo para o NoCat.
Ativar MySQL
Vamos ativar o MySQL, pois no Slackware 10.0 ele se encontra instalado, porém alguns ajustes são necessários para colocá-lo rodando.
Como nós iremos usar o MySQL apenas para armazenar algumas centenas de logins, não convém reservar recursos desnecessários. Por isso será usado o arquivo de configuração my-small.cnf (ver documentação do MySQL).
Em seguida criaremos um banco de dados para o NoCatAuth e um login de acesso para ele.
# cp /etc/my-small.cnf /etc/my.cnf # mysql_install_db # chown mysql.mysql /var/lib/mysql /var/run/mysql -R # chmod +x /etc/rc.d/rc.mysqld # /etc/rc.d/rc.mysqld start
Conferindo se o servidor MySQL esta de pé:
# nmap localhost -p 3306 Starting nmap 3.50 ( http://www.insercure.org/nmap/ ) at 2004-07-26 16:02 Interesting ports on localhost (127.0.0.1): PORT STATE SERVICE 3306/tcp open mysql Nmap run completed - 1 IP address (1 host up) scanned in 0.331 seconds
Ajustando a senha do root mysql:
# mysqladmin password senhadorootmysqlaqui # mysql -u root -psenhadorootmysqlaqui mysql> CREATE DATABASE nocat; mysql> GRANT ALL PRIVILEGES ON nocat.* TO nocat@localhost IDENTIFIED BY "senhadonocat" WITH GRANT OPTION; mysql> FLUSH PRIVILEGES; mysql> exit
Substitua "senhadorootmysqlaqui" pela senha de root do MySQL, cuidado com esta senha. Faça o mesmo com "senhadonocat".
NoCAT
Todos os códigos necessários para construção do nosso servidor, tanto Auth como Gateway estão no mesmo pacote:
# wget http://nocat.net/download/NoCatAuth/NoCatAuth-0.82.tar.gz # tar -xvzf NoCatAuth-0.82.tar.gz # cd NoCatAuth-0.82
NoCAT Gateway
# make PREFIX=/usr/local/nocat/gw gateway
NoCAT Auth
# make PREFIX=/usr/local/nocat/authserv authserv
Chave PGP
A chave de PGP deve ser a mesma para ambas as instâncias para que elas se comuniquem, portanto, vamos criá-la no authserv e copiá-la para o gateway. Não defina uma senha para esta chave.
# make PREFIX=/usr/local/nocat/authserv pgpkey # cp /usr/local/nocat/authserv/trustedkeys.gpg /usr/local/nocat/gw/pgp
Pronto, a instalação já está feita, agora vamos configurar tudo, começando pelo Apache. |
Configuração Apache
Criando certificados: Como não temos dinheiro sobrando para comprar um certificado da VeriSign (pelo menos eu não), vamos ser nossa própria entidade certificadora. Crie um diretório na pasta raíz do Apache com o nome ssl:
# cd /usr/local/apache2 # mkdir ssl # cd ssl
Vamos criar os certificados:
# openssl genrsa -out nocat.key 1024
Criar assinatura do certificado digital:
# openssl req -new -key nocat.key -out nocat.csr
Certificado auto-assinado:
# openssl x509 -days 365 -req -in nocat.csr -signkey nocat.key -out nocat.crt
Configurando HTTPS e CGI-BIN
Edite o arquivo /usr/local/apache2/conf/httpd.conf e procure onde está a definição da pasta virtual cgi-bin:
ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
AllowOverride None Options None Order allow,deny Allow from all
Altere para o exemplo abaixo:
| ScriptAlias /cgi-bin/ /usr/local/nocat/authserv/cgi-bin/
SetEnv PERL5LIB /usr/local/nocat/suthserv/lib SetEnv NOCAT /usr/local/nocat/authserv/nocat.conf | Edite o arquivo /usr/local/apache2/conf/ssl.conf e preencha com o seguinte conteúdo:
| SSLRandomSeed startup builtin SSLRandomSeed connect builtin
Listen 443 AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl SSLPassPhraseDialog builtin SSLSessionCache dbm:/usr/local/apache2/logs/ssl_scache SSLSessionCacheTimeout 300 SSLMutex file:/usr/local/apache2/logs/ssl_mutex DumentRoot /usr/local/apache2/htdocs ServerName authserv.dominio.com.br:443 ServerAdmin contato@patrick.eti.br ErrorLog /usr/local/apache2/logs/erros_log TransferLog /usr/local/apache2/logs/access_log SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificateFile /usr/local/apache2/ssl/nocat.crt SSLCertificateKeyFile /usr/local/apache2/ssl/nocat.key SSLOptions +StdEnvVars SSLOptions +StdEnvVars SetEnvIf User-Agent .*MSIE.* \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 CustomLog /usr/local/apache2/logs/ssl_request_log \ %t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \%r\ %b | NoCatAuth
Vá até o diretório /usr/local/nocat/authserv, edite o arquivo nocat.conf e confira os parâmetros:
| Verbosity 10 PGPKeyPath /usr/local/nocat/authserv/pgp HomePage http://www.dominio.com.br/ DocumentRoot /usr/local/nocat/authserv/htdocs
# configuraçao do banco de dados MySQL # reveja a ativação do mysql para conferir a senha que você configurou DataSource DBI Database dbi:mysql:database=nocat DB_User nocat DB_Passwd senhadonocat | Os demais parâmetros devem permanecer inalterados, a menos que você saiba o que esta fazendo. Na ativação do MySQL, nós apenas criamos o banco de dados nocat, agora vamos criar as tabelas. No pacote de instalação do NoCat há uma pasta etc e dentro dela um arquivo chamado nocat.schema. Execute o seguinte comando para criar a estrutura de tabelas:
# mysql -u root -psenhadorootmysqlaqui nocat < /usr/local/src/NoCatAuth-0.82/etc/nocat.schema
MUITO IMPORTANTE: Já vi varias perguntas na internet sobre um erro:
"INTERNAL SERVER ERROR"
Quando se solicita a autenticação. Como o nocat auth roda por meio de cgi, o usuario que acessa os arquivos em /USR/LOCAL/NOCAT/AUTHSERV/* é o usuario do Apache. Para que esse erro desapareça, dê o domínio desses arquivos para o Apache, execute:
# chown apacheuser.apachegroup /usr/local/nocat/authserv -R # chmod 700 /usr/local/nocat/authserv -R
LEMBRANDO QUE: apacheuser e apachegroup deverá ser substituído pelo usuário e grupo que roda o Apache.
NoCatGateway
Edite agora o arquivo nocat.conf do diretório /usr/local/nocat/gw e confira os parâmetros abaixo:
| Verbosity 10 GatewayName Domínio Gateway - Autenticação
# se o gateway também faz NAT, você deve usar Passive, senão, use Captive GatewayMode Passive LoginTimeout 86400 HomePage http://www.dominio.com.br/ DocumentRoot /usr/local/nocat/gw/htdocs
# Coloque no parâmetro abaixo, os logins que tem livre acesso separados de espaço # ou comentar essa linha para que todos autentiquem Owners contato@patrick.eti.br tol83@bol.com.br
# ip da interface em contato com rede wireless ou rede local AuthServiceAddr 192.168.10.1 AuthServiceURL https://$AuthServiceAddr/cgi-bin/login LogoutURL https://$AuthServiceAddr/logout.html
# interface com ip roteável na internet ExternalDevice eth0
# interface com usuários (192.168.10.1) InternalDevice eth1
# apenas este DNS poderá ser usado na rede dos usuários, caso # este parâmetro não seja definido, serão liberados os endereços # dos servidores no arquivo /etc/resolv.conf # lembre-se de colocar os mesmos servidores na configuração do DHCPD DNSAddr 192.168.10.1 192.168.150.56 | Os demais parâmetros devem permanecer inalterados, a menos, é claro, que você saiba o que está fazendo.
Configurando DHCPD
Para que os usuários não tenham que trocar nas configurações de rede dos seus computadores, vamos configurar o gateway para servir isso para eles. Edite o arquivo /etc/dhcpd.conf e preencha com as linhas:
| ddns-update-style none; default-lease-time 600; max-lease-time 600000; option broadcast-address 192.168.10.255;
# desativar dhcpd para a interface 192.168.150.21 subnet 192.168.150.0 netmask 255.255.255.0 {} subnet 192.168.10.0 netmaks 255.255.255.0 { range 192.168.10.100 192.168.10.200; option routers 192.168.10.1; option domain-name "dominiowireless.com.br"; option domain-name-servers 192.168.10.1; } # mais informacoes: # man dhcpd.conf | Opcional: Servidor DNS
É recomendável que você tenha um servidor DNS no gateway, portando adiciona o NAMED na inicialização do Slackware 10.0:
# chmod +x /etc/rc.d/rc.bind |
Iniciando o servidor Por motivos de segurança, já que o Apache 1.3 foi removido, desative o rc.httpd com o comando:
# chmod -x /etc/rc.d/rc.httpd
Crie o arquivo /etc/rc.d/rc.nocat com o seguinte conteúdo:
| #!/bin/sh NC=/usr/loca/nocat/gw export PERL5LIB=$NC/lib:$PERL5LIB export NOCAT=$NC/nocat.conf case "$1" in start) echo "Starting the NoCat gateway ..." $NC/bin/gateway ;; stop) echo "Stopping the NoCat gateway ..." killall gateway 2>/dev/null restart) $0 stop sleep 1 $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac | E torne-o executável:
# chmod +x /etc/rc.d/rc.nocat
Execute os comandos abaixo para rodar o DNS e o MySQL na inicialização do sistema:
# chmod +x /etc/rc.d/rc.bind # chmod +x /etc/rc.d/rc.mysqld
Vamos agora configurar o servidor para levantar os serviços de forma organizada. Edite o arquivo /etc/rc.d/rc.local e certifique-se de que há as seguintes linhas (adicione as que faltarem):
| # iniciando servidor DHCPD dhcpd
# iniciando apache com suporte a SSL If [ -x /usr/local/apache2/bin/apachectl ]; then /usr/local/apache2/bin/apachectl startssl fi
# iniciando NoCatGateway /etc/rc.d/rc.nocat start | Agora, reinicie o servidor. Seu gateway autenticado está pronto! | Créditos: Patrick Brandao http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=1338&pagina=1
|
Nenhum comentário:
Postar um comentário