2024-04-09    2025-03-25    1853 字  4 分钟

部署LDAP

需要先安装Docker,并创建相应的目录。

1
2
mkdir -p /data/docker/ldap/data
mkdir -p /data/docker/ldap/conf

容器化部署OpenLdap

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
docker run \
  -d -p 389:389 -p 636:636 \
  --name openldap \
  --restart=always \
  -v /data/docker/ldap/data:/var/lib/ldap \
  -v /data/docker/ldap/conf:/etc/ldap/slapd.d \
  --env LDAP_ORGANISATION="snoopyops.top" \
  --env LDAP_DOMAIN="snoopyops.top" \
  --env LDAP_BASE_DN="dc=snoopyops,dc=top" \
  --env LDAP_ADMIN_PASSWORD="PassW0rd" \
  osixia/openldap

部署管理页面

可以使用phpldapadmin对LDAP进行管理。

1
2
3
4
5
6
7
docker run \
  -d -p 8080:80 -p 8443:443 \
  --name phpldapadmin \
  --link openldap:ldap-host \
  --env PHPLDAPADMIN_HTTPS=false \
  --env PHPLDAPADMIN_LDAP_HOSTS=ldap-host \
  osixia/phpldapadmin

部署Nginx代理管理页面

 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
28
29
30
31
upstream pla {
    server  10.20.0.56:8080 max_fails=3 fail_timeout=3 weight=3;
}

server {
    listen 80 ;
    server_name pla-ops.snoopyops.top;
    index index.html index.htm index.jsp ;
    rewrite ^/(.*)$  https://$server_name/$1 ;
}

server {
    listen      443 ssl ;
    server_name pla-ops.snoopyops.top;
    ssl_certificate      /etc/nginx/cert/wildcard-snoopyops-top_fullchain.pem;
    ssl_certificate_key  /etc/nginx/cert/wildcard-snoopyops-top_key.pem;
    ssl_session_timeout  5m ;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
    ssl_prefer_server_ciphers   on;
    index index.html index.htm index.jsp;
    #include iplist/iplist.txt;
    access_log  /data/nginx/logs/pla-ops.snoopyops.top.access.log json;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	proxy_pass http://pla;
    }
}

做完域名解析后,通过pla-ops.snoopyops.top可访问LDAP

用户名为cn=admin,dc=snoopyops,dc=top密码为PassW0rd

注意:LDAP应通过白名单限制访问范围,防止被攻击。

LDAP创建组织及用户

创建People组织

创建组织:

  • dc=snoopyops,dc=top下点击Create a child entry按钮
  • 选择Default
  • ObjectClasses选择organizationalUnit,然后点击Proceed
  • 从上而下填写,RDN 选择 ou(ou)
  • 然后开始正式的人员信息填写
    • ou: People

image-20250325165927112

创建用户

点击People ,选择Create a child entry按钮,再选择Default

创建普通用户:

  • People 之下点击Create a child entry按钮
  • 选择Default
  • ObjectClasses选择inetOrgPerson,然后点击Proceed
  • 从上而下填写,RDN 选择 User Name(uid)
  • 然后开始正式的人员信息填写
    • cn:zhangs
    • sn:zhangs
    • displayName:张三
    • 电子邮件:zhangs@qq.com
    • ou:People
    • 密码:123456
    • User Name:zhangs

image-20250325171306997

创建用户组

为了精准授权,我们可以通过用户组进行授权,比如创建jenkins用户组,将用户加入到jenkins用户组中,用户可以登录jenkins。并不是每个LDAP用户都可以登录jenkins

先创建Group组织,创建方法与创建People组织相同。

点击刚刚创建的Group ,选择Create a child entry按钮,再选择Default

创建普通用户:

  • People 之下点击Create a child entry按钮
  • 选择Default
  • ObjectClasses选择groupOfUniqueNames,然后点击Proceed
  • 从上而下填写,RDN 选择 cn(cn)
  • 然后开始填写组信息
    • cn:jenkins
    • uniqueMember:点击后边的搜索框,选择将要包含的用户

image-20250325172551673

集成到其他应用

jumpserver

登录jumpserver后,点击系统设置—>认证设置—>LDAP

image-20250325174354510

jenkins

Jenkins 启用了 ldap 登陆之后,默认是登录用户就是管理员权限,尽管我们还可以通过更细化权限划分的插件来实现管控,但是这仍然让人觉得不那么优雅。

