Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Alguns exemplos de organização de WiFi corporativo já foram descritos. Descreverei aqui como implementei essa solução e os problemas que encontrei ao conectar em diferentes dispositivos. Usaremos o LDAP existente com usuários estabelecidos, instalaremos o FreeRadius e configuraremos o WPA2-Enterprise no controlador Ubnt. Tudo parece simples. Vamos ver…

Um pouco sobre métodos EAP

Antes de iniciarmos a tarefa, precisamos decidir qual método de autenticação usaremos em nossa solução.

Da Wikipedia:

EAP é uma estrutura de autenticação frequentemente usada em redes sem fio e conexões ponto a ponto. O formato foi descrito pela primeira vez na RFC 3748 e atualizado na RFC 5247.
EAP é usado para selecionar um método de autenticação, transferir chaves e processar essas chaves por plug-ins chamados métodos EAP. Existem muitos métodos EAP, tanto definidos com o próprio EAP quanto aqueles lançados por fornecedores individuais. O EAP não define a camada de enlace, apenas define o formato da mensagem. Cada protocolo que usa EAP possui seu próprio protocolo de encapsulamento de mensagens EAP.

Os próprios métodos:

  • LEAP é um protocolo proprietário desenvolvido pela CISCO. Vulnerabilidades encontradas. Atualmente não recomendado para uso
  • O EAP-TLS é bem suportado por fornecedores sem fio. É um protocolo seguro porque é o sucessor dos padrões SSL. Configurar o cliente é bastante complicado. Você precisa de um certificado de cliente além da senha. Suportado em muitos sistemas
  • EAP-TTLS – amplamente suportado em muitos sistemas, oferece boa segurança usando certificados PKI apenas no servidor de autenticação
  • EAP-MD5 é outro padrão aberto. Oferece segurança mínima. Vulnerável, não suporta autenticação mútua e geração de chaves
  • EAP-IKEv2 - baseado no Internet Key Exchange Protocol versão 2. Fornece autenticação mútua e estabelecimento de chave de sessão entre cliente e servidor
  • PEAP é uma solução conjunta entre CISCO, Microsoft e RSA Security como um padrão aberto. Amplamente disponível em produtos, oferece segurança muito boa. Semelhante ao EAP-TTLS, exigindo apenas um certificado do lado do servidor
  • PEAPv0/EAP-MSCHAPv2 – Depois do EAP-TLS, este é o segundo padrão amplamente utilizado no mundo. Relacionamento cliente-servidor usado em Microsoft, Cisco, Apple, Linux
  • PEAPv1/EAP-GTC - Criado pela Cisco como uma alternativa ao PEAPv0/EAP-MSCHAPv2. Não protege os dados de autenticação de forma alguma. Não suportado no sistema operacional Windows
  • EAP-FAST é um método desenvolvido pela Cisco para corrigir as deficiências do LEAP. Usa credencial de acesso protegido (PAC). Completamente inacabado

De toda essa variedade, a escolha ainda não é grande. O método de autenticação exigia: boa segurança, suporte em todos os dispositivos (Windows 10, macOS, Linux, Android, iOS) e, na verdade, quanto mais simples melhor. Portanto, a escolha recaiu sobre o EAP-TTLS em conjunto com o protocolo PAP.
Pode surgir a pergunta - Por que usar o PAP? Afinal, ele transmite senhas em texto não criptografado?

Sim está certo. A comunicação entre FreeRadius e FreeIPA ocorrerá exatamente assim. No modo de depuração, você pode acompanhar como o nome de usuário e a senha são enviados. Sim, e deixe-os ir, só você tem acesso ao servidor FreeRadius.

Você pode ler mais sobre como funciona o EAP-TTLS aqui

FreeRADIUS

Atualizaremos o FreeRadius para CentOS 7.6. Não há nada complicado aqui, instalamos da maneira usual.

yum install freeradius freeradius-utils freeradius-ldap -y

Dos pacotes, a versão 3.0.13 está instalada. Este último pode ser tomado em https://freeradius.org/

Depois disso, o FreeRadius já está funcionando. Você pode descomentar a linha em /etc/raddb/users

steve   Cleartext-Password := "testing"

Inicie no servidor em modo de depuração

freeradius -X

E faça uma conexão de teste do localhost

radtest steve testing 127.0.0.1 1812 testing123

Recebemos uma resposta ID de aceitação de acesso recebido 115 de 127.0.0.1:1812 a 127.0.0.1:56081 comprimento 20, significa que está tudo bem. Vá em frente.

Conectando o módulo ldap.

ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap

E vamos mudar isso imediatamente. Precisamos do FreeRadius para poder acessar o FreeIPA

habilitado para mods/ldap

