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.
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.
O banco de dados que deve ser utilizado para esse servidor pode ser o MySQL ou MariaDB.
Para configurar o banco de dados deve ser definida às seguintes variáveis de ambiente:
As seguintes tabelas devem existir no banco de dados do radius:
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;
É 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)
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:
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.
Content type
Image
Digest
Size
15.3 MB
Last updated
over 8 years ago
docker pull i9corp/freeradius