无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

已经描述了一些组织企业 WiFi 的示例。 这里我将描述我是如何实现这样的解决方案以及在不同设备上连接时遇到的问题。 我们将使用现有的 LDAP 和已建立的用户,安装 FreeRadius 并在 Ubnt 控制器上配置 WPA2-Enterprise。 一切看起来都很简单。 让我们来看看…

关于 EAP 方法的一些知识

在开始任务之前,我们需要决定在解决方案中使用哪种身份验证方法。

来自维基百科:

EAP 是一种常用于无线网络和点对点连接的身份验证框架。 该格式首先在 RFC 3748 中描述,并在 RFC 5247 中更新。
EAP 用于选择身份验证方法、传输密钥并通过称为 EAP 方法的插件处理这些密钥。 EAP 方法有很多种,既有 EAP 本身定义的,也有个别供应商发布的。 EAP不定义链路层,它只定义消息格式。 每个使用 EAP 的协议都有自己的 EAP 消息封装协议。

方法本身:

  • LEAP 是 CISCO 开发的专有协议。 发现漏洞。 目前不建议使用
  • EAP-TLS 在无线供应商中得到了很好的支持。 它是一种安全协议,因为它是 SSL 标准的后继者。 设置客户端相当复杂。 除了密码之外,您还需要客户端证书。 许多系统都支持
  • EAP-TTLS - 在许多系统上得到广泛支持,仅在身份验证服务器上使用 PKI 证书提供良好的安全性
  • EAP-MD5 是另一个开放标准。 提供最低限度的安全性。 存在漏洞,不支持相互认证和密钥生成
  • EAP-IKEv2 - 基于互联网密钥交换协议版本 2。提供客户端和服务器之间的相互身份验证和会话密钥建立
  • PEAP 是 CISCO、Microsoft 和 RSA Security 之间的联合解决方案,作为开放标准。 广泛应用于产品中,提供非常好的安全性。 与EAP-TTLS类似,只需要服务器端证书
  • PEAPv0/EAP-MSCHAPv2 - 这是继 EAP-TLS 之后世界上第二个广泛使用的标准。 在 Microsoft、Cisco、Apple、Linux 中使用客户端-服务器关系
  • PEAPv1/EAP-GTC - 由 Cisco 创建,作为 PEAPv0/EAP-MSCHAPv2 的替代方案。 不以任何方式保护身份验证数据。 Windows 操作系统不支持
  • EAP-FAST是Cisco为了纠正LEAP的缺点而开发的一种方法。 使用受保护的访问凭证 (PAC)。 完全未完成

在所有这些品种中,选择仍然不是很多。 所需的身份验证方法:良好的安全性,支持所有设备(Windows 10、macOS、Linux、Android、iOS),而且实际上越简单越好。 因此,选择落在了EAP-TTLS 与PAP 协议的结合上。
可能会出现问题 - 为什么要使用 PAP? 毕竟,它以明文形式传输密码?

恩,那就对了。 FreeRadius 和 FreeIPA 之间的通信将完全像这样进行。 在调试模式下,您可以跟踪用户名和密码的发送方式。 是的,让他们走吧,只有您有权访问 FreeRadius 服务器。

您可以阅读有关 EAP-TTLS 工作原理的更多信息 这里

自由半径

我们将把 FreeRadius 升级到 CentOS 7.6。 这里没有什么复杂的,我们按照通常的方式安装即可。

yum install freeradius freeradius-utils freeradius-ldap -y

在这些软件包中,安装了版本 3.0.13。 后者可以在 https://freeradius.org/

在此之后,FreeRadius 就已经开始工作了。 您可以取消注释 /etc/raddb/users 中的行

steve   Cleartext-Password := "testing"

以调试模式启动服务器

freeradius -X

并从本地主机建立测试连接

radtest steve testing 127.0.0.1 1812 testing123

我们收到了答复 收到从 115:127.0.0.1 到 1812:127.0.0.1 长度 56081 的访问接受 ID 20,这意味着一切正常。 前进。

连接模块 LDAP.

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

我们将立即更改它。 我们需要 FreeRadius 才能访问 FreeIPA

启用 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}})"
}
...

重新启动radius服务器并检查LDAP用户的同步:

