Danton Dorati reservou um pouco de seu tempo para contribuir com um bom artigo sobre implementação de um Servidor VPN, com autenticação em Radios e base de dados MySQL. O artigo tem varios comentarios e detalhes, facilitando o entendimento do leitor. Com certeza atingirá vários usuários que ainda obtêm dúvidas na implementação de VPN sob um sistema FreeBSD.
Neste artigo descreverei como montar um servidor VPN (Virtual Private Network) do tipo Client-to-Host com base no MPD (Multi-link PPP daemon) utilizando um protocolo do tipo AAA (Authentication, Authorization and Accounting) que é o RADIUS (Remote Authentication Dial In User Service) usando o Open Source Freeradius. Existe outro software gerenciador de protocolo RADIUS, conhecido como Openradius, mas devido a grande complexidade de configurá-lo, preferi o mais fácil, pois minha intenção não é complicar e nem deixar usuários leigos "perdidos".
Como base de autenticação, um banco de dados, de preferência o MySQL porque é um dos mais utilizados hoje em dia e facilmente qualquer usuário poderá obter informações sobre como compilar, configurar e utilizar bastando dar uma "googlada". Mas caso haja preferência em algum outro tipo de DataBase, não se desespere há arquivos de demonstração e farei um breve resumo de como configura-los. Softwares utilizados no ambiente deste howto: Configurando o MPD O MDP é um daemon PPP para FreeBSD e funciona melhor que o poptop, além se ser mais simples de configurar por ter menos arquivos de configuração e o melhor de tudo, funciona com pptp e radius. A configuração dele não é muito complicada, toda documentação que você possa precisar está em /usr/local/share/doc/mpd embora seja perfeitamente possível configurar o mpd.conf.sample somente lendo os comentários do mesmo. Um artigo bem legal em português você encontra aqui embora meio desatualizado (aborda a versão 4.x do FreeBSD) mas ainda ajuda bastante e vale a pena a leitura! Instalando MPD via PORTS
# cd /usr/ports/net/mpd && make install clean # rehash Os arquivos de configuração do MPD estão em /usr/local/etc/mpd/, todos bem explicados, como exemplo, o mpd.conf.sample é um arquivo que é comentado linha apos linha. Para saber todos as opções de inicialização use: mpd -h. Mas as que você eventualmente usará são: -k - mata o deamon e roda em modo interativo -b - roda em modo background -c - define a porta que o MPD escutara e habilitara a opção de "dar" um telnet nessa mesma porta para verificar se está rodando tudo certo. Dentro do mpd.conf, você pode seguramente apagar as partes desnecessárias e deixar o arquivo parecido com este: #############################################################
#mpd.conf default: load pptp pptp: new -i ng0 pptp pptp set iface disable on-demand set iface enable proxy-arp set iface idle 1800 set iface enable tcpmssfix set bundle enable multilink # Seção que habilita o servidor RADIUS load radius set link yes acfcomp protocomp set link no pap chap set link enable chap set link keep-alive 10 60 set link mtu 1460 set link enable no-orig-auth set ipcp yes vjcomp # Interface o qual o servidor atribuirá os IPs para as estações, DNS e etc. set ipcp ranges INTERFACE-NAS(inicial) INTERFACE-NAS(final) set ipcp dns IP-SERVIDOR-DNS # Servidor samba ou wins descomenta essa linha caso houver um dos dois # set ipcp nbns IP-SERVIDOR-WINS/SAMBA set bundle enable compression set ccp yes mppc set ccp yes mpp-e40 set ccp yes mpp-e128 set ccp yes mpp-stateless radius: # Você pode usar radius.conf(5), se for ajudar, porque pode share the # alguma configuração com userland-ppp e outros apps. # Não há necessidade de "setar" qual será o arquivo de configuração # do RADIUS, mas se você quiser será de sua conta e risco se não # funcionar corretamente a autenticação. #set radius config /usr/local/etc/raddb/radiusd.conf # Eu aconselho especificar as configurações do server diretamente # aqui pra não haver erros set radius retries 3 set radius timeout 4 # Altere seu IP e a chave-secreta "setada" em # /usr/local/etc/raddb/clients.conf set radius server IP-DO-SERVIDOR chave-especifica 1812 1813 # Coloque aqui qual será o classe de IP do NAS o qual o servidor RADIUS reconhecera você # como cliente autorizado. # Aconselho se seja uma interface a par da sua rede interna set radius me IP-DO-NAS # Interface de rede VPN # Atualiza os usuários a cada 5 minutos set radius acct-update 300 # Deixar o servidor RADIUS acessar o IP set ipcp enable radius-ip # Habilita a fazer autenticação de usuários na DB do RADIUS set bundle enable radius-auth # Habilita a fazer autenticação no mpd.secret se falhar a autenticação RADIUS #set bundle enable radius-fallback # Habilita conta RADIUS set bundle enable radius-acct # Usa idle-timeout, session-timeout, rotas e mtu from do servidor # radius set iface enable radius-idle radius-session radius-mtu radius-route # ativa MPPE e deixa o servidor RADIUS acessar MPPE-types e # MPPE-policies set bundle enable compression set ccp yes mppc set ccp enable radius # Fim do mpd.conf ############################################################# Use o arquivo mpd.links para especificar qual será o IP publico que ouvirá na porta 1723, por experiência própria, aconselho que esse valor seja 0.0.0.0:
############################################################ #mpd.links pptp: set link type pptp set pptp self 0.0.0.0 set pptp enable incoming set pptp disable originate ########################################################### Caso haja falha na autenticação RADIUS e se no arquivo mpd.conf a opção "set bundle enable radius-fallback" estiver descomentada então a autenticação será feita no arquivo mpd.secret. Aqui vai um exemplo: ############################################################ #mpd.secret USER SENHA(ENTRE ASPAS) IP-DA-ESTACAO urisso "vpn-mpd" IP-DO-NAS ############################################################ Configurando o Freeradius Os arquivos de configuração do freeradius estarão após a instalação em /usr/local/etc/raddb/. Para instalar o FreeRadius via PORTS você precisará fazer algumas configurações, antes de um make config dentro de /usr/ports/net/freeradius,aparecerá algumas opções para de/selecionar e compilá-la ou não na instalação. x x [ ] KERBEROS With Kerberos support x x x x [ ] HEIMDAL With Heimdal Kerberos support x x x x [ ] LDAP With LDAP user database x x x x [ ] MYSQL With MySQL user database x x x x [ ] PGSQL With PostgreSQL use database x x x x [ ] SNMP With SNMP support x x x x [ ] EDIR With Novell eDirectory support x x x x [ ] NOPERL Do not require perl (use only if necessary) x x x x [ ] EXPERIMENTAL Build experimental modules x x Como pretendemos configurar o FreeRadius utilizando o MySQL, selecione a opção do Kerberos que é um protocolo desenvolvido para fornecer poderosa autenticação em aplicações usuário/servidor, onde ele funciona como a terceira parte neste processo, oferecendo autenticação ao usuário. Agora só fazer um make install. Ficará mais ou menos assim: # cd /usr/ports/net/freeradius && make config x x [X] KERBEROS With Kerberos support x x x x [X] HEIMDAL With Heimdal Kerberos support x x x x [ ] LDAP With LDAP user database x x x x [X] MYSQL With MySQL user database x x x x [ ] PGSQL With PostgreSQL use database x x x x [ ] SNMP With SNMP support x x x x [ ] EDIR With Novell eDirectory support x x x x [ ] NOPERL Do not require perl (use only if necessary) x x x x [ ] EXPERIMENTAL Build experimental modules x x # make # make install # mkdir /usr/local/etc/raddb/modules # cp -vr work/freeradius-1.1.4/doc/examples/ /usr/local/etc/raddb/modules/ Quando finalmente a instalação estiver concluida vamos precisar configurar o /usr/local/etc/raddb/radiusd.conf e crie-o e insira dentro do mesmo o seguinte conteúdo: ############################################################# #radiusd.conf # variáveis definidas na instalação, essas opções foram disponibilizadas para que você não # precise recompilar para mudar os arquivos de lugar você pode usar essas variáveis quando # definir o valor de algum parâmetro ao longo desse arquivo. prefix = /usr/local/ exec_prefix = ${prefix} sysconfdir = ${prefix}/etc localstatedir = /var sbindir = ${exec_prefix}/sbin logdir = ${localstatedir}/log/radius raddbdir = ${sysconfdir}/raddb radacctdir = ${logdir}/radacct confdir = ${raddbdir} run_dir = ${localstatedir}/run/radiusd # arquivo de log principal, nesse arquivo ficarão # todas as mensagem de erro, tentativas de # conexão, etc... log_file = ${logdir}/radius.log # pasta de bibliotecas, se elas se encontrarem em varias pastas, separe as localizações # por : , tipo: libdir = /usr/lib:/usr/local/lib libdir = ${exec_prefix}/lib # arquivo onde será armazenado o id do processo principal do freeradius pidfile = ${run_dir}/radiusd.pid # definição do usuário e grupo dos processos filhos do radiusd se você não especificar, o # usuário que deu partida será usado (root), se você usar o arquivo /etc/shadow para # autenticação, defina o grupo como shadow, vale lembrar que o usuário que executa o # radiusd deve ter permissão de escrita no diretório de log user = nobody group = nobody # define o tempo que o processo filho segura o pedido, caso o tempo limite seja atingido, o # servidor retorna acesso negado. Por exemplo: se você define 2 segundos e usa um banco de # dados mysql sobrecarregado que demora 5 segundos para concluir uma pesquisa, seu # servidor nunca vai dar acesso a ninguém! max_request_time = 30 # se no parâmetro max_request_time você definiu o valor 30 segundos, e o cliente perdeu a # paciência e enviou outra solicitação sem ter concluído a primeira, o freeradius não ficara # fazendo trabalho repetitivo simultaneamente. Se você definir esse parâmetro como ve, ao # chegar a segunda requisição do mesmo cliente com a mesma "pergunta", ele desistirá da # primeira para atender a nova solicitação. delete_blocked_requests = no # esse valor funciona da seguinte maneira: se o NAS ou RAS enviou uma pergunta e a # resposta foi perdida na rede, o NAS tornará fazer a pergunta, todo o processo de # autenticação será realizado novamente. Para evitar isso o freeradius manter a resposta no # cache pelo tempo definido aqui (em segundos), assim, se o pacote resposta for perdido e a # pergunta for repetida, a resposta será imediata, usando assim o mínimo de processamento. cleanup_delay = 5 # define o número máximo de requisições que o freeradius pode atender simultaneamente, # somando todas as requisições atendidas pelos processos filhos, assim, se você tem 4 # processo filhos, cada um poderá atender 256 perguntas simultaneamente. # ATENÇÃO: as respostas cacheadas pela opção cleanup_delay são contabilizadas. Se você # colocou cleanup_delay com um valor alto, seu radius ficará exposto a um DOS. max_requests = 1024 # isso fará o freeradius escutar em um endereço especifico, * inclui todos os endereços ip do # host, você pode usar um FQDN, mas antes tenha certeza de que a resolução de dns estará # disponível no momento em que o servidor radius inicia. bind_address = * # porta de escuta. Equipamentos antigos tem a porta 1645 como padrão de autenticação e # 1646 como contabilidade. A RFC 2138 mudou essa porta para 1812 autenticação e 1813 # contabilidade. Equipamentos novos provavelmente terá essa porta como padrão. 0 (zero) # fará com que a porta seja pesquisada em /etc/services, esse parâmetro pode ser sobreposto # pela opção -p do comando radiusd #listen { # ipaddr = * # endereço ip ou FQDN, mesmos critérios # usados em bind_address # port = 0 # porta de escuta, mesmos critérios # usados em port # Type of packets to listen for. # Allowed values are: # auth listen for authentication packets # acct listen for accounting packets # # type = auth # tipo de escuta: # auth -> autenticação # acct -> contabilidade #} # Se você quiser que o freeradius escute a porta de autenticação em um ip, e a porta de # contabilidade em outro, ou em postas distantes no mesmo ip, o modelo acima de listagem # será útil. Esse recurso apareceu a partir da versão 1.0 e resolve o problema se você tem # equipamentos novos e antigos servidos pelo mesmo radius. port = 0 # define se o nome DNS dos clientes será pesquisado a partir do ip. Se definir como yes, toda # vez que uma requisição chegar de um endereço ip, o freeradius irá consultar o dns para usar # o nome no log de atividades. O valor no é a melhor opção, não sobrecarrega o servidor DNS hostname_lookups = no # ative essa opção para depurar erros no servidor, caso contrario deixe como está allow_core_dumps = no # ativa ou desativa expressões regulares nos parâmetros dos pacotes, desativar é uma boa # idéia embora o padrão seja 'yes' regular_expressions = yes extended_expressions = yes # registra nos logs os dados completos do campo User-Name do pacote de autenticação, se # definido como yes, do jeito que chegar, será usado. log_stripped_names = no # deseja logar atividades de autenticação? se você tem milhares de clientes logando # simultaneamente, significa que seu log vai crescer muito com essa opção ativa. Eu sempre # coloco yes pois fica fácil e rápido descobrir por que certo cliente (leigo) não consegue # autenticar. log_auth = yes # Logar senhas quando a autenticação falhar? embora seja útil para dar suporte - usuário # digitando senha incorretamente (branco, maiúsculas, etc...), a privacidade do usuário fica #reduzida e uma brecha de segurança, todas as senhas serão registradas no log. log_auth_badpass = yes # idêntica a opção acima, porém se aplica para autenticações bem sucedidas. log_auth_goodpass = yes # essas duas opções são muito importantes: se o usuário deixar o CapsLock ligado, significa # que não conseguirá se autenticar e isso significa uma insatisfação ou uma chamada # desnecessária no suporte. Temos 3 opções: after, before e no suponhamos que eu informe # meu login: urisso "after" fará com que a autenticação seja primeiro testada com o valor # informado, se falhar, aplica um lowercase nos valores e tenta novamente. Sendo a primeira # tentativa com "Urisso" e a segunda com "urisso" "before" fará com que um lowercase seja # aplicado antes de pesquisar a base de dados, que receberá "urisso" "no" desativa esse efeito # passando para a base de dados o mesmo valor recebido: "urisso" usercollide = no lower_user = no lower_pass = no # As duas opções acima servem para retirar espaços de nome de usuário esenha. #Os seusclientes podem, sem perceber,< span> colocar um espaço no final ou no começo das #credenciais, o que gera uma chamada desnecessária no suporte técnico três valores poderão #ser escolhidos: after, before e no nospace_user = no nospace_pass = no # comando ao usar para checar conexões simultâneas checkrad = ${sbindir}/checkrad # sessão de segurança ---------------------------- security { max_attributes = 200 # define o número máximo de atributos num pacote enviado para o servidor. Um número # muito baixo faria o servidor # negar pacotes, número muito alto deixará o servidor vulnerável. O atacante pode emitir # um pedido com um número # exagerado de parâmetros e esgotar os recursos de memória reject_delay = 1 # define o tempo de espera antes de enviar uma resposta de acesso negado. Essa opção # proteje seu servidor # contra ataques de força bruta. Escolha de 0 a 5, 0 (zero) fará com que a resposta seja # enviada imediatamente status_server = no # permite ou nega o envio de pacotes de status do usuário. Não é muito importante mas # alguns NAS's com keep-alive # podem precisar desse recurso para checar o status de uma sessão. } # sessão de proxy ------------------------------ proxy_requests = yes $INCLUDE ${confdir}/proxy.conf # configuração de clientes NAS --------------- $INCLUDE ${confdir}/clients.conf # quando falo de clientes NAS não estou me referindo a seus clientes de conexão discada, mas # sim aos dispositivos em contato com eles que se encarregam de procurar o radius para # validar o usuário, esses equipamentos podem ser RAS como cyclades, cisco, etc... ou # mesmo serviços em qualquer servidor que se baseia numa autenticação com radius. # sessão de snmp ---------------------------- snmp = no $INCLUDE ${confdir}/snmp.conf # ativa o suporte a monitoramento por snmp no freeradius # configuração de processos filhos ------------------------ thread pool { start_servers = 5 # número de processos filhos a serem criados quando o serviço for iniciado max_servers = 32 # número máximo de processos filhos atendendo solicitações min_spare_servers = 3 max_spare_servers = 10 # regula o número de processos para manter um bom desempenho max_requests_per_server = 0 # número máximo de solicitações feitas a um processo filho antes de ser destruído 0 (zero) # para infinito, mas não recomendável pois um processo filho pode consumir recursos que # nunca irá liberar, 250 é um bom valor. } # sessão de definição de módulos ----------------------- modules { # formato: # name [ instance ] { # config_item = value # ... # } # name -> se refere ao nome do modulo rlm_?????, muitos módulos são fornecidos com o # freeradius, esse # recurso permite que você crie seus próprios módulos. pap { encryption_scheme = crypt } # define o tipo de criptografia usada na autenticação PAP, valores disponíveis: # - clear: sem criptografia, texto plano # - crypt: criptografia do unix # - md5: criptografia MD5 # - sha1: criptografia SHA1 # - padrão: crypt chap { authtype = CHAP } # adiciona suporte a autenticações usando CHAP pam { pam_auth = radiusd } # suporte PAM dos sistemas unix, configura o pamd em /etc/pam.d/ para usar esse tipo de # autenticação # autenticação baseada nas credenciais do sistema /etc/passwd e /etc/shadow unix { cache = no # criar caches de dados de login? habilitar essa opção pode melhorar o desempenho se # você tem muitos # usuários de sistema cache_reload = 600 # tempo em segundos para recarregar o cache de logins do sistema define a localização # dos seus arquivos de autenticação de sistema encontra-se comentado, usando o valor # padrão # # passwd = /etc/passwd # shadow = /etc/shadow # group = /etc/group radwtmp = ${logdir}/radwtmp } # Extensible Authentication Protocol $INCLUDE ${confdir}/eap.conf # Micro$oft CHAP authentication, esses módulos suportam MS-CHAP e MS-CHAPv2 mschap { nbsp; authtype = MS-CHAP # protocolo M$ usado use_mppe = yes require_encryption = yes #require_strong = yes with_ntdomain_hack = no #ntlm_auth = "/usr/local/bin/ntlm_auth --request-nt-key --username=%{Stripped-User-Name:-%{User-Name:-None}} --challenge=%{mschap:Challenge:-00} --nt-response=%{mschap:NT-Response:-00}" } # Lightweight Directory Access Protocol (LDAP), permite usa autenticação LDAP # (Auth-Type := LDAP) ldap { server = "ldap.your.domain" # identity = "cn=admin,o=My Org,c=UA" # password = senhadnaqui basedn = "o=My Org,c=UA" filter = "(uid=%{Stripped-User-Name:-%{User-Name}})" # base_filter = "(objectclass=radiusprofile)" start_tls = no # coloque yes se deseja usar tls para criptografar os dados nas conexões com o LDAP e # configure e descomente os valores abaixo: # tls_cacertfile = /path/to/cacert.pem # tls_cacertdir = /path/to/ca/dir/ # tls_certfile = /path/to/radius.crt # tls_keyfile = /path/to/radius.key # tls_randfile = /path/to/rnd # tls_require_cert = "demand" # default_profile = "cn=radprofile,ou=dialup,o=My Org,c=UA" # profile_attribute = "radiusProfileDn" access_attr = "dialupAccess" dictionary_mapping = ${raddbdir}/ldap.attrmap # define o arquivo de mapas de atributos do seu diretorio ldap_connections_number = 5 # password_header = "{clear}" # password_attribute = userPassword # groupname_attribute = cn # groupmembership_filter = "(|(&(objectClass=GroupOfNames) (member=%{Ldap-UserDn})) (&(objectClass=GroupOfUniqueNames) (uniquemember=%{Ldap-UserDn})))" # groupmembership_attribute = radiusGroupName timeout = 4 timelimit = 3 net_timeout = 1 # compare_check_items = yes # do_xlat = yes # access_attr_used_for_allow = yes } # ---------------------------------------- # modulo Realm, para proxy # 'realm/username' realm IPASS { format = prefix delimiter = "/" ignore_default = no ignore_null = no } # 'username@realm' realm suffix { format = suffix delimiter = "@" ignore_default = no ignore_null = no } # 'username%realm' realm realmpercent { format = suffix delimiter = "%" # ignore_default = no ignore_null = no } # 'domain\user' realm ntdomain { format = prefix delimiter = "\\" ignore_default = no ignore_null = no } checkval { item-name = Calling-Station-Id check-name = Calling-Station-Id data-type = string #notfound-reject = no } # reescrita de pacotes. Usado para autorização e contabilidade #attr_rewrite sanecallerid { # attribute = Called-Station-Id # may be "packet", "reply", "proxy", "proxy_reply" or "config" # searchin = packet # searchfor = "[+ ]" # replacewith = "" # ignore_case = no # new_attribute = no # max_matches = 10 # ## If set to yes then the replace string will be appended to the original string # append = no #} preprocess { huntgroups = ${confdir}/huntgroups hints = ${confdir}/hints with_ascend_hack = no ascend_channels_per_line = 23 with_ntdomain_hack = no with_specialix_jetstream_hack = no with_cisco_vsa_hack = no } files { usersfile = ${confdir}/users acctusersfile = ${confdir}/acct_users compat = no } detail { detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d detailperm = 0600 } # detail auth_log { # detailfile = ${radacctdir}/%{Client-IP-Address}/auth-detail-%Y%m%d # detailperm = 0600 # } # detail reply_log { # detailfile = ${radacctdir}/%{Client-IP-Address}/reply-detail-%Y%m%d # detailperm = 0600 # } # detail pre_proxy_log { # detailfile = ${radacctdir}/%{Client-IP-Address}/pre-proxy-detail-%Y%m%d # detailperm = 0600 # } # detail post_proxy_log { # detailfile = ${radacctdir}/%{Client-IP-Address}/post-proxy-detail-%Y%m%d # detailperm = 0600 # } acct_unique { key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port" } # Para Postgresql, use: ${confdir}/postgresql.conf # Para MS-SQL, use: ${confdir}/mssql.conf # For Oracle, use: ${confdir}/oraclesql.conf # $INCLUDE ${confdir}/sql.conf # inclusão de arquivo de configuração contendo módulos de autenticação, sessão e # contabilidade controlados em banco de dados SQL módulos responsáveis por controlar # usuários conectados para evitar conexão simultânea quanto esta é usada radutmp { filename = ${logdir}/radutmp username = %{User-Name} case_sensitive = yes check_with_nas = yes perm = 0600 callerid = "yes" } radutmp sradutmp { filename = ${logdir}/sradutmp perm = 0644 callerid = "no" } attr_filter { &n sp; attrsfile = ${confdir}/attrs } counter daily { filename = ${raddbdir}/db.daily key = User-Name count-attribute = Acct-Session-Time reset = daily counter-name = Daily-Session-Time &;nbsp; check-name = Max-Daily-Session allowed-servicetype = Framed-User cache-size = 5000 } always fail { rcode = fail } always reject { rcode = reject } always ok { rcode = ok simulcount = 0 mpp = no } expr { } digest { } exec { wait = yes input_pairs = request } exec echo { wait = yes program = "/bin/echo %{User-Name}" input_pairs = request output_pairs = reply #packet_type = Access-Accept } ippool main_pool { range-start = 192.168.1.1 range-stop = 192.168.2.254 netmask = 255.255.255.0 cache-size = 800 session-db = ${raddbdir}/db.ippool ip-index = ${raddbdir}/db.ipindex override = no maximum-timeout = 0 } } # controle de acesso, sessão e contabilidade ----------- # sessão instantiate - inicia módulos, se não for usar, não inicie. instantiate { exec expr # daily } # sessão authorization - controla os módulos responsáveis por autorizar o acesso das # requisições authorize { preprocess # auth_log # attr_filter chap mschap # digest # IPASS # suffix # ntdomain # eap # files sql # etc_smbpasswd # ldap # daily # checkval } # Sessão authentication # responsável por conferir o tipo de autenticação usado authenticate { Auth-Type PAP { pap } Auth-Type CHAP { chap } Auth-Type MS-CHAP { mschap } # digest pam # unix # Auth-Type LDAP { # ldap # } # eap } # Sessão Pre-accounting. Decide qual tipo de contabilidade usar preacct { # preprocess # acct_unique # home server as authentication requests. # IPASS # suffix # ntdomain # # Read the 'acct_users' file # files } # Sessao Accounting. Registra dados de contabilidade accounting { # detail # daily # unix # radutmp # sradutmp # main_pool sql # pgsql-voip } # Controle de sessão quando se faz o controle de sessão para evitar conexões simultâneas # (impede o nome de usuário de # se conectar varias vezes de locais diferentes ao mesmo tempo com o mesmo login) session { # radutmp sql } post-auth { # main_pool # reply_log # sql # Post-Auth-Type REJECT { # insert-module-name-here # } } pre-proxy { # attr_rewrite # pre_proxy_log } post-proxy { # post_proxy_log # attr_rewrite # attr_filter eap } ############################################################ Os exemplos descritos foram utilizados em meu servidor sem fazer nenhuma alteração e totalmente funcional. Lembrando que esse arquivo de configuração do radiusd está configurado para fazer a pesquisas de usuários no banco de dados do MySQL. O próximo arquivo a ser configurado é o clients.conf onde ficará os dados dos IPs dos NAS's que poderão ter acesso ao servidor RADIUS, é bem simples de configurá-lo: ############################################################ #client.conf client INTERFACE-INTERNA { secret = chave-secreta # chave-secreta do servidor. Somente os NAS's que conhecem essa chave-secreta poderão # fazer pedidos de autenticação. OBRIGATÓRIO shortname = REDE # nome do cliente. Normalmente você pode colocar uma parte do FQDN esse nome é usado # no arquivo de log e referencias de contabilidade *OBRIGATÓRIO* nastype = other # define o tipo de NAS ó cliente. Muito importante pois um NAS especifico pode ter campos # definidos nos arquivos de dicionários de parâmetros. OPCIONAL. Padrão: other } # o exemplo acima trata de uma rede inteira, mas você pode restringir acesso somente a # usuários que você queira. client IP-DO-NAS{ secret = chave-especifica shortname = VPN nastype = other } ############################################################ Importante: se seu NAS não estiver cadastrado aqui, possivelmente você vai ver no arquivo de log: Tue Feb 13 17:06:16 2007 : Error: Ignoring request from unknown client IP-DO-NAS:41747 Reinicie o servidor radius sempre que adicionar um novo client. Agora precisaremos alterar o arquivo sql.conf pra que o radiusd possa logar no servidor MySQL como usuário root, como provavelmente você já estará dentro do diretório onde estão os arquivos de configuração do servidor RADIUS basta editar o arquivo mencionado e editar as seguintes linhas. Vejamos como deve ficar essa parte: ############################################################ #sql.conf sql { driver = "rlm_sql_mysql" # informa ao freeradius qual modulo de banco # de dados usar, neste caso, mysql. Mas os drivers suportados são estes: # rlm_sql_postgresql, rlm_sql_iodbc, rlm_sql_oracle, rlm_sql_unixodbc, rlm_sql_freetds server = "localhost" # diz ao freeradius em qual host está o servidor mysql login = "root" # define o nome de usuário registrado no mysql password = "senha-do-root-no-msyql" # senha do usuário definido no parâmetro "login". Se seu servidor MySQL não estiver # configurado ainda, coloque uma mesma senha que mais tarde você definirá quando estiver # o configurando. Veja bem, esse arquivo não é para ser substituído e sim alterado na parte # mencionada, não delete nada que vem abaixo, pois pode ser que não funcione # corretamente. } ############################################################# Resumindo: Esse arquivo conf acima não está completo, o "sample" tem todas as opções e as variaveis necessárias para o funcionamento correto # cd /usr/local/etc/raddb/ # touch radiusd.conf # ee radiusd.conf Quando o editor de texto abrir copie o exemplo radiusd.conf citado acima e de um shift+insert salve e saia. # touch clients.conf # ee clients.conf Faça essas passos mencionado em cima e coloque no arquivo o exemplo descrito em clients.conf. # cp sql.conf.sample sql.conf # ee sql.conf Altere o arquivo de configuração do driver do MySQL para o Freeradius conforme descrito, defina a senha do root para o radiusd poder logar no mysql. E finalizando crie o diretório radius e o arquivo radius.log dento do diretório /var/logs/ um com permissão de 775 e o outro com 777 respectivamente. # mkdir /var/log/radius && touch /var/log/radius/radius.log # chmod 775 /var/log/radius && chmod 777 /var/log/radius/radius.log Configurando o MySQL Instalando-o via ports: # cd /usr/ports/databases/mysql50-server # make install clean Caso sua shell seja csh, então de um rehash antes como abaixo: # rehash Agora é só por o MySQL para funcionar. Instalando as databases do sistema: # mysql_install_db Ajustando o dono do diretório do MySQL para o próprio: # chown -R mysql:mysql /var/db/mysql/ Subindo o serviço do MySQL: # mysqld_safe & Se você definiu em /etc/hosts o nome do seu servidor Ex: serverteste.dominio.com (domínio interno), então coloque no lugar de IP-DO-SERVIDOR esse hostname. Abrindo o acesso root no MySQL: # /usr/local/bin/mysqladmin -u root password 'crie-sua-senha' # /usr/local/bin/mysqladmin -u root -h IP-DO-SERVIDOR password 'crie-sua-senha' Configurado o MySQL e rodando sem problemas vamos para parte de configuração do banco de dados do radiusd. Vamos criar o banco de dados e as tabelas. Os criadores do freeradius já deixaram a DDL pronta para você. # cd /usr/local/etc/raddb/modules/ Dentro desta pasta existe um arquivo chamado mysql.sql contendo todos os comandos para criar as tabelas. Crie o banco de dados com o comando: Obs.: Aqui não tem erro de digitação não, a opção -p é junta com a senha que você definiu no MySQL para o usuário root # mysqladmin -psenha-do-root create radius E crie as tabelas com o comando: # mysql -psenha-do-root radius < mysql.sql Vamos criar um usuário chamado "urisso". Conecte-se ao MySQL no banco radius: # mysql -psenha-do-root radius Obs.: Es es exemplos descri os ab ixo são do MySQL, não sou intimo o bastante em ma s nenhum tipo de DB para poder citar exemplos de como criar valores para usuário, ou grupos, ou respostas, ou checagem e etc. Criando o usuário e IP específico que só poderá se conectar atravez deles: mysql> INSERT INTO radcheck (username, attribute, op, value) VALUES ('urisso', 'Password', '==', 'senha-vpn'); mysql> INSERT INTO radcheck (username, attribute, op, value) VALUES ('urisso', 'NASIPAddress', '==', 'IP-DO-NAS'); Insira urisso no grupo Diretoria, na checagem de grupo e uma mensagem de que conexão de "boas vindas": mysql> INSERT INTO usergroup (username, groupname) VALUES ('urisso', 'Diretoria'); mysql> INSERT INTO radreply (username, attribute, op, value) VALUES ('urisso', 'Reply-Message', '==', 'Bem Vindo Chefe'); mysql> INSERT INTO radgroupcheck (groupname, attribute, op, value) VALUES ('Diretoria', 'NAS-IP-Address','==', IP-DO-NAS); Quando você cria o banco de dados MySQL do radius a partir da DDL fornecida nos fontes do módulo, as seguintes tabelas são criadas: radacct - contém informações de contabilidade dos usuários, descrita no capítulo "Extrato de horas"; radcheck - contém a lista de atributos que serão usados para autenticar um usuário específico. O atributo mais necessário para que o usuário tenha acesso seguro é "Password", exemplo:
mysql> SELECT UserName, Attribute, op, Value FROM radcheck WHERE UserName = 'urisso'; UserName | Attribute | op | Value ----------------------------------------------------------- urisso | Password | == | senha-vpn urisso | NASIPAddress | == | IP-DO-NAS ----------------------------------------------------------- Quando urisso tentar se autenticar, será checado os dois parâmetros, Password e NASIPAddress, só será retornado um Access-Accept se a senha estiver certa e a pergunta vier do NAS IP-DO-NAS. Muitos parâmetros podem ser adicionados para limitar a fonte de acesso. radreply - contém uma lista de atributos devolvidos ao usuário. Estes atributos só serão enviados numa resposta diferente de Access-Reject, parâmetros de resposta influenciam na conexão do usuário, você poderá interagir com o NAS (ou RAS), desde que ele tenha flexibilidade para os valores retornados (adquira o manual do seu RAS, é muito interessante saber o que pode ser feito nele pelas respostas do radius).
mysql> SELECT UserName, Attribute, op, Value FROM radreply WHERE UserName = 'urisso'; UserName | Attribute | op | Value ------------------------------------------------------------- urisso | Reply-Message | == | Bem Vindo Chefe ------------------------------------------------------------- Com os registros acima, urisso receberá uma mensagem de boas vindas. mysql> SELECT UserName, GroupName FROM usergroup; UserName | GroupName ---------------------------------- urisso | Diretoria ---------------------------------- mysql> SELECT GroupName, Attribute, op, Value FROM radgroupcheck ORDER BY GroupName; GroupName | Attribute | op | Value -------------------------------------------------------- Diretoria | NAS-IP-Address | == | IP-DO-NAS -------------------------------------------------------- Acima, podemos ver que: Quem é do grupo Diretoria só podem se autenticar se a conexão for intermediada pelo NAS IP-DO-NAS mysql> SELECT GroupName, Attribute, op, Value FROM radgroupreply ORDER BY GroupName; GroupName | Attribute | op | Value ------------------------------------------------------------------- Diretoria | Reply-Message | == | Bem vindo Chefe -------------------------------------------------------------------- mysql> SELECT user, pass, reply, date FROM radpostauth WHERE user = 'urisso'; user | pass | reply | date ----------------------------------------------------------------- urisso | senha-vpn | Access-Accept | 20070211125413 urisso | senha-vpn | Access-Accept | 20070212102318 ----------------------------------------------------------------- Acima, o relatório diz que o usuário autenticou com sucesso nas duas tentativas. O campo date é timestamp: ano, mês, dia, hora, minuto e segundo. Agora que você já sabe como manipular o retorno e a autorização dos usuários, leia o manual do seu NAS e veja quais parâmetros ele aceita e crie seus próprios grupos de acesso. Como disse no começo de tudo se algum usuário não fosse utilizar o MySQL eu faria um breve resumo de como fazer autenticação de usuários em outro banco de dados, lembrando que se tivéssemos usados por exemplo o PostgreSQL teríamos que recompilar o Freeradius com essa opção. No arquivo de configuração sql.conf as únicas mudanças que precisarão serem feitas são no tipo do driver e nas variáveis de server, login, senha, e em qual tipo de database o radiusd fará a pesquisa no banco de dados utilizado e configurado no driver (radius_db). As demais podem permanecerem inalteradas. Se você mudar a estrutura de algumas SQL's do sql.conf para algum propósito particular, recomendo que faça testes manuais no banco de dados para se certificar que estão funcionando. Vamos agora testar pra ver se todas as configurações estão corretas # /usr/local/etc/rc.d/radiusd start Depois vem a VPN em modo interativo # /usr/local/sbin/mpd -k Agora executamos um comando pra testar se o servidor RADIUS esta fazendo a autenticação correta no DB do MySQL. Obs.: MUITO IMPORTANTE ISSO AQUI. No arquivo mpd.conf de demonstração coloquei: set radius server IP-DO-SERVIDOR chave-especifica 1812 1813 # Coloque aqui qual será o classe de IP do NAS o qual o servidor RADIU # reconhecerá você como cliente autorizado. Aconselho que se seja # uma interface a par da sua rede interna set radius me IP-DO-NAS # Interface de rede VPN Isso significa que no exemplo abaixo pra testar o servidor RADIUS usei uma chave e um NAS diferente que usei no arquivo de configuração do MPD, se não, não poderia obter essa resposta conexão estabelecida, afinal quem conectar via VPN receberá uma classe de IP diferente de quem está na rede comum. # radtest urisso senha-vpn IP-DO-SERVIDOR 0 chave-secreta 0 IP-DO-NAS Retornará algo do tipo: Sending Access-Request of id 135 to IP-DO-SERVIDOR port 1812 User-Name = "urisso" User-Password = "chave-secreta" NAS-IP-Address = IP-DO-NAS NAS-Port = 0 Framed-Protocol = PPP rad_recv: Access-Accept packet from host IP-DO-NAS:1812, id=135, length=37 Reply-Message = "Bem Vindo Chefe" Caso não retorne isso de uma olhada em /var/log/radius/radius.log e verifique qual a mensagem de erro que servidor RADIUS reportou para esse log. Execute o MPD em modo interativo e crie uma conexão VPN e conecte no servidor e observe, se caso não houver erros você estará logado. Se não de uma olhada nos logs e verifique qual o possível problema. Agora adicione no /etc/rc.conf as seguintes linhas: mpd_enable="YES"
mpd_flags="-b" radiusd_enable="YES" mysql_enable="YES" Configurando um client VPN no Windows XP
a) Vá até o Painel de controle -> Conexões de Rede -> Assistente para Novas Conexões; b) Abrirá uma caixa de dialogo, clique em Avançar, selecione a 2ª opção e clique em Avançar; c) Selecione novamente a 2ª opção, e digite um nome qualquer em Nome da empresa; d) Clique em Avançar, e selecione a 1ª opção no campo e avance, e digite o IP-DO-SERVIDOR; e) Clique em Concluir, abrirá a janela para conectar no VPN mas ainda não o faça; f) Clique em Propriedades, e vá na aba Segurança e selecione a 2ª opção; g) Clique em Configuração e no tipo de Criptografia de dados selecione a 4ª opção e de OK; h) Vá até a aba Rede, e dê um duplo-clique em Protocolo TCP/IP; i) No Pop-up que abrirá, selecione a 2ª opção e digite o IP-DO-NAS; j) Finalmente de OK, e OK novamente, e coloque o nome do usuário (Ex: urisso) e senha-vpn; Artigo publicado por Danton Dorati - <
Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo
> |