FreeBSD

Autenticação RADIUS

FreeRADIUS


RADIUS é a sigla de Remote Authentication Dial In User Service. É um padrão de autenticação, autorização e accounting ("contabilização") muito utilizado para as situações em que um equipamento de acesso remoto, como um NAS (Network Access Server), precisa autenticar usuários de conexões discadas, como no caso de um provedor.
O RADIUS trabalha em um modelo cliente/servidor, onde o NAS é o cliente. O servidor é responsável por receber o pedido de conexão, autenticar o usuário, e autorizar, ou não, que seja estabelecida a conexão dial-up entre o usuário e o NAS. A comunicação entre o Servidor RADIUS e o NAS é feita através do protocolo UDP, nas portas 1812 (autenticação - radius) e 1813 (accounting - radacct).
O padrão RADIUS é definido pela RFC2865.

O servidor que iremos utilizar é o FreeRADIUS, que define-se como um servidor RADIUS de alta performance e altamente configurável. Sua página é www.freeradius.org.

Efetue o download do source da última versão estável do FreeRADIUS a partir de ftp://ftp.freeradius.org/pub/radius/. A versão atual é 0.9.3 e o arquivo chama-se freeradius-0.9.3.tar.gz. Descompacte este arquivo no /tmp e acesse o diretório que será criado, /tmp/freeradius-0.9.3.

Execute os seguintes comandos:

# ./configure --localstatedir=/var
# make
# make install

Será criado automaticamente o diretório /var/log/radius, onde ficarão todos os logs. Será instalado o daemon radiusd no diretório /usr/local/sbin, e os utilitários abaixo no diretório /usr/local/bin:

radclient -> emula um cliente RADIUS, enviando pacotes para o servidor e mostrando a resposta.
radlast -> mostra as últimas conexões de usuários.
radtest -> frontend para o radclient, utilizado para testar o servidor.
radwho -> mostra os usuários conectados.
radrelay -> replica dados de accounting para outro servidor RADIUS.
radwatch -> não é utilizado, é instalado apenas por razões históricas.
radzap -> efetua a limpeza da base de dados de sessões ativas.

Os arquivos de configuração ficam no diretório /usr/local/etc/raddb, acesse-o.

O arquivo clients.conf guarda a configuração de quais clientes RADIUS iremos aceitar pedidos. Uma entrada de localhost como cliente irá permitir que sejam efetuados testes com o utilitário radtest. Segue abaixo um exemplo do arquivo, que deverá ter a permissão 600:

-------------------- Arquivo clients.conf --------------------
# clients.conf

# Definicao do cliente 127.0.0.1
client 127.0.0.1 {

# Secret do NAS
secret = secretX

# Apelido
shortname = localhost

# Tipo de NAS
nastype = other
}


# Definicao do cliente 10.20.30.40.
# Este devera ser o seu NAS.
client 10.20.30.40 {
secret = secretY
shortname = nas-1
nastype = usrhiper
}


# Tipos de NAS (nastype) permitidos:
#
# cisco - Cisco Access Server
# computone - Computone PowerRack
# livingston - Livingston PortMaster
# max40xx - Ascend Max 4000 family
# multitech - Multitech CommPlete Server
# netserver - 3Com/USR NetServer
# pathras - Cyclades PathRAS
# patton - Patton 2800
# portslave - Cistron PortSlave
# tc - 3Com/USR TotalControl
# usrhiper - 3Com/USR Hiper Arc Total Control
# other

-------------------- Fim do arquivo clients.conf --------------------

O próximo arquivo é o naspasswd, que guarda o login e a senha de acesso administrativo de cada NAS para fazer a verificação se um cliente já está conectado ou não, caso se deseje limitar o login simultâneo. Este arquivo só é necessário para os tipos de NAS que não permitem fazer essa verificação via SNMP ou finger, que são os seguintes: 3Com/USR TotalControl, 3Com/USR NetServer e Cyclades PathRAS. O arquivo deverá ter a permissão 600, e possui o seguinte conteúdo:

-------------------- Arquivo naspasswd --------------------
# naspasswd

# Formato:
# ip_do_nas login senha

10.20.30.40 admin senhaX
-------------------- Fim do arquivo nasspasswd --------------------

O FreeRADIUS poderá checar o login e senha dos usuários do sistema ou então poderá ser cadastrado cada usuário no arquivo "users". O mais recomendado é que haja uma máquina dedicada para isso, e sejam utilizados o login e senha do sistema para a autenticação, ou seja, cada usuário criado no FreeBSD será um usuário do provedor. Segue um exemplo do arquivo users abaixo, que deverá ter permissão 600:

---------- Arquivo users --------------------
# users

# Desativa o acesso do usuario beltrano.
#beltrano Auth-Type := Reject
# Reply-Message = "Seu acesso foi desativado."

# Desativa o acesso dos usuarios do grupo 'desativados'.
#DEFAULT Group == "desativados", Auth-Type := Reject
# Reply-Message = "Seu acesso foi desativado."

# Para cadastrar os usuarios neste arquivo, insira as 4 linhas
# abaixo para cada usuario.
#
#fulano Auth-Type := Local, User-Password == "senhaY"
# Service-Type = Framed-User,
# Framed-Protocol = PPP,
# Framed-Compression = Van-Jacobson-TCP-IP

# Padrao para efetuar a checagem de senha no sistema.
# Comentar caso seja feito o cadastro dos usuarios neste arquivo.
# Ajuste o parâmetro Simultaneous-Use para o numero de conexoes
# simultaneas permitidas com o mesmo login.
DEFAULT Auth-Type := System, Simultaneous-Use := 1
Service-Type = Framed-User,
Framed-Protocol = PPP,
Framed-Compression = Van-Jacobson-TCP-IP

