- Ambiente de instalação
- Freeradius 2.2.9
- Mariadb 10.0.27 x86_64
- Distribuição Slackware 14.2 64
Faça o download e instale o Freeradius. A instalação abaixo foi feita através do script slackbuilds. Este artigo mostra como gerar um pacote e instalar através dos scripts slackbuilds.
# Shell
// Download do freeradius wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-server-2.2.9.tar.bz2 // Download do slackbuilds wget https://slackbuilds.org/slackbuilds/14.2/network/freeradius-server.tar.gz // Descompacta tar -zxf freeradius-server.tar.gz // Move o source do freeradius para o diretório do script slackbuilds mv freeradius-server-2.2.9.tar.bz2 freeradius-server // Acessa o diretório do script cd freeradius-server // Gera o pacote ./freeradius-server.SlackBuild // Instala o pacote installpkg /tmp/freeradius-server-2.2.9-x86_64-1_SBo.tgz
O próximo passo é criar o banco de dados e garantir permissão a um usuário. Utilize os nomes a sua escolha.
$ Shell + Mysql
mysql -u root -p CREATE DATABASE radius; GRANT ALL ON radius.* TO radius@localhost IDENTIFIED BY "SenhadoUsuario"; exit
Para mais informações sobre usuários e permissões no MySQL: Manipulando usuários e privilégios no mysql.
Agora iremos importar as tabelas padrões do FreeRADIUS para o MySQL.
$ Shell
cd /etc/raddb/sql/mysql/ mysql -u root -p radius < schema.sql mysql -u root -p radius < nas.sql
Abaixo a lista das tabelas que são criadas com o comando acima:
Mysql
MariaDB [(none)]> use radius; Database changed MariaDB [radius]> show tables; +------------------+ | Tables_in_radius | +------------------+ | nas | | radacct | | radcheck | | radgroupcheck | | radgroupreply | | radpostauth | | radreply | | radusergroup | +------------------+ 8 rows in set (0.00 sec)
Configurando o FreeRADIUS para usar o MySQL
Edite o arquivo /etc/raddb/radiusd.conf descomentando a linha $INCLUDE sql.conf:
/etc/raddb/radiusd.conf
# Include another file that has the SQL-related configuration.
# This is another file only because it tends to be big.
$INCLUDE sql.conf
Edite o arquivo /etc/raddb/sql.conf conforme necessidade, veja um exemplo abaixo:
/etc/raddb/sql.conf
sql {
# Define o banco de dados que será utilizado
database = "mysql"
driver = "rlm_sql_${database}"
# Nome do host e porta onde esta o banco de dados
server = "localhost"
port = 3306
# Usuário e senha do banco
login = "radius"
password = "radpass"
# Nome do banco de dados
radius_db = "radius"
# Define as tabelas que serão usadas para cada funcionalidade
acct_table1 = "radacct"
acct_table2 = "radacct"
postauth_table = "radpostauth"
authcheck_table = "radcheck"
authreply_table = "radreply"
groupcheck_table = "radgroupcheck"
groupreply_table = "radgroupreply"
usergroup_table = "radusergroup"
deletestalesessions = yes
sqltrace = no
sqltracefile = ${logdir}/sqltrace.sql
num_sql_socks = ${thread[pool].max_servers}
connect_failure_retry_delay = 60
lifetime = 0
max_queries = 0
# Diz para o radius utilizar a tabela "nas" para consultar as informações dos clientes
readclients = yes
nas_table = "nas"
$INCLUDE sql/${database}/dialup.conf
}
Edite /etc/raddb/sites-enabled/default e remova o comentário(#) das linhas contendo 'sql' e comente ou delete as linhas com o conteúdo "files".
- Remova o comentário da linha 'sql' na seção authorize {} para que o FreeRADIUS faça o processo de autorização utilizando o banco de dados.
- Remova o comentário da linha 'sql' na seção accounting{} para que o FreeRADIUS armazene as informações de accounting no banco de dados.
- Remova o comentário da linha 'sql' na seção session{} se você quiser utilizar detecção de usuários simultâneos.
- Remova o comentário da linha 'sql' na seção post-auth{} para registrar no banco de dados todas as tentativas de autenticação.
*** As mesmas edições feitas neste arquivo /etc/raddb/sites-enabled/default devem ser feitas no arquivo /etc/raddb/sites-enabled/inner-tunnel.
Abaixo os arquivos default e inner-tunnel sem os comentários
/etc/raddb/sites-enabled/default
authorize {
preprocess
chap
mschap
digest
suffix
eap {
ok = return
}
sql
expiration
logintime
pap
}
authenticate {
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
digest
unix
eap
}
preacct {
preprocess
acct_unique
suffix
}
accounting {
detail
sql
exec
attr_filter.accounting_response
}
session {
radutmp
sql
}
post-auth {
sql
exec
Post-Auth-Type REJECT {
sql
eap
attr_filter.access_reject
}
}
pre-proxy {
}
post-proxy {
eap
}
/etc/raddb/sites-enabled/inner-tunnel
server inner-tunnel {
listen {
ipaddr = 127.0.0.1
port = 18120
type = auth
}
authorize {
chap
mschap
suffix
update control {
Proxy-To-Realm := LOCAL
}
eap {
ok = return
}
sql
expiration
logintime
pap
}
authenticate {
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
unix
eap
}
session {
radutmp
sql
}
post-auth {
sql
Post-Auth-Type REJECT {
sql
attr_filter.access_reject
}
}
pre-proxy {
}
post-proxy {
eap
}
}
Inserindo dados fictícios no MySQL
Você deve agora inserir informações nas tabelas do MySQL para depois testar o serviço. Logue no MySQL e selecione o banco de dados do radius.
$ Shell + Mysql
mysql -u root -p Enter password: MariaDB [(none)]> use radius; Database changed MariaDB [radius]>
Adicione registros na tabela radcheck para cada conta de usuário com o atributo 'Cleartext-Password' seguido da senha. Esta tabela é responsável por armazenar os dados dos usuários para autenticação.
Mysql
INSERT INTO `radcheck` (`id`, `username`, `attribute`, `op`, `value`) VALUES (1, 'joao', 'Cleartext-Password', ':=', 'senhadojoao'), (2, 'alfredo', 'Cleartext-Password', ':=', 'senhadoalfredo'), (3, 'joana', 'Cleartext-Password', ':=', 'senhadajoana');
Adicione registros na tabela usergroup que correspondam ao nome da conta do usuário(utilizada na tabela radcheck) e nome do grupo que este usuário será atribuído. Esta tabela associa usuários a grupos sendo possível definir opções em comum para usuários no mesmo grupo.
Mysql
INSERT INTO `radusergroup` (`username`, `groupname`, `priority`) VALUES
('joana', 'administrador', 1),
('alfredo', 'tecnico', 1);
Adicione atributos específicos para cada usuário na tabela radreply. Esta tabela retorna, por exemplo, o tempo máximo de sessão, o IP, entre outras opções. Os atributos são associados ao usuário nesta tabela.
Mysql
INSERT INTO `radreply` (`id`, `username`, `attribute`, `op`, `value`) VALUES (1, 'joao', 'Session-Timeout', ':=', '86400'), (2, 'alfredo', 'Session-Timeout', ':=', '3600'), (3, 'joana', 'Session-Timeout', ':=', '18000');
Adicione atributos na tabela radgroupreply para afetar todos os membros do grupo. Definir o tempo de inatividade nesta tabela associado a um grupo irá fazer com que todos deste grupo recebam o mesmo tempo de inatividade.
Mysql
INSERT INTO `radgroupreply` (`id`, `groupname`, `attribute`, `op`, `value`) VALUES (1, 'administrador', 'Idle-Timeout', ':=', '86400'), (2, 'tecnico', 'Idle-Timeout', ':=', '3600');
Veja como ficaram as tabelas com os campos fictícios:
Mysql
MariaDB [radius]> select * from radcheck; +----+----------+--------------------+----+----------------+ | id | username | attribute | op | value | +----+----------+--------------------+----+----------------+ | 1 | joao | Cleartext-Password | := | senhadojoao | | 2 | alfredo | Cleartext-Password | := | senhadoalfredo | | 3 | joana | Cleartext-Password | := | senhadajoana | +----+----------+--------------------+----+----------------+ 3 rows in set (0.00 sec) MariaDB [radius]> select * from radusergroup; +----------+---------------+----------+ | username | groupname | priority | +----------+---------------+----------+ | joana | administrador | 1 | | alfredo | tecnico | 1 | +----------+---------------+----------+ 2 rows in set (0.00 sec) MariaDB [radius]> select * from radreply; +----+----------+-----------------+----+-------+ | id | username | attribute | op | value | +----+----------+-----------------+----+-------+ | 1 | joao | Session-Timeout | := | 86400 | | 2 | alfredo | Session-Timeout | := | 3600 | | 3 | joana | Session-Timeout | := | 18000 | +----+----------+-----------------+----+-------+ 3 rows in set (0.00 sec) MariaDB [radius]> select * from radgroupreply; +----+---------------+--------------+----+-------+ | id | groupname | attribute | op | value | +----+---------------+--------------+----+-------+ | 1 | administrador | Idle-Timeout | := | 86400 | | 2 | tecnico | Idle-Timeout | := | 3600 | +----+---------------+--------------+----+-------+ 2 rows in set (0.00 sec)
Testando a autenticação
No teste a seguir serão utilizados alguns parâmetros do servidor radius, estes podem ser encontrados no arquivo /etc/raddb/clients.conf.
/etc/raddb/clients.conf
# Arquivo sem comentários
client localhost {
ipaddr = 127.0.0.1
secret = testing123
require_message_authenticator = no
nastype = other
}
Veja também: Como remover comentários e linhas em branco de um arquivo no linux
Inicie o radius em modo de depuração utilizando o comando seguinte. Neste modo é possível verificar possíveis erros além de acompanhar o que esta acontecendo durante a tentativa de autenticação. O radius só deve ser iniciado desta maneira para analise e testes, não em ambiente de produção.
# Shell
radiusd -X
Agora vamos testar uma autenticação com o comando radtest. Mantenha o terminal em que o comando "radiusd -X" foi executado aberto, e em outro terminal execute o comando abaixo:
# Formato do comando # radtest {username} {password} {hostname} 10 {radius_secret} # username e password substituir por um dos adicionados na tabela radcheck # hostname utilize localhost ou 127.0.0.1 e radius secret utilize testing123 # o hostname e o secret podem ser encontrados no arquivo /etc/raddb/clients.conf radtest joao senhadojoao 127.0.0.1 10 testing123 Sending Access-Request of id 52 to 127.0.0.1 port 1812 User-Name = "joao" User-Password = "senhadojoao" NAS-IP-Address = 127.0.0.1 NAS-Port = 10 Message-Authenticator = 0x00000000000000000000000000000000 rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=52, length=26 Session-Timeout = 86400
A requisição acima foi aceita Access-Accept. No outro terminal onde foi executado radiusd -X será possível verificar as informações de depuração.
O servidor esta pronto, configurado para trabalhar com o MySQL.
Inicialização do serviço
Por padrão a instalação já cria o arquivo /etc/rc.d/rc.radiusd, é necessário conceder permissão de execução e adicionar uma chamada ao serviço no arquivo /etc/rc.d/rc.local para que este seja iniciado junto com o sistema.
# Shell
# Adiciona permissão de execução ao script chmod +x /etc/rc.d/rc.radiusd # Inicia o serviço /etc/rc.d/rc.radiusd start # Interrompe o serviço /etc/rc.d/rc.radiusd stop
Adicione o conteúdo abaixo ao arquivo /etc/rc.d/rc.local para iniciar o serviço junto com o sistema:
/etc/rc.d/rc.local
# Start Radius server:
if [ -x /etc/rc.d/rc.radiusd ]; then
/etc/rc.d/rc.radiusd start
fi