因此,在 Jenkins 这里,打算采用基于应用分组的方式进行配置。通过上文创建用户组的教成,先把`jenkins·用户组创建出来。

创建完成后的架构模式如下:

image-20250325173009385

登录Jenkins后,直接点击系统管理—>全局安全配置,按照下面的内容进行配置即可。

Jenkins-Ldap-1

Jenkins-Ldap-2

image-20250325173617895

配置完成,点击Test LDAP settings,此时可以用其中一个账号密码进行测试。

OpenVPN

Jenkins一样,创建一个vpn用户组

参考VPN部署文档集成LDAP插件,此处不赘述,配置如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
cat /etc/openvpn/auth/ldap.conf
<LDAP>
	URL		ldap://10.20.0.56:389
	BindDN		cn=admin,dc=snoopyops,dc=top
	Password	PassW0rd
	Timeout		15
	TLSEnable	no
	FollowReferrals yes

</LDAP>

<Authorization>
	BaseDN		"ou=People,dc=snoopyops,dc=top"
	SearchFilter	"uid=%u"
	RequireGroup	true
	<Group>
		BaseDN		"ou=Group,dc=snoopyops,dc=top"
		SearchFilter	"cn=vpn"
		MemberAttribute	uniqueMember
	</Group>
</Authorization>

密码管理

通过self-service-password服务,可为用户提供web页面,实现用户自助修改密码的功能。

准备配置文件。

1
2
3
4
mkdir -p /data/docker/self-service-password/config
docker run --name selfServicePassword -itd docker.io/ltbproject/self-service-password:1.5.0
docker cp selfServicePassword:/var/www/conf/config.inc.php /data/docker/self-service-password/config/
docker rm -f selfServicePassword

修改配置文件,主要做如下修改

 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_url = "ldap://10.20.0.56";
$ldap_starttls = false;
$ldap_binddn = "cn=admin,dc=snoopyops,dc=top";
$ldap_bindpw = 'PassW0rd';
$ldap_base = "ou=People,dc=snoopyops,dc=top";
$ldap_login_attribute = "uid";
$ldap_fullname_attribute = "cn";
$ldap_filter = "(&(objectClass=person)($ldap_login_attribute={login}))";
$ldap_use_exop_passwd = false;
$ldap_use_ppolicy_control = false;
# 邮箱相关配置
$mail_from = "ops@snoopyops.top";
$mail_from_name = "账号重置密码";
$mail_signature = "";
$notify_on_change = true;
$mail_sendmailpath = '/usr/sbin/sendmail'; 
$mail_protocol = 'smtp';
$mail_smtp_debug = 0;
$mail_debug_format = 'html';
$mail_smtp_host = 'smtp.feishu.cn';
$mail_smtp_auth = true;
$mail_smtp_user = 'ops@snoopyops.top';
$mail_smtp_pass = 'B5Gps73vm4owuULdd';
$mail_smtp_port = 465;
# 用于加密或签名操作,设置为随机字符
$keyphrase = "ks8lajsskjxJUs22";

运行self-service-password服务。

1
docker run -p 9080:80  --restart=always --name selfServicePassword -v /data/docker/self-service-password/config:/var/www/conf -itd docker.io/ltbproject/self-service-password:1.5.0

配置Nginx

 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
28
29
30
upstream password-ops {
    server 10.20.0.56:9080 max_fails=3 fail_timeout=3 weight=3;
}

server {
    listen 80 ;
    server_name password-ops.snoopyops.top;
    index index.html index.htm index.jsp ;
    rewrite ^/(.*)$  https://$server_name/$1 ;
}

server {
    listen      443 ssl ;
    server_name password-ops.snoopyops.top;
    ssl_certificate      /etc/nginx/cert/wildcard-snoopyops-top_fullchain.pem;
    ssl_certificate_key  /etc/nginx/cert/wildcard-snoopyops-top_key.pem;
    ssl_session_timeout  5m ;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
    ssl_prefer_server_ciphers   on;
    index index.html index.htm index.jsp;
    access_log  /data/nginx/logs/password-ops.snoopyops.top.access.log json;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	proxy_pass http://password-ops;
    }
}

做完域名解析后,访问域名,可通过邮件的方式自助修改密码

self-service-password