radtest user_ldap password_ldap localhost 1812 testing123

编辑 eap 中 启用 mods/eap
这里我们将添加两个 eap 实例。 它们仅在证书和密钥方面有所不同。 我将在下面解释为什么这是真的。

启用 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"
           }
}

接下来我们编辑 站点启用/默认。 我对授权和验证部分感兴趣。

站点启用/默认

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
}

在授权部分,我们删除所有不需要的模块。 我们只留下ldap。 添加通过用户名进行客户端验证。 这就是我们在上面添加两个 eap 实例的原因。

多EAP事实上,当连接某些设备时,我们将使用系统证书并指定域。 我们拥有来自受信任的证书颁发机构的证书和密钥。 就我个人而言,我认为这种连接过程比在每个设备上抛出自签名证书更简单。 但即使没有自签名证书,仍然无法离开。 三星设备和Android =< 6版本不知道如何使用系统证书。 因此,我们使用自签名证书为他们创建一个单独的 eap-guest 实例。 对于所有其他设备,我们将使用带有受信任证书的 eap-client。 用户名由连接设备时的匿名字段确定。 只允许使用 3 个值:Guest、Client 和空字段。 其余的全部丢弃。 这可以在策略中配置。 稍后我会举一个例子。

让我们编辑授权和验证部分 站点启用/内部隧道

站点启用/内部隧道

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
}

接下来,您需要在策略中指定哪些名称可以用于匿名登录。 编辑 策略.d/过滤器.

您需要找到与此类似的行:

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

下面在 elsif 中添加必要的值:

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

现在我们需要移动到目录 证书。 这里我们需要放置来自我们已经拥有的受信任的证书颁发机构的密钥和证书,并且我们需要为 eap-guest 生成自签名证书。

更改文件中的参数 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"

我们在文件中写入相同的值 服务器.cnf。 我们只改变
通用名称:

服务器.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"

我们创造:

make

准备好。 已收到 server.crt这 и server.key 上面我们已经在eap-guest中注册了。

最后,让我们将访问点添加到文件中 客户端配置文件。 我有 7 个,为了不单独添加每个点,我们将仅注册它们所在的网络(我的接入点位于单独的 VLAN 中)。

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

泛快控制器

我们在控制器上建立一个单独的网络。 让它成为192.168.2.0/24
转到设置 -> 个人资料。 让我们创建一个新的:

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

我们记下radius服务器的地址和端口以及写入文件中的密码 客户配置文件:

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

创建新的无线网络名称。 选择 WPA-EAP(企业)作为身份验证方法并指定创建的半径配置文件:

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

我们保存一切,应用它并继续前进。

设置客户端

让我们从最难的部分开始吧!

窗户10

困难在于 Windows 尚不知道如何通过域连接到企业 WiFi。 因此,我们必须手动将证书上传到受信任的证书存储区。 在这里,您可以使用自签名的证书或来自证书颁发机构的证书。 我将使用第二个。

接下来您需要创建一个新连接。 为此,请转至网络和 Internet 设置 -> 网络和共享中心 -> 创建并配置新连接或网络:

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

我们手动输入网络名称并更改安全类型。 然后点击 更改连接设置 然后在“安全”选项卡中,选择网络身份验证 - EAP-TTLS。

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

进入设置,设置身份验证的机密性- 客户。 作为受信任的证书颁发机构,选择我们添加的证书,选中“如果服务器无法授权,则不要向用户发出邀请”框,然后选择身份验证方法 - 明文密码(PAP)。

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

接下来,转到其他参数并选中“指定身份验证模式”框。 选择“用户身份验证”并点击 保存凭证。 在这里您需要输入用户名_ldap和密码_ldap

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

我们保存、应用、关闭一切。 您可以连接到新网络。

Linux

我在 Ubuntu 18.04、18.10、Fedora 29、30 上进行了测试。

首先,您自己下载证书。 我没有发现Linux中是否可以使用系统证书或者是否有这样的商店。

我们将通过域连接。 因此,我们需要购买证书的认证机构颁发的证书。

所有连接均在一个窗口中完成。 选择我们的网络:

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

匿名 - 客户
域 — 为其颁发证书的域

Android

非三星

从版本 7 开始,连接 WiFi 时,您可以通过仅指定域来使用系统证书:

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

