Colbrze's Blog

兴趣使然的小站

不入流的软件工程师
现在的我是一名运维开发工程师,正在学习 DevOps 相关的知识。


初步体验 LDAP

lam

先搞懂怎么用,再搞懂怎么装,最后才搞懂怎么配置。

想当初17年的时候我就被LDAP搞疯过一次,没想到这次又以失败告终了。虽然已经大致弄明白了怎么使用,但是还是感觉白白折腾了。

摘一段在这次找资料时看到的吐槽:

如果你搜索OpenLDAP的安装指南,很不幸地告诉你,网上不管中文的英文的,90%都是错的,它们都还活在上个世纪,它们会告诉你要去修改一个叫做slapd.conf的文件,基本上看到这里,你就不用往下看了,这个文件早就被抛弃,新版的OpenLDAP里根本就没有这个文件!取而代之的是slapd.d的文件夹,然后另一部分教程会告诉你,让你修改这个文件夹下的某一个ldif文件,看到这里,你也不用往下看了,你又看到了伪教程,因为这个文件夹下的所有文件的第一行都明确地写着:『这是一个自动生成的文件,不要修改它!』你修改了它之后,它的md5校验值会匹配不上,造成更多的问题。你应该用ldapmodify来修改这个文件,而关于ldapmodify的教程,可以说几乎就没有!我一开始不知道面临这样荒谬的处境,很多运维人员是怎么活下来的,不过等我自己配通了以后,真的是累到连写教程的精力都没有了,好吧,我已经配通了,你们各人自求多福吧。

​ — 摘自 我花了一个五一终于搞懂了OpenLDAP

怎么用

LDAP 是一种树形结构,大致类似于:

1
2
3
4
5
6
7
8
- dc=xyz
- dc=colbrze
- ou=users
- ou=it
- cn=colbrze
- ou=other
- ou=groups
-dc=balabla

这整个结构,只有到cn=colbrze才是一条完整的条目,而条目可以看做是其他数据库中的主键。

我们使用完整的条目cn=colbrze,ou=it,ou=users,dc=colbrze,dc=xyz可以找到一条记录,假设这条记录的objectClass=inetOrgPerson,那么里面可能包含许多属性,包括 uid、sn、cn、userPassword等。

objectClass包含什么属性都是LDAP内置好的,一般我们用到的就是inetOrgPerson(用于账号)和organizationalUnit(用于组)。

使用

添加数据

我们会有个管理员账号,例如 cn=admin,dc=colbrze,dc=xyz。我们使用他来登陆OpenLDAP对数据进行管理。

使用phpLDAPadmin, LAM等工具登陆好管理账号后,向baseDN`dc=colbrze,dc=xyz`下面增加组(organizationalUnit),之后再组中增加用户(inetOrgPerson),添加用户的属性和密码。

在其他应用中配置LDAP

  • 配置好OpenLDAP的地址和端口
  • 管理账号的账号密码
  • baseDN
  • 用户过滤条件 (&(objectclass=inetOrgPerson)(cn=%s)) 就是什么属性作为用户名

一般配置好可以连接上其他应用了,用户名就是cn=%s里的cn了,也可以用uidmail
有些应用可能还需要配置属性直接的映射关系,像是{mail:email, uid:username, cn=realname} 这样的。

jenkins oldap

flask-simpleldap

这就是最简单的应用了,真的非常简单(如果不用考虑安装配置用户权限这些问题的话)。


OpenLDAP部署及管理维护

参考:

- https://juejin.im/post/5b588a255188251aef4e6694
- ansible playbook https://github.com/sios-tech/ansible-openldap-rhel7

图形管理工具:

- web: phpLDAPadmin, LAM(包含前者)
- 桌面:[ApacheLdapStudio](https://directory.apache.org/studio/)

生成密码

参考:http://www.openldap.org/faq/data/cache/347.html

方法1

使用 slappasswd

1
2
3
4
# slappasswd -h {SSHA} -s password
{SSHA}LpKu4DcomddQwTzy+te00O2HjukCTU7f
# slappasswd -h {SHA} -s password
{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=

方法2

使用 python (SHA密码, SSHA 是加盐版的 SHA,具体见参考链接里的内容)

1
2
3
4
5
6
7
8
In [1]: import hashlib

In [2]: import base64

In [3]: h = hashlib.sha1('password'.encode())

In [4]: base64.encodebytes(h.digest())[:-1]
Out[4]: b'W6ph5Mm5Pz8GgiULbPgzG37mj9g='

在给 entry 添加密码属性时,可以直接使用 slappasswd 生成的密码。

但是在 LDIF 文件中,需要将上面生成的密码进行base64编码。

对密码进行 base64 编码

可以用Python

1
2
3
import base64
s = "{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g="
base64.b64encode(s.encode())

or shell 中直接执行

1
pwd={SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=;python -c "import base64;print(base64.b64encode('$pwd'.encode()))"

或者使用 JavaScript

1
btoa("{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=")

OpenLDAP 修改配置

参考:https://www.server-world.info/en/note?os=CentOS_6&p=ldap

很多教程中是修改slapd.conf文件,弃用后是使用slapdmodify命令。

ldapmodify -Y EXTERNAL -H ldapi:/// -f test.ldif

docker-compose 示例

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
# docker-compose.yml
version: "3.4"

services:
ldap:
image: osixia/openldap
# restart: always
environment:
LDAP_ORGANISATION: "colbrze"
LDAP_DOMAIN: "colbrze.xyz"
LDAP_ADMIN_PASSWORD: "ldap" # 配置管理员密码,管理员账号为 cn=admin,dc=colbrze,dc=xyz
ports:
- 389:389
- 636:636
# volumes:
# - $PWD/slapd.d:/etc/ldap/slapd.d
# - $PWD/data:/var/lib/ldap


lam:
image: ldapaccountmanager/lam:6.8
ports:
- 8080:80
volumes:
- $PWD/lam.conf:/usr/share/ldap-account-manager/config/lam.conf
depends_on:
- ldap

# volumes:
# ldap-data:

OpenLDAP 用户读写权限设置

参考:

很多教程中实在 slapd.conf 里面添加权限管理的,但是slapd.conf已经被弃用的了,现在添加权限管理也需要使用 slapdmodify命令。

例如:

1
2
3
4
5
6
7
# test.ldif
dn: olcDatabase={1}mdb,cn=config
add: olcAccess
olcAccess: {0}to *
by self write
by anonymous auth
by * read
1
2
3
# ldapmodify -v -n -f test.ldif
or
# ldapmodify -Y EXTERNAL -H ldapi:/// -f test.ldif

但是我试了半天都不行,放弃了。

其他相关链接

更早的文章

利用Github搭建图床

使用 Golang 并利用 Github 搭建简单的图床功能 背景 由于使用的腾讯云服务器配置只有1核1G1Mbps按流量计费,为了提升访问速度和减少流量,避免从服务器获取图片,就弄了这个简单的图床功能。 功能具体的功能就是将图片拖拽到文件上传的框内后,服务器会保存图片,并利用 git 将图片推送 …

web, github 继续阅读