ldap {
server="ldap://ldap.server.com"
port=636
start_tls=yes
identity="uid=admin,cn=users,dc=server,dc=com"
password=**********
base_dn="cn=users,dc=server,dc=com"
set_auth_type=yes
...
user {
base_dn="${..base_dn}"
filter="(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
}
...

Reinicie o servidor radius e verifique a sincronização dos usuários LDAP:

radtest user_ldap password_ldap localhost 1812 testing123

Editando eap em habilitado para mods/eap
Aqui adicionaremos duas instâncias de eap. Eles diferirão apenas em certificados e chaves. Explicarei por que isso é verdade abaixo.

habilitado para mods/eap

eap eap-client {                                                                                                                                                                                                                           default_eap_type = ttls                                                                                                                                                                                                                 timer_expire = 60                                                                                                                                                                                                                       ignore_unknown_eap_types = no                                                                                                                                                                                                          cisco_accounting_username_bug = no                                                                                                                                                                                                      max_sessions = ${max_requests}
           tls-config tls-common {
           private_key_file = ${certdir}/fisrt.key
           certificate_file = ${certdir}/first.crt
           dh_file = ${certdir}/dh
           ca_path = ${cadir}
           cipher_list = "HIGH"
           cipher_server_preference = no
           ecdh_curve = "prime256v1"
           check_crl = no
           }
                                                                                                                                                                                                                                                                                                                                                                                                                                                 
           ttls {
           tls = tls-common
           default_eap_type = md5
           copy_request_to_tunnel = no
           use_tunneled_reply = yes
           virtual_server = "inner-tunnel"
           }
}
eap eap-guest {
default_eap_type = ttls                                                                                                                                                                                                                 timer_expire = 60                                                                                                                                                                                                                       ignore_unknown_eap_types = no                                                                                                                                                                                                          cisco_accounting_username_bug = no                                                                                                                                                                                                      max_sessions = ${max_requests}
           tls-config tls-common {
           private_key_passwotd=blablabla
           private_key_file = ${certdir}/server.key
           certificate_file = ${certdir}/server.crt
           dh_file = ${certdir}/dh
           ca_path = ${cadir}
           cipher_list = "HIGH"
           cipher_server_preference = no
           ecdh_curve = "prime256v1"
           check_crl = no
           }
                                                                                                                                                                                                                                                                                                                                                                                                                                                 
           ttls {
           tls = tls-common
           default_eap_type = md5
           copy_request_to_tunnel = no
           use_tunneled_reply = yes
           virtual_server = "inner-tunnel"
           }
}

A seguir editamos habilitado para site/padrão. Estou interessado nas seções de autorização e autenticação.

habilitado para site/padrão

authorize {
  filter_username
  preprocess
  if (&User-Name == "guest") {
   eap-guest {
       ok = return
   }
  }
  elsif (&User-Name == "client") {
    eap-client {
       ok = return 
    }
  }
  else {
    eap-guest {
       ok = return
    }
  }
  ldap
  if ((ok || updated) && User-Password) {
    update {
        control:Auth-Type := ldap
    }
  }
  expiration
  logintime
  pap
  }

authenticate {
  Auth-Type LDAP {
    ldap
  }
  Auth-Type eap-guest {
    eap-guest
  }
  Auth-Type eap-client {
    eap-client
  }
  pap
}

Na seção de autorização, removemos todos os módulos que não precisamos. Deixamos apenas ldap. Adicione verificação de cliente por nome de usuário. É por isso que adicionamos duas instâncias de eap acima.

Multi EAPO fato é que ao conectar alguns dispositivos usaremos certificados de sistema e especificaremos o domínio. Temos um certificado e uma chave de uma autoridade de certificação confiável. Pessoalmente, na minha opinião, esse procedimento de conexão é mais simples do que colocar um certificado autoassinado em cada dispositivo. Mas mesmo sem certificados autoassinados ainda não foi possível sair. Dispositivos Samsung e Android =< 6 versões não sabem como usar certificados de sistema. Portanto, criamos uma instância separada de eap-guest para eles com certificados autoassinados. Para todos os outros dispositivos usaremos eap-client com um certificado confiável. O nome de usuário é determinado pelo campo Anônimo ao conectar o dispositivo. São permitidos apenas 3 valores: Convidado, Cliente e um campo vazio. O resto é tudo descartado. Isso pode ser configurado nas políticas. Darei um exemplo um pouco mais tarde.

Vamos editar as seções de autorização e autenticação em habilitado para site/túnel interno

habilitado para site/túnel interno

authorize {
  filter_username
  filter_inner_identity
  update control {
   &Proxy-To-Realm := LOCAL
  }
  ldap
  if ((ok || updated) && User-Password) {
    update {
        control:Auth-Type := ldap
    }
  }
  expiration
  digest
  logintime
  pap
  }

authenticate {
  Auth-Type eap-guest {
    eap-guest
  }
  Auth-Type eap-client {
    eap-client
  }
  Auth-Type PAP {
    pap
  }
  ldap
}

Em seguida, você precisa especificar nas políticas quais nomes podem ser usados ​​para login anônimo. Edição política.d/filtro.

Você precisa encontrar linhas semelhantes a esta:

if (&outer.request:User-Name !~ /^(anon|@)/) {
  update request {
    Module-Failure-Message = "User-Name is not anonymized"
  }
  reject
}

E abaixo no elsif adicione os valores necessários:

elsif (&outer.request:User-Name !~ /^(guest|client|@)/) {
  update request {
    Module-Failure-Message = "User-Name is not anonymized"
  }
  reject
}

Agora precisamos ir para o diretório certs. Aqui precisamos colocar a chave e o certificado de uma autoridade de certificação confiável, que já temos, e precisamos gerar certificados autoassinados para eap-guest.

Alterando os parâmetros no arquivo ca.cnf.

ca.cnf


...
default_days = 3650
default_md = sha256
...
input_password = blablabla
output_password = blablabla
...
countryName = RU
stateOrProvinceNmae = State
localityNmae = City
organizationName = NONAME
emailAddress = [email protected]
commonName = "CA FreeRadius"

Escrevemos os mesmos valores no arquivo servidor.cnf. Nós apenas mudamos
nome comum:

servidor.cnf


...
default_days = 3650
default_md = sha256
...
input_password = blablabla
output_password = blablabla
...
countryName = RU
stateOrProvinceNmae = State
localityNmae = City
organizationName = NONAME
emailAddress = [email protected]
commonName = "Server Certificate FreeRadius"

Nós criamos:

make

Preparar. Recebido servidor.crt и servidor.chave Já nos registramos acima no eap-guest.

E por último, vamos adicionar nossos pontos de acesso ao arquivo cliente.conf. Tenho 7. Para não adicionar cada ponto separadamente, vamos cadastrar apenas a rede em que estão localizados (meus pontos de acesso estão em uma VLAN separada).

client APs {
ipaddr = 192.168.100.0/24
password = password_AP
}

Controlador Ubiquiti

Criamos uma rede separada no controlador. Que seja 192.168.2.0/24
Vá para configurações -> perfil. Vamos criar um novo:

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Anotamos o endereço e porta do servidor radius e a senha que estava escrita no arquivo clientes.conf:

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Crie um novo nome de rede sem fio. Selecione WPA-EAP (Enterprise) como método de autenticação e especifique o perfil radius criado:

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Salvamos tudo, aplicamos e seguimos em frente.

Configurando clientes

Vamos começar com a parte mais difícil!

Windows 10

A dificuldade se resume ao fato de o Windows ainda não saber como se conectar ao WiFi corporativo através de um domínio. Portanto, temos que carregar manualmente nosso certificado para o armazenamento de certificados confiável. Aqui você pode usar um autoassinado ou de uma autoridade de certificação. Vou usar o segundo.

Em seguida, você precisa criar uma nova conexão. Para fazer isso, vá para Configurações de Rede e Internet -> Central de Rede e Compartilhamento -> Criar e configurar uma nova conexão ou rede:

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Inserimos manualmente o nome da rede e alteramos o tipo de segurança. Em seguida, clique em alterar configurações de conexão e na guia Segurança, selecione autenticação de rede - EAP-TTLS.

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Vá para as configurações, defina a confidencialidade da autenticação - cliente. Como autoridade de certificação confiável, selecione o certificado que adicionamos, marque a caixa “Não emitir convite ao usuário se o servidor não puder ser autorizado” e selecione o método de autenticação - senha de texto simples (PAP).

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Em seguida, vá para parâmetros adicionais e marque a caixa “Especificar modo de autenticação”. Selecione “Autenticação do usuário” e clique em salvar credenciais. Aqui você precisará inserir username_ldap e password_ldap

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Salvamos, aplicamos, fechamos tudo. Você pode se conectar a uma nova rede.

Linux

Testei no Ubuntu 18.04, 18.10, Fedora 29, 30.

Primeiro, baixe o certificado para você. Não descobri no Linux se é possível usar certificados de sistema ou se existe tal armazenamento.

Vamos nos conectar via domínio. Portanto, precisamos de um certificado da autoridade de certificação da qual nosso certificado foi adquirido.

Todas as conexões são feitas em uma janela. Selecione nossa rede:

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

anônimo - cliente
domínio — o domínio para o qual o certificado foi emitido

Android

não Samsung

A partir da versão 7, ao conectar WiFi, você pode usar certificados de sistema especificando apenas o domínio:

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

domínio — o domínio para o qual o certificado foi emitido
anônimo - cliente

Samsung

Como escrevi acima, os dispositivos Samsung não sabem como usar certificados de sistema ao conectar-se ao WiFi e não têm a capacidade de se conectar via domínio. Portanto, você precisa adicionar manualmente o certificado raiz da autoridade de certificação (ca.pem, retire-o do servidor Radius). É aqui que a autoassinada será usada.

Baixe o certificado para o seu dispositivo e instale-o.

Instalando um certificadoEmpresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Nesse caso, você precisará definir um padrão de desbloqueio de tela, código PIN ou senha, caso ainda não esteja definido:

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Mostrei uma opção complexa para instalar um certificado. Na maioria dos dispositivos, basta clicar no certificado baixado.

Quando o certificado estiver instalado, você poderá prosseguir para a conexão:

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

certificado - indique aquele que você instalou
usuário anônimo - convidado

MacOS

Os dispositivos Apple só podem se conectar ao EAP-TLS imediatamente, mas você ainda precisa fornecer um certificado a eles. Para especificar um método de conexão diferente, você precisa usar o Apple Configurator 2. Assim, você precisa primeiro baixá-lo para o seu Mac, criar um novo perfil e adicionar todas as configurações WiFi necessárias.

Configuração AppleEmpresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Aqui indicamos o nome da nossa rede
Tipo de segurança – WPA2 Enterprise
Tipos de EAP aceitos - TTLS
Nome de usuário e senha - deixe em branco
Autenticação Interna - PAP
Identidade Externa - cliente

Guia Confiança. Aqui indicamos nosso domínio

Todos. O perfil pode ser salvo, assinado e distribuído para dispositivos

Depois que o perfil estiver pronto, você precisará baixá-lo para o seu Mac e instalá-lo. Durante o processo de instalação, você precisará especificar usernmae_ldap e password_ldap do usuário:

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

iOS

O processo é semelhante ao macOS. Você precisa usar um perfil (você pode usar o mesmo do macOS. Veja acima como criar um perfil no Apple Configurator).

Baixe o perfil, instale, insira as credenciais, conecte-se:

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Empresa Wi-Fi. FreeRadius + FreeIPA + Ubiquiti

Isso é tudo. Configuramos o servidor Radius, sincronizamos com o FreeIPA e informamos aos pontos de acesso da Ubiquiti para usarem WPA2-EAP.

Possíveis perguntas

AT: como transferir um perfil/certificado para um funcionário?

Sobre: Armazeno todos os certificados/perfis em FTP com acesso via web. Configurei uma rede para convidados com limite de velocidade e acesso apenas à Internet, com exceção do FTP.
A autenticação dura 2 dias, após os quais é reiniciada e o cliente fica sem Internet. Que. Quando um funcionário deseja se conectar ao WiFi, ele primeiro se conecta à rede de convidados, faz login no FTP, baixa o certificado ou perfil necessário, instala-os e, em seguida, pode se conectar à rede corporativa.

AT: por que não usar um esquema com MSCHAPv2? é mais seguro!

Sobre: em primeiro lugar, este esquema funciona bem em NPS (Windows Network Policy System), em nossa implementação é necessário configurar adicionalmente o LDAP (FreeIpa) e armazenar hashes de senha no servidor. Adicionar. Não é aconselhável fazer configurações, pois isso pode levar a vários problemas de sincronização do sistema de ultrassom. Em segundo lugar, o hash é MD4, por isso não adiciona muita segurança

AT: É possível autorizar dispositivos usando endereços MAC?

Sobre: NÃO, isso não é seguro, um invasor pode falsificar endereços MAC e, mais ainda, a autorização por endereços MAC não é suportada em muitos dispositivos

AT: Por que usar todos esses certificados? você pode se conectar sem eles

Sobre: certificados são usados ​​para autorizar o servidor. Aqueles. Ao se conectar, o dispositivo verifica se é um servidor confiável ou não. Se sim, então a autenticação prossegue; caso contrário, a conexão é encerrada. Você pode se conectar sem certificados, mas se um invasor ou vizinho configurar um servidor radius e um ponto de acesso com o mesmo nome que o nosso em casa, ele poderá interceptar facilmente as credenciais do usuário (não se esqueça que elas são transmitidas em texto não criptografado) . E quando um certificado for usado, o inimigo verá em seus logs apenas nosso nome de usuário fictício - convidado ou cliente e um erro de tipo - Certificado CA desconhecido

um pouco mais sobre o macOSNormalmente, no macOS, a reinstalação do sistema é feita pela Internet. No modo de recuperação, o Mac deve estar conectado ao WiFi, e nem o WiFi corporativo nem a rede de convidados funcionarão aqui. Pessoalmente instalei outra rede, a usual WPA2-PSK, oculta, apenas para operações técnicas. Ou você também pode criar uma unidade flash USB inicializável com o sistema antecipadamente. Mas se o seu Mac for posterior a 2015, você também precisará encontrar um adaptador para esta unidade flash)

Fonte: habr.com

Adicionar um comentário