域 — 为其颁发证书的域
匿名 - 客户

Samsung

正如我上面所写,三星设备在连接 WiFi 时不知道如何使用系统证书,并且它们不具备通过域连接的能力。 因此,需要手动添加证书颁发机构的根证书(ca.pem,从Radius服务器获取)。 这是使用自签名的地方。

将证书下载到您的设备并安装。

安装证书无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

在这种情况下,您需要设置屏幕解锁图案、PIN 码或密码(如果尚未设置):

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

我展示了安装证书的复杂选项。 在大多数设备上,只需单击下载的证书即可。

安装证书后,您可以继续连接:

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

证书 - 表明您安装的证书
匿名用户-来宾

macos

Apple 设备只能直接连接到 EAP-TLS,但您仍然需要为其提供证书。 要指定不同的连接方法,您需要使用 Apple Configurator 2。因此,您需要首先将其下载到您的 Mac,创建新的配置文件并添加所有必要的 WiFi 设置。

Apple配置器无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

这里我们指出我们网络的名称
安全类型 - WPA2 企业版
接受的 EAP 类型 - TTLS
用户名和密码 - 留空
内部验证-PAP
外部身份——客户

信任选项卡。 这里我们指明我们的域

全部。 配置文件可以保存、签名并分发到设备

配置文件准备好后,您需要将其下载到 Mac 并安装。 在安装过程中,您需要指定用户的usernmae_ldap和password_ldap:

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

iOS

该过程与 macOS 类似。 您需要使用一个配置文件(您可以使用与 macOS 相同的配置文件。请参阅上文,了解如何在 Apple Configurator 中创建配置文件)。

下载配置文件,安装,输入凭据,连接:

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

无线网络企业。 FreeRadius + FreeIPA + Ubiquiti

就这样。 我们设置了 Radius 服务器,将其与 FreeIPA 同步,并告诉 Ubiquiti 接入点使用 WPA2-EAP。

可能的问题

在: 如何将个人资料/证书转移给员工?

关于: 我将所有证书/配置文件存储在 FTP 上,并可通过网络访问。 我设置了一个具有速度限制的访客网络,并且只能访问 Internet(FTP 除外)。
身份验证持续 2 天,之后身份验证将被重置,客户端将无法连接互联网。 那。 当员工想要连接WiFi时,他首先连接到访客网络,登录FTP,下载他需要的证书或配置文件,安装它们,然后可以连接到公司网络。

在: 为什么不使用 MSCHAPv2 方案? 更安全!

关于: 首先,该方案在NPS(Windows网络策略系统)上运行良好,在我们的实现中,需要额外配置LDAP(FreeIpa)并在服务器上存储密码哈希值。 添加。 不建议进行设置,因为这可能会导致超声系统的同步出现各种问题。 其次,散列是MD4,所以它并没有增加太多的安全性

在: 是否可以使用 MAC 地址对设备进行授权?

关于: 不,这不安全,攻击者可以欺骗 MAC 地址,更重要的是,许多设备不支持通过 MAC 地址进行授权

在: 为什么要使用所有这些证书? 无需它们即可连接

关于: 证书用于对服务器进行授权。 那些。 连接时,设备会检查其是否是可信任的服务器。 如果是,则继续进行身份验证;如果不是,则关闭连接。 您可以在没有证书的情况下进行连接,但是如果攻击者或邻居在家里设置了一个 Radius 服务器和一个与我们同名的接入点,他可以轻松拦截用户的凭据(不要忘记它们是以明文形式传输的) 。 当使用证书时,敌人只会在他的日志中看到我们的虚构用户名 - 访客或客户端以及类型错误 - 未知的 CA 证书

有关 macOS 的更多信息通常,在 macOS 上,重新安装系统是通过互联网完成的。 在恢复模式下,Mac 必须连接到 WiFi,我们的公司 WiFi 和访客网络都无法在此处工作。 就我个人而言,我安装了另一个网络,通常的WPA2-PSK,隐藏的,仅用于技术操作。 或者你也可以提前制作一个随系统启动的U盘。 但如果您的 Mac 是 2015 年之后的,您还需要为该闪存驱动器找到一个适配器)

来源: habr.com

添加评论