
已经描述了企业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-基于Internet密钥交换协议版本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 OS不支持
- EAP-FAST是思科开发的一种纠正LEAP缺陷的方法。 使用受保护的访问凭据(PAC)。 尚未完全开发
在所有这些多样性中,选择仍然不是很大。 身份验证方法是必需的:良好的安全性,在所有设备(Windows 10,macOS,Linux,Android,iOS)上的支持,并且实际上越简单越好。 因此,该选择取决于与PAP协议结合使用的EAP-TTLS。
也许出现问题-为什么要使用PAP? 因为它以明文形式传输密码?
是的,没错。 FreeRadius和FreeIPA之间的通信将以这种方式进行。 在调试模式下,您可以跟踪用户名和密码的发送方式。 是的,放开他们,只有您可以访问FreeRadius服务器。
在此处阅读有关EAP-TTLS工作的更多信息
。
辐射半径
我们将在CentOS 7.6上提高FreeRadius。 这里没有什么复杂的,以通常的方式设置。
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
得到一个响应,
从127.0.0.1:1812到127.0.0.1►6081长度为20的接收到的访问接受ID 115 ,那么一切都很好。 来吧
我们连接
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
在
启用了Mods的/ EAP中编辑
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个值:访客,客户和空字段。 其余的将被丢弃。 这是在策略中配置的。 我稍后再举一个例子
编辑已
启用站点/内部隧道中的部分的授权和身份验证
启用站点/内部隧道 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 }
接下来,您需要在策略中指定哪些名称可用于匿名登录。 编辑
policy.d / filter 。
您需要找到类似于以下内容的行:
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 }
现在我们需要移动到
certs目录。 在这里,您需要从我们已经拥有的受信任的证书颁发机构放下密钥和证书,并且需要为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 = admin@admin.ru commonName = "CA FreeRadius"
在
server.cnf文件中指定了相同的值。 我们只改变
commonName :
server.cnf ... default_days = 3650 default_md = sha256 ... input_password = blablabla output_password = blablabla ... countryName = RU stateOrProvinceNmae = State localityNmae = City organizationName = NONAME emailAddress = admin@admin.ru commonName = "Server Certificate FreeRadius"
我们创建:
make
做完了 生成的
server.crt和
server.key已经在eap-guest中进行了注册。
最后,将访问点添加到
client.conf文件。 我有它们7.为了不分别添加每个点,我们将仅注册它们所位于的网络(我的访问点在单独的VLAN中)。
client APs { ipaddr = 192.168.100.0/24 password = password_AP }
泛型控制器
在控制器上,我们建立了一个独立的网络。 设为192.168.2.0/24
转到设置->个人资料。 创建一个新的:

我们写出radius服务器的地址和端口以及在
clients.conf文件中注册的密码:

创建一个新的无线名称。 作为身份验证方法,选择“ WPA-EAP(Enterprise)”并指定创建的半径轮廓:

我们保存,申请并继续前进。
客户设置
让我们从最困难的地方开始!
Windows 10
复杂性归结为Windows仍然无法按域连接到公司WiFi的事实。 因此,您必须手动将我们的证书上载到信任存储。 在这里,您既可以使用自签名证书,也可以使用证书颁发机构的证书。 我将使用第二个。
接下来,您需要创建一个新的连接。 为此,请转到网络和Internet设置->网络和共享中心->创建并配置新的连接或网络:



手动注册网络名称并更改安全性类型。 单击
更改连接设置后 ,在“安全性”部分中,选择“网络身份验证-EAP-TTLS”。



我们进入参数,指定身份验证保密性
-client 。 作为受信任的证书颁发机构,我们选择添加的证书,选中“如果无法对服务器进行授权,则不给用户邀请”框,然后选择身份验证方法-未加密的密码(PAP)。

接下来,转到其他参数,在“指定身份验证模式”上打勾。 选择项目“用户身份验证”,然后单击
保存凭证 。 在这里您需要输入username_ldap和password_ldap



