Sign inSign up

i9corp/freeradius

By i9corp

•Updated over 8 years ago

Servidor de RADIUS integrado com MySQL

Image
0

1.5K

i9corp/freeradius repository overview

⁠Servidor de RADIUS integrado com o MySQL

Essa imagem do RADIUS (Remote Authentication Dial In User Service) realiza a validação (processo de autenticação e autorização), consultando a base de dados do MySQL e armazena os logs como tentativas de autenticação.

Foi utilizado o freeradius para fazer essa imagem.

⁠Rede

Para realizar uma requisição ao radius é necessário que o endereço ip que for realizar a requisição esteja liberado no RADIUS e que seja informada a senha configurada no secret.

Ao iniciar o container é possível definir qual a rede que você irá permitir que se comunique com o RADIUS e a secret que deve ser usado. Isso é feito configurando duas variáveis de ambiente.

  • RADIUS_KEY (A senha usada para realizar as requisições ao RADIUS)
  • RADIUS_CLIENTS (A rede que poderá enviar requisições ao RADIUS)

⁠Banco de dados

O banco de dados que deve ser utilizado para esse servidor pode ser o MySQL ou MariaDB.

⁠Configurando o banco de dados

Para configurar o banco de dados deve ser definida às seguintes variáveis de ambiente:

  • MYSQL_DATABASE (Banco de dados que irá armazenar as tabelas do RADIUS)
  • MYSQL_HOST (Endereço IP ou domínio banco de dados)
  • MYSQL_USER (Senha usado para se conectar com o banco de dados)
  • MYSQL_PASSWORD (Senha usado para se conectar com o banco de dados)
  • MYSQL_PORT (Porta para realizar a conexão com o banco de dados, a padrão é a 3306)

⁠Estrutura de tabelas

As seguintes tabelas devem existir no banco de dados do radius:

  • cui
  • nas
  • radacct
  • radcheck
  • radgroupcheck
  • radgroupreply
  • radippool
  • radpostauth
  • radreply
  • radusergroup
  • wimax

Para criar as tabelas manualmente você pode usar a sequinte SQL.

