{"id":192,"date":"2012-01-13T07:47:51","date_gmt":"2012-01-13T09:47:51","guid":{"rendered":"http:\/\/linuxrs.com.br\/?p=192"},"modified":"2012-01-13T07:47:51","modified_gmt":"2012-01-13T09:47:51","slug":"freeradius-servidor-radius-eficiente-e-completo","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=192","title":{"rendered":"Freeradius &#8211; servidor radius eficiente e completo"},"content":{"rendered":"<table width=\"100%\" border=\"0\" cellspacing=\"3\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td colspan=\"2\">\n<table border=\"0\">\n<tbody>\n<tr>\n<td align=\"justify\">\n<h1>Aviso<\/h1>\n<p>Este artigo pode ser distribu\u00eddo, publicado, impresso e copiado de todas as formas e meios poss\u00edveis, desde que se mantenha o nome, a p\u00e1gina web e o e-mail do autor no cabe\u00e7alho, em local vis\u00edvel, abaixo do t\u00edtulo e com a letra maior ou igual a usada no texto.<\/p>\n<p>Meu primeiro contato com o servi\u00e7o radius foi com uma solu\u00e7\u00e3o comercial chamada <em>Steel-Belted Radius<\/em> (<a href=\"http:\/\/www.funk.com\/radius\/\">http:\/\/www.funk.com\/radius\/<\/a>), na \u00e9poca ele atendia minhas necessidades. O \u00fanico problema era que eu n\u00e3o podia compartilhar a base de dados com outras aplica\u00e7\u00f5es e isso estava ficando chato: a senha do e-mail era uma, a senha de acesso outra, n\u00e3o dava pra criar formul\u00e1rios de mudan\u00e7a de senha on-line e fazer uma migra\u00e7\u00e3o de base de dados e mantendo o software era invi\u00e1vel.<\/p>\n<p>Quando decidi migrar para uma solu\u00e7\u00e3o livre, comecei analisar tecnicamente os produtos do mercado, gostei de dois: <em>freeradius<\/em> e <em>openradius<\/em>, por\u00e9m o freeradius ganhou favoritismo, por que? Voc\u00ea vai saber nesse artigo!<\/p>\n<p>As configura\u00e7\u00f5es de hardware n\u00e3o s\u00e3o muito relevantes, um servidor radius n\u00e3o \u00e9 pesado nem exigente. Seu velho 486 daria pro gasto!<\/p>\n<p>SOFTWARES USADOS NO ARTIGO<\/p>\n<ul>\n<li><a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">Linux<\/a>: Slackware 10.0 (instala\u00e7\u00e3o Full)<\/li>\n<li>Freeradius 1.0.1<\/li>\n<li>MySQL 3.xx ou 4.xx<\/li>\n<\/ul>\n<p>Esse artigo \u00e9 uma abordagem completa do servi\u00e7o radius, tire um tempo para ler e preste aten\u00e7\u00e3o! Bons lucros com o conhecimento (aceito gratifica\u00e7\u00f5es$$!!!).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><strong>Instala\u00e7\u00e3o e comandos<\/strong><\/p>\n<table border=\"0\">\n<tbody>\n<tr>\n<td align=\"justify\">Quando eu escrevia este artigo, o link usado para download da vers\u00e3o atualizada do <em>Freeradius<\/em> era:<\/p>\n<p><a href=\"ftp:\/\/ftp.freeradius.org\/pub\/radius\/freeradius-1.0.1.tar.gz\">ftp:\/\/ftp.freeradius.org\/pub\/radius\/freeradius-1.0.1.tar.gz<\/a><\/p>\n<p>Caso este link esteja quebrado hoje, tente procurar no site <a href=\"http:\/\/www.freeradius.org\/\">www.freeradius.org<\/a> a vers\u00e3o atual para download ou entre no endere\u00e7o <a href=\"ftp:\/\/ftp.freeradius.org\/pub\">ftp:\/\/ftp.freeradius.org\/pub<\/a> e procure pelo pacote diretamente.<\/p>\n<p><strong># cd \/usr\/local\/src<br \/>\n# wget ftp:\/\/ftp.freeradius.org\/pub\/radius\/freeradius-1.0.1.tar.gz<br \/>\n# tar -xvzf freeradius-1.0.1.tar.gz<br \/>\n# cd freeradius-1.0.1\/<br \/>\n# .\/configure<br \/>\n# make<br \/>\n# make install<\/strong><\/p>\n<p>Como voc\u00ea pode ver, na instala\u00e7\u00e3o n\u00e3o h\u00e1 segredos, se voc\u00ea se deparar com algum problema na hora de compilar, consulte o comando:<\/p>\n<p><strong># .\/configure &#8211;help<\/strong><\/p>\n<p>para ver op\u00e7\u00f5es que possam burlar os erros.<\/p>\n<p>Por exemplo, se ele reclamar a aus\u00eancia do modulo kerberos, voc\u00ea pode usar a op\u00e7\u00e3o &#8211;without-krb5 no .\/configure para resolver, digo isso pois uma vez encarei esse problema na distribui\u00e7\u00e3o <em>Fedora<\/em>.<\/p>\n<p>O simples .\/configure far\u00e1 com que todos os m\u00f3dulos do freeradius que se comunicam com outras tecnologias como MySQL, LDAP, etc sejam instalados, alguns poder\u00e3o pedir bibliotecas, mas no Slackware 10 isso n\u00e3o acontece.<\/p>\n<p>Ao usar simplesmente .\/configure antes de compilar, ele ir\u00e1 programar o freeradius para ser instalado em \/usr\/local nas subpastas de sistema, tipo:<\/p>\n<ul>\n<li>\/urs\/local\/etc -&gt; arquivos de configura\u00e7\u00e3o;<\/li>\n<li>\/usr\/local\/sbin -&gt; comandos do administrador;<\/li>\n<li>\/usr\/local\/share -&gt; arquivos de dicion\u00e1rio de radius e outros arquivos compartilhados;<\/li>\n<li>\/usr\/local\/var -&gt; arquivos de pid e logs;<\/li>\n<\/ul>\n<p>e assim por diante. Ent\u00e3o, se nesse artigo eu falar da localiza\u00e7\u00e3o de algum comando ou arquivo de configura\u00e7\u00e3o, farei considerando que seu .\/configure n\u00e3o alterou o &#8220;&#8211;prefix&#8221; padr\u00e3o (\/urs\/local).<\/p>\n<p>Os seguintes comandos ser\u00e3o adicionados ao seu <em>Linux<\/em>:<\/p>\n<ul>\n<li>\/usr\/local\/bin\/radclient<\/li>\n<li>\/usr\/local\/bin\/radeapclient<\/li>\n<li>\/usr\/local\/bin\/radlast<\/li>\n<li>\/usr\/local\/bin\/radrelay<\/li>\n<li>\/usr\/local\/bin\/radtest<\/li>\n<li>\/usr\/local\/bin\/radwho<\/li>\n<li>\/usr\/local\/bin\/radzap<\/li>\n<li>\/usr\/local\/bin\/rlm_ippool_tool<\/li>\n<li>\/usr\/local\/bin\/smbencrypt<\/li>\n<\/ul>\n<p>Para o administrador:<\/p>\n<ul>\n<li>\/usr\/local\/sbin\/check-radiusd-config<\/li>\n<li>\/usr\/local\/sbin\/checkrad<\/li>\n<li>\/usr\/local\/sbin\/radiusd<\/li>\n<li>\/usr\/local\/sbin\/radwatch<\/li>\n<li>\/usr\/local\/sbin\/rc.radiusd<\/li>\n<\/ul>\n<p>Vejamos mais detalhes de como configur\u00e1-lo no pr\u00f3ximo cap\u00edtulo.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><strong>Arquivos de configura\u00e7\u00e3o detalhados<\/strong><\/p>\n<table border=\"0\">\n<tbody>\n<tr>\n<td align=\"justify\">Configurar o <em>freeradius<\/em> \u00e9 f\u00e1cil. Vou descrever cada detalhe do <em>radiusd.conf<\/em> (\/usr\/loca\/etc\/raddb\/radiusd.conf), que \u00e9 necess\u00e1rio para voc\u00ea entender melhor e n\u00e3o perder tempo procurando ajuda em f\u00f3runs! A descri\u00e7\u00e3o precede os par\u00e2metros, n\u00e3o comentei todos para n\u00e3o fugir do assunto.<\/p>\n<h1>1 &#8211; radiusd.conf<\/h1>\n<p>Arquivo de configura\u00e7\u00e3o principal respons\u00e1vel pelo daemon do radius e fazer inclus\u00f5es dos demais arquivos de configura\u00e7\u00e3o.<\/td>\n<\/tr>\n<tr>\n<td><span style=\"color: #004080;\"># inicio radiusd.conf<\/span><\/p>\n<p>prefix = \/usr\/local\/src<br \/>\nexec_prefix = ${prefix}<br \/>\nsysconfdir = ${prefix}\/etc<br \/>\nlocalstatedir = ${prefix}\/var<br \/>\nsbindir = ${exec_prefix}\/sbin<br \/>\nlogdir = ${localstatedir}\/log\/radius<br \/>\nraddbdir = ${sysconfdir}\/raddb<br \/>\nradacctdir = ${logdir}\/radacct<br \/>\nconfdir = ${raddbdir}<br \/>\nrun_dir = ${localstatedir}\/run\/radiusd<br \/>\n<span style=\"color: #004080;\"># vari\u00e1veis definidas na instala\u00e7\u00e3o, essas op\u00e7\u00f5es<br \/>\n# foram disponibilizadas para que voc\u00ea n\u00e3o precise<br \/>\n# recompilar para mudar os arquivos de lugar<br \/>\n# voc\u00ea pode usar essas vari\u00e1veis quando definir o<br \/>\n# valor de algum par\u00e2metro ao longo desse arquivo.<\/span><\/p>\n<p>log_file = ${logdir}\/radius.log<br \/>\n<span style=\"color: #004080;\"># arquivo de log principal, nesse arquivo ficar\u00e3o<br \/>\n# todas as mensagem de erro, tentativas de<br \/>\n# conex\u00e3o, etc&#8230;<\/span><\/p>\n<p>libdir = ${exec_prefix}\/lib<br \/>\n<span style=\"color: #004080;\"># pasta de bibliotecas, se elas<br \/>\n# se encontrarem em varias pastas,<br \/>\n# separe as localiza\u00e7\u00f5es<br \/>\n# por : , tipo: libdir = \/usr\/lib:\/usr\/local\/lib<\/span><\/p>\n<p>pidfile = ${run_dir}\/radiusd.pid<br \/>\n<span style=\"color: #004080;\"># arquivo onde ser\u00e1 armazenado o id<br \/>\n# do processo principal do freeradius<\/span><\/p>\n<p>user = nobody<br \/>\ngroup = nobody<br \/>\n<span style=\"color: #004080;\"># defini\u00e7\u00e3o do usu\u00e1rio e grupo dos processos filhos do radiusd<br \/>\n# se voc\u00ea n\u00e3o especificar, o usu\u00e1rio que deu partida<br \/>\n# ser\u00e1 usado (root), se<br \/>\n# voc\u00ea usar o arquivo \/etc\/shadow para autentica\u00e7\u00e3o,<br \/>\n# defina o grupo como shadow, vale lembrar<br \/>\n# que o usu\u00e1rio que executa o radiusd deve ter permiss\u00e3o<br \/>\n# de escrita no diret\u00f3rio de log<\/span><\/p>\n<p>max_request_time = 30<br \/>\n<span style=\"color: #004080;\"># define o tempo que o processo filho segura o pedido,<br \/>\n# caso o tempo limite seja atingido, o servidor retorna<br \/>\n# acesso negado. Por exemplo: se voc\u00ea define 2 segundos<br \/>\n# e usa um banco de dados mysql sobrecarregado que demora<br \/>\n# 5 segundos para concluir uma pesquisa, seu servidor nunca<br \/>\n# vai dar acesso a ningu\u00e9m!<\/span><\/p>\n<p>delete_blocked_requests = no<br \/>\n<span style=\"color: #004080;\"># se no par\u00e2metro max_request_time voc\u00ea<br \/>\n# definiu o valor 30 segundos, e o cliente<br \/>\n# perdeu a paci\u00eancia e enviou outra solicita\u00e7\u00e3o sem<br \/>\n# ter conclu\u00eddo a primeira,<br \/>\n# o freeradius n\u00e3o ficara fazendo trabalho<br \/>\n# repetitivo simultaneamente. Se voc\u00ea definir<br \/>\n# esse par\u00e2metro como yes, ao chegar a segunda<br \/>\n# requisi\u00e7\u00e3o do mesmo cliente com a mesma<br \/>\n# &#8220;pergunta&#8221;, ele desistir\u00e1 da primeira para<br \/>\n# atender a nova solicita\u00e7\u00e3o.<\/span><\/p>\n<p>cleanup_delay = 5<br \/>\n<span style=\"color: #004080;\"># esse valor funciona da seguinte maneira:<br \/>\n# se o NAS ou RAS enviou uma pergunta e<br \/>\n# a resposta foi perdida na rede, o NAS tornar\u00e1<br \/>\n# fazer a pergunta, todo o processo de autentica\u00e7\u00e3o<br \/>\n# ser\u00e1 realizado novamente. Para evitar isso o freeradius<br \/>\n# manter a resposta no cache pelo tempo definido aqui<br \/>\n# (em segundos), assim, se o pacote resposta for perdido<br \/>\n# e a pergunta for repetida, a resposta ser\u00e1 imediata,<br \/>\n# usando assim o m\u00ednimo de processamento.<\/span><\/p>\n<p>max_requests = 1024<br \/>\n<span style=\"color: #004080;\"># define o n\u00famero m\u00e1ximo de<br \/>\n# requisi\u00e7\u00f5es que o freeradius pode atender<br \/>\n# simultaneamente, somando todas as requisi\u00e7\u00f5es<br \/>\n# atendidas pelos processos filhos, assim,<br \/>\n# se voc\u00ea tem 4 processo filhos, cada um<br \/>\n# poder\u00e1 atender 256 perguntas simultaneamente<br \/>\n# ATEN\u00c7\u00c3O: as respostas cacheadas pela op\u00e7\u00e3o<br \/>\n# cleanup_delay s\u00e3o contabilizadas. Se voc\u00ea colocou<br \/>\n# cleanup_delay com um valor alto, seu radius<br \/>\n# ficar\u00e1 exposto a um DOS<\/span><\/p>\n<p>bind_address = *<br \/>\n<span style=\"color: #004080;\"># isso far\u00e1 o freeradius escutar em<br \/>\n# um endere\u00e7o especifico, * inclui todos<br \/>\n# os endere\u00e7os ip do host, voc\u00ea pode<br \/>\n# usar um FQDN, mas antes tenha certeza<br \/>\n# de que a resolu\u00e7\u00e3o de dns estar\u00e1 dispon\u00edvel<br \/>\n# no momento em que o servidor radius inicia<\/span><\/p>\n<p>port = 0<br \/>\n<span style=\"color: #004080;\"># porta de escuta. Equipamentos antigos tem a porta<br \/>\n# 1645 como padr\u00e3o de autentica\u00e7\u00e3o e 1646 como<br \/>\n# contabilidade. A RFC 2138 mudou essa porta para<br \/>\n# 1812 autentica\u00e7\u00e3o e 1813 contabilidade. Equipamentos<br \/>\n# novos provavelmente ter\u00e1 essa porta como padr\u00e3o.<br \/>\n# 0 (zero) far\u00e1 com que a porta seja pesquisada<br \/>\n# em \/etc\/services, esse par\u00e2metro pode ser<br \/>\n# sobreposto pela op\u00e7\u00e3o -p do comando radiusd<\/p>\n<p>#listen {<br \/>\n# ipaddr = *<br \/>\n# endere\u00e7o ip ou FQDN, mesmos crit\u00e9rios<br \/>\n# usados em bind_address<br \/>\n# port = 0<br \/>\n# porta de escuta, mesmos crit\u00e9rios<br \/>\n# usados em port<\/p>\n<p>#\u00a0\u00a0Type of packets to listen for.<br \/>\n#\u00a0\u00a0Allowed values are:<br \/>\n#\u00a0\u00a0\u00a0\u00a0auth\u00a0\u00a0\u00a0\u00a0listen for authentication packets<br \/>\n#\u00a0\u00a0\u00a0\u00a0acct\u00a0\u00a0\u00a0\u00a0listen for accounting packets<br \/>\n#<br \/>\n# type = auth<br \/>\n# tipo de escuta:<br \/>\n# auth -&gt; autentica\u00e7\u00e3o<br \/>\n# acct -&gt; contabilidade<br \/>\n#}<br \/>\n# Se voc\u00ea quiser que o freeradius escute<br \/>\n# a porta de autentica\u00e7\u00e3o em um ip, e<br \/>\n# a porta de contabilidade em outro, ou<br \/>\n# em postas distantes no mesmo ip, o<br \/>\n# modelo acima de listagem ser\u00e1 \u00fatil<br \/>\n# Esse recurso apareceu a partir da vers\u00e3o<br \/>\n# 1.0 e resolve o problema se voc\u00ea<br \/>\n# tem equipamentos novos e antigos<br \/>\n# servidos pelo mesmo radius<\/span><\/p>\n<p>hostname_lookups = no<br \/>\n<span style=\"color: #004080;\"># define se o nome DNS dos clientes<br \/>\n# ser\u00e1 pesquisado a partir do ip. Se definir como yes,<br \/>\n# toda vez que uma requisi\u00e7\u00e3o chegar de<br \/>\n# um endere\u00e7o ip, o freeradius ir\u00e1 consultar<br \/>\n# o dns para usar o nome no log de atividades.<br \/>\n# o valor no \u00e9 a melhor op\u00e7\u00e3o, n\u00e3o sobrecarrega<br \/>\n# o servidor DNS<\/span><\/p>\n<p>allow_core_dumps = no<br \/>\n<span style=\"color: #004080;\"># ative essa op\u00e7\u00e3o para depurar erros no<br \/>\n# servidor, caso contrario deixe como est\u00e1<\/span><\/p>\n<p>regular_expressions = yes<br \/>\nextended_expressions = yes<br \/>\n<span style=\"color: #004080;\"># ativa ou desativa express\u00f5es regulares<br \/>\n# nos par\u00e2metros dos pacotes, desativar<br \/>\n# \u00e9 uma boa id\u00e9ia embora o padr\u00e3o seja<br \/>\n# yes<\/span><\/p>\n<p>log_stripped_names = no<br \/>\n<span style=\"color: #004080;\"># registra nos logs os dados completos do<br \/>\n# campo User-Name do pacote de autentica\u00e7\u00e3o,<br \/>\n# se definido como yes, do jeito que chegar,<br \/>\n# ser\u00e1 usado.<\/span><\/p>\n<p>log_auth = no<br \/>\n<span style=\"color: #004080;\"># deseja logar atividades de autentica\u00e7\u00e3o?<br \/>\n# se voc\u00ea tem milhares de clientes logando<br \/>\n# simultaneamente, significa<br \/>\n# que seu log vai crescer muito com essa<br \/>\n# op\u00e7\u00e3o ativa. Eu sempre coloco yes pois<br \/>\n# fica f\u00e1cil e r\u00e1pido descobrir por que<br \/>\n# certo cliente (leigo) n\u00e3o consegue autenticar<\/span><\/p>\n<p>log_auth_badpass = no<br \/>\n<span style=\"color: #004080;\"># Logar senhas quando a autentica\u00e7\u00e3o falhar?<br \/>\n# embora seja \u00fatil para dar suporte &#8211; usu\u00e1rio<br \/>\n# digitando senha incorretamente (branco, mai\u00fasculas, etc&#8230;),<br \/>\n# a privacidade do usu\u00e1rio fica reduzida e uma brecha de seguran\u00e7a,<br \/>\n# todas as senhas ser\u00e3o registradas no log<\/span><\/p>\n<p>log_auth_goodpass = no<br \/>\n<span style=\"color: #004080;\"># id\u00eantica a op\u00e7\u00e3o acima, por\u00e9m se<br \/>\n# aplica para autentica\u00e7\u00f5es bem sucedidas.<\/span><\/p>\n<p>usercollide = no<\/p>\n<p>lower_user = no<br \/>\nlower_pass = no<br \/>\n<span style=\"color: #004080;\"># essas duas op\u00e7\u00f5es s\u00e3o muito importantes:<br \/>\n# se o usu\u00e1rio deixar o CapsLock ligado,<br \/>\n# significa que n\u00e3o conseguir\u00e1 se autenticar<br \/>\n# e isso significa uma insatisfa\u00e7\u00e3o ou uma<br \/>\n# chamada desnecess\u00e1ria no suporte.<br \/>\n# Temos 3 op\u00e7\u00f5es: after, before e no<br \/>\n# suponhamos que eu informe meu login: PatrickBrandao<br \/>\n# &#8220;after&#8221; far\u00e1 com que a autentica\u00e7\u00e3o<br \/>\n# seja primeiro testada com o valor<br \/>\n# informado, se falhar, aplica um lowercase<br \/>\n# nos valores e tenta novamente. Sendo a primeira<br \/>\n# tentativa com &#8220;PatrickBrandao&#8221; e a segunda com &#8220;patrickbrandao&#8221;<br \/>\n# &#8220;before&#8221; far\u00e1 com que um lowercase seja<br \/>\n# aplicado antes de pesquisar a base de<br \/>\n# dados, que receber\u00e1 &#8220;patrickbrandao&#8221;<br \/>\n# &#8220;no&#8221; desativa esse efeito passando para<br \/>\n# a base de dados o mesmo valor recebido: &#8220;PatrickBrandao&#8221;<\/span><\/p>\n<p>nospace_user = no<br \/>\nnospace_pass = no<br \/>\n<span style=\"color: #004080;\"># as duas op\u00e7\u00f5es acima<br \/>\n# servem para retirar espa\u00e7os de nome<br \/>\n# de usu\u00e1rio e senha. Os seus clientes<br \/>\n# podem, sem perceber, colocar<br \/>\n# um espa\u00e7o no final ou no come\u00e7o<br \/>\n# das credenciais, o que gera uma<br \/>\n# chamada desnecess\u00e1ria no suporte t\u00e9cnico<br \/>\n# tr\u00eas valores poder\u00e3o ser escolhidos:<br \/>\n# after, before e no<\/span><\/p>\n<p>checkrad = ${sbindir}\/checkrad<br \/>\n<span style=\"color: #004080;\"># comando ao usar para checar conex\u00f5es simult\u00e2neas<\/p>\n<p># sess\u00e3o de seguran\u00e7a &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<\/span><br \/>\nsecurity {<br \/>\nmax_attributes = 200<br \/>\n<span style=\"color: #004080;\"># define o n\u00famero m\u00e1ximo de atributos<br \/>\n# num pacote enviado para o servidor.<br \/>\n# um n\u00famero muito baixo faria o servidor<br \/>\n# negar pacotes, n\u00famero muito alto deixar\u00e1<br \/>\n# o servidor vulner\u00e1vel. O atacante pode emitir<br \/>\n# um pedido com um n\u00famero exagerado<br \/>\n# de par\u00e2metros e esgotar os recursos de mem\u00f3ria<\/span><\/p>\n<p>reject_delay = 1<br \/>\n<span style=\"color: #004080;\"># define o tempo de espera antes de enviar<br \/>\n# uma resposta de acesso negado.<br \/>\n# essa op\u00e7\u00e3o proteje seu servidor<br \/>\n# contra ataques de for\u00e7a bruta<br \/>\n# Escolha de 0 a 5, 0 (zero) far\u00e1 com que<br \/>\n# a resposta seja enviada imediatamente<\/span><\/p>\n<p>status_server = no<br \/>\n<span style=\"color: #004080;\"># permite ou nega o envio de pacotes<br \/>\n# de status do usu\u00e1rio. N\u00e3o \u00e9 muito importante<br \/>\n# mas alguns NAS&#8217;s com keep-alive podem<br \/>\n# precisar desse recurso para checar o<br \/>\n# status de uma sess\u00e3o.<\/span><br \/>\n}<\/p>\n<p><span style=\"color: #004080;\"># sess\u00e3o de proxy &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/span><br \/>\nproxy_requests = yes<br \/>\n$INCLUDE ${confdir}\/proxy.conf<\/p>\n<p><span style=\"color: #004080;\"># configura\u00e7\u00e3o de clientes NAS &#8212;&#8212;&#8212;&#8212;&#8212;<\/span><\/p>\n<p>$INCLUDE ${confdir}\/clients.conf<br \/>\n<span style=\"color: #004080;\"># quando falo de clientes NAS n\u00e3o<br \/>\n# estou me referindo a seus clientes de<br \/>\n# conex\u00e3o discada, mas sim aos dispositivos<br \/>\n# em contato com eles que se encarregam de<br \/>\n# procurar o radius para validar o usu\u00e1rio,<br \/>\n# esses equipamentos podem ser RAS como<br \/>\n# cyclades, cisco, etc&#8230; ou mesmo servi\u00e7os<br \/>\n# em qualquer servidor que se baseia numa<br \/>\n# autentica\u00e7\u00e3o com radius<\/p>\n<p># sess\u00e3o de snmp &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<\/span><\/p>\n<p>snmp = no<br \/>\n$INCLUDE ${confdir}\/snmp.conf<br \/>\n<span style=\"color: #004080;\"># ativa o suporte a monitoramento por snmp<br \/>\n# no freeradius<\/p>\n<p># configura\u00e7\u00e3o de processos filhos &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/span><br \/>\nthread pool {<br \/>\nstart_servers = 5<br \/>\n<span style=\"color: #004080;\"># n\u00famero de processos filhos a serem criados quando<br \/>\n# o servi\u00e7o for iniciado<\/span><\/p>\n<p>max_servers = 32<br \/>\n<span style=\"color: #004080;\"># n\u00famero m\u00e1ximo de processos filhos<br \/>\n# atendendo solicita\u00e7\u00f5es<\/span><\/p>\n<p>min_spare_servers = 3<br \/>\nmax_spare_servers = 10<br \/>\n<span style=\"color: #004080;\"># regula o n\u00famero de processos para manter<br \/>\n# um bom desempenho<\/span><\/p>\n<p>max_requests_per_server = 0<br \/>\n<span style=\"color: #004080;\"># n\u00famero m\u00e1ximo de solicita\u00e7\u00f5es feitas<br \/>\n# a um processo filho antes de ser destru\u00eddo<br \/>\n# 0 (zero) para infinito, mas n\u00e3o recomend\u00e1vel<br \/>\n# pois um processo filho pode consumir recursos<br \/>\n# que nunca ir\u00e1 liberar, 250 \u00e9 um bom valor.<\/span><br \/>\n}<\/p>\n<p><span style=\"color: #004080;\"># sess\u00e3o de defini\u00e7\u00e3o de m\u00f3dulos &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/span><br \/>\nmodules {<br \/>\n<span style=\"color: #004080;\"># formato:<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0name [ instance ] {<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0config_item = value<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8230;<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0}<\/span><br \/>\n<span style=\"color: #004080;\"># name -&gt; se refere ao nome do<\/span><br \/>\n<span style=\"color: #004080;\"># modulo rlm_?????, muitos m\u00f3dulos<\/span><br \/>\n<span style=\"color: #004080;\"># s\u00e3o fornecidos com o freeradius, esse<\/span><br \/>\n<span style=\"color: #004080;\"># recurso permite que voc\u00ea crie seus pr\u00f3prios<\/span><br \/>\n<span style=\"color: #004080;\"># m\u00f3dulos.<\/span><\/p>\n<p>pap {<br \/>\nencryption_scheme = crypt<br \/>\n}<br \/>\n<span style=\"color: #004080;\"># define o tipo de<\/span><br \/>\n<span style=\"color: #004080;\"># criptografia usada na autentica\u00e7\u00e3o PAP<\/span><br \/>\n<span style=\"color: #004080;\"># valores dispon\u00edveis:<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0clear: sem criptografia, texto plano<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0crypt: criptografia do unix<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0md5: criptografia MD5<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0sha1: criptografia SHA1<\/span><br \/>\n<span style=\"color: #004080;\"># padr\u00e3o: crypt<\/span><\/p>\n<p>chap {<br \/>\nauthtype = CHAP<br \/>\n}<br \/>\n<span style=\"color: #004080;\"># adiciona suporte a autentica\u00e7\u00f5es<\/span><br \/>\n<span style=\"color: #004080;\"># usando CHAP<\/span><\/p>\n<p>pam {<br \/>\npam_auth = radiusd<br \/>\n}<br \/>\n<span style=\"color: #004080;\"># suporte PAM dos sistemas unix, configura<\/span><br \/>\n<span style=\"color: #004080;\"># o pamd em \/etc\/pam.d\/ para usar esse tipo<\/span><br \/>\n<span style=\"color: #004080;\"># de autentica\u00e7\u00e3o<\/span><\/p>\n<p><span style=\"color: #004080;\"># autentica\u00e7\u00e3o baseada nas credenciais do sistema<\/span><br \/>\n<span style=\"color: #004080;\"># \/etc\/passwd e \/etc\/shadow<\/span><br \/>\nunix {<br \/>\ncache = no<br \/>\n<span style=\"color: #004080;\"># criar caches de dados de login?<\/span><br \/>\n<span style=\"color: #004080;\"># habilitar essa op\u00e7\u00e3o pode melhorar<\/span><br \/>\n<span style=\"color: #004080;\"># o desempenho se voc\u00ea tem muitos<\/span><br \/>\n<span style=\"color: #004080;\"># usu\u00e1rios de sistema<\/span><\/p>\n<p>cache_reload = 600<br \/>\n<span style=\"color: #004080;\"># tempo em segundos para recarregar<\/span><br \/>\n<span style=\"color: #004080;\"># o cache de logins do sistema<\/span><\/p>\n<p><span style=\"color: #004080;\"># define a localiza\u00e7\u00e3o dos seus<\/span><br \/>\n<span style=\"color: #004080;\"># arquivos de autentica\u00e7\u00e3o de sistema<\/span><br \/>\n<span style=\"color: #004080;\"># encontra-se comentado, usando o<\/span><br \/>\n<span style=\"color: #004080;\"># valor padr\u00e3o<\/span><br \/>\n<span style=\"color: #004080;\">#<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0passwd = \/etc\/passwd<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0shadow = \/etc\/shadow<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0group = \/etc\/group<\/span><\/p>\n<p>radwtmp = ${logdir}\/radwtmp<br \/>\n}<\/p>\n<p><span style=\"color: #004080;\">#\u00a0\u00a0Extensible Authentication Protocol<\/span><br \/>\n$INCLUDE ${confdir}\/eap.conf<\/p>\n<p><span style=\"color: #004080;\"># Micro$oft CHAP authentication<\/span><br \/>\n<span style=\"color: #004080;\"># esses m\u00f3dulos suportam MS-CHAP e MS-CHAPv2<\/span><br \/>\nmschap {<br \/>\nauthtype = MS-CHAP<br \/>\n<span style=\"color: #004080;\"># protocolo M$ usado<\/span><br \/>\n<span style=\"color: #004080;\">#use_mppe = no<\/span><br \/>\n<span style=\"color: #004080;\">#require_encryption = yes<\/span><br \/>\n<span style=\"color: #004080;\">#require_strong = yes<\/span><br \/>\n<span style=\"color: #004080;\">#with_ntdomain_hack = no<\/span><br \/>\n<span style=\"color: #004080;\">#ntlm_auth = &#8220;\/path\/to\/ntlm_auth &#8211;request-nt-key &#8211;username=%{Stripped-User-Name:-%{User-Name:-None}} &#8211;challenge=%{mschap:Challenge:-00} &#8211;nt-response=%{mschap:NT-Response:-00}&#8221;<\/span><br \/>\n}<\/p>\n<p><span style=\"color: #004080;\"># Lightweight Directory Access Protocol (LDAP)<\/span><br \/>\n<span style=\"color: #004080;\"># permite usa autentica\u00e7\u00e3o LDAP (Auth-Type := LDAP)<\/span><br \/>\nldap {<br \/>\nserver = &#8220;ldap.your.domain&#8221;<br \/>\n<span style=\"color: #004080;\"># identity = &#8220;cn=admin,o=My Org,c=UA&#8221;<\/span><br \/>\n<span style=\"color: #004080;\"># password = senhadnaqui<\/span><br \/>\nbasedn = &#8220;o=My Org,c=UA&#8221;<br \/>\nfilter = &#8220;(uid=%{Stripped-User-Name:-%{User-Name}})&#8221;<br \/>\n<span style=\"color: #004080;\"># base_filter = &#8220;(objectclass=radiusprofile)&#8221;<\/span><\/p>\n<p>start_tls = no<br \/>\n<span style=\"color: #004080;\"># coloque yes se deseja usar tls para criptografar<\/span><br \/>\n<span style=\"color: #004080;\"># os dados nas conex\u00f5es com o LDAP e<\/span><br \/>\n<span style=\"color: #004080;\"># configure e descomente os valores abaixo<\/span><br \/>\n<span style=\"color: #004080;\"># tls_cacertfile\u00a0\u00a0\u00a0\u00a0= \/path\/to\/cacert.pem<\/span><br \/>\n<span style=\"color: #004080;\"># tls_cacertdir\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0= \/path\/to\/ca\/dir\/<\/span><br \/>\n<span style=\"color: #004080;\"># tls_certfile\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0= \/path\/to\/radius.crt<\/span><br \/>\n<span style=\"color: #004080;\"># tls_keyfile\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0= \/path\/to\/radius.key<\/span><br \/>\n<span style=\"color: #004080;\"># tls_randfile\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0= \/path\/to\/rnd<\/span><br \/>\n<span style=\"color: #004080;\"># tls_require_cert\u00a0\u00a0\u00a0\u00a0= &#8220;demand&#8221;<\/span><\/p>\n<p><span style=\"color: #004080;\"># default_profile = &#8220;cn=radprofile,ou=dialup,o=My Org,c=UA&#8221;<\/span><br \/>\n<span style=\"color: #004080;\"># profile_attribute = &#8220;radiusProfileDn&#8221;<\/span><br \/>\naccess_attr = &#8220;dialupAccess&#8221;<\/p>\n<p>dictionary_mapping = ${raddbdir}\/ldap.attrmap<br \/>\n<span style=\"color: #004080;\"># define o arquivo de mapas de atributos<\/span><br \/>\n<span style=\"color: #004080;\"># do seu diretorio<\/span><br \/>\nldap_connections_number = 5<\/p>\n<p><span style=\"color: #004080;\"># password_header = &#8220;{clear}&#8221;<\/span><br \/>\n<span style=\"color: #004080;\"># password_attribute = userPassword<\/span><br \/>\n<span style=\"color: #004080;\"># groupname_attribute = cn<\/span><br \/>\n<span style=\"color: #004080;\"># groupmembership_filter = &#8220;(|(&amp;(objectClass=GroupOfNames) (member=%{Ldap-UserDn})) (&amp;(objectClass=GroupOfUniqueNames) (uniquemember=%{Ldap-UserDn})))&#8221;<\/span><br \/>\n<span style=\"color: #004080;\"># groupmembership_attribute = radiusGroupName<\/span><br \/>\ntimeout = 4<br \/>\ntimelimit = 3<br \/>\nnet_timeout = 1<br \/>\n<span style=\"color: #004080;\"># compare_check_items = yes<\/span><br \/>\n<span style=\"color: #004080;\"># do_xlat = yes<\/span><br \/>\n<span style=\"color: #004080;\"># access_attr_used_for_allow = yes<\/span><br \/>\n}<\/p>\n<p><span style=\"color: #004080;\"># &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<\/span><\/p>\n<p><span style=\"color: #004080;\"># modulo Realm, para proxy<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0&#8216;realm\/username&#8217;<\/span><br \/>\nrealm IPASS {<br \/>\nformat = prefix<br \/>\ndelimiter = &#8220;\/&#8221;<br \/>\nignore_default = no<br \/>\nignore_null = no<br \/>\n}<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0&#8216;username@realm&#8217;<\/span><br \/>\nrealm suffix {<br \/>\nformat = suffix<br \/>\ndelimiter = &#8220;@&#8221;<br \/>\nignore_default = no<br \/>\nignore_null = no<br \/>\n}<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0&#8216;username%realm&#8217;<\/span><br \/>\nrealm realmpercent {<br \/>\nformat = suffix<br \/>\ndelimiter = &#8220;%&#8221;<br \/>\nignore_default = no<br \/>\nignore_null = no<br \/>\n}<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0&#8216;domain\\user&#8217;<\/span><br \/>\nrealm ntdomain {<br \/>\nformat = prefix<br \/>\ndelimiter = &#8220;\\\\&#8221;<br \/>\nignore_default = no<br \/>\nignore_null = no<br \/>\n}<\/p>\n<p>checkval {<br \/>\nitem-name = Calling-Station-Id<br \/>\ncheck-name = Calling-Station-Id<br \/>\ndata-type = string<br \/>\n<span style=\"color: #004080;\">#notfound-reject = no<\/span><br \/>\n}<\/p>\n<p><span style=\"color: #004080;\"># reescrita de pacotes. Usado para autoriza\u00e7\u00e3o e contabilidade<\/span><br \/>\n<span style=\"color: #004080;\">#attr_rewrite sanecallerid {<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0attribute = Called-Station-Id<\/span><br \/>\n<span style=\"color: #004080;\"># may be &#8220;packet&#8221;, &#8220;reply&#8221;, &#8220;proxy&#8221;, &#8220;proxy_reply&#8221; or &#8220;config&#8221;<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0searchin = packet<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0searchfor = &#8220;[+ ]&#8221;<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0replacewith = &#8220;&#8221;<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0ignore_case = no<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0new_attribute = no<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0max_matches = 10<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0## If set to yes then the replace string will be appended to the original string<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0append = no<\/span><br \/>\n<span style=\"color: #004080;\">#}<\/span><\/p>\n<p>preprocess {<br \/>\nhuntgroups = ${confdir}\/huntgroups<br \/>\nhints = ${confdir}\/hints<br \/>\nwith_ascend_hack = no<br \/>\nascend_channels_per_line = 23<br \/>\nwith_ntdomain_hack = no<br \/>\nwith_specialix_jetstream_hack = no<br \/>\nwith_cisco_vsa_hack = no<br \/>\n}<\/p>\n<p>files {<br \/>\nusersfile = ${confdir}\/users<br \/>\nacctusersfile = ${confdir}\/acct_users<\/p>\n<p>compat = no<br \/>\n}<\/p>\n<p>detail {<br \/>\ndetailfile = ${radacctdir}\/%{Client-IP-Address}\/detail-%Y%m%d<br \/>\ndetailperm = 0600<br \/>\n}<br \/>\n<span style=\"color: #004080;\"># detail auth_log {<\/span><br \/>\n<span style=\"color: #004080;\"># detailfile = ${radacctdir}\/%{Client-IP-Address}\/auth-detail-%Y%m%d<\/span><br \/>\n<span style=\"color: #004080;\"># detailperm = 0600<\/span><br \/>\n<span style=\"color: #004080;\"># }<\/span><br \/>\n<span style=\"color: #004080;\"># detail reply_log {<\/span><br \/>\n<span style=\"color: #004080;\"># detailfile = ${radacctdir}\/%{Client-IP-Address}\/reply-detail-%Y%m%d<\/span><br \/>\n<span style=\"color: #004080;\"># detailperm = 0600<\/span><br \/>\n<span style=\"color: #004080;\"># }<\/span><br \/>\n<span style=\"color: #004080;\"># detail pre_proxy_log {<\/span><br \/>\n<span style=\"color: #004080;\"># detailfile = ${radacctdir}\/%{Client-IP-Address}\/pre-proxy-detail-%Y%m%d<\/span><br \/>\n<span style=\"color: #004080;\"># detailperm = 0600<\/span><br \/>\n<span style=\"color: #004080;\"># }<\/span><br \/>\n<span style=\"color: #004080;\"># detail post_proxy_log {<\/span><br \/>\n<span style=\"color: #004080;\"># detailfile = ${radacctdir}\/%{Client-IP-Address}\/post-proxy-detail-%Y%m%d<\/span><br \/>\n<span style=\"color: #004080;\"># detailperm = 0600<\/span><br \/>\n<span style=\"color: #004080;\"># }<\/span><br \/>\nacct_unique {<br \/>\nkey = &#8220;User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port&#8221;<br \/>\n}<\/p>\n<p><span style=\"color: #004080;\">#\u00a0\u00a0Para Postgresql, use:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0${confdir}\/postgresql.conf<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0Para MS-SQL, use:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ${confdir}\/mssql.conf<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0For Oracle, use:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ${confdir}\/oraclesql.conf<\/span><br \/>\n<span style=\"color: #004080;\">#<\/span><br \/>\n$INCLUDE\u00a0\u00a0${confdir}\/sql.conf<br \/>\n<span style=\"color: #004080;\"># inclus\u00e3o de arquivo de configura\u00e7\u00e3o contendo<\/span><br \/>\n<span style=\"color: #004080;\"># m\u00f3dulos de autentica\u00e7\u00e3o, sess\u00e3o e contabilidade<\/span><br \/>\n<span style=\"color: #004080;\"># controlados em banco de dados SQL<\/span><\/p>\n<p><span style=\"color: #004080;\"># m\u00f3dulos respons\u00e1veis por controlar usu\u00e1rios conectados<\/span><br \/>\n<span style=\"color: #004080;\"># para evitar conex\u00e3o simult\u00e2nea quanto esta \u00e9<\/span><br \/>\n<span style=\"color: #004080;\"># usada<\/span><br \/>\nradutmp {<br \/>\nfilename = ${logdir}\/radutmp<br \/>\nusername = %{User-Name}<br \/>\ncase_sensitive = yes<br \/>\ncheck_with_nas = yes<br \/>\nperm = 0600<br \/>\ncallerid = &#8220;yes&#8221;<br \/>\n}<br \/>\nradutmp sradutmp {<br \/>\nfilename = ${logdir}\/sradutmp<br \/>\nperm = 0644<br \/>\ncallerid = &#8220;no&#8221;<br \/>\n}<br \/>\nattr_filter {<br \/>\nattrsfile = ${confdir}\/attrs<br \/>\n}<br \/>\ncounter daily {<br \/>\nfilename = ${raddbdir}\/db.daily<br \/>\nkey = User-Name<br \/>\ncount-attribute = Acct-Session-Time<br \/>\nreset = daily<br \/>\ncounter-name = Daily-Session-Time<br \/>\ncheck-name = Max-Daily-Session<br \/>\nallowed-servicetype = Framed-User<br \/>\ncache-size = 5000<br \/>\n}<br \/>\nalways fail {<br \/>\nrcode = fail<br \/>\n}<br \/>\nalways reject {<br \/>\nrcode = reject<br \/>\n}<br \/>\nalways ok {<br \/>\nrcode = ok<br \/>\nsimulcount = 0<br \/>\nmpp = no<br \/>\n}<br \/>\nexpr {<br \/>\n}<br \/>\ndigest {<br \/>\n}<br \/>\nexec {<br \/>\nwait = yes<br \/>\ninput_pairs = request<br \/>\n}<br \/>\nexec echo {<br \/>\nwait = yes<br \/>\nprogram = &#8220;\/bin\/echo %{User-Name}&#8221;<br \/>\ninput_pairs = request<br \/>\noutput_pairs = reply<br \/>\n<span style=\"color: #004080;\">#packet_type = Access-Accept<\/span><br \/>\n}<\/p>\n<p>ippool main_pool {<br \/>\nrange-start = 192.168.1.1<br \/>\nrange-stop = 192.168.3.254<br \/>\nnetmask = 255.255.255.0<br \/>\ncache-size = 800<br \/>\nsession-db = ${raddbdir}\/db.ippool<br \/>\nip-index = ${raddbdir}\/db.ipindex<br \/>\noverride = no<br \/>\nmaximum-timeout = 0<br \/>\n}<\/p>\n<p>}<\/p>\n<p><span style=\"color: #004080;\"># controle de acesso, sess\u00e3o e contabilidade &#8212;&#8212;&#8212;&#8211;<\/span><\/p>\n<p><span style=\"color: #004080;\"># sess\u00e3o instantiate &#8211; inicia m\u00f3dulos, se n\u00e3o for usar, n\u00e3o inicie.<\/span><br \/>\ninstantiate {<br \/>\nexec<br \/>\nexpr<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0daily<\/span><br \/>\n}<\/p>\n<p><span style=\"color: #004080;\"># sess\u00e3o authorization &#8211; controla os m\u00f3dulos<\/span><br \/>\n<span style=\"color: #004080;\"># respons\u00e1veis por autorizar o acesso das<\/span><br \/>\n<span style=\"color: #004080;\"># requisi\u00e7\u00f5es<\/span><\/p>\n<p>authorize {<br \/>\npreprocess<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0auth_log<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0attr_filter<\/span><br \/>\nchap<br \/>\nmschap<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0digest<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0IPASS<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0suffix<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0ntdomain<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0eap<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0files<\/span><br \/>\nsql<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0etc_smbpasswd<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0ldap<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0daily<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0checkval<\/span><br \/>\n}<\/p>\n<p><span style=\"color: #004080;\"># Sess\u00e3o authentication<\/span><br \/>\n<span style=\"color: #004080;\"># respons\u00e1vel por conferir o tipo de autentica\u00e7\u00e3o usado<\/span><br \/>\nauthenticate {<br \/>\nAuth-Type PAP {<br \/>\npap<br \/>\n}<br \/>\nAuth-Type CHAP {<br \/>\nchap<br \/>\n}<br \/>\nAuth-Type MS-CHAP {<br \/>\nmschap<br \/>\n}<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0digest<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0pam<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0unix<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0Auth-Type LDAP {<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ldap<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0}<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0eap<\/span><br \/>\n}<\/p>\n<p><span style=\"color: #004080;\">#\u00a0\u00a0Sess\u00e3o Pre-accounting.\u00a0\u00a0Decide qual tipo de contabilidade usar<\/span><br \/>\npreacct {<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0preprocess<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0acct_unique<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0home server as authentication requests.<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0IPASS<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0suffix<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0ntdomain<\/span><\/p>\n<p><span style=\"color: #004080;\">#<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0Read the &#8216;acct_users&#8217; file<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0files<\/span><br \/>\n}<\/p>\n<p><span style=\"color: #004080;\"># Sessao Accounting.\u00a0\u00a0Registra dados de contabilidade<\/span><br \/>\naccounting {<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0detail<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0daily<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0unix<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0radutmp<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0sradutmp<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0main_pool<\/span><br \/>\nsql<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0pgsql-voip<\/span><br \/>\n}<\/p>\n<p><span style=\"color: #004080;\"># Controle de sess\u00e3o <\/span><br \/>\n<span style=\"color: #004080;\"># quando se faz o controle de sess\u00e3o para<\/span><br \/>\n<span style=\"color: #004080;\"># evitar conex\u00f5es simult\u00e2neas (impede o <\/span><br \/>\n<span style=\"color: #004080;\"># nome de usu\u00e1rio de se conectar varias vezes de<\/span><br \/>\n<span style=\"color: #004080;\"># locais diferentes ao mesmo tempo com o mesmo login)<\/span><br \/>\nsession {<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0radutmp<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0sql<\/span><br \/>\n}<\/p>\n<p>post-auth {<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0main_pool<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0reply_log<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0sql<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0Post-Auth-Type REJECT {<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0insert-module-name-here<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0}<\/span><br \/>\n}<\/p>\n<p>pre-proxy {<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0attr_rewrite<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0pre_proxy_log<\/span><br \/>\n}<\/p>\n<p>post-proxy {<br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0post_proxy_log<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0attr_rewrite<\/span><br \/>\n<span style=\"color: #004080;\">#\u00a0\u00a0\u00a0\u00a0attr_filter<\/span><br \/>\neap<br \/>\n}<br \/>\n<span style=\"color: #004080;\"># fim radiusd.conf<\/span><\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\n<h1>2 &#8211; clients.conf<\/h1>\n<p>Respons\u00e1vel pela lista de clientes NAS que desfrutam do servi\u00e7o radius.<\/td>\n<\/tr>\n<tr>\n<td><span style=\"color: #004080;\"># inicio clients.conf<\/span><\/p>\n<p>client 127.0.0.1 {<br \/>\nsecret = raioceleste<br \/>\n<span style=\"color: #004080;\"># segredo do servidor. Somente<\/span><br \/>\n<span style=\"color: #004080;\"># os NAS&#8217;s que conhecem esse<\/span><br \/>\n<span style=\"color: #004080;\"># segredo poder\u00e3o fazer pedidos<\/span><br \/>\n<span style=\"color: #004080;\"># de autentica\u00e7\u00e3o. OBRIGAT\u00d3RIO<\/span><\/p>\n<p>shortname = localhost<br \/>\n<span style=\"color: #004080;\"># nome do cliente. Normalmente<\/span><br \/>\n<span style=\"color: #004080;\"># voc\u00ea pode colocar uma parte do FQDN<\/span><br \/>\n<span style=\"color: #004080;\"># esse nome \u00e9 usado no arquivo de log<\/span><br \/>\n<span style=\"color: #004080;\"># e referencias de contabilidade<\/span><br \/>\n<span style=\"color: #004080;\"># OBRIGAT\u00d3RIO<\/span><\/p>\n<p>nastype = other<br \/>\n<span style=\"color: #004080;\"># define o tipo de NAS \u00f3 cliente.<\/span><br \/>\n<span style=\"color: #004080;\"># Muito importante pois um<\/span><br \/>\n<span style=\"color: #004080;\"># NAS especifico pode ter campos<\/span><br \/>\n<span style=\"color: #004080;\"># definidos nos arquivos de dicion\u00e1rios<\/span><br \/>\n<span style=\"color: #004080;\"># de par\u00e2metros. OPCIONAL. Padr\u00e3o: other<\/span><br \/>\n}<\/p>\n<p><span style=\"color: #004080;\"># o exemplo acima trata um cliente<\/span><br \/>\n<span style=\"color: #004080;\"># em especifico, mas voc\u00ea pode<\/span><br \/>\n<span style=\"color: #004080;\"># abrir uma rede inteira no freeradius<\/span><\/p>\n<p>client 192.168.10.0\/24 {<br \/>\nsecret = raioceleste10<br \/>\nshortname = intranet-10<br \/>\n}<\/p>\n<p><span style=\"color: #004080;\"># Importante: se seu NAS n\u00e3o estiver cadastrado<\/span><br \/>\n<span style=\"color: #004080;\"># aqui, possivelmente voc\u00ea vai ver no arquivo<\/span><br \/>\n<span style=\"color: #004080;\"># de log:<\/span><br \/>\n<span style=\"color: #004080;\"># Thu Aug 12 17:06:16 2004 : Error: Ignoring request from unknown client 192.168.10.24:41747<\/span><br \/>\n<span style=\"color: #004080;\"># <\/span><br \/>\n<span style=\"color: #004080;\"># sempre que adicionar um novo cliente, voc\u00ea ter\u00e1 que reiniciar o freeradius<\/span><br \/>\n<span style=\"color: #004080;\"># fim clients.conf<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><strong>Autenticando na base de dados MySQL e evitando conex\u00f5es simult\u00e2neas<\/strong><\/p>\n<table border=\"0\">\n<tbody>\n<tr>\n<td align=\"justify\">Usar <em>freeradius<\/em> e base de dados MySQL \u00e9 uma das melhores op\u00e7\u00f5es dispon\u00edveis. A flexibilidade e suporte do MySQL garante muita seguran\u00e7a aos seus dados e muita rapidez.<\/p>\n<p>Certifique-se de que no arquivo <em>radiusd.conf<\/em>, a seguinte linha est\u00e1 declarada:<\/td>\n<\/tr>\n<tr>\n<td>$INCLUDE ${confdir}\/sql.conf<\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nPrimeiro passo e editar o arquivo \/usr\/local\/etc\/raddb\/sql.conf e alterar as seguintes linhas:<\/td>\n<\/tr>\n<tr>\n<td>sql {<br \/>\ndriver = &#8220;rlm_sql_mysql&#8221;<br \/>\n<span style=\"color: #004080;\"># informa ao freeradius qual modulo de banco<\/span><br \/>\n<span style=\"color: #004080;\"># de dados usar, neste caso, mysql<\/span><\/p>\n<p>server = &#8220;localhost&#8221;<br \/>\n<span style=\"color: #004080;\"># diz ao freeradius em qual<\/span><br \/>\n<span style=\"color: #004080;\"># host est\u00e1 o servidor mysql<\/span><\/p>\n<p>login = &#8220;root&#8221;<br \/>\n<span style=\"color: #004080;\"># define o nome de usu\u00e1rio registrado no mysql<\/span><\/p>\n<p>password = &#8220;senhadologinaqui&#8221;<br \/>\n<span style=\"color: #004080;\"># senha do usu\u00e1rio definido no par\u00e2metro &#8220;login&#8221;<\/span><\/p>\n<p>radius_db = &#8220;radius&#8221;<br \/>\n<span style=\"color: #004080;\"># nome do banco de dados que contem<\/span><br \/>\n<span style=\"color: #004080;\"># as tabelas<\/span><\/p>\n<p><span style=\"color: #004080;\"># abaixo deste texto (arquivo truncado aqui) se encontram defini\u00e7\u00f5es de SQL para<\/span><br \/>\n<span style=\"color: #004080;\"># pesquisa de dados, n\u00e3o altere, ao menos<\/span><br \/>\n<span style=\"color: #004080;\"># que tenha um prop\u00f3sito<\/span><br \/>\n<span style=\"color: #004080;\"># &#8230;&#8230;<\/span><br \/>\n<span style=\"color: #004080;\"># &#8230;.<\/span><br \/>\n}<\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nSegundo, criar o banco de dados e as tabelas. Os criadores do freeradius j\u00e1 deixaram a DDL pronta para voc\u00ea, basta ir at\u00e9 a pasta onde est\u00e3o os fontes, na subpasta:<\/p>\n<p>src\/modules\/rlm_sql\/drivers\/rlm_sql_mysql<\/p>\n<p>Se voc\u00ea descompactou em \/usr\/local\/src, o caminho completo \u00e9:<\/p>\n<p>\/usr\/local\/src\/freeradius-1.0.1\/src<br \/>\n\/modules\/rlm_sql\/drivers\/rlm_sql_mysql<\/p>\n<p>Dentro desta pasta existe um arquivo chamado db_mysql.sql contendo todos os comandos para criar as tabelas. Crie o banco de dados com o comando:<\/p>\n<p><strong># mysqladmin -psenharoot create radius<\/strong><\/p>\n<p>E crie as tabelas com o comando:<\/p>\n<p><strong># mysql -psenharoot radius &lt; db_mysql.sql<\/strong><\/p>\n<p>Agora edite o <em>radiusd.conf<\/em>, vamos configur\u00e1-lo para autenticar os dados no MySQL. Procure no final do arquivo pela sess\u00e3o &#8220;authorize&#8221; e adicione &#8220;sql&#8221;, ficando assim:<\/td>\n<\/tr>\n<tr>\n<td>authorise {<br \/>\nsql<br \/>\n}<\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nIsso far\u00e1 com que os usu\u00e1rios sejam procurados na tabela <em>radcheck<\/em>, banco de dados <em>radius<\/em> no MySQL.<\/p>\n<p>Pr\u00f3ximo passo \u00e9 registrar a contabilidade dos acessos, muito \u00fatil para provedores que tem planos limitados de horas. V\u00e1 at\u00e9 a sess\u00e3o &#8220;accounting&#8221; e adicione &#8220;sql&#8221;, ficando assim:<\/td>\n<\/tr>\n<tr>\n<td>accounting {<br \/>\nsql<br \/>\n}<\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nIsso far\u00e1 com que os dados das conex\u00f5es sejam armazenadas na tabela <em>radacct<\/em>.<\/p>\n<p>Um recurso interessante \u00e9 o controle de conex\u00e3o simult\u00e2nea. Isso impede que um usu\u00e1rio passe suas credencias (login\/senha) para amigos e todos usem ao mesmo tempo, dando &#8220;preju&#8221;. Na sess\u00e3o &#8220;session&#8221; adicione &#8220;sql&#8221;, ficando assim:<\/td>\n<\/tr>\n<tr>\n<td>session {<br \/>\nsql<br \/>\n}<\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nAinda n\u00e3o est\u00e1 pronto o controle de sess\u00e3o, voc\u00ea ter\u00e1 que editar o sql.conf e descomentar as linhas que definem as vari\u00e1veis:<\/td>\n<\/tr>\n<tr>\n<td>simul_count_query<br \/>\nsimul_verify_query<\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nVamos criar um usu\u00e1rio chamado &#8220;joao&#8221;, que ter\u00e1 direito a apenas uma conex\u00e3o. Conecte-se ao MySQL no banco radius:<\/p>\n<p><strong># mysql -psenharoot radius<\/strong><\/p>\n<p>Criar usu\u00e1rio:<\/p>\n<p>mysql&gt; <strong>INSERT INTO radcheck (username, attribute, op, value)<\/strong><br \/>\nmysql&gt; <strong>VALUES (&#8216;joao&#8217;, &#8216;Password&#8217;, &#8216;==&#8217;, &#8216;senhasecreta&#8217;);<\/strong><\/p>\n<p>Criar grupo com direito a uma conex\u00e3o chamado &#8216;sessaounica&#8217;:<\/p>\n<p>mysql&gt; <strong>INSERT INTO radgroupcheck (groupname, attribute,<\/strong><br \/>\nmysql&gt; <strong>op, value) VALUES (&#8216;sessaounica&#8217;, &#8216;Simultaneous-Use&#8217;,<\/strong><br \/>\nmysql&gt; <strong>&#8216;:=&#8217;, 1);<\/strong><\/p>\n<p>Inserir joao nesse grupo:<\/p>\n<p>mysql&gt; <strong>INSERT INTO usergroup (username, groupname) VALUES (&#8216;joao&#8217;, &#8216;sessaounica&#8217;);<\/strong><\/p>\n<p>Pronto. Jo\u00e3o agora n\u00e3o pode passar seu login pra ningu\u00e9m, sen\u00e3o ficar\u00e1 sem acesso! Para conex\u00f5es ISDN 128k, crie um grupo de dupla permiss\u00e3o, pois sen\u00e3o o segundo canal n\u00e3o conseguir\u00e1 conectar-se. Veja como aparece no log, uma tentativa de conex\u00e3o simult\u00e2nea ap\u00f3s o usu\u00e1rio j\u00e1 estar conectado de outro lugar:<\/p>\n<p>Auth: Login OK: [joao\/senhasecreta] (from client pr4k port 326 cli 31555xxxx)<br \/>\nAuth: Multiple logins (max 1) : [joao\/senhasecreta] (from client pr4k port 315 cli 31552xxxx)<\/p>\n<p>Acontece, de vez em quando, do usu\u00e1rio ficar &#8220;agarrado&#8221; no radius. Ele \u00e9 desconectado do RAS ou NAS, por\u00e9m o radius n\u00e3o da baixa na sess\u00e3o, os motivos podem ser, principalmente, perda do pacote no caminho at\u00e9 o radius, problema muito comum para provedores que lidam com ADSL de outras operadoras. A pr\u00f3xima vez que o usu\u00e1rio tenta logar, o acesso \u00e9 negado &#8211; o servidor radius pensa que \u00e9 sess\u00e3o simult\u00e2nea. Para resolver esse problema, sempre que um usu\u00e1rio (joao por exemplo) ficar &#8220;agarrado&#8221;, voc\u00ea libera ele com a SQL:<\/p>\n<p>mysql&gt; <strong>DELETE FROM radacct WHERE username = &#8216;joao&#8217; AND acctsessiontime = 0 ORDER BY radacctid DESC LIMIT 1;<\/strong><\/p>\n<p>A desvantagem \u00e9 que Jo\u00e3o ter\u00e1 que solicitar suporte t\u00e9cnico para ter o problema resolvido!<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><strong>Checagem e retorno de atributos em banco de dados<\/strong><\/p>\n<table border=\"0\">\n<tbody>\n<tr>\n<td align=\"justify\">NOTA: As SQL&#8217;s exibidas neste cap\u00edtulo foram digitadas no prompt do MySQL de um servidor de testes para voc\u00ea ter uma no\u00e7\u00e3o dos conceitos na pr\u00e1tica.<\/p>\n<p>Quando voc\u00ea cria o banco de dados MySQL do radius a partir da DDL fornecida nos fontes do m\u00f3dulo, as seguintes tabelas s\u00e3o criadas:<\/p>\n<ul>\n<li><em>radacct<\/em> &#8211; cont\u00e9m informa\u00e7\u00f5es de contabilidade dos usu\u00e1rios, descrita no cap\u00edtulo &#8220;Extrato de horas&#8221;;<\/li>\n<li><em>radcheck<\/em> &#8211; cont\u00e9m a lista de atributos que ser\u00e3o usados para autenticar um usu\u00e1rio espec\u00edfico. O atributo mais necess\u00e1rio para que o usu\u00e1rio tenha acesso seguro \u00e9 &#8220;Password&#8221;, exemplo:\n<p>mysql&gt; <strong>SELECT UserName, Attribute, op, Value FROM radcheck WHERE UserName = &#8216;joao&#8217;;<\/strong><\/p>\n<pre>UserName         |    Attribute         |   op   | Value\r\n-----------------------------------------------------------\r\njoao             |    Password          |  ==   | senhasecreta\r\njoao             |    NASIPAddress      |  ==   | 192.168.0.1\r\n-----------------------------------------------------------<\/pre>\n<p>Quando Jo\u00e3o tentar se autenticar, ser\u00e1 checado os dois par\u00e2metros, Password e NASIPAddress, s\u00f3 ser\u00e1 retornado um Access-Accept se a senha estiver certa e a pergunta vier do NAS 192.168.0.1. Muitos par\u00e2metros podem ser adicionados para limitar a fonte de acesso, at\u00e9 mesmo restringir um usu\u00e1rio dial-up a um \u00fanico n\u00famero de telefone (par\u00e2metro CallingStationID)!<\/li>\n<li><em>radreply<\/em> &#8211; cont\u00e9m uma lista de atributos devolvidos ao usu\u00e1rio. Estes atributos s\u00f3 ser\u00e3o enviados numa resposta diferente de Access-Reject, par\u00e2metros de resposta influenciam na conex\u00e3o do usu\u00e1rio, voc\u00ea poder\u00e1 interagir com o NAS (ou RAS), desde que ele tenha flexibilidade para os valores retornados (adquira o manual do seu RAS, \u00e9 muito interessante saber o que pode ser feito nele pelas respostas do radius).\n<p>mysql&gt; <strong>SELECT UserName, Attribute, op, Value FROM radreply WHERE UserName = &#8216;joao&#8217;;<\/strong><\/p>\n<pre>UserName  | Attribute         |  op  | Value\r\n----------------------------------------------------------\r\njoao      | Reply-Message     |  ==  | Bem Vindo Sr. Diretor!\r\njoao      | Framed-IP-Address |  ==  | 10.0.0.121\r\njoao      | Framed-IP-Netmask |  ==  | 255.255.255.0\r\n----------------------------------------------------------<\/pre>\n<p>Com os registros acima, Jo\u00e3o receber\u00e1 uma mensagem de boas vindas e o endere\u00e7o ip 10.0.0.121\/24.<\/li>\n<li><em>usergroup<\/em> &#8211; Bom, seria muito desagrad\u00e1vel administrar centenas de usu\u00e1rios inserindo atributos em um por um. Voc\u00ea pode criar grupos de checagem e inserir os usu\u00e1rios neles. A tabela usergroup serve exatamente para isso: voc\u00ea adiciona grupos de checagem e retorno nas tabelas radgroupcheck e radgroupreply respectivamente, e, ao criar um relacionamento entre o grupo e a usu\u00e1rio nessa tabela, os par\u00e2metros do grupo s\u00e3o usados nas opera\u00e7\u00f5es com o usu\u00e1rio.\n<p>mysql&gt; <strong>SELECT UserName, GroupName FROM usergroup;<\/strong><\/p>\n<pre>UserName     |    GroupName\r\n----------------------------------\r\njoao         |    Diretoria\r\npatrick      |    Admin\r\nanamaria     |    Dialup\r\nkairan       |    Dialup\r\nmilene       |    Dialup\r\nmarcos       |    Velox\r\n----------------------------------<\/pre>\n<\/li>\n<li><em>radgroupcheck<\/em> &#8211; cont\u00e9m informa\u00e7\u00f5es dos grupos referenciados em usergroup para checagem de par\u00e2metros:\n<p>mysql&gt; <strong>SELECT GroupName, Attribute, op, Value FROM radgroupcheck ORDER BY GroupName;<\/strong><\/p>\n<pre>GroupName   | Attribute      |  op  | Value\r\n---------------------------------------------------\r\nAdmin       | NAS-IP-Address |  ==  |  192.168.0.1\r\nDialup      | NASPortType    |  ==  |  Async\r\nDiretoria   | NAS-IP-Address |  ==  |  192.168.0.1\r\nVelox       | NASPortType    |  ==  |  Virtual\r\n---------------------------------------------------<\/pre>\n<p>Acima, podemos ver que: Quem \u00e9 do grupo Admin e Diretoria s\u00f3 pode se autenticar se a conex\u00e3o for intermediada pelo NAS 192.168.0.1. Quem \u00e9 do grupo Dialup s\u00f3 pode autenticar se o tipo da porta (NASPortType) for ass\u00edncrona. E assim vai!<\/li>\n<li><em>radgroupcheck<\/em> &#8211; cont\u00e9m informa\u00e7\u00f5es dos grupos referenciados em usergroup para retorno de par\u00e2metros:\n<p>mysql&gt; <strong>SELECT GroupName, Attribute, op, Value FROM radgroupreply ORDER BY GroupName;<\/strong><\/p>\n<pre>GroupName | Attribute      |  op   | Value\r\n-------------------------------------------------------------------\r\nAdmin     | Reply-Message  |  ==   | Bem vindo Manda-chuva!\r\nDialup    | Reply-Message  |  ==   | Um site de cada vez por favor.\r\nDiretoria | Reply-Message  |  ==   | Acesso bloqueado as 19:00\r\nVelox     | Reply-Message  |  ==   | \u00c9 proibido compartilhar conex\u00e3o \r\n                                     com terceiros\r\n--------------------------------------------------------------------<\/pre>\n<\/li>\n<li><em>radpostauth<\/em> &#8211; salva informa\u00e7\u00f5es de respostas enviadas para os usu\u00e1rios. Com ele voc\u00ea pode tirar um relat\u00f3rio das tentativas de acesso, por exemplo:\n<p>mysql&gt; <strong>SELECT user, pass, reply, date FROM radpostauth WHERE user = &#8216;joao&#8217;;<\/strong><\/p>\n<pre>user  | pas          | reply          | date\r\n-------------------------------------------------------\r\njoao  | senhasecreta | Access-Accept  |  20041228125413\r\njoao  | senhasecreta | Access-Accept  |  20041229182318\r\n-------------------------------------------------------<\/pre>\n<p>Acima, o relat\u00f3rio diz que o usu\u00e1rio autenticou com sucesso nas duas tentativas. O campo date \u00e9 timestamp: ano, m\u00eas, dia, hora, minuto e segundo.<\/li>\n<\/ul>\n<p>Agora que voc\u00ea j\u00e1 sabe como manipular o retorno e a autoriza\u00e7\u00e3o dos usu\u00e1rios, leia o manual do seu NAS e veja quais par\u00e2metros ele aceita e crie seus pr\u00f3prios grupos de acesso. Boa sorte!<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><strong>Autenticando na base de dados PostgreSQL, Oracle e outros<\/strong><\/p>\n<table border=\"0\">\n<tbody>\n<tr>\n<td align=\"justify\">Talvez voc\u00ea tenha imaginado ao ver o t\u00edtulo que integrar com outros bancos de dados sen\u00e3o MySQL seria um mist\u00e9rio, na verdade, o <em>sql.conf<\/em> tem uma \u00fanica linha que define o banco de dados a ser usado.<\/p>\n<p>Edite sql.conf e voc\u00ea ver\u00e1 as seguintes linhas:<\/td>\n<\/tr>\n<tr>\n<td><span style=\"color: #004080;\"># Database type<br \/>\n# Current supported are: rlm_sql_mysql, rlm_sql_postgresql,<br \/>\n# rlm_sql_iodbc, rlm_sql_oracle, rlm_sql_unixodbc, rlm_sql_freetds<\/span><br \/>\ndriver = &#8220;rlm_sql_mysql&#8221;<\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nNas linhas acima, o driver usado para conectar ao banco de dados \u00e9 o mysql, para que esse driver esteja dispon\u00edvel, as bibliotecas de inclus\u00f5es tem que estar presentes no sistema (exemplo: mysql.h).<\/p>\n<p>Mudando o driver de banco de dados, defina os valores apropriados \u00e0s vari\u00e1veis:<\/p>\n<ul>\n<li>server<\/li>\n<li>login<\/li>\n<li>password<\/li>\n<li>radius_db<\/li>\n<\/ul>\n<p>As demais podem permanecer inalteradas. Se voc\u00ea mudar a estrutura de algumas SQL&#8217;s do sql.conf para algum prop\u00f3sito particular, recomendo que fa\u00e7a testes manuais no banco de dados para se certificar que est\u00e3o funcionando. Digo isso porque uma vez alterei algumas e meu servidor radius estava se comportando de forma estranha, no log n\u00e3o aparecia nada, quando passei um pente fino, era uma SQL mal escrita.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><strong>Negando temporariamente o acesso de clientes inadimplentes usando SQL<\/strong><\/p>\n<table border=\"0\">\n<tbody>\n<tr>\n<td align=\"justify\">Normalmente e inevitavelmente, se voc\u00ea trabalha em um provedor, algum dia um usu\u00e1rio deixar\u00e1 de pagar e voc\u00ea ter\u00e1 que suspender o acesso dele.<\/p>\n<p>\u00c9 muito interessante manter os dados do cliente no banco de dados, pois ele pode retornar a ativa um dia. Assim, quando ele ligar dizendo:<\/p>\n<p>&#8211; Por favor, quero quitar minha d\u00edvida e ter meu acesso restabelecido.<\/p>\n<p>Voc\u00ea n\u00e3o ter\u00e1 o problema de ter que colocar senha em branco ou uma senha f\u00e1cil e ped\u00ed-lo para mudar na p\u00e1gina. A maioria dos clientes desconfia que os provedores t\u00eam acesso \u00e0 senha deles.<\/p>\n<p>Minha experi\u00eancia diz tamb\u00e9m que a maioria dos usu\u00e1rios que retornam a usar o servi\u00e7o de um provedor, v\u00e3o optar por usar o mesmo login e senha que usavam antes de serem suspensos, principalmente o e-mail.<\/p>\n<p>Por isso, manter os dados dele no db vai possibilitar essa vantagem.<\/p>\n<p>Como voc\u00ea j\u00e1 viu, se estiver usando uma base de dados, uma SQL ser\u00e1 emitida para extrair dados de login do db, o que vamos fazer \u00e9 manipular essa SQL e alterar a estrutura do banco para suport\u00e1-la.<\/p>\n<p>1 &#8211; Altere a estrutura da tabela <em>radacct<\/em> no seu db radius adicionando uma coluna chamada &#8220;enable&#8221;, essa coluna poder\u00e1 suportar dois valores: Y ou N.<\/p>\n<p>O padr\u00e3o ser\u00e1 Y, quanto o usu\u00e1rio for desabilitado, o valor deve mudar para N. Acrescente a nova coluna com o seguinte comando no CLI no MySQL:<\/p>\n<p>mysql&gt; <strong>ALTER TABLE radacct ADD enable enum(&#8216;Y&#8217;,&#8217;N&#8217;) NOT NULL DEFAULT &#8216;Y&#8217;;<\/strong><\/p>\n<p>2 &#8211; Altere a SQL para chegar o status do usu\u00e1rio no campo &#8220;enable&#8221;. No arquivo \/usr\/local\/etc\/raddb\/sql.conf, procure pela linha:<\/p>\n<p>authorize_check_query = &#8220;SELECT id, UserName, Attribute, Value,op FROM ${authreply_table} WHERE Username = &#8216;%{SQL-User-Name}&#8217; ORDER BY id&#8221;<\/p>\n<p>E acrescente a cl\u00e1usula WHERE a seguinte compara\u00e7\u00e3o:<\/p>\n<p>AND enable = &#8216;Y&#8217;<\/p>\n<p>Ficando assim:<\/td>\n<\/tr>\n<tr>\n<td>authorize_check_query = &#8220;SELECT id, UserName, Attribute, Value,op FROM ${authreply_table} WHERE Username = &#8216;%{SQL-User-Name}&#8217; AND enable = &#8216;Y&#8217; ORDER BY id&#8221;<\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nCom isso, somente usu\u00e1rios habilitados poder\u00e3o ser selecionados! Se o usu\u00e1rio joao n\u00e3o pagar direitinho, voc\u00ea desativa ele com a SQL:<\/p>\n<p>mysql&gt; <strong>UPDATE radcheck SET enable = &#8216;N&#8217; WHERE username = &#8216;joao&#8217;;<\/strong><\/p>\n<p>Se ele pagar, voc\u00ea ativa com a SQL:<\/p>\n<p>mysql&gt; <strong>UPDATE radcheck SET enable = &#8216;Y&#8217; WHERE username = &#8216;joao&#8217;;<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><strong>Autenticando na base de dados de usu\u00e1rios do sistema<\/strong><\/p>\n<table border=\"0\">\n<tbody>\n<tr>\n<td align=\"justify\">Se voc\u00ea n\u00e3o precisa de um servidor para grandes implementa\u00e7\u00f5es, nem usar um servidor de banco de dados, autenticar usu\u00e1rios no sistema pode ser muito \u00fatil, o <em>freeradius<\/em> pode consultar os arquivos <em>\/etc\/passwd<\/em> e <em>\/etc\/shadow<\/em> para validar uma requisi\u00e7\u00e3o. A configura\u00e7\u00e3o \u00e9 muito simples, no arquivo \/usr\/local\/etc\/raddb\/radiusd.conf, edite as se\u00e7\u00f5es &#8220;instantiate&#8221;, &#8220;authorize&#8221; e &#8220;authenticate&#8221; de forma que fiquem assim:<\/td>\n<\/tr>\n<tr>\n<td>instantiate {<br \/>\n}<\/p>\n<p>authorize {<br \/>\nchap<br \/>\nmschap<br \/>\nfiles<br \/>\n}<\/p>\n<p>authenticate {<br \/>\nAuth-Type PAP {<br \/>\npap<br \/>\n}<br \/>\nAuth-Type CHAP {<br \/>\nchap<br \/>\n}<br \/>\nunix<br \/>\n}<\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nAs palavras &#8220;unix&#8221; e &#8220;files&#8221; s\u00e3o as respons\u00e1veis pelo tipo de autentica\u00e7\u00e3o baseada nos arquivos de sistema.<\/p>\n<p>Usando desta maneira, o m\u00e9todo usado para inserir usu\u00e1rios no radius \u00e9 o mesmo para adicionar um usu\u00e1rio ao sistema: usando os comandos &#8220;useradd&#8221; ou a ferramenta de administra\u00e7\u00e3o usada na sua distribui\u00e7\u00e3o <em>Linux<\/em>. Assim, qualquer usu\u00e1rio que puder se autenticar no sistema tamb\u00e9m poder\u00e1 se autenticar no radius, mas caso isso n\u00e3o for seguro, voc\u00ea pode editar no <em>radiusd.conf<\/em>, as op\u00e7\u00f5es do m\u00f3dulo &#8220;unix&#8221; e apontar para novos arquivos passwd e shadow.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><strong>Testando o servidor radius antes de coloc\u00e1-lo em produ\u00e7\u00e3o<\/strong><\/p>\n<table border=\"0\">\n<tbody>\n<tr>\n<td align=\"justify\">Voc\u00ea instalou, sabe como funciona, escolheu a melhor forma de autenticar, est\u00e1 rodando, mas como saber se ele est\u00e1 funcionando devidamente?<\/p>\n<p>Eu costumo usa duas ferramentas para me certificar se um servidor radius presta:<\/p>\n<h1>1 &#8211; radtest<\/h1>\n<p>O comando radtest acompanha o pacote do freeradius e \u00e9 instalado com os demais aplicativos. Embora sirva apenas para testar autentica\u00e7\u00e3o e retorno de par\u00e2metros, \u00e9 uma ferramenta muito \u00fatil em um <a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">Linux<\/a>.<\/p>\n<p>Sintaxe:<\/p>\n<p>radtest USU\u00c1RIO SENHA SERVIDOR:PORTAAUTH PORTANAS SEGREDORADIUS<\/p>\n<p>onde:<\/p>\n<ul>\n<li>USU\u00c1RIO, SENHA &#8211; o \u00f3bvio, login do usu\u00e1rio e senha;<\/li>\n<li>SERVIDOR &#8211; endere\u00e7o ip ou FQDN do servidor radius;<\/li>\n<li>PORTAAUTH &#8211; porta no SERVIDOR onde o servi\u00e7o radius atende solicita\u00e7\u00f5es de autentica\u00e7\u00e3o;<\/li>\n<li>PORTANAS &#8211; porta do NAS, pode ser uma porta eletr\u00f4nica (n\u00famero do modem) ou virtual, apenas para controle. Para testes, coloque qualquer valor num\u00e9rico.<\/li>\n<li>SEGREDORADIUS &#8211; quando voc\u00ea faz uma solicita\u00e7\u00e3o de autentica\u00e7\u00e3o, seu endere\u00e7o ip tem que estar cadastrado no arquivo clients.conf do servidor num par de IP\/SEGREDO. O ip ser\u00e1 descoberto pelo SERVIDOR atrav\u00e9s do par\u00e2metro NAS-IP-Address, o segredo voc\u00ea tem que informar aqui.<\/li>\n<\/ul>\n<p>Ap\u00f3s uma solicita\u00e7\u00e3o, o radtest informa quais par\u00e2metros est\u00e1 enviando para o servidor, seguido do retorno.<\/p>\n<p>Exemplo:<\/p>\n<p><strong># radtest joao senhasecreta 127.0.0.1:1645 0 reioceleste<\/strong><br \/>\nSending Access-Request of id 176 to 127.0.0.1:1645<br \/>\nUser-Name = &#8220;joao&#8221;<br \/>\nUser-Password = &#8220;senhasecreta&#8221;<br \/>\nNAS-IP-Address = localhost<br \/>\nNAS-Port = 0<\/p>\n<p>rad_recv: Access-Accept packet from host 127.0.0.1:1645, id=176, length=58<br \/>\nReply-Message = &#8220;Bem vindo chefe!&#8221;<\/p>\n<p>Como voc\u00ea pode ver acima, o servidor retornou uma resposta de acesso aceito &#8220;Access-Accept&#8221; e um par\u00e2metro que eu configurei em radreply para o usu\u00e1rio joao (&#8220;Reply-Message&#8221;).<\/p>\n<h1>2 &#8211; NTRadPing<\/h1>\n<p>Ferramenta muito boa, para Windows (triste!), mas serve para testar todos os tipos de pacotes radius: Autentica\u00e7\u00e3o, Autoriza\u00e7\u00e3o, Contabilidade e Status. Como ele tem uma interface gr\u00e1fica, n\u00e3o preciso ficar ensinando, a tela \u00e9 bem obvia, d\u00ea uma olhada abaixo, o mesmo teste feito no radtest com o NTRadPing:<\/td>\n<\/tr>\n<tr>\n<td><a href=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/ntradping.jpg\" target=\"_new\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/ntradpingt.jpg\" alt=\"\" width=\"470\" height=\"292\" border=\"0\" \/><\/a><\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nVoc\u00ea pode baix\u00e1-lo gratuitamente do site:<\/p>\n<ul>\n<li><a href=\"http:\/\/www.mastersoft-group.com\/download\/\">http:\/\/www.mastersoft-group.com\/download\/<\/a><\/li>\n<\/ul>\n<p>ou direto:<br \/>\n<a href=\"http:\/\/www.mastersoft-group.com\/download\/step2.asp?frm_prod=9\">http:\/\/www.mastersoft-group.com\/download\/step2.asp?frm_prod=9<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><strong>Criando gr\u00e1ficos de monitoramento com MRTG<\/strong><\/p>\n<table border=\"0\">\n<tbody>\n<tr>\n<td align=\"justify\">Bom, para essa implementa\u00e7\u00e3o voc\u00ea precisa ter o MRTG instalado no seu <em>Linux<\/em>, n\u00e3o tem segredo, v\u00e1 na ordem:<\/p>\n<ul>\n<li>instale zlib<\/li>\n<li>instale libjpeg<\/li>\n<li>instale gd<\/li>\n<li>instale mrtg<\/li>\n<\/ul>\n<p>Por padr\u00e3o, os programas do mrtg s\u00e3o instalados em \/usr\/local\/mrtg-2\/bin.<\/p>\n<p>Criar gr\u00e1ficos com dados do banco de dados do radius \u00e9 muito importante. Voc\u00ea pode ter o controle de quantas sess\u00f5es s\u00e3o abertas em hor\u00e1rios diferentes, ter o controle do n\u00famero de registros no banco de dados, etc.<\/p>\n<p>Por exemplo: Implementando um simples gr\u00e1fico de mrtg para monitorar o n\u00famero de conex\u00f5es abertas, pude saber que tenho muitas linhas telef\u00f4nicas sobrando, podendo bolar uma estrat\u00e9gia para compensar os gastos. \u00c9 importante tamb\u00e9m monitorar a quantidade de banda que \u00e9 consumida pelos clientes dial-up, entre outros valores que podem decidir a expans\u00e3o do neg\u00f3cio.<\/p>\n<p>Considerando que voc\u00ea vai armazenar os gr\u00e1ficos na pasta \/www\/graficos que est\u00e1 publicada no seu Apache.<\/p>\n<p>Gr\u00e1fico de sess\u00f5es abertas:<\/p>\n<p>Crie o arquivo \/www\/graficos\/sessoes.conf com o conte\u00fado:<\/td>\n<\/tr>\n<tr>\n<td><span style=\"color: #004080;\"># in\u00edcio<\/span><br \/>\nEnableIPv6: no<br \/>\nWorkdir: \/www\/graficos\/<br \/>\nOptions[_]: growright,bits<\/p>\n<p>Title[sessoes] : Radius &#8211; Sess\u00f5es abertas<br \/>\nMaxBytes[index] : 10000<br \/>\nAbsMax[index] : 20000<br \/>\nOptions[index]: growright,noinfo,gauge<br \/>\nTarget[index]: `\/etc\/mrtg\/radius-sessoes.sh`<br \/>\nPageTop[index]: <strong>Radius<\/strong><br \/>\nShortLegend[index]: Sess\u00f5es<br \/>\nYLegend[index]: Sess\u00f5es\/hora<br \/>\nLegend1[index]: Total de sess\u00f5es<br \/>\nWithPeak[index]: ymwd<br \/>\nXSize[index]: 350<br \/>\nYSize[index]: 150<br \/>\n<span style=\"color: #004080;\"># fim<\/span><\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nComo voc\u00ea pode ver, o comando \/etc\/mrtg\/radius-sessoes.sh \u00e9 invocado. Esse script tem que retornar um valor para o MRTG no seguinte formato:<\/p>\n<p>#&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\nn\u00famero&lt;quebra de linha&gt;<br \/>\nn\u00famero&lt;quebra de linha&gt;<br \/>\n#&#8212;&#8212;&#8212;&#8212;&#8211;<\/p>\n<p>Exemplo:<\/p>\n<p><strong># .\/etc\/mrtg\/radius-sessoes.sh<\/strong><br \/>\n30<br \/>\n0<\/p>\n<p>Nesse caso, o n\u00famero 30 \u00e9 o n\u00famero de sess\u00f5es que est\u00e3o abertas. No script \/etc\/mrtg\/radius-sessoes.sh, coloque o seguinte conte\u00fado:<\/td>\n<\/tr>\n<tr>\n<td><span style=\"color: #004080;\"># inicio<\/span><br \/>\n<span style=\"color: #004080;\">#!\/bin\/sh<\/span><\/p>\n<p>servidormysql=localhost<br \/>\nusuario=root<br \/>\nsenha=mysql2005<br \/>\nbanco=radius<br \/>\ntabelaacct=radacct<\/p>\n<p>sessoes=`mysql -N -p$senha -h $servidormysql -u $login $banco -e &#8220;SELECT count(*) FROM $tabelaacct WHERE AcctStopTime = 0;&#8221;`<\/p>\n<p>echo $sessoes<br \/>\necho 0<br \/>\n<span style=\"color: #004080;\"># fim<\/span><\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nSalve e torne execut\u00e1vel:<\/p>\n<p><strong># chmod +x \/etc\/mrtg\/radius-sessoes.sh<\/strong><\/p>\n<p>O comando para gerar o gr\u00e1fico ser\u00e1:<\/p>\n<p><strong># \/usr\/local\/bin\/mrtg-2\/bin\/mrtg \/www\/graficos\/sessoes.conf<\/strong><\/p>\n<p>As 3 primeiras vezes que voc\u00ea o executar, erros ser\u00e3o gerados, mas n\u00e3o se preocupe, certifique-se de que novos arquivos foram gerados em \/www\/graficos\/, o arquivo sessoes.html nessa pasta mostra os gr\u00e1ficos que come\u00e7aram a ser exibidos uns 15 minutos depois.<\/p>\n<p>Coloque o comando para gerar os gr\u00e1ficos de 5 em 5 minutos pelo <em>crontab<\/em>:<\/td>\n<\/tr>\n<tr>\n<td>*\/5\u00a0\u00a0*\u00a0\u00a0*\u00a0\u00a0*\u00a0\u00a0*\u00a0\u00a0\/usr\/local\/bin\/mrtg-2\/bin\/mrtg \/www\/graficos\/sessoes.conf<\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nAgora \u00e9 s\u00f3 monitorar!<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><strong>Extrato de horas<\/strong><\/p>\n<table border=\"0\">\n<tbody>\n<tr>\n<td align=\"justify\">Agora um assunto que \u00e9 muito interessante: Extrato de horas.<\/p>\n<p>Em muitas empresas, provedores, etc \u00e9 importante relatar o uso do servi\u00e7o (conex\u00e3o a internet) de forma leg\u00edvel e acess\u00edvel. Os provedores de acesso, por exemplo, tem planos de acesso limitados a certa quantia de horas e quando o usu\u00e1rio abusa, uma multa \u00e9 cobrada sobre o excedente.<\/p>\n<p>Quando uma quantia \u00e9 cobrada do usu\u00e1rio, como cliente, ele tem o direito de saber pelo que est\u00e1 pagando, ent\u00e3o \u00e9 hora de dar contas.<\/p>\n<p>O <em>freeradius<\/em>, junto com os m\u00f3dulos de SQL, salva os dados de sess\u00e3o na tabela <em>radacct<\/em>(contabilidade), cada registro nesta tabela \u00e9 composto pelas seguintes colunas:<\/p>\n<ul>\n<li>RadAcctId -&gt; n\u00famero \u00fanico de identifica\u00e7\u00e3o do registro;<\/li>\n<li>AcctSessionId -&gt; caracteres de identifica\u00e7\u00e3o da sess\u00e3o;<\/li>\n<li>AcctUniqueId -&gt; n\u00famero \u00fanico da sess\u00e3o;<\/li>\n<li>UserName -&gt; nome de usu\u00e1rio;<\/li>\n<li>Realm -&gt; Realm usado;<\/li>\n<li>NASIPAddress -&gt; RAS (ou NAS) que participou da autentica\u00e7\u00e3o e contabilidade;<\/li>\n<li>NASPortId -&gt; porta do NAS usada;<\/li>\n<li>NASPortType -&gt; tipo da porta (Async{56kbps}, ISDN {64 ou 128kb}, Virtual {adsl e outros});<\/li>\n<li>AcctStartTime -&gt; data hora do in\u00edcio da sess\u00e3o, hora em que a conex\u00e3o foi estabelecida;<\/li>\n<li>AcctStopTime -&gt; data hora do fim da sess\u00e3o, hora em que a conex\u00e3o foi encerrada;<\/li>\n<li>AcctSessionTime -&gt; tempo da sess\u00e3o em segundos (diferen\u00e7a entre AcctStopTime e AcctStartTime);<\/li>\n<li>AcctAuthentic -&gt; Protocolo de autentica\u00e7\u00e3o usado (ex.: RADIUS);<\/li>\n<li>ConnectInfo_start -&gt; informa\u00e7\u00f5es da conex\u00e3o quando ela se iniciou, informando o protocolo eletr\u00f4nico, a velocidade de upload, velocidade de download, etc&#8230; (ex.: V90 31200 52000 LAPM\/V42Bis);<\/li>\n<li>ConnectInfo_stop -&gt; informa\u00e7\u00f5es da conex\u00e3o quando ela terminou. Vide ConnectInfo_start<\/li>\n<li>AcctInputOctets -&gt; quantidade de dados recebidos;<\/li>\n<li>AcctOutputOctets -&gt; quantidade de dados enviados;<\/li>\n<li>Os dois campos acima s\u00e3o, sem d\u00favida, a melhor maneira de controlar o volume de dados de um cliente;<\/li>\n<li>CalledStationId -&gt; Em caso de RAS (cyclades, cisco, etc&#8230;) com diversos n\u00fameros, informa o n\u00famero que o cliente discou;<\/li>\n<li>CallingStationId -&gt; N\u00famero do telefone do cliente. Eu amo esse campo! Com ele, voc\u00ea acha o cliente em qualquer lugar! Tem como voc\u00ea saber de onde o cliente anda conectando, se ele ficar usando em casa e no trabalho, etc;<\/li>\n<li>AcctTerminateCause -&gt; Informa o motivo da desconex\u00e3o. Os valores mais comuns s\u00e3o:\n<ul>\n<li>Host-Request = o usu\u00e1rio (ou algum software no PC dele) requisitou a desconex\u00e3o.<\/li>\n<li>Lost-Carrier = sinal de linha perdido ou muita interfer\u00eancia na transmiss\u00e3o. Ocorre muito quando h\u00e1 varias extens\u00f5es na mesma linha telef\u00f4nica ou a presen\u00e7a de umidade, gato, etc.\n<p>Veja mais detalhes sobre motivos de desconex\u00e3o em \/usr\/local\/share\/freeradius\/dictionary.<\/li>\n<li>ServiceType = tipo de servi\u00e7o.<\/li>\n<li>FramedProtocol = protocolo usado (ex.: PPP).<\/li>\n<li>FramedIPAddress = endere\u00e7o ip concedido ao cliente durante a sess\u00e3o. Se a pol\u00edcia federal der uma batida a\u00ed, voc\u00ea vai poder informar pelo endere\u00e7o ip, de qual telefone partiu a conex\u00e3o do hacker!<\/li>\n<li>AcctStartDelay = tempo demorado para registrar o in\u00edcio da sess\u00e3o.<\/li>\n<li>AcctStopDelay = tempo demorado para registrar o fim da sess\u00e3o.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Quanto o usu\u00e1rio se conecta ao dispositivo de rede (NAS) e inicia uma sess\u00e3o, um registro em radacct \u00e9 criado, mas nem todas as informa\u00e7\u00f5es est\u00e3o dispon\u00edveis nele. O campo AcctStopTime \u00e9 0 (valor zero), entre outros.<\/p>\n<p>Assim, voc\u00ea pode descobrir quais usu\u00e1rios est\u00e3o conectados no momento com a SQL:<\/p>\n<p>mysql&gt; <strong>SELECT username, date_format(AcctStartTime, &#8216;%d\/%m\/%Y %T&#8217;) AS AcctStartTime, NASPortType FROM radacct WHERE AcctStopTime = 0 ORDER BY AcctStartTime;<\/strong><\/p>\n<p>Exemplo do resultado:<\/p>\n<pre>UserName   | AcctStartTime        |   NASPortType\r\n+--------------------+---------------------------\r\n paulinho  | 30\/12\/2004  07:30:06 |   Virtual\r\n francisco | 30\/12\/2004  09:28:18 |   Async\r\n+--------------------+---------------------------<\/pre>\n<p>Na tabela, vejo que um usu\u00e1rio de velox (paulinho) e outro de conex\u00e3o discada (francisco) est\u00e3o conectados.<\/p>\n<p>Assim que a desconex\u00e3o \u00e9 registrada pelo NAS ou RAS, \u00e9 transmitido para porta de contabilidade do freeradius um pedido de encerramento da sess\u00e3o, os dados restantes s\u00e3o preenchidos (data e hora, tempo total da sess\u00e3o, velocidade na hora da desconex\u00e3o, motivo, etc).<\/p>\n<p>Bom, agora que voc\u00ea j\u00e1 sabe o caminho das pedras, \u00e9 hora de desenvolver um software que te d\u00ea isso de forma acess\u00edvel e que voc\u00ea possa integrar com outros sistemas, como o de cobran\u00e7a, por exemplo. Boa sorte no desenvolvimento!<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><strong>Administra\u00e7\u00e3o de usu\u00e1rios<\/strong><\/p>\n<table border=\"0\">\n<tbody>\n<tr>\n<td align=\"justify\">N\u00e3o \u00e9 agrad\u00e1vel ter uma grande quantidade de clientes e ter que administrar &#8220;no dedo&#8221;, um software de administra\u00e7\u00e3o \u00e9 fundamental. Voc\u00ea tem tr\u00eas op\u00e7\u00f5es:<\/p>\n<p>1 &#8211; desenvolver um, escolhendo a tecnologia, se baseando nas suas necessidades e nos relacionamentos do seu banco de dados de clientes, cobran\u00e7a, etc.<\/p>\n<p>N\u00e3o existe nenhum segredo para se fazer isso, basta ter conhecimento em alguma linguagem de programa\u00e7\u00e3o com API do banco de dados usado (exemplo: PHP e MySQL). Assim voc\u00ea pode oferecer para seus clientes, formul\u00e1rios de mudan\u00e7a de senha, extrato de horas de acesso, help-desk, etc. Eu mesmo j\u00e1 desenvolvi um software do tipo, que instalo para meus clientes.<\/p>\n<p>2 &#8211; usar o software &#8220;dial-up admin&#8221;, GNU, distribu\u00eddo junto com o <em>freeradius<\/em>.<\/p>\n<p>O dial-up admin \u00e9 um software completo para administra\u00e7\u00e3o de um servidor radius baseado em banco de dados. Ele possui total controle das tabelas do radius, para alterar atributos, administrar usu\u00e1rios, grupos e uma interface b\u00e1sica de administra\u00e7\u00e3o de clientes (nome, telefone, endere\u00e7o).<\/p>\n<p>Ser\u00e1 necess\u00e1rio ter instalado no seu servidor:<\/p>\n<ul>\n<li>Apache<\/li>\n<li>PHP<\/li>\n<li>Perl &#8211; m\u00f3dulo Date::Manip<\/li>\n<\/ul>\n<p>Na pasta de fontes do freeradius, existe uma pasta chamada dialup_admin, coloque-a em \/usr\/local e se assegure de que somente o usu\u00e1rio que executa o Apache (nobody normalmente) tenha permiss\u00f5es nessa pasta.<\/p>\n<p>Voc\u00ea n\u00e3o ir\u00e1 publicar a pasta \/usr\/local\/dialup_admin no seu Apache, mas sim uma subpasta chamada htdocs (\/usr\/local\/dialup_admin\/htdocs), que dever\u00e1 ser protegida por senha. Insira no seu <em>httpd.conf<\/em>:<\/td>\n<\/tr>\n<tr>\n<td>Alias \/dialup_admin &#8220;\/usr\/local\/dialup_admin\/htdocs&#8221;<br \/>\n&lt;Directory &#8220;\/usr\/local\/dialup_admin\/htdocs&#8221;<br \/>\nAuthName &#8220;Area Restrita &#8211; Administra\u00e7\u00e3o&#8221;<br \/>\nAuthType Basic<br \/>\nAuthUserFile \/usr\/local\/dialup_admin\/.htpasswd<br \/>\nrequire valid-user<br \/>\n&lt;\/Directory&gt;<\/td>\n<\/tr>\n<tr>\n<td align=\"justify\">\nCrie agora o arquivo de senhas:<\/p>\n<p># <strong>htpasswd -c \/usr\/local\/dialup_admin\/.htpasswd -m administrador senha<\/strong><\/p>\n<p>V\u00e1 at\u00e9 a pasta \/usr\/local\/dialup_admin\/sql, voc\u00ea deve executar todas estes arquivos de SQL no seu banco de dados de radius (banco &#8220;radius&#8221;):<\/p>\n<p><strong># cd \/usr\/local\/dialup_admin\/sql<br \/>\n# mysql -pSENHA -u USUARIO -h SERVIDOR radius -e badusers.sql<br \/>\n# mysql -pSENHA -u USUARIO -h SERVIDOR radius &lt; mtotacct.sql<br \/>\n# mysql -pSENHA -u USUARIO -h SERVIDOR radius &lt; totacct.sql<br \/>\n# mysql -pSENHA -u USUARIO -h SERVIDOR radius &lt; userinfo.sql<\/strong><\/p>\n<p>Onde: SENHA, USU\u00c1RIO e SERVIDOR devem ser substitu\u00eddos pelos valores corretos no seu servidor MySQL.<\/p>\n<p>Com as tabelas criadas e o Apache configurado, edite o arquivo \/usr\/local\/dialup_admin\/conf\/admin.conf e altere os valores das vari\u00e1veis de acordo com sua instala\u00e7\u00e3o (mysql, arquivos de configura\u00e7\u00e3o do freeradius, etc).<\/p>\n<p>Agora reinicie seu Apache, voc\u00ea ir\u00e1 acessar pelo endere\u00e7o:<\/p>\n<p>http:\/\/192.168.10.1\/dialup_admin<\/p>\n<p>Onde 192.168.10.1 deve ser substitu\u00eddo pelo ip ou nome FQDN do servidor.<\/p>\n<p>Com esses passos voc\u00ea deve conseguir usar o software com sucesso!<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><strong>Ajuda<\/strong><\/p>\n<table border=\"0\">\n<tbody>\n<tr>\n<td align=\"justify\">Espero que tenham gostado da qualidade do artigo.<\/p>\n<p>A vers\u00e3o atualizada e corrigida dia-a-dia estar\u00e1 dispon\u00edvel no endere\u00e7o:<\/p>\n<ul>\n<li><a href=\"http:\/\/www.patrick.eti.br\/\">http:\/\/www.patrick.eti.br\/<\/a><\/li>\n<\/ul>\n<p>Como o pr\u00f3pria licen\u00e7a do freeradius diz, n\u00e3o dou quaisquer garantia quanto ao software freeradius nem nenhum dos software citados nesse artigo, use por sua pr\u00f3pria conta e risco.<\/p>\n<p>Primeiramente, se tiver d\u00favidas, coloque-as nesse artigo, no vivaolinux.com.br, por favor, n\u00e3o me mande e-mails sem antes ler bem o artigo e se certificar de que voc\u00ea fez um m\u00ednimo de esfor\u00e7o para faz\u00ea-lo funcional!<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>Aviso Este artigo pode ser distribu\u00eddo, publicado, impresso e copiado de todas as formas e meios poss\u00edveis, desde que se mantenha o nome, a p\u00e1gina web e o e-mail do autor no cabe\u00e7alho, em local vis\u00edvel, abaixo do t\u00edtulo e com a letra maior ou igual a usada no texto. Meu primeiro contato com o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[51,35],"tags":[98,95,97,14,96],"class_list":["post-192","post","type-post","status-publish","format-standard","hentry","category-linux-linuxrs","category-wireless","tag-controle","tag-freeradius","tag-gerenciamento","tag-linux","tag-wireles"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=192"}],"version-history":[{"count":1,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/192\/revisions"}],"predecessor-version":[{"id":193,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/192\/revisions\/193"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}