已经编写了许多有关OpenVPN的指南,包括通过Active Directory进行授权。 他们中的大多数归结为使用LDAP,但我没有找到使用Kerberos的方法,该方法写在完整的文章中。 但是,这里不会发明新的东西,我只是编译了在我之前已经做过的事情,PAM与Kerberos可以很好地工作,并且OpenVPN具有本机PAM插件。 我还决定拒绝用户证书和提示,他们只是建议所有用户都颁发一个证书,但这些证书不适合我,因此发现了另一个对所有客户端都有效的解决方案。

关于NSS的一些知识
就我而言,我将Centos 7与sssd结合使用。 但是,没有什么可以阻止使用winbind的。 最主要的是要在域中拥有汽车和Kerberos票证。 我不会写这是怎么做的,因为 我不会说什么新鲜的东西,网络上有很多不错的手册。
如果以前没有做过,那么有必要更改
/etc/nsswitch.conf
的设置。 根据所使用的模块,您需要分别输入
sss或winbind而不是module_name。 可以使用
man nsswitch.conf
读取参数说明。
以下设置应足够:
passwd: files module_name shadow: files module_name group: files module_name
对于sssd,我们不会忘记[sssd]块中的
/etc/sssd/sssd.conf
等其他信息:
services = nss, pam
至于winbind,我很难说些什么,我还没使用过。
最终目标是从getent获得正确的结果。 检查机器是否可以接收有关域用户和组的信息:
> getent passwd kanlas kanlas:*:14123583:1257570:Kanlas Kanlasovich:/home/kanlas@example.com:/bin/bash > getent group VPN vpn:*:13821391:kanlas,igor,marina
注意事项如果您使用sssd并且仅使用全名(即kanlas@example.com)获得用户数据,请在域块中的sssd.conf中添加use_fully_qualified_names = False
参数。
配置PAM
现在,您需要创建自己的PAM模块。 为了不使用系统access.conf,我们将从读取访问组的位置创建一个单独的文件。 我不太擅长PAM模块,因此无法在下面的示例中说明是否需要所有代码行。 通常,我们只对
account required pam_listfile.so onerr=fail item=group sense=allow file=/etc/openvpn/auth/access-groups
的行
account required pam_listfile.so onerr=fail item=group sense=allow file=/etc/openvpn/auth/access-groups
感兴趣
account required pam_listfile.so onerr=fail item=group sense=allow file=/etc/openvpn/auth/access-groups
。
最简单的选择是采用例如登录模块,并向其中添加所需的行。 完成了
我们得到:
#%PAM-1.0 auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so auth substack system-auth auth include postlogin account required pam_listfile.so onerr=fail item=group sense=allow file=/etc/openvpn/auth/access-groups account include system-auth password include system-auth session required pam_selinux.so close session required pam_loginuid.so session optional pam_console.so session required pam_selinux.so open session required pam_namespace.so session optional pam_keyinit.so force revoke session include system-auth session include postlogin -session optional pam_ck_connector.so
我们将其放在
/etc/pam.d
,并自行命名。
在模块中指定的
/etc/openvpn/auth/access-groups
,访问组将被写入此处,您可以根据需要指定路径。 您将需要使用域指定组的名称(通用名称)。 就我而言,我在那里写了
VPN@example.com 。
还需要向OpenVPN解释它需要使用PAM。 我们在服务器配置中添加了以下几行:
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so __pam username-as-common-name
不同的发行版可能有不同的路径! 按路径检查文件,或使用查找。使用username-as-common-name参数的原因是,否则,在客户端具有auth-user-pass之后,
证书中指定的
名称将被发送到服务器。在客户端配置中,添加以下行
auth-user-pass
在此设置完成后,即可进行测试。
我们删除用户证书
现在,我们已经通过域获得了授权,并且用户证书已无用,放弃它似乎是一个合理的决定。 但是移动客户端对此有问题,只是不接受这种配置,而台式机虽然可以工作,但却在恶意诅咒。 首先,我们将重新配置服务器,使其不再需要证书。
verify-client-cert none
接下来,我们添加到客户端配置
setenv CLIENT_CERT 0
就是这样,现在客户不会对证书发誓。 有趣的是,此选项隐藏在
iOS的“问答”部分。 我尚未在iOS上进行过测试,但是Android,MacOS(
测试版客户端 )和Windows都接受了这些设置。 目前只有Android上
的第三方OpenVPN客户端无法执行此操作(在撰写本文时,他们已经可以对其进行修复)。