Sunteți pe pagina 1din 34

FREERADIUS 1.1.7 / DEBIAN ETCH 4.

0
Procedimentos para a instalao do Freeradius 1.1.7 com suporte a
EAP-TLS e PEAP-TTLS MSCHAPv2 No Debian Etch 4.0 Kernel 2.6.19.

1 - Baixar e instalar os pacotes necessrios para a compilao dos


fontes do Freeradius.

apt-get install dpkg*


apt-get build-dep openssl
apt-get build-dep gcc
apt-get install dpatch
apt-get install fakeroot
apt-get install autotools-dev
apt-get install libtool
apt-get install libltdl3-dev
apt-get install libpam0g-dev
apt-get install libmysqlclient15-dev
apt-get install libgdbm-dev
apt-get install libldap2-dev
apt-get install libsasl2-dev
apt-get install libiodbc2-dev
apt-get install libkrb5-dev
apt-get install libperl-dev
apt-get install snmp
apt-get install libsnmp9-dev
apt-get install libpq-dev

2- Fazer o download dos Fontes do Freeradius

cd /usr/local/src
wget ftp://ftp.freeradius.org/pub/radius/freeradius-1.1.7.tar.gz
tar -zxvf freeradius-1.1.7.tar.gz
cd freeradius-1.1.7

3- Acessar o diretrio /usr/local/src/freeradius-1.1.7/debian, copiar o


arquivos rules para /usr/local/src/freeradius-1.1.7/.

cd /usr/local/src/freeradius-1.1.7
cp rules ../

4- Edite o arquivo rules e descomente as linhas modulepackages


e buildssl. Aps isso Insira --without-rlm_counter em ./configure
dentro do mesmo arquivo.

mcedit rules

modulepackages = krb5 ldap mysql iodbc postgresql


buildssl = --with-rlm_sql_postgresql_lib_dir=`pg_config --libdir` --with-
rlm_sql_postgresql_include_dir=`pg_config --includedir`
dh_testdir
# dh_testroot
./configure \
$(confflags) \
--config-cache \
--prefix=/usr \
--exec-prefix=/usr \
--mandir=$(mandir) \
--sysconfdir=/etc \
--libdir=$(libdir) \
--datadir=/usr/share \
--localstatedir=/var \
--without-rlm_counter
--with-raddbdir=$(raddbdir) \
--with-logdir=/var/log/$(package) \
--with-system-libtool --disable-ltdl-install \
--with-large-files --with-udpfromto --with-edir \
--enable-strict-dependencies \
--enable-developer \
${buildssl}

5- Execute o arquivo rules.

./rules

6- Execute make e logo aps make install

make
make install

7- Aps a instalao vamos configurar o suporte a EAP-TLS e PEAP-


TTLS MSCHAPv2.

7. 1 edite o arquivo /etc/raddb/eap.conf e deixe exatamente como