-------------------- Fim do arquivo users --------------------

O arquivo de configuração principal do FreeRADIUS é o radiusd.conf. Faça uma cópia do original para ter como referência, e leia todos os seus comentários. No exemplo abaixo foram retiradas algumas opções.

-------------------- Arquivo radiusd.conf --------------------
# radiusd.conf

prefix = /usr/local
exec_prefix = /usr/local
sysconfdir = /usr/local/etc
localstatedir = /var/radius
sbindir = /usr/local/sbin
logdir = /var/log/radius
raddbdir = /usr/local/etc/raddb
radacctdir = /var/log/radacct
confdir = /usr/local/etc/raddb
run_dir = /var/run/radiusd
libdir = /usr/local/lib
log_file = /var/log/radius/radius.log
pidfile = /var/run/radiusd/radiusd.pid

# Usuario sob o qual o daemon ira rodar.
# Caso comentado ira rodar sob o usuario que o inicializou.
#user = nobody

# Grupo sob o qual o daemon ira rodar.
# Caso comentado ira rodar sob o grupo do usuario que o inicializou.
#group = nobody

# Tempo maximo em segundos para processar um pedido.
max_request_time = 30

delete_blocked_requests = no
cleanup_delay = 5

# Numero maximo de pedidos em andamento. O recomendado eh
# 256 * numero de NAS.
max_requests = 256

# Endereco IP local utilizado. Ira aceitar pedidos nesta interface de
# rede e ira enviar as respostas tambem por esta.
#bind_address = 10.1.2.3

# Porta utilizada. Alguns NAS ainda utilizam o padrao
# antigo, que eh 1645.
port = 1812

hostname_lookups = no
allow_core_dumps = no
regular_expressions = yes
extended_expressions = yes
log_stripped_names = no

# Logar ou nao pedidos de autenticacao no arquivo radius.log.
log_auth = no

# Logar ou nao senhas invalidas.
log_auth_badpass = no

# Logar ou nao senhas corretas.
log_auth_goodpass = no

usercollide = no
lower_user = after
lower_pass = no
nospace_user = after
nospace_pass = no

checkrad = /usr/local/sbin/checkrad

security {
max_attributes = 200
reject_delay = 1
status_server = no
}

proxy_requests = no

$INCLUDE /usr/local/etc/raddb/clients.conf

snmp = no

thread pool {
start_servers = 5
max_servers = 32
min_spare_servers = 3
max_spare_servers = 10
max_requests_per_server = 0
}

modules {
pap {
encryption_scheme = crypt
}

unix {
cache = no
cache_reload = 0
radwtmp = /var/log/radius/radwtmp
}

preprocess {
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 = /usr/local/etc/raddb/users
acctusersfile = /usr/local/etc/raddb/acct_users
compat = no
}

detail {
detailfile = /var/log/radius/radacct/%{Client-IP-Address}/detail-%Y%m
detailperm = 0600
}

detail auth_log {
detailfile = /var/log/radius/radacct/%{Client-IP-Address}/auth-detail-%Y%m
detailperm = 0600
}

acct_unique {
key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port-Id"
}

radutmp {
filename = /var/log/radius/radutmp
username = %{User-Name}
case_sensitive = no
check_with_nas = yes
perm = 0600
callerid = "yes"
}

attr_filter {
attrsfile = /usr/local/etc/radius/attrs
}

always fail {
rcode = fail
}
always reject {
rcode = reject
}
always ok {
rcode = ok
simulcount = 0
mpp = no
}

expr {
}
}

instantiate {
expr
}

authorize {
preprocess
auth_log
files
}

authenticate {
Auth-Type PAP {
pap
}
unix
}

preacct {
preprocess
files
}

accounting {
acct_unique
detail
unix
radutmp
}

session {
radutmp
}

-------------------- Fim do arquivo radiusd.conf --------------------

Execute ainda os seguintes comandos, para que não sejam utilizados arquivos de configuração obsoletos, que são incluídos apenas por motivo históricos:

# cd /usr/local/etc/raddb
# mv naslist naslist.OFF
# mv clients clients.OFF
# mv realms realms.OFF

Feitas estas configurações, o servidor pode ser inicializado e testado. Execute o /usr/local/sbin/radiusd e verifique o arquivo de log, em /var/log/radius/radius.log. Na última linha deverá constar a seguinte frase logo após a inicialização:

Info: Ready to process requests.

Agora teste o servidor, com o utilitário radtest. Execute a linha de comando abaixo, substituindo os valores usuario e senha por um username e senha válidos no seu sistema e secretX pelo secret do cliente 127.0.0.1 definido no arquivo clients.conf:

# radtest usuario senha 127.0.0.1 10 secretX

Deverá aparecer a string Access-Accept como resultado. Tente novamente o comando com uma senha incorreta, e veja se aparece a string Access-Reject como retorno.

O arquivo de log do daemon é o /var/log/radius/radius.log. Além deste, temos outros dois tipos de log, em /var/log/radius/radacct. Um é o detail-aaaamm, onde aaaamm será o ano e o mês corrente, este arquivo guarda o log de accounting. O outro chama-se auth-detail-aaaamm, e registra todos os pedidos de autorização (login) para conexão.

Crie um script de inicialização para o FreeRADIUS, em /usr/local/etc/rc.d/freeradius.sh, com a permissão 700 e os seguintes comandos para inicialização e shutdown, respectivamente:

/usr/local/sbin/radiusd

e

kill `cat /var/run/radiusd/radiusd.pid`

 

Atualizado em 03/02/04.

Heini Thomas Geib.
http://www2.unijui.edu.br/~heini

Voltar