34.3. 配置 FreeRADIUS ,以使用 EAP 安全地验证网络客户端
FreeRADIUS 支持通过不同的扩展验证协议(EAP)的方法。但是,对于受支持的安全场景,请使用 EAP-TTLS (隧道传输层安全)。
使用 EAP-TTLS ,客户端使用安全 TLS 连接作为外部身份验证协议来设置隧道。然后,内部身份验证使用 LDAP 向身份管理进行身份验证。要使用 EAP-TTLS,您需要一个 TLS 服务器证书。
默认的 FreeRADIUS 配置文件充当文档,并描述了所有参数和指令。如果要禁用某些特性,请注释掉它们,而不是删除配置文件中的相应部分。这可让您保留配置文件和包含的文档的结构。
先决条件
-
您已安装了
freeradius和freeradius-ldap软件包。 -
/etc/raddb/目录中的配置文件保持不变,因为是如freeradius软件包提供的。 - 主机已在 Red Hat Enterprise Linux Identity Management (IdM)域中注册。
流程
创建一个私钥并从 IdM 请求一个证书:
# ipa-getcert request -w -k /etc/pki/tls/private/radius.key -f /etc/pki/tls/certs/radius.pem -o "root:radiusd" -m 640 -O "root:radiusd" -M 640 -T caIPAserviceCert -C 'systemctl restart radiusd.service' -N freeradius.idm.example.com -D freeradius.idm.example.com -K radius/freeradius.idm.example.comcertmonger服务将私钥存储在/etc/pki/tls/private/radius.key文件中,将证书存储在/etc/pki/tls/certs/radius.pem文件中,并设置安全权限。另外,certmonger将监控证书,在证书过期前续订证书,并在证书续订后重启radiusd服务。验证 CA 是否已成功发布证书:
# ipa-getcert list -f /etc/pki/tls/certs/radius.pem ... Number of certificates and requests being tracked: 1. Request ID '20240918142211': status: MONITORING stuck: no key pair storage: type=FILE,location='/etc/pki/tls/private/radius.key' certificate: type=FILE,location='/etc/pki/tls/certs/radius.crt' ...使用 Diffie-Hellman (DH)参数创建
/etc/raddb/certs/dh文件。例如,要创建带有 2048 位素数的 DH 文件,请输入:# openssl dhparam -out /etc/raddb/certs/dh 2048为了安全起见,请不要使用小于 2048 位素数的 DH 文件。根据位数,文件的创建可能需要几分钟。
编辑
/etc/raddb/mods-available/eap文件:在
tls-config tls-common指令中配置与 TLS 相关的设置:eap { ... tls-config tls-common { ... private_key_file = /etc/pki/tls/private/radius.key certificate_file = /etc/pki/tls/certs/radius.pem ca_file = /etc/ipa/ca.crt ... } }将
eap指令中的default_eap_type参数设为ttls:eap { ... default_eap_type = ttls ... }注释掉
md5指令,以禁用不安全的 EAP-MD5 身份验证方法:eap { ... # md5 { # } ... }请注意,在默认的配置文件中,其他不安全的 EAP 身份验证方法默认被注释掉了。
编辑
/etc/raddb/sites-available/default文件,然后注释掉eap以外的所有身份验证方法:authenticate { ... # Auth-Type PAP { # pap # } # Auth-Type CHAP { # chap # } # Auth-Type MS-CHAP { # mschap # } # mschap # digest ... }这将只对外部身份验证启用了 EAP,并禁用了纯文本身份验证方法。
编辑
/etc/raddb/sites-available/inner-tunnel文件,并进行以下更改:注释掉
-ldap条目,并将ldap模块配置添加到authorize指令中:authorize { ... #-ldap ldap if ((ok || updated) && User-Password) { update { control:Auth-Type := ldap } } ... }在
authenticate指令中取消 LDAP 身份验证类型的注释:authenticate { Auth-Type LDAP { ldap } }
启用
ldap模块:# ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap编辑
/etc/raddb/mods-available/ldap文件,并进行以下更改:在
ldap指令中,设置 IdM LDAP 服务器 URL 和基本可分辨名称(DN):ldap { ... server = 'ldaps://idm_server.idm.example.com' base_dn = 'cn=users,cn=accounts,dc=idm,dc=example,dc=com' ... }在服务器 URL 中指定
ldaps协议,以便在 FreeRADIUS 主机和 IdM 服务器之间使用 TLS 加密的连接。在
ldap指令中,启用 IdM LDAP 服务器的 TLS 证书验证:tls { ... require_cert = 'demand' ... }
编辑
/etc/raddb/clients.conf文件:在
localhost和localhost_ipv6客户端指令中设置安全密码:client localhost { ipaddr = 127.0.0.1 ... secret = localhost_client_password ... } client localhost_ipv6 { ipv6addr = ::1 secret = localhost_client_password }为网络验证器添加客户端指令:
client hostapd.example.org { ipaddr = 192.0.2.2/32 secret = hostapd_client_password }可选:如果其他主机也能够访问 FreeRADIUS 服务,也为它们添加客户端指令,例如:
client <hostname_or_description> { ipaddr = <IP_address_or_range> secret = <client_password> }ipaddr参数接受 IPv4 和 IPv6 地址,您可以使用可选的无类别域间路由(CIDR)表示法来指定范围。但是,在这个参数中您只能设置一个值。例如,要授予对 IPv4 和 IPv6 地址的访问,您必须添加两个客户端指令。为客户端指令使用一个描述性名称,如主机名或一个描述 IP 范围在哪里使用的词语。
验证配置文件:
# radiusd -XC ... Configuration appears to be OK在
firewalld服务中打开 RADIUS 端口:# firewall-cmd --permanent --add-service=radius # firewall-cmd --reload启用并启动
radiusd服务:# systemctl enable --now radiusd
故障排除
如果
radiusd服务无法启动,请验证您是否可以解析 IdM 服务器主机名:# host -v idm_server.idm.example.com对于其他问题,请在 debug 模式下运行
radiusd:停止
radiusd服务:# systemctl stop radiusd以 debug 模式启动该服务:
# radiusd -X ... Ready to process requests-
在 FreeRADIUS 主机上执行验证测试,如
验证部分中所述。
后续步骤
- 禁用不再需要的身份验证方法,以及您不使用的其他功能。