abaixo:
# -*- text -*-
#
# Whatever you do, do NOT set 'Auth-Type := EAP'. The server
# is smart enough to figure this out on its own. The most
# common side effect of setting 'Auth-Type := EAP' is that the
# users then cannot use ANY other authentication method.
#
# $Id: eap.conf,v 1.4.4.5 2007/04/20 11:58:45 aland Exp $
#
eap {
# Invoke the default supported EAP type when
# EAP-Identity response is received.
#
# The incoming EAP messages DO NOT specify which EAP
# type they will be using, so it MUST be set here.
#
# For now, only one default EAP type may be used at a time.
#
# If the EAP-Type attribute is set by another module,
# then that EAP type takes precedence over the
# default type configured here.
#
default_eap_type = md5

# A list is maintained to correlate EAP-Response


# packets with EAP-Request packets. After a
# configurable length of time, entries in the list
# expire, and are deleted.
#
timer_expire = 60

# There are many EAP types, but the server has support
# for only a limited subset. If the server receives
# a request for an EAP type it does not support, then
# it normally rejects the request. By setting this
# configuration to "yes", you can tell the server to
# instead keep processing the request. Another module
# MUST then be configured to proxy the request to
# another RADIUS server which supports that EAP type.
#
# If another module is NOT configured to handle the
# request, then the request will still end up being
# rejected.
ignore_unknown_eap_types = no

# Cisco AP1230B firmware 12.2(13)JA1 has a bug. When


given
# a User-Name attribute in an Access-Accept, it copies one
# more byte than it should.
#
# We can work around it by configurably adding an extra
# zero byte.
cisco_accounting_username_bug = no

# Supported EAP-types

#
# We do NOT recommend using EAP-MD5 authentication
# for wireless connections. It is insecure, and does
# not provide for dynamic WEP keys.
#
md5 {
}

# Cisco LEAP
#
# We do not recommend using LEAP in new deployments.
See:
# http://www.securiteam.com/tools/5TP012ACKE.html
#
# Cisco LEAP uses the MS-CHAP algorithm (but not
# the MS-CHAP attributes) to perform it's authentication.
#
# As a result, LEAP *requires* access to the plain-text
# User-Password, or the NT-Password attributes.
# 'System' authentication is impossible with LEAP.
#
leap {
}

# Generic Token Card.


#
# Currently, this is only permitted inside of EAP-TTLS,
# or EAP-PEAP. The module "challenges" the user with
# text, and the response from the user is taken to be
# the User-Password.
#
# Proxying the tunneled EAP-GTC session is a bad idea,
# the users password will go over the wire in plain-text,
# for anyone to see.
#
gtc {
# The default challenge, which many clients
# ignore..
#challenge = "Password: "

# The plain-text response which comes back


# is put into a User-Password attribute,
# and passed to another module for
# authentication. This allows the EAP-GTC
# response to be checked against plain-text,
# or crypt'd passwords.
#
# If you say "Local" instead of "PAP", then
# the module will look for a User-Password
# configured for the request, and do the
# authentication itself.
#
auth_type = PAP
}

## EAP-TLS
#
# To generate ctest certificates, run the script
#
# ../scripts/certs.sh
#
# The documents on http://www.freeradius.org/doc
# are old, but may be helpful.
#
# See also:
#
#
http://www.dslreports.com/forum/remark,9286052~mode=flat
#
tls {
private_key_password = whatever
private_key_file = ${raddbdir}/certs/cert-srv.pem

# If Private key & Certificate are located in


# the same file, then private_key_file &
# certificate_file must contain the same file
# name.
certificate_file = ${raddbdir}/certs/cert-srv.pem

# Trusted Root CA list


CA_file = ${raddbdir}/certs/demoCA/cacert.pem

#
# For DH cipher suites to work, you have to
# run OpenSSL to create the DH file first:
#
# openssl dhparam -out certs/dh 1024
#
dh_file = ${raddbdir}/certs/dh
random_file = ${raddbdir}/certs/random

#
# This can never exceed the size of a RADIUS
# packet (4096 bytes), and is preferably half
# that, to accomodate other attributes in
# RADIUS packet. On most APs the MAX packet
# length is configured between 1500 - 1600
# In these cases, fragment size should be
# 1024 or less.
#
# fragment_size = 1024

# include_length is a flag which is


# by default set to yes If set to
# yes, Total Length of the message is
# included in EVERY packet we send.
# If set to no, Total Length of the
# message is included ONLY in the
# First packet of a fragment series.
#
# include_length = yes

# Check the Certificate Revocation List


#
# 1) Copy CA certificates and CRLs to same directory.
# 2) Execute 'c_rehash <CA certs&CRLs Directory>'.
# 'c_rehash' is OpenSSL's command.
# 3) Add 'CA_path=<CA certs&CRLs directory>'
# to radiusd.conf's tls section.
# 4) uncomment the line below.
# 5) Restart radiusd
# check_crl = yes

#
# If check_cert_issuer is set, the value will
# be checked against the DN of the issuer in
# the client certificate. If the values do not
# match, the cerficate verification will fail,
# rejecting the user.
#
# check_cert_issuer =
"/C=GB/ST=Berkshire/L=Newbury/O=My Company Ltd"

#
# If check_cert_cn is set, the value will
# be xlat'ed and checked against the CN
# in the client certificate. If the values
# do not match, the certificate verification
# will fail rejecting the user.
#
# This check is done only if the previous
# "check_cert_issuer" is not set, or if
# the check succeeds.
#
# check_cert_cn = %{User-Name}
#
# Set this option to specify the allowed
# TLS cipher suites. The format is listed
# in "man 1 ciphers".
cipher_list = "DEFAULT"
}

# The TTLS module implements the EAP-TTLS protocol,


# which can be described as EAP inside of Diameter,
# inside of TLS, inside of EAP, inside of RADIUS...
#
# Surprisingly, it works quite well.
#
# The TTLS module needs the TLS module to be installed
# and configured, in order to use the TLS tunnel
# inside of the EAP packet. You will still need to
# configure the TLS module, even if you do not want
# to deploy EAP-TLS in your network. Users will not
# be able to request EAP-TLS, as it requires them to
# have a client certificate. EAP-TTLS does not
# require a client certificate.
#
ttls {
# The tunneled EAP session needs a default
# EAP type which is separate from the one for
# the non-tunneled EAP module. Inside of the
# TTLS tunnel, we recommend using EAP-MD5.
# If the request does not contain an EAP
# conversation, then this configuration entry
# is ignored.
default_eap_type = md5

# The tunneled authentication request does


# not usually contain useful attributes
# like 'Calling-Station-Id', etc. These
# attributes are outside of the tunnel,
# and normally unavailable to the tunneled
# authentication request.
#
# By setting this configuration entry to
# 'yes', any attribute which NOT in the
# tunneled authentication request, but
# which IS available outside of the tunnel,
# is copied to the tunneled request.
#
# allowed values: {no, yes}
copy_request_to_tunnel = no

# The reply attributes sent to the NAS are


# usually based on the name of the user
# 'outside' of the tunnel (usually
# 'anonymous'). If you want to send the
# reply attributes based on the user name
# inside of the tunnel, then set this
# configuration entry to 'yes', and the reply
# to the NAS will be taken from the reply to
# the tunneled request.
#
# allowed values: {no, yes}
use_tunneled_reply = no
}

###############################################
###
#
# !!!!! WARNINGS for Windows compatibility !!!!!
#

###############################################
###
#
# If you see the server send an Access-Challenge,
# and the client never sends another Access-Request,
# then
#
# STOP!
#
# The server certificate has to have special OID's
# in it, or else the Microsoft clients will silently
# fail. See the "scripts/xpextensions" file for
# details, and the following page:
#
# http://support.microsoft.com/kb/814394/en-us
#
# For additional Windows XP SP2 issues, see:
#
# http://support.microsoft.com/kb/885453/en-us
#
# Note that we do not necessarily agree with their
# explanation... but the fix does appear to work.
#

###############################################
###

#
# The tunneled EAP session needs a default EAP type
# which is separate from the one for the non-tunneled
# EAP module. Inside of the TLS/PEAP tunnel, we
# recommend using EAP-MS-CHAPv2.
#
# The PEAP module needs the TLS module to be installed
# and configured, in order to use the TLS tunnel
# inside of the EAP packet. You will still need to
# configure the TLS module, even if you do not want
# to deploy EAP-TLS in your network. Users will not
# be able to request EAP-TLS, as it requires them to
# have a client certificate. EAP-PEAP does not
# require a client certificate.
#
peap {
# The tunneled EAP session needs a default
# EAP type which is separate from the one for
# the non-tunneled EAP module. Inside of the
# PEAP tunnel, we recommend using MS-CHAPv2,
# as that is the default type supported by
# Windows clients.
default_eap_type = mschapv2

# the PEAP module also has these configuration


# items, which are the same as for TTLS.
#copy_request_to_tunnel = no
#use_tunneled_reply = no
# When the tunneled session is proxied, the
# home server may not understand EAP-MSCHAP-V2.
# Set this entry to "no" to proxy the tunneled
# EAP-MSCHAP-V2 as normal MSCHAPv2.
#proxy_tunneled_request_as_eap = yes
}

#
# This takes no configuration.
#
# Note that it is the EAP MS-CHAPv2 sub-module, not
# the main 'mschap' module.
#
# Note also that in order for this sub-module to work,
# the main 'mschap' module MUST ALSO be configured.
#
# This module is the *Microsoft* implementation of MS-
CHAPv2
# in EAP. There is another (incompatible) implementation
# of MS-CHAPv2 in EAP by Cisco, which FreeRADIUS does
not
# currently support.
#
mschapv2 {
}
}

