Criando um servidor de autenticação com FreeRadius no Debian 10 Buster (Extra sqlippool)

Esse tutorial é ideal para provedores que desejam criar seu próprio sistema de autenticação com freeradius, fazendo autenticação do tipo PPPoE, hotspot, Wireless (PSK/EAP) entre outras.
Neste tutorial iremos instalar e configurar o FreeRadius 3.0.x sobre o Debina 10, com integração dos na base de dados MariaDB (frok do MySQL), ativaremos ainda o módulos SQLIPPOOL para armazenar nossa pool de IPs na base de dados.
REQUISITOS
1 – Debian 10 bustes – Instalação limpa
2 – WEB Apache + PHP + MariaDB + phpMyAdmin no Debian 10 Buster “LAMP” (Se desejar usar o phpMyAdmin)
Instalação do FreeRadius 3.0.`>17`
Primeiramente iremos criar o banco de dados e usuário e conceder as permissões de acesso.
Abra o terminal de comando do MariaDB e crie a base e o usuario chamados de radius e defina a senha para este usuário.
# mariadb -u root
Altere SENHA_USER_RADIUS. Você pode gerar uma senha forte e segura em https://senhasegura.remontti.com.br
CREATE DATABASE radius; GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost' IDENTIFIED BY 'SENHA_USER_RADIUS'; FLUSH PRIVILEGES; quit;
Instale os pacotes do freeradius
# apt install freeradius freeradius-mysql freeradius-utils
Com o o banco de dados radius criado iremos importar as tabelas padrões do freeradius:
# mariadb -u radius -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql # mariadb -u radius -p radius < /etc/freeradius/3.0/mods-config/sql/ippool/mysql/schema.sql
Após comando será solicitado a senha do usuario radius (SENHA_USER_RADIUS).
Caso deseje logs mais detalhados (recomendo) edite o arquivo /etc/freeradius/3.0/radiusd.conf, mas antes faça um backup do mesmo.
# cp /etc/freeradius/3.0/radiusd.conf /etc/freeradius/3.0/radiusd.conf.orig # vim /etc/freeradius/3.0/radiusd.conf
Localize as variáveis e altere para yes
[...]
log {
[...]
stripped_names = yes
auth = yes
auth_badpass = yes
auth_goodpass = yes
[...]
}
[...]
Ajustaremos o mod SQL para trabalhar com conexão do tipo mysql, e informamos os dados para conexão com o banco de dados. Arquivo /etc/freeradius/3.0/mods-available/sql.orig
# cp /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-available/sql.orig
Usarei o comando sed para facilitar sua vida 🙂 mas preste atenção nos comandos, se desejar pode editar o arquivo manualmente e alterar as entradas.
# sed -i 's/driver = "rlm_sql_null"/driver = "rlm_sql_mysql"/' /etc/freeradius/3.0/mods-available/sql # sed -i 's/dialect = "sqlite"/dialect = "mysql"/' /etc/freeradius/3.0/mods-available/sql # sed -i '/server = "localhost"/s/^#//g' /etc/freeradius/3.0/mods-available/sql # sed -i '/port = 3306/s/^#//g' /etc/freeradius/3.0/mods-available/sql # sed -i '/login = "radius"/s/^#//g' /etc/freeradius/3.0/mods-available/sql # sed -i '/password = "radpass"/s/^#//g' /etc/freeradius/3.0/mods-available/sql # sed -i '/read_clients = yes/s/^#//g' /etc/freeradius/3.0/mods-available/sql
No próximo comando altere SENHA_USER_RADIUS para a senha de conexão do usuário radius.
# sed -i 's/radpass/SENHA_USER_RADIUS/' /etc/freeradius/3.0/mods-available/sql
Habilite o mod:
# ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/sql
Agora no arquivo /etc/freeradius/3.0/sites-enabled/default vamos comentar alguns componentes que não nos interessa (Se você entrar no arquivo e editar manualmente ele está todo comentado, auto explicativo.) e incluir alguns componentes como o SQL.
# cp /etc/freeradius/3.0/sites-available/default /etc/freeradius/3.0/sites-available/default.org
# sed -i '/digest/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/suffix/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/files/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/ldap/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/exec/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/detail/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/unix/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i '/attr_filter.accounting_response/s/^/#/g' /etc/freeradius/3.0/sites-available/default
# sed -i 's/-sql/sql/' /etc/freeradius/3.0/sites-available/default
# sed -i '682 s/# *//' /etc/freeradius/3.0/sites-available/default
# sed -i '829,849 {s/^/##/}' /etc/freeradius/3.0/sites-available/default
Habilitando o mod sqlippool
Como o mod sqlippool você poderá ter sua pool de IPs direto no banco de dados.
# ln -s /etc/freeradius/3.0/mods-available/sqlippool /etc/freeradius/3.0/mods-enabled/sqlippool
Vou alterar (Descomentando e comentado) a chave pool_key = "%{NAS-Port}" por "%{Calling-Station-Id}", desta forma a chave será o MAC, e "allow_duplicates = no" para não termos duplicidades de IPs. Mais adiante iremos também ajustar o allocate_clear.
# sed -i '65 {s/^/#/}' /etc/freeradius/3.0/mods-available/sqlippool
# sed -i '66 s/# *//' /etc/freeradius/3.0/mods-available/sqlippool
# sed -i '58 s/# *//' /etc/freeradius/3.0/mods-available/sqlippool
Precisamos adicionar o mod sqlippool no nosso arquivo default, você acrescentará sqlippool em accounting {...} e post-auth {...} logo abaixo de sql:
# sed -i '641i\ sqlippool' /etc/freeradius/3.0/sites-available/default # sed -i '734i\ sqlippool' /etc/freeradius/3.0/sites-available/default
Verifique com o comando abaixo se a saída do seu arquivo ficou assim:
# cat /etc/freeradius/3.0/sites-enabled/default |grep -v "#" |awk 'NF>0'
server default {
listen {
type = auth
ipaddr = *
port = 0
limit {
max_connections = 16
lifetime = 0
idle_timeout = 30
}
}
listen {
ipaddr = *
port = 0
type = acct
limit {
}
}
listen {
type = auth
port = 0
limit {
max_connections = 16
lifetime = 0
idle_timeout = 30
}
}
listen {
ipv6addr = ::
port = 0
type = acct
limit {
}
}
authorize {
filter_username
preprocess
chap
mschap
eap {
ok = return
}
sql
expiration
logintime
pap
}
authenticate {
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
mschap
eap
}
preacct {
preprocess
acct_unique
}
accounting {
sql
sqlippool
}
session {
sql
}
post-auth {
update {
&reply: += &session-state:
}
sql
sqlippool
remove_reply_message_if_eap
}
pre-proxy {
}
post-proxy {
eap
}
}
Faremos os ajustes no arquivo inner-tunnel
# cp /etc/freeradius/3.0/sites-available/inner-tunnel /etc/freeradius/3.0/sites-available/inner-tunnel.org
# sed -i '/suffix/s/^/#/g' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i '/files/s/^/#/g' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i '/-ldap/s/^/#/g' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i 's/-sql/sql/' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i 's/radutmp/#radutmp/' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i '269 s/# *//' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i '331,356 {s/^/##/}' /etc/freeradius/3.0/sites-available/inner-tunnel
# sed -i '365,376 {s/^/##/}' /etc/freeradius/3.0/sites-available/inner-tunnel
Verifique com o comando abaixo se a saída do seu arquivo ficou assim:
# cat /etc/freeradius/3.0/sites-enabled/inner-tunnel |grep -v "#" |awk 'NF>0'
server inner-tunnel {
listen {
ipaddr = 127.0.0.1
port = 18120
type = auth
}
authorize {
filter_username
chap
mschap
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
}
mschap
eap
}
session {
sql
}
post-auth {
sql
}
pre-proxy {
}
post-proxy {
eap
}
Uma alteração que acho válida é para que para cada alocação de IP ela seja randômica, isso pode solucionar alguns problemas como o balanceamento dos prefixo no seu BGP, ou daqueles clientes que jogam online, fazem download e até mesmo que estão sofrendo algum ataque. Assim ao reiniciar seu equipamento o mesmo irá receber um novo endereço IP. Para que funcione desta forma iremos apenas comentar algumas linhas e descomentar outras, pois em /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf variável allocate_find já vem com o modelo pronto 🙂
Comentar:
# sed -i '41,50 {s/^/##/}' /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf
##allocate_find = "\
## SELECT framedipaddress FROM ${ippool_table} \
## WHERE pool_name = '%{control:Pool-Name}' \
## AND (expiry_time < NOW() OR expiry_time IS NULL) \
## ORDER BY \
## (username <> '%{User-Name}'), \
## (callingstationid <> '%{Calling-Station-Id}'), \
## expiry_time \
## LIMIT 1 \
## FOR UPDATE"
Descomentar:
# sed -i '55,62 s/# *//' /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf
allocate_find = "\
SELECT framedipaddress FROM ${ippool_table} \
WHERE pool_name = '%{control:Pool-Name}' \
AND expiry_time IS NULL \
ORDER BY \
RAND() \
LIMIT 1 \
FOR UPDATE"
Como alteramos a pool_key para Calling-Station-Id em /etc/freeradius/3.0/mods-enabled/sqlippool vamos ajustar o allocate_clear para quando for liberar um IP use a chave pool_key e não a NAS, caso contrário ira liberar IPs indevidos que estão sendo utilizado por usuários ativos e assim evitamos que surjam IPs duplicados, para isso:
Comentar:
# sed -i '26,35 {s/^/##/}' /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf
##allocate_clear = "\
## UPDATE ${ippool_table} \
## SET \
## nasipaddress = '', \
## pool_key = 0, \
## callingstationid = '', \
## username = '', \
## expiry_time = NULL \
## WHERE expiry_time <= NOW() - INTERVAL 1 SECOND \
## AND nasipaddress = '%{%{Nas-IP-Address}:-%{Nas-IPv6-Address}}'"
Descomentar
# sed -i '10,18 s/# *//' /etc/freeradius/3.0/mods-config/sql/ippool/mysql/queries.conf
allocate_clear = "\
UPDATE ${ippool_table} \
SET \
nasipaddress = '', \
pool_key = 0, \
callingstationid = '', \
username = '', \
expiry_time = NULL \
WHERE pool_key = '${pool_key}'"
É interessante você ajustar o tempo lease_duration = 3600 no arquivo /etc/freeradius/3.0/mods-available/sqlippool talvez para um menor intervalo,porém sempre respeitando que o Acct-Interim-Interval seja um tempo menor, para não ter duplicidades de ips. Falo sobre isso no tutorial https://blog.remontti.com.br/4085 recomendo a leitura!
Opcional
Eu particularmente não gosto da ideia da tabela radusergroup não ter um ID, em alguma programação ela pode ser útil, então para fazer isso se desejar faça:
# mariadb -u radius -p
Entre com suasenha do usuário radius.
USE radius; ALTER TABLE `radusergroup` ADD `id` INT(20) NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`) ; ALTER TABLE `radusergroup` ADD UNIQUE(`id`); quit;
Caso você tenha uma alta demanda de requisições você pode fazer algumas alterações no radiusd.conf.
Altere conforme sua necessidade, e hardware de seu servidor. Vale lembrar que fazendo essas alterações pode ser necessário alterar o limite de conexões ao MariaDB. Não abuse nessas configurações recomendo ler a documentação.
# vim /etc/freeradius/3.0/radiusd.conf
Você pode começar dobrando os valores, ex.:
[...]
thread pool {
start_servers = 10
max_servers = 64
min_spare_servers = 6
max_spare_servers = 20
max_queue_size = 131072
max_requests_per_server = 0
auto_limit_acct = no
}
[...]
Finalizando
Habilite o freeradius para começar junto com a inicialização do sistema
# systemctl enable freeradius
Pare o serviço e inicie em modo debug
# systemctl stop freeradius # freeradius -X
Se nenhum erro acontecer uma mensagem com: Ready to process requests aparecer parabéns seu freeradius está funcionando. Através do comando debug você consegue acompanhar as ações que o freeradius irá fazer, ótimo para estudos e entendimento. Para encerrar o modo debig use Crtl+c, e então inicie o serviço de forma normal.
# systemctl start freeradius
Para integrar seu servidor freeradius para fazer autenticações PPPoE, Hotspot, Wireless PSK/EAP entre outras, você precisa aprender mais sobre as tabelas do banco de dados e quais atributos usar em cada situação sempre pensando na segurança. Você pode acessar https://blog.remontti.com.br/4085 onde irá encontra alguns modelos de autenticação que atente praticamente todos os cenários de provedores.
Gostou? Quer me ajudar? 🙂
Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!

Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.
Participe do canal no telegram para ficar atualizado sempre que publicar um novo tutorial.
Abraço!
Fonte:
https://wiki.freeradius.org/guide/SQL-HOWTO
https://wiki.freeradius.org/modules/Rlm_sql
https://wiki.freeradius.org/modules/Rlm_sqlippool




Cara, você é ótimo, segui seu tutorial a risca e deu tudo certo!
Caramba, você fez um monte de alterações usando sed com busca pelo número de linha para localização das alterações.
Mas que burrada ! Metade não aponta mais para a linha certa, porque os arquivos de configuração mudam sutilmente de uma versão para outra do pacote freeradius-config.
Se vc estiver utilizando o debian 10 estará as linhas certas, pois a versão do freeradius não é mais recente, agora se vc esta usando outra versão de distribuição é OBVIO que não será mais!
Ressalto no tutorial para prestar atenção que estou usando sed, não é difícil entender o q o comando faz.
Então antes de vir aqui encher meu saco vai e faz melhor!
parabéns. Tutorial muito bem montado e prático.
Muito Obrigado! Tutorial Muito Bem Feito!
Show de bola consegui instalar tudo com sucesso no ubuntu 20.04 , tive que efetuar algumas alteracões em alguns arquivos em linhas diferentes do tutorial, mas o freeradius está funcionando agora.
Sabem informar se existe algum dashboard PHP que seja compativel com o freeradius 3.0 para eu tentar configurar e instalar para efetuar uns testes?
pesquisa sobr daloRadius
Muito Obrigado por sempre contribuir com seu conhecimento…vlew mesmo!!!
boa tarde estava procurando uma solução para colocar no meu isp que controla-se os usuarios ssh nos equipamentos huawei que tenho aqui
e fazer logo dos comandos dos funcionarios