- 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