当IT系统的数量增多,统一管理各个信息系统的用户信息就是一件很有必要的事情,否则一个个系统去开通和注销用户,不但操作繁琐容易出错,而且可能会出现不安全的情况。比如张三离职后注销了人资系统的帐号却还在可以登录办公系统,或者李四离开公司还可以登录公司内部网络。
目录服务器就是专为统一认证用户信息设计,我们最熟悉的轻量级目录服务器,除了Windows Active Directory,就是Linux下的OpenLDAP了。
这里我们更进一步,不但使用openldap统一认证,而且使用其过滤功能分离权限,避免一个人有了账户就可以登录任意系统。
也就是说v**用户不一定可以使用svn和gitlab,反过来svn用户也不一定可以使用v**和gitlab服务。
具体的做法就是使用inetOrgPerson对象的businessCategory属性来定义svn/gitlab/openvpn权限。
配置如下:
SVN
代码语言:javascript复制<Location /svn>
......
AuthLDAPURL "ldap://x.x.x.x:389/ou=people,dc=example,dc=com?cn??(&(businessCategory=*svn*)(objectClass=inetOrgPerson))"
Require valid-user
AuthBasicProvider ldap
......
</Location>
GitLab
代码语言:javascript复制gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = {
'main' => {
'label' => 'OpenLDAP',
'host' => 'x.x.x.x',
'port' => 389,
'uid' => 'cn',
'encryption' => 'plain',
'verify_certificates' => true,
'active_directory' => false,
'base' => 'ou=people,dc=example,dc=com',
'allow_username_or_email_login' => false,
'user_filter' => '(&(businessCategory=*git*)(objectClass=inetOrgPerson))',
}
}
openvpn
安装包 openvpn-auth-ldap
主配置文件
/etc/openvpn/server.conf
代码语言:javascript复制plugin /usr/lib64/openvpn/plugins/openvpn-auth-ldap.so /etc/openvpn/auth/ldap.conf
该插件配置文件
/etc/openvpn/auth/ldap.conf
代码语言:javascript复制<LDAP>
URL ldap://x.x.x.x:389
</LDAP>
<Authorization>
BaseDN "ou=people,dc=example,dc=com"
SearchFilter "(&(cn=%u)(businessCategory=*vpn*))"
RequireGroup false
</Authorization>
通过上面的配置,svn/gitlab/openldap服务都通过openldap统一认证用户,但是各个系统用户权限还是独立的,不会出现一个用户注册后可以登录任意系统的情况,开通权限也很简单,直接给businessCategory赋值使其包含过滤关键字就可以了。如"vpn git"就可以使用vpn和git,"svn git"就可以使用svn和git,"vpn git svn"就是都可以访问。
说明
ldap是一个广泛通用的协议,几乎所有操作系统,网络设备,和应用程序都可以使用它来进行用户认证。
上面使用businessCategory属性只是为了方便而已,实际用户可以自己创建对象和属性,比如创建一个名为XPerson的对象,在里面创建一个名为xNet的属性,一样可以用来作限制。
实际上ldap可以看作一个为专用于认证的数据库,新建属性类似传统数据库里面为表添加自定义字段。
PS: pve下有OpenLDAP的lxc容器模板,整个安装配置只需要几分钟。