OBS: Aps as etapas detalhadas acima temos que configurar a base de


autenticao dentro do arquivo principal de configurao
radiusd.conf de acordo com o escolhido (unix, sql, users ... )

Arquivos de configurao detalhados


Configurar o freeradius fcil. Vou descrever cada detalhe do radiusd.conf
(/usr/loca/etc/raddb/radiusd.conf), que necessrio para voc entender melhor
e no perder tempo procurando ajuda em fruns! A descrio precede os
parmetros, no comentei todos para no fugir do assunto.

1 - radiusd.conf

Arquivo de configurao principal responsvel pelo daemon do radius e fazer


incluses dos demais arquivos de configurao.
# inicio radiusd.conf

prefix = /usr/local/src
exec_prefix = ${prefix}
sysconfdir = ${prefix}/etc
localstatedir = ${prefix}/var
sbindir = ${exec_prefix}/sbin
logdir = ${localstatedir}/log/radius
raddbdir = ${sysconfdir}/raddb
radacctdir = ${logdir}/radacct
confdir = ${raddbdir}
run_dir = ${localstatedir}/run/radiusd
# variveis definidas na instalao, essas opes
# foram disponibilizadas para que voc no precise
# recompilar para mudar os arquivos de lugar
# voc pode usar essas variveis quando definir o
# valor de algum parmetro ao longo desse arquivo.

log_file = ${logdir}/radius.log
# arquivo de log principal, nesse arquivo ficaro
# todas as mensagem de erro, tentativas de
# conexo, etc...

libdir = ${exec_prefix}/lib
# pasta de bibliotecas, se elas
# se encontrarem em varias pastas,
# separe as localizaes
# por : , tipo: libdir = /usr/lib:/usr/local/lib

pidfile = ${run_dir}/radiusd.pid
# arquivo onde ser armazenado o id
# do processo principal do freeradius

user = nobody
group = nobody
# definio do usurio e grupo dos processos filhos do radiusd
# se voc no especificar, o usurio que deu partida
# ser usado (root), se
# voc usar o arquivo /etc/shadow para autenticao,
# defina o grupo como shadow, vale lembrar
# que o usurio que executa o radiusd deve ter permisso
# de escrita no diretrio de log

max_request_time = 30
# define o tempo que o processo filho segura o pedido,
# caso o tempo limite seja atingido, o servidor retorna
# acesso negado. Por exemplo: se voc define 2 segundos
# e usa um banco de dados mysql sobrecarregado que demora
# 5 segundos para concluir uma pesquisa, seu servidor nunca
# vai dar acesso a ningum!

delete_blocked_requests = no
# se no parmetro max_request_time voc
# definiu o valor 30 segundos, e o cliente
# perdeu a pacincia e enviou outra solicitao sem
# ter concludo a primeira,
# o freeradius no ficara fazendo trabalho
# repetitivo simultaneamente. Se voc definir
# esse parmetro como yes, ao chegar a segunda
# requisio do mesmo cliente com a mesma
# "pergunta", ele desistir da primeira para
# atender a nova solicitao.

cleanup_delay = 5
# esse valor funciona da seguinte maneira:
# se o NAS ou RAS enviou uma pergunta e
# a resposta foi perdida na rede, o NAS tornar
# fazer a pergunta, todo o processo de autenticao
# ser realizado novamente. Para evitar isso o freeradius
# manter a resposta no cache pelo tempo definido aqui
# (em segundos), assim, se o pacote resposta for perdido
# e a pergunta for repetida, a resposta ser imediata,
# usando assim o mnimo de processamento.

max_requests = 1024
# define o nmero mximo de
# requisies que o freeradius pode atender
# simultaneamente, somando todas as requisies
# atendidas pelos processos filhos, assim,
# se voc tem 4 processo filhos, cada um
# poder atender 256 perguntas simultaneamente
# ATENO: as respostas cacheadas pela opo
# cleanup_delay so contabilizadas. Se voc colocou
# cleanup_delay com um valor alto, seu radius
# ficar exposto a um DOS

bind_address = *
# isso far o freeradius escutar em
# um endereo especifico, * inclui todos
# os endereos ip do host, voc pode
# usar um FQDN, mas antes tenha certeza
# de que a resoluo de dns estar disponvel
# no momento em que o servidor radius inicia

port = 0
# porta de escuta. Equipamentos antigos tem a porta
# 1645 como padro de autenticao e 1646 como
# contabilidade. A RFC 2138 mudou essa porta para
# 1812 autenticao e 1813 contabilidade. Equipamentos
# novos provavelmente ter essa porta como padro.
# 0 (zero) far com que a porta seja pesquisada
# em /etc/services, esse parmetro pode ser
# sobreposto pela opo -p do comando radiusd

#listen {
# ipaddr = *
# endereo ip ou FQDN, mesmos critrios
# usados em bind_address
# port = 0
# porta de escuta, mesmos critrios
# usados em port

# Type of packets to listen for.


# Allowed values are:
# auth listen for authentication packets
# acct listen for accounting packets
#
# type = auth
# tipo de escuta:
# auth -> autenticao
# acct -> contabilidade
#}
# Se voc quiser que o freeradius escute
# a porta de autenticao em um ip, e
# a porta de contabilidade em outro, ou
# em postas distantes no mesmo ip, o
# modelo acima de listagem ser til
# Esse recurso apareceu a partir da verso
# 1.0 e resolve o problema se voc
# tem equipamentos novos e antigos
# servidos pelo mesmo radius

hostname_lookups = no
# define se o nome DNS dos clientes
# ser pesquisado a partir do ip. Se definir como yes,
# toda vez que uma requisio chegar de
# um endereo ip, o freeradius ir consultar
# o dns para usar o nome no log de atividades.
# o valor no a melhor opo, no sobrecarrega
# o servidor DNS

allow_core_dumps = no
# ative essa opo para depurar erros no
# servidor, caso contrario deixe como est

