家庭工作站打造之旅(四)–LDAP认证与集成

原理简介

随着工作站里的人员和服务越来越多,对于账号的管理问题开始暴露出来,我们希望能够统一管理人员账号以及人员账号和服务之间的关系,目录服务(Directory Services)为此而生!

LDAP是Lightweight Directory Access Protocol的缩写,顾名思义,它是指轻量级目录访问协议(这个主要是相对另一目录访问协议X.500而言的;LDAP略去了x.500中许多不太常用的功能,且以TCP/IP协议为基础)。

LDAP目录以树状的层次结构来存储数据(这很类同于DNS),最顶层即根部称作“基准DN”,形如”dc=krproject,dc=org”。在根目录的下面有很多的文件和目录,为了把这些大量的数据从逻辑上分开,LDAP像其它的目录服务协议一样使用OU(Organization Unit),可以用来表示公司内部机构,如部门等,也可以用来表示设备、人员等。同时OU还可以有子OU,用来表示更为细致的分类。

LDAP中每一条记录都有一个唯一的区别于其它记录的名字DN(Distinguished Name),其处在“叶子”位置的部分称作RDN;如dn:uid=tiger,ou=people,dc=krproject,dc=org中tiger即为RDN;RDN在一个OU中必须是唯一的。

安装步骤

以下为笔者在虚拟主机Ubuntu16.04上的安装步骤,其中:

OpenLDAP服务的安装与配置

安装openldap服务及工具包:

1
2
sudo apt-get update
sudo apt-get install slapd ldap-utils

配置slapd:

1
sudo dpkg-reconfigure slapd

会被问到一系列问题:

  • Omit OpenLDAP server configuration?: No
  • DNS domain name: 基于输入的domain创建基本的目录结构。krproject.org
  • Organization name: krproject
  • Administrator password: 安装时候输入的密码,或使用新密码。
  • Database backend to use: HDB
  • removed when slapd is purged?: No
  • Move old database?: Yes
  • Allow LDAPv2 protocol?: No

配置slapd仅本机访问:

1
sudo vi /etc/default/slapd

SLAPD_SERVICES="ldap:/// ldapi:///" 替换为:SLAPD_SERVICES="ldap://127.0.0.1:389/ ldapi:///"

LDAP Account Manager的安装与配置

因为是php的应用,这里我们采用源码方式安装:
https://www.ldap-account-manager.org/lamcms/releases 处直接下载最新(6.3)的tar.bz2包,解压后,将内容放在apache2服务根目录/var/www/html/下新建目录中。

LDAP Account Manager的配置全部在web端控制,通过访问域名+目录名即可进行!

Self Service Password的安装与配置

因为是php的应用,这里我们采用源码方式安装:
https://ltb-project.org/download#self_service_password 处直接下载最新(1.2)的tar.gz包,解压后,将内容放在apache2服务根目录/var/www/html/下新建目录中。

编辑目录下的conf/config.inc.php文件,配置ldapmail段为自己所需配置即可。

系统集成

我们采用组织属性(o)来控制各服务的访问权限,本地检查命令为:

1
ldapsearch -D "CN=admin,DC=krproject,DC=org" -w ****** -H ldap://localhost:389 -b "OU=people,DC=krproject,DC=org" "(o=*openvpn*)"

与OpenVPN的集成与配置

参考文档:https://www.howtoing.com/setting-up-an-openvpn-server-with-authentication-against-openldap-on-ubuntu-10.04-lts

首先安装OpenVPN的ldap认证支持:

1
sudo apt-get install openvpn-auth-ldap

配置OpenVPN以OpenLDAP来认证:

1
2
sudo mkdir /etc/openvpn/auth
sudo cp /usr/share/doc/openvpn-auth-ldap/examples/auth-ldap.conf /etc/openvpn/auth

编辑配置:/etc/openvpn/auth/auth-ldap.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<LDAP>
# LDAP server URL
URL ldap://localhost:389

# Bind DN (If your LDAP server doesn't support anonymous binds)
BindDN cn=admin,dc=krproject,dc=org

# Bind Password
Password ******

# Network timeout (in seconds)
Timeout 15

# Enable Start TLS
TLSEnable no
</LDAP>

<Authorization>
# Base DN
BaseDN "ou=people,dc=krproject,dc=org"

# User Search Filter
SearchFilter "(&(uid=%u)(o=*openvpn*))"

# Require Group Membership
RequireGroup false
</Authorization>

编辑OpenVPN服务端认证配置:/etc/openvpn/server.conf

1
2
plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/auth/auth-ldap.conf
client-cert-not-required

对于OpenVPN客户端配置,修改之前的CERT+KEY的认证方式,改为用户名密码方式:

1
2
3
4
;cert home-tiger.crt
;key home-tiger.key
ns-cert-type server
auth-user-pass

重启openvpn以生效:

1
sudo systemctl restart openvpn

与gitlab的集成与配置

参考文档:https://docs.gitlab.com/ce/administration/auth/ldap.html

编辑gitlab配置:/etc/gitlab/gitlab.rb,修改ldap配置段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
gitlab_rails['ldap_enabled'] = true
##! **remember to close this block with 'EOS' below**
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
main: # 'main' is the GitLab 'provider ID' of this LDAP server
label: 'LDAP'
host: 'localhost'
port: 389
uid: 'uid'
method: 'plain' # "tls" or "ssl" or "plain"
bind_dn: 'cn=admin,dc=krproject,dc=org'
password: '******'
active_directory: true
allow_username_or_email_login: true
block_auto_created_users: false
base: 'ou=people,dc=krproject,dc=org'
user_filter: '(o=*gitlab*)'
attributes:
username: ['uid', 'userid', 'sAMAccountName']
email: ['mail', 'email', 'userPrincipalName']
name: 'cn'
first_name: 'givenName'
last_name: 'sn'
EOS

重启gitlab以生效:

1
sudo gitlab-ctl reconfigure