OpenVPN和Active Directory(不带用户证书的Kerberos)

已经编写了许多有关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客户端无法执行此操作(在撰写本文时,他们已经可以对其进行修复)。

Source: https://habr.com/ru/post/zh-CN469583/


All Articles