regular_expressions = yes
extended_expressions = yes
# ativa ou desativa expresses regulares
# nos parmetros dos pacotes, desativar
# uma boa idia embora o padro seja
# yes

log_stripped_names = no
# registra nos logs os dados completos do
# campo User-Name do pacote de autenticao,
# se definido como yes, do jeito que chegar,
# ser usado.

log_auth = no
# deseja logar atividades de autenticao?
# se voc tem milhares de clientes logando
# simultaneamente, significa
# que seu log vai crescer muito com essa
# opo ativa. Eu sempre coloco yes pois
# fica fcil e rpido descobrir por que
# certo cliente (leigo) no consegue autenticar

log_auth_badpass = no
# Logar senhas quando a autenticao falhar?
# embora seja til para dar suporte - usurio
# digitando senha incorretamente (branco, maisculas, etc...),
# a privacidade do usurio fica reduzida e uma brecha de segurana,
# todas as senhas sero registradas no log

log_auth_goodpass = no
# idntica a opo acima, porm se
# aplica para autenticaes bem sucedidas.

usercollide = no

lower_user = no
lower_pass = no
# essas duas opes so muito importantes:
# se o usurio deixar o CapsLock ligado,
# significa que no conseguir se autenticar
# e isso significa uma insatisfao ou uma
# chamada desnecessria no suporte.
# Temos 3 opes: after, before e no
# suponhamos que eu informe meu login: PatrickBrandao
# "after" far com que a autenticao
# seja primeiro testada com o valor
# informado, se falhar, aplica um lowercase
# nos valores e tenta novamente. Sendo a primeira
# tentativa com "PatrickBrandao" e a segunda com "patrickbrandao"
# "before" far com que um lowercase seja
# aplicado antes de pesquisar a base de
# dados, que receber "patrickbrandao"
# "no" desativa esse efeito passando para
# a base de dados o mesmo valor recebido: "PatrickBrandao"

nospace_user = no
nospace_pass = no
# as duas opes acima
# servem para retirar espaos de nome
# de usurio e senha. Os seus clientes
# podem, sem perceber, colocar
# um espao no final ou no comeo
# das credenciais, o que gera uma
# chamada desnecessria no suporte tcnico
# trs valores podero ser escolhidos:
# after, before e no
checkrad = ${sbindir}/checkrad
# comando ao usar para checar conexes simultneas

# sesso de segurana ----------------------------


security {
max_attributes = 200
# define o nmero mximo de atributos
# num pacote enviado para o servidor.
# um nmero muito baixo faria o servidor
# negar pacotes, nmero muito alto deixar
# o servidor vulnervel. O atacante pode emitir
# um pedido com um nmero exagerado
# de parmetros e esgotar os recursos de memria

reject_delay = 1
# define o tempo de espera antes de enviar
# uma resposta de acesso negado.
# essa opo proteje seu servidor
# contra ataques de fora bruta
# Escolha de 0 a 5, 0 (zero) far com que
# a resposta seja enviada imediatamente

status_server = no
# permite ou nega o envio de pacotes
# de status do usurio. No muito importante
# mas alguns NAS's com keep-alive podem
# precisar desse recurso para checar o
# status de uma sesso.
}

# sesso de proxy ------------------------------


proxy_requests = yes
$INCLUDE ${confdir}/proxy.conf

# configurao de clientes NAS ---------------

$INCLUDE ${confdir}/clients.conf
# quando falo de clientes NAS no
# estou me referindo a seus clientes de
# conexo discada, mas sim aos dispositivos
# em contato com eles que se encarregam de
# procurar o radius para validar o usurio,
# esses equipamentos podem ser RAS como
# cyclades, cisco, etc... ou mesmo servios
# em qualquer servidor que se baseia numa
# autenticao com radius
# sesso de snmp ----------------------------

snmp = no
$INCLUDE ${confdir}/snmp.conf
# ativa o suporte a monitoramento por snmp
# no freeradius

# configurao de processos filhos ------------------------


thread pool {
start_servers = 5
# nmero de processos filhos a serem criados quando
# o servio for iniciado

max_servers = 32
# nmero mximo de processos filhos
# atendendo solicitaes

min_spare_servers = 3
max_spare_servers = 10
# regula o nmero de processos para manter
# um bom desempenho

max_requests_per_server = 0
# nmero mximo de solicitaes feitas
# a um processo filho antes de ser destrudo
# 0 (zero) para infinito, mas no recomendvel
# pois um processo filho pode consumir recursos
# que nunca ir liberar, 250 um bom valor.
}

# sesso de definio de mdulos -----------------------