CREATE TABLE IF NOT EXISTS `cui` (
    `clientipaddress` VARCHAR(15) NOT NULL DEFAULT '',
    `callingstationid` VARCHAR(50) NOT NULL DEFAULT '',
    `username` VARCHAR(64) NOT NULL DEFAULT '',
    `cui` VARCHAR(32) NOT NULL DEFAULT '',
    `creationdate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `lastaccounting` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
    PRIMARY KEY (`username`, `clientipaddress`, `callingstationid`)
)ENGINE=MyISAM;

CREATE TABLE IF NOT EXISTS `nas` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `nasname` VARCHAR(128) NOT NULL,
    `shortname` VARCHAR(32) NULL DEFAULT NULL,
    `type` VARCHAR(30) NULL DEFAULT 'other',
    `ports` INT(5) NULL DEFAULT NULL,
    `secret` VARCHAR(60) NOT NULL DEFAULT 'secret',
    `server` VARCHAR(64) NULL DEFAULT NULL,
    `community` VARCHAR(50) NULL DEFAULT NULL,
    `description` VARCHAR(200) NULL DEFAULT 'RADIUS Client',
    PRIMARY KEY (`id`),
    INDEX `nasname` (`nasname`)
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `radacct` (
    `radacctid` BIGINT(21) NOT NULL AUTO_INCREMENT,
    `acctsessionid` VARCHAR(64) NOT NULL DEFAULT '',
    `acctuniqueid` VARCHAR(32) NOT NULL DEFAULT '',
    `username` VARCHAR(64) NOT NULL DEFAULT '',
    `groupname` VARCHAR(64) NOT NULL DEFAULT '',
    `realm` VARCHAR(64) NULL DEFAULT '',
    `nasipaddress` VARCHAR(15) NOT NULL DEFAULT '',
    `nasportid` VARCHAR(15) NULL DEFAULT NULL,
    `nasporttype` VARCHAR(32) NULL DEFAULT NULL,
    `acctstarttime` DATETIME NULL DEFAULT NULL,
    `acctstoptime` DATETIME NULL DEFAULT NULL,
    `acctsessiontime` INT(12) NULL DEFAULT NULL,
    `acctauthentic` VARCHAR(32) NULL DEFAULT NULL,
    `connectinfo_start` VARCHAR(50) NULL DEFAULT NULL,
    `connectinfo_stop` VARCHAR(50) NULL DEFAULT NULL,
    `acctinputoctets` BIGINT(20) NULL DEFAULT NULL,
    `acctoutputoctets` BIGINT(20) NULL DEFAULT NULL,
    `calledstationid` VARCHAR(50) NOT NULL DEFAULT '',
    `callingstationid` VARCHAR(50) NOT NULL DEFAULT '',
    `acctterminatecause` VARCHAR(32) NOT NULL DEFAULT '',
    `servicetype` VARCHAR(32) NULL DEFAULT NULL,
    `framedprotocol` VARCHAR(32) NULL DEFAULT NULL,
    `framedipaddress` VARCHAR(15) NOT NULL DEFAULT '',
    `acctstartdelay` INT(12) NULL DEFAULT NULL,
    `acctstopdelay` INT(12) NULL DEFAULT NULL,
    `xascendsessionsvrkey` VARCHAR(10) NULL DEFAULT NULL,
    PRIMARY KEY (`radacctid`),
    INDEX `username` (`username`),
    INDEX `framedipaddress` (`framedipaddress`),
    INDEX `acctsessionid` (`acctsessionid`),
    INDEX `acctsessiontime` (`acctsessiontime`),
    INDEX `acctuniqueid` (`acctuniqueid`),
    INDEX `acctstarttime` (`acctstarttime`),
    INDEX `acctstoptime` (`acctstoptime`),
    INDEX `nasipaddress` (`nasipaddress`)
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `radcheck` (
    `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(64) NOT NULL DEFAULT '',
    `attribute` VARCHAR(64) NOT NULL DEFAULT '',
    `op` CHAR(2) NOT NULL DEFAULT '==',
    `value` VARCHAR(253) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`),
    INDEX `username` (`username`(32))
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `radgroupcheck` (
    `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `groupname` VARCHAR(64) NOT NULL DEFAULT '',
    `attribute` VARCHAR(64) NOT NULL DEFAULT '',
    `op` CHAR(2) NOT NULL DEFAULT '==',
    `value` VARCHAR(253) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`),
    INDEX `groupname` (`groupname`(32))
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `radgroupreply` (
    `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `groupname` VARCHAR(64) NOT NULL DEFAULT '',
    `attribute` VARCHAR(64) NOT NULL DEFAULT '',
    `op` CHAR(2) NOT NULL DEFAULT '=',
    `value` VARCHAR(253) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`),
    INDEX `groupname` (`groupname`(32))
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `radippool` (
    `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `pool_name` VARCHAR(30) NOT NULL,
    `framedipaddress` VARCHAR(15) NOT NULL DEFAULT '',
    `nasipaddress` VARCHAR(15) NOT NULL DEFAULT '',
    `calledstationid` VARCHAR(30) NOT NULL,
    `callingstationid` VARCHAR(30) NOT NULL,
    `expiry_time` DATETIME NULL DEFAULT NULL,
    `username` VARCHAR(64) NOT NULL DEFAULT '',
    `pool_key` VARCHAR(30) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `radippool_poolname_expire` (`pool_name`, `expiry_time`),
    INDEX `framedipaddress` (`framedipaddress`),
    INDEX `radippool_nasip_poolkey_ipaddress` (`nasipaddress`, `pool_key`, `framedipaddress`)
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `radpostauth` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(64) NOT NULL DEFAULT '',
    `pass` VARCHAR(64) NOT NULL DEFAULT '',
    `reply` VARCHAR(32) NOT NULL DEFAULT '',
    `authdate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `radreply` (
    `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(64) NOT NULL DEFAULT '',
    `attribute` VARCHAR(64) NOT NULL DEFAULT '',
    `op` CHAR(2) NOT NULL DEFAULT '=',
    `value` VARCHAR(253) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`),
    INDEX `username` (`username`(32))
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `radusergroup` (
    `username` VARCHAR(64) NOT NULL DEFAULT '',
    `groupname` VARCHAR(64) NOT NULL DEFAULT '',
    `priority` INT(11) NOT NULL DEFAULT '1',
    INDEX `username` (`username`(32))
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `wimax` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(64) NOT NULL DEFAULT '',
    `authdate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `spi` VARCHAR(16) NOT NULL DEFAULT '',
    `mipkey` VARCHAR(400) NOT NULL DEFAULT '',
    `lifetime` INT(12) NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    INDEX `username` (`username`),
    INDEX `spi` (`spi`)
)ENGINE=InnoDB;

⁠Usando a imagem

É possivel iniciar a imagem através de linha comando porém devido à quantidade de variáveis é aconselhável que se crie um docker-composer.yml e configure e depois execute o deamon através do comando:

docker-compose up -d -f <nome_do_meu_docker_composer>

O nome do docker composer deve ser substituído pelo seu arquivo e deve conter não só o nome, mas também a extensão caso a exista, por exemplo: app-freeradius.yml)

⁠Exemplo de docker-composer.yml

version: "2"
services: 
freeradius:
    image: "i9corp/freeradius:latest"
    network_mode: "host"
    ports:
    - "1812:1812/udp"
    - "1813:1813/udp"
    volumes:
    - "vol_radius:/etc/raddb"
    environment:
    - MYSQL_DATABASE=radius
    - MYSQL_HOST=10.224.100.12
    - MYSQL_USER=radius
    - MYSQL_PASSWORD=c92a666087ae3a8131f371da913a5fa3
    - MYSQL_PORT=32768
    - RADIUS_KEY=d16773ea3ddf0835f72cb11ca9459934
    - RADIUS_CLIENTS=10.224.100.0/24
    - DB_FORCE_CREATE=0
    - RAD_DEBUG=no
volumes:
vol_radius:

⁠Testando a conexão

Os testes do servidor radius foram realizados usando a ferramenta ntradping, é possível obter o download da mesma no site da novell⁠.

Se o equipamento que fizer a requisição não estiver dentro da rede liberada no RADIUS o RADIUS irá ignorar a requisição e a mesma retornará como rejeitada.

Tag summary

Content type

Image

Digest

Size

15.3 MB

Last updated

over 8 years ago

docker pull i9corp/freeradius