Idioma
Categoria
Pesquisar

Configurando Radius com MySQL no Slackware

Veja como instalar o radius, criar as tabelas no mysql e configurar a integração entre os serviços.

Em Open Source Por Rudi Drusian Lange
Publicado em
Última atualização
  • 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