modules {
# formato:
# name [ instance ] {
# config_item = value
# ...
# }
# name -> se refere ao nome do
# modulo rlm_?????, muitos mdulos
# so fornecidos com o freeradius, esse
# recurso permite que voc crie seus prprios
# mdulos.

pap {
encryption_scheme = crypt
}
# define o tipo de
# criptografia usada na autenticao PAP
# valores disponveis:
# clear: sem criptografia, texto plano
# crypt: criptografia do unix
# md5: criptografia MD5
# sha1: criptografia SHA1
# padro: crypt

chap {
authtype = CHAP
}
# adiciona suporte a autenticaes
# usando CHAP

pam {
pam_auth = radiusd
}
# suporte PAM dos sistemas unix, configura
# o pamd em /etc/pam.d/ para usar esse tipo
# de autenticao

# autenticao baseada nas credenciais do sistema


# /etc/passwd e /etc/shadow
unix {
cache = no
# criar caches de dados de login?
# habilitar essa opo pode melhorar
# o desempenho se voc tem muitos
# usurios de sistema

cache_reload = 600
# tempo em segundos para recarregar
# o cache de logins do sistema

# define a localizao dos seus


# arquivos de autenticao de sistema
# encontra-se comentado, usando o
# valor padro
#
# passwd = /etc/passwd
# shadow = /etc/shadow
# group = /etc/group

radwtmp = ${logdir}/radwtmp
}

# Extensible Authentication Protocol


$INCLUDE ${confdir}/eap.conf
# Micro$oft CHAP authentication
# esses mdulos suportam MS-CHAP e MS-CHAPv2
mschap {
authtype = MS-CHAP
# protocolo M$ usado
#use_mppe = no
#require_encryption = yes
#require_strong = yes
#with_ntdomain_hack = no
#ntlm_auth = "/path/to/ntlm_auth --request-nt-key --username=%
{Stripped-User-Name:-%{User-Name:-None}} --challenge=%
{mschap:Challenge:-00} --nt-response=%{mschap:NT-Response:-00}"
}

# Lightweight Directory Access Protocol (LDAP)


# permite usa autenticao LDAP (Auth-Type := LDAP)
ldap {
server = "ldap.your.domain"
# identity = "cn=admin,o=My Org,c=UA"
# password = senhadnaqui
basedn = "o=My Org,c=UA"
filter = "(uid=%{Stripped-User-Name:-%{User-Name}})"
# base_filter = "(objectclass=radiusprofile)"

start_tls = no
# coloque yes se deseja usar tls para criptografar
# os dados nas conexes com o LDAP e
# configure e descomente os valores abaixo
# tls_cacertfile = /path/to/cacert.pem
# tls_cacertdir = /path/to/ca/dir/
# tls_certfile = /path/to/radius.crt
# tls_keyfile = /path/to/radius.key
# tls_randfile = /path/to/rnd
# tls_require_cert = "demand"

# default_profile = "cn=radprofile,ou=dialup,o=My Org,c=UA"


# profile_attribute = "radiusProfileDn"
access_attr = "dialupAccess"

dictionary_mapping = ${raddbdir}/ldap.attrmap
# define o arquivo de mapas de atributos
# do seu diretorio
ldap_connections_number = 5

# password_header = "{clear}"
# password_attribute = userPassword
# groupname_attribute = cn
# groupmembership_filter = "(|(&(objectClass=GroupOfNames)
(member=%{Ldap-UserDn})) (&(objectClass=GroupOfUniqueNames)
(uniquemember=%{Ldap-UserDn})))"
# groupmembership_attribute = radiusGroupName
timeout = 4
timelimit = 3
net_timeout = 1
# compare_check_items = yes
# do_xlat = yes
# access_attr_used_for_allow = yes
}

# ----------------------------------------

# modulo Realm, para proxy


# 'realm/username'
realm IPASS {
format = prefix
delimiter = "/"
ignore_default = no
ignore_null = no
}
# 'username@realm'
realm suffix {
format = suffix
delimiter = "@"
ignore_default = no
ignore_null = no
}
# 'username%realm'
realm realmpercent {
format = suffix
delimiter = "%"
ignore_default = no
ignore_null = no
}
# 'domain\user'
realm ntdomain {
format = prefix
delimiter = "\\"
ignore_default = no
ignore_null = no
}

checkval {
item-name = Calling-Station-Id
check-name = Calling-Station-Id
data-type = string
#notfound-reject = no
}

# reescrita de pacotes. Usado para autorizao e contabilidade


#attr_rewrite sanecallerid {
# attribute = Called-Station-Id
# may be "packet", "reply", "proxy", "proxy_reply" or "config"
# searchin = packet
# searchfor = "[+ ]"
# replacewith = ""
# ignore_case = no
# new_attribute = no
# max_matches = 10
# ## If set to yes then the replace string will be appended to the original
string
# append = no
#}

preprocess {
huntgroups = ${confdir}/huntgroups
hints = ${confdir}/hints
with_ascend_hack = no
ascend_channels_per_line = 23
with_ntdomain_hack = no
with_specialix_jetstream_hack = no
with_cisco_vsa_hack = no
}

files {
usersfile = ${confdir}/users
acctusersfile = ${confdir}/acct_users

compat = no
}

detail {
detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d
detailperm = 0600
}
# detail auth_log {
# detailfile = ${radacctdir}/%{Client-IP-Address}/auth-detail-%Y%m%d
# detailperm = 0600
#}
# detail reply_log {
# detailfile = ${radacctdir}/%{Client-IP-Address}/reply-detail-%Y%m%d
# detailperm = 0600
#}
# detail pre_proxy_log {
# detailfile = ${radacctdir}/%{Client-IP-Address}/pre-proxy-detail-%Y%m
%d
# detailperm = 0600
#}
# detail post_proxy_log {
# detailfile = ${radacctdir}/%{Client-IP-Address}/post-proxy-detail-%Y
%m%d
# detailperm = 0600
#}
acct_unique {
key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address,
NAS-Port"
}

# Para Postgresql, use: ${confdir}/postgresql.conf


# Para MS-SQL, use: ${confdir}/mssql.conf
# For Oracle, use: ${confdir}/oraclesql.conf
#
$INCLUDE ${confdir}/sql.conf
# incluso de arquivo de configurao contendo
# mdulos de autenticao, sesso e contabilidade
# controlados em banco de dados SQL

# mdulos responsveis por controlar usurios conectados


# para evitar conexo simultnea quanto esta
# usada
radutmp {
filename = ${logdir}/radutmp
username = %{User-Name}
case_sensitive = yes
check_with_nas = yes
perm = 0600
callerid = "yes"
}
radutmp sradutmp {
filename = ${logdir}/sradutmp
perm = 0644
callerid = "no"
}
attr_filter {
attrsfile = ${confdir}/attrs
}
counter daily {
filename = ${raddbdir}/db.daily
key = User-Name
count-attribute = Acct-Session-Time
reset = daily
counter-name = Daily-Session-Time
check-name = Max-Daily-Session
allowed-servicetype = Framed-User
cache-size = 5000
}
always fail {
rcode = fail
}
always reject {
rcode = reject
}
always ok {
rcode = ok
simulcount = 0
mpp = no
}
expr {
}
digest {
}
exec {
wait = yes
input_pairs = request
}
exec echo {
wait = yes
program = "/bin/echo %{User-Name}"
input_pairs = request
output_pairs = reply
#packet_type = Access-Accept
}

ippool main_pool {
range-start = 192.168.1.1
range-stop = 192.168.3.254
netmask = 255.255.255.0
cache-size = 800
session-db = ${raddbdir}/db.ippool
ip-index = ${raddbdir}/db.ipindex
override = no
maximum-timeout = 0
}

# controle de acesso, sesso e contabilidade -----------