我们保存,应用,关闭所有内容。 您可以连接到新网络。
的Linux
我在Ubuntu 18.04、18.10,Fedora 29、30上进行了测试。
首先,请下载证书。 我没有在Linux中找到是否可以使用系统证书,以及是否根本没有这样的存储。
我们将按域连接。 因此,您需要购买证书的认证中心的证书。
所有连接都在一个窗口中完成。 选择我们的网络:
匿名-客户
域-为其颁发证书的域
安卓系统
非三星
从版本7开始,连接WiFi时,您可以通过仅指定域来使用系统证书:
域-为其颁发证书的域
匿名-客户
三星
如上所述,Samsung设备在连接WiFi时不知道如何使用系统证书,并且它们无法按域连接。 因此,您必须手动添加证书颁发机构的根证书(ca.pem,我们将其放在Radius服务器上)。 这是它将使用自签名的地方。
将证书下载到您的设备并安装。
安装证书后,您可以继续进行连接:
证书-指示已安装的证书
匿名用户-来宾
操作系统
开箱即用的Apple设备只能连接到EAP-TLS,但是您仍然需要为其添加证书。 要指定其他连接方法,您需要使用Apple Configurator2。因此,必须首先将其下载到poppy,创建新的配置文件并添加所有必需的WiFi设置。
苹果配置器
在这里,我们指出您的网络名称
安全类型-WPA2 Enterprise
可接受的EAP类型-TTLS
用户名和密码-留空
内部身份验证-PAP
外部身份-客户
信任标签。 在这里,我们指出我们的域名仅此而已。 配置文件可以保存,签名并分发到设备
配置文件准备就绪后,需要将其下载到罂粟并进行安装。 在安装过程中,您将需要指定usernmae_ldap和password_ldap用户:



的iOS
该过程类似于macOS。 您需要使用配置文件(您可以使用与macOS相同的配置文件。如何在Apple Configurator中创建配置文件,请参见上文)。
下载配置文件,安装,输入凭据,然后连接:






仅此而已。 我们设置了Radius服务器,使其与FreeIPA同步,并告诉Ubiquiti接入点使用WPA2-EAP。
可能的问题
问:如何将个人资料/证书转移给员工?
答:我存储在ftp上并通过Web访问的所有证书/配置文件。 提出了一个仅具有速度限制和Internet访问的来宾网络,但ftp除外。
身份验证持续2天,此后将重置身份验证,并且客户端将无法访问Internet。 T.O. 当员工想要连接到WiFi时,他首先连接到访客网络,访问FTP,下载所需的证书或配置文件,安装它们,然后可以连接到公司网络。
问:为什么不对MSCHAPv2使用架构? 她更安全!
答:首先,这种方案在NPS(Windows网络策略系统)上效果很好,在我们的实现中,有必要另外配置LDAP(FreeIpa)并将密码哈希存储在服务器上。 添加。 建议不要进行设置,因为 这会导致超声同步的各种问题。 其次,哈希是MD4,因此这并不能真正提高安全性。
问:是否可以通过mac-address授权设备?
答:不,这是不安全的,攻击者可以欺骗罂粟地址,而且许多设备不支持对罂粟地址的授权
问:为什么要使用所有这些证书? 你可以没有他们连接
答:证书用于授权服务器。 即 连接后,设备将检查是否可以信任该服务器。 如果是,则认证进一步,如果否,则关闭连接。 您可以不使用证书进行连接,但是,如果攻击者或邻居选择了与我们同名的Radius服务器和接入点,则他可以轻松地拦截用户凭据(不要忘记它们以明文形式传输)。 使用证书时,敌人只会在我们的日志中看到虚构的用户名-来宾或客户端,以及错误类型-未知CA证书
有关macOS的更多信息通常,在macOS上,重新安装系统是通过Internet完成的。 在恢复模式下,罂粟必须连接到WiFi,并且我们的公司WiFi和访客网络都无法在此工作。 我个人则选择了另一个网络,即通常用于技术操作的WPA2-PSK隐藏网络。 否则,您可以提前使用系统制作可引导的USB闪存驱动器。 但如果是2015年之后的罂粟,您仍然需要为此闪存驱动器找到一个适配器)