# sesso instantiate - inicia mdulos, se no for usar, no inicie.


instantiate {
exec
expr
# daily
}

# sesso authorization - controla os mdulos


# responsveis por autorizar o acesso das
# requisies

authorize {
preprocess
# auth_log
# attr_filter
chap
mschap
# digest
# IPASS
# suffix
# ntdomain
# eap
# files
sql
# etc_smbpasswd
# ldap
# daily
# checkval
}

# Sesso authentication
# responsvel por conferir o tipo de autenticao usado
authenticate {
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
# digest
# pam
# unix
# Auth-Type LDAP {
# ldap
# }
# eap
}

# Sesso Pre-accounting. Decide qual tipo de contabilidade usar


preacct {
# preprocess
# acct_unique
# home server as authentication requests.
# IPASS
# suffix
# ntdomain

#
# Read the 'acct_users' file
# files
}
# Sessao Accounting. Registra dados de contabilidade
accounting {
# detail
# daily
# unix
# radutmp
# sradutmp
# main_pool
sql
# pgsql-voip
}

# Controle de sesso
# quando se faz o controle de sesso para
# evitar conexes simultneas (impede o
# nome de usurio de se conectar varias vezes de
# locais diferentes ao mesmo tempo com o mesmo login)
session {
# radutmp
# sql
}

post-auth {
# main_pool
# reply_log
# sql
# Post-Auth-Type REJECT {
# insert-module-name-here
# }
}

pre-proxy {
# attr_rewrite
# pre_proxy_log
}

post-proxy {
# post_proxy_log
# attr_rewrite
# attr_filter
eap
}
# fim radiusd.conf

2 - clients.conf

Responsvel pela lista de clientes NAS que desfrutam do servio radius.


# inicio clients.conf

client 127.0.0.1 {
secret = raioceleste
# segredo do servidor. Somente
# os NAS's que conhecem esse
# segredo podero fazer pedidos
# de autenticao. OBRIGATRIO

shortname = localhost
# nome do cliente. Normalmente
# voc pode colocar uma parte do FQDN
# esse nome usado no arquivo de log
# e referencias de contabilidade
# OBRIGATRIO

nastype = other
# define o tipo de NAS cliente.
# Muito importante pois um
# NAS especifico pode ter campos
# definidos nos arquivos de dicionrios
# de parmetros. OPCIONAL. Padro: other
}

# o exemplo acima trata um cliente


# em especifico, mas voc pode
# abrir uma rede inteira no freeradius

client 192.168.10.0/24 {
secret = raioceleste10
shortname = intranet-10
}

# Importante: se seu NAS no estiver cadastrado


# aqui, possivelmente voc vai ver no arquivo
# de log:
# Thu Aug 12 17:06:16 2004 : Error: Ignoring request from unknown client
192.168.10.24:41747
#
# sempre que adicionar um novo cliente, voc ter que reiniciar o freeradius
# fim clients.conf

Autenticando na base de dados MySQL e evitando conexes


simultneas
Usar freeradius e base de dados MySQL uma das melhores opes
disponveis. A flexibilidade e suporte do MySQL garante muita segurana aos
seus dados e muita rapidez.

Certifique-se de que no arquivo radiusd.conf, a seguinte linha est declarada:


$INCLUDE ${confdir}/sql.conf
Primeiro passo e editar o arquivo /usr/local/etc/raddb/sql.conf e alterar as
seguintes linhas:
sql {
driver = "rlm_sql_mysql"
# informa ao freeradius qual modulo de banco
# de dados usar, neste caso, mysql

server = "localhost"
# diz ao freeradius em qual
# host est o servidor mysql

login = "root"
# define o nome de usurio registrado no mysql

password = "senhadologinaqui"
# senha do usurio definido no parmetro "login"

radius_db = "radius"
# nome do banco de dados que contem
# as tabelas

# abaixo deste texto (arquivo truncado aqui) se encontram definies de


SQL para
# pesquisa de dados, no altere, ao menos
# que tenha um propsito
# ......
# ....
}

Segundo, criar o banco de dados e as tabelas. Os criadores do freeradius j


deixaram a DDL pronta para voc, basta ir at a pasta onde esto os fontes,
na subpasta:

/usr/local/src/freeradius-1.1.7/doc/examples/

Se voc descompactou em /usr/local/src, o caminho completo :

/usr/local/src/freeradius-1.1.7/doc/examples/mysql.sql

Dentro desta pasta existe um arquivo chamado db_mysql.sql contendo todos


os comandos para criar as tabelas. Crie o banco de dados com o comando:

#mysqladmin -psenharoot create radius

E crie as tabelas com o comando:


# mysql -psenharoot radius < db_mysql.sql

Agora edite o radiusd.conf, vamos configur-lo para autenticar os dados no


MySQL. Procure no final do arquivo pela sesso "authorize" e adicione "sql",
ficando assim:
authorise {
sql
}

Isso far com que os usurios sejam procurados na tabela radcheck, banco de
dados radius no MySQL.

Prximo passo registrar a contabilidade dos acessos, muito til para


provedores que tem planos limitados de horas. V at a sesso "accounting" e
adicione "sql", ficando assim:
accounting {
sql
}

Isso far com que os dados das conexes sejam armazenadas na tabela
radacct.

Um recurso interessante o controle de conexo simultnea. Isso impede que


um usurio passe suas credencias (login/senha) para amigos e todos usem ao
mesmo tempo, dando "preju". Na sesso "session" adicione "sql", ficando
assim:
session {
sql
}

Ainda no est pronto o controle de sesso, voc ter que editar o sql.conf e
descomentar as linhas que definem as variveis:
simul_count_query
simul_verify_query

Vamos criar um usurio chamado "joao", que ter direito a apenas uma
conexo. Conecte-se ao MySQL no banco radius:

# mysql -psenharoot radius

Criar usurio:

INSERT INTO radcheck (username, attribute, op, value)


VALUES ('joao', 'Password', '==', 'senhasecreta');

Criar grupo com direito a uma conexo chamado 'sessaounica':

INSERT INTO radgroupcheck (groupname, attribute,


op, value) VALUES ('sessaounica', 'Simultaneous-Use',
':=', 1);
Inserir joao nesse grupo:

INSERT INTO usergroup (username, groupname) VALUES ('joao',


'sessaounica');

Pronto. Joo agora no pode passar seu login pra ningum, seno ficar sem
acesso! Para conexes ISDN 128k, crie um grupo de dupla permisso, pois
seno o segundo canal no conseguir conectar-se. Veja como aparece no log,
uma tentativa de conexo simultnea aps o usurio j estar conectado de
outro lugar:

Auth: Login OK: [joao/senhasecreta] (from client pr4k port 326 cli 31555xxxx)
Auth: Multiple logins (max 1) : [joao/senhasecreta] (from client pr4k port 315
cli 31552xxxx)

Acontece, de vez em quando, do usurio ficar "agarrado" no radius. Ele


desconectado do RAS ou NAS, porm o radius no da baixa na sesso, os
motivos podem ser, principalmente, perda do pacote no caminho at o radius,
problema muito comum para provedores que lidam com ADSL de outras
operadoras. A prxima vez que o usurio tenta logar, o acesso negado - o
servidor radius pensa que sesso simultnea. Para resolver esse problema,
sempre que um usurio (joao por exemplo) ficar "agarrado", voc libera ele
com a SQL:

DELETE FROM radacct WHERE username = 'joao' AND acctsessiontime


= 0 ORDER BY radacctid DESC LIMIT 1;

A desvantagem que Joo ter que solicitar suporte tcnico para ter o
problema resolvido!

Checagem e retorno de atributos em banco de dados


NOTA: As SQL's exibidas neste captulo foram digitadas no prompt do MySQL
de um servidor de testes para voc ter uma noo dos conceitos na prtica.

Quando voc cria o banco de dados MySQL do radius a partir da DDL fornecida
nos fontes do mdulo, as seguintes tabelas so criadas:

radacct - contm informaes de contabilidade dos usurios, descrita no


captulo "Extrato de horas";
radcheck - contm a lista de atributos que sero usados para autenticar
um usurio especfico. O atributo mais necessrio para que o usurio
tenha acesso seguro "Password", exemplo:

SELECT UserName, Attribute, op, Value FROM radcheck WHERE


UserName = 'joao';

UserName | Attribute | op | Value


-----------------------------------------------------------
joao | Password | == | senhasecreta
joao | NASIPAddress | == | 192.168.0.1
-----------------------------------------------------------
Quando Joo tentar se autenticar, ser checado os dois parmetros,
Password e NASIPAddress, s ser retornado um Access-Accept se a
senha estiver certa e a pergunta vier do NAS 192.168.0.1. Muitos
parmetros podem ser adicionados para limitar a fonte de acesso, at
mesmo restringir um usurio dial-up a um nico nmero de telefone
(parmetro CallingStationID)!

radreply - contm uma lista de atributos devolvidos ao usurio. Estes


atributos s sero enviados numa resposta diferente de Access-Reject,
parmetros de resposta influenciam na conexo do usurio, voc poder
interagir com o NAS (ou RAS), desde que ele tenha flexibilidade para os
valores retornados (adquira o manual do seu RAS, muito interessante
saber o que pode ser feito nele pelas respostas do radius).

SELECT UserName, Attribute, op, Value FROM radreply WHERE


UserName = 'joao';

UserName | Attribute | op | Value


----------------------------------------------------------
joao | Reply-Message | == | Bem Vindo Sr. Diretor!
joao | Framed-IP-Address | == | 10.0.0.121
joao | Framed-IP-Netmask | == | 255.255.255.0
----------------------------------------------------------

Com os registros acima, Joo receber uma mensagem de boas vindas e


o endereo ip 10.0.0.121/24.

usergroup - Bom, seria muito desagradvel administrar centenas de


usurios inserindo atributos em um por um. Voc pode criar grupos de
checagem e inserir os usurios neles. A tabela usergroup serve
exatamente para isso: voc adiciona grupos de checagem e retorno nas
tabelas radgroupcheck e radgroupreply respectivamente, e, ao criar um
relacionamento entre o grupo e a usurio nessa tabela, os parmetros do
grupo so usados nas operaes com o usurio.

SELECT UserName, GroupName FROM usergroup;

UserName | GroupName
----------------------------------
joao | Diretoria
patrick | Admin
anamaria | Dialup
kairan | Dialup
milene | Dialup
marcos | Velox
----------------------------------

radgroupcheck - contm informaes dos grupos referenciados em


usergroup para checagem de parmetros:
SELECT GroupName, Attribute, op, Value FROM radgroupcheck
ORDER BY GroupName;

GroupName | Attribute | op | Value


---------------------------------------------------
Admin | NAS-IP-Address | == | 192.168.0.1
Dialup | NASPortType | == | Async
Diretoria | NAS-IP-Address | == | 192.168.0.1
Velox | NASPortType | == | Virtual
---------------------------------------------------

Acima, podemos ver que: Quem do grupo Admin e Diretoria s pode se


autenticar se a conexo for intermediada pelo NAS 192.168.0.1. Quem
do grupo Dialup s pode autenticar se o tipo da porta (NASPortType) for
assncrona. E assim vai!

radgroupcheck - contm informaes dos grupos referenciados em


usergroup para retorno de parmetros:

mysql> SELECT GroupName, Attribute, op, Value FROM


radgroupreply ORDER BY GroupName;

GroupName | Attribute | op | Value


-------------------------------------------------------------------
Admin | Reply-Message | == | Bem vindo Manda-chuva!
Dialup | Reply-Message | == | Um site de cada vez por favor.
Diretoria | Reply-Message | == | Acesso bloqueado as 19:00
Velox | Reply-Message | == | proibido compartilhar conexo
com terceiros
--------------------------------------------------------------------

radpostauth - salva informaes de respostas enviadas para os usurios.


Com ele voc pode tirar um relatrio das tentativas de acesso, por
exemplo:

mysql> SELECT user, pass, reply, date FROM radpostauth WHERE


user = 'joao';

user | pas | reply | date


-------------------------------------------------------
joao | senhasecreta | Access-Accept | 20041228125413
joao | senhasecreta | Access-Accept | 20041229182318
-------------------------------------------------------

Acima, o relatrio diz que o usurio autenticou com sucesso nas duas
tentativas. O campo date timestamp: ano, ms, dia, hora, minuto e
segundo.
1 - radtest

O comando radtest acompanha o pacote do freeradius e instalado com os


demais aplicativos. Embora sirva apenas para testar autenticao e retorno de
parmetros, uma ferramenta muito til em um Linux.

Sintaxe:

radtest USURIO SENHA SERVIDOR:PORTAAUTH PORTANAS SEGREDORADIUS

onde:
USURIO, SENHA - o bvio, login do usurio e senha;
SERVIDOR - endereo ip ou FQDN do servidor radius;
PORTAAUTH - porta no SERVIDOR onde o servio radius atende
solicitaes de autenticao;
PORTANAS - porta do NAS, pode ser uma porta eletrnica (nmero do
modem) ou virtual, apenas para controle. Para testes, coloque qualquer
valor numrico.
SEGREDORADIUS - quando voc faz uma solicitao de autenticao, seu
endereo ip tem que estar cadastrado no arquivo clients.conf do servidor
num par de IP/SEGREDO. O ip ser descoberto pelo SERVIDOR atravs do
parmetro NAS-IP-Address, o segredo voc tem que informar aqui.

Aps uma solicitao, o radtest informa quais parmetros est enviando para o
servidor, seguido do retorno.

Exemplo:

# radtest joao senhasecreta 127.0.0.1:1645 0 reioceleste


Sending Access-Request of id 176 to 127.0.0.1:1645
User-Name = "joao"
User-Password = "senhasecreta"
NAS-IP-Address = localhost
NAS-Port = 0

rad_recv: Access-Accept packet from host 127.0.0.1:1645, id=176, length=58


Reply-Message = "Bem vindo chefe!"

Como voc pode ver acima, o servidor retornou uma resposta de acesso aceito
"Access-Accept" e um parmetro que eu configurei em radreply para o usurio
joao ("Reply-Message").
Administrao de usurios
No agradvel ter uma grande quantidade de clientes e ter que administrar
"no dedo", um software de administrao fundamental. Voc tem trs
opes:

1 - desenvolver um, escolhendo a tecnologia, se baseando nas suas


necessidades e nos relacionamentos do seu banco de dados de clientes,
cobrana, etc.

No existe nenhum segredo para se fazer isso, basta ter conhecimento em


alguma linguagem de programao com API do banco de dados usado
(exemplo: PHP e MySQL). Assim voc pode oferecer para seus clientes,
formulrios de mudana de senha, extrato de horas de acesso, help-desk, etc.
Eu mesmo j desenvolvi um software do tipo, que instalo para meus clientes.

2 - usar o software "dial-up admin", GNU, distribudo junto com o freeradius.

O dial-up admin um software completo para administrao de um servidor


radius baseado em banco de dados. Ele possui total controle das tabelas do
radius, para alterar atributos, administrar usurios, grupos e uma interface
bsica de administrao de clientes (nome, telefone, endereo).

Ser necessrio ter instalado no seu servidor:

Apache
PHP
Perl - mdulo Date::Manip

recommends
suggests
dep: apache2-mpm-prefork
modelo tradicional para o Apache HTTPD
or httpd
modelo tradicional para o Apache HTTPD virtual package provided
by [show 24 providing packages] aolserver4, aolserver4-core,
apache2-mpm-event, apache2-mpm-itk, apache2-mpm-prefork,
apache2-mpm-worker, boa, bozohttpd, caudium, cherokee, dhttpd,
ebhttpd, fnord, lighttpd, mathopd, micro-httpd, mini-httpd,
mzscheme, nginx, roxen4, thttpd, tntnet, webfs, yaws
dep: php5
linguagem de script incorporvel em HTML, lado servidor
(metapacote)
or libapache2-mod-php5
linguagem de script incorporvel em HTML, lado servidor
(metapacote)
or php5-cgi
linguagem de script incorporvel em HTML, lado servidor
(metapacote)

sug: libdate-manip-perl
a perl library for manipulating dates
sug: php5-ldap
LDAP module for php5
sug: php5-mysql
MySQL module for php5
or php5-pgsql
PostgreSQL module for php5

Na pasta de fontes do freeradius, existe uma pasta chamada dialup_admin,


coloque-a em /usr/local e se assegure de que somente o usurio que executa o
Apache (nobody normalmente) tenha permisses nessa pasta.

Voc no ir publicar a pasta /usr/local/dialup_admin no seu Apache, mas sim


uma subpasta chamada htdocs (/usr/local/dialup_admin/htdocs), que dever
ser protegida por senha. Insira no seu httpd.conf:
Alias /dialup_admin "/usr/local/dialup_admin/htdocs"
<Directory "/usr/local/dialup_admin/htdocs"
AuthName "Area Restrita - Administrao"
AuthType Basic
AuthUserFile /usr/local/dialup_admin/.htpasswd
require valid-user
</Directory>

Crie agora o arquivo de senhas:

# htpasswd -c /usr/local/dialup_admin/.htpasswd -m administrador


senha

V at a pasta /usr/local/dialup_admin/sql, voc deve executar todas estes


arquivos de SQL no seu banco de dados de radius (banco "radius"):

# cd /usr/local/dialup_admin/sql
# mysql -pSENHA -u USUARIO -h SERVIDOR radius -e badusers.sql
# mysql -pSENHA -u USUARIO -h SERVIDOR radius < mtotacct.sql
# mysql -pSENHA -u USUARIO -h SERVIDOR radius < totacct.sql
# mysql -pSENHA -u USUARIO -h SERVIDOR radius < userinfo.sql

Onde: SENHA, USURIO e SERVIDOR devem ser substitudos pelos valores


corretos no seu servidor MySQL.

Com as tabelas criadas e o Apache configurado, edite o arquivo


/usr/local/dialup_admin/conf/admin.conf e altere os valores das variveis de
acordo com sua instalao (mysql, arquivos de configurao do freeradius,
etc).

Agora reinicie seu Apache, voc ir acessar pelo endereo:

http://192.168.10.1/dialup_admin

Onde 192.168.10.1 deve ser substitudo pelo ip ou nome FQDN do servidor.

S-ar putea să vă placă și