OpenLDAP docker 部署
镜像
热度比较高的有两个镜像:
osixia/openldap
、
bitnami/openldap
osixia/openldap:
- 集成了 TLS 安全认证,默认开启
- 个人维护
- 6个月前更新
bitnami/openldap:
- 没有做签名认证
- 团队维护
- 7天前更新
两者都没有做 SSL 安全认证,没有开 memberOf 功能,没有开账号安全策略,没有设置用户自主改密码
综合两者的优缺点,最终选择了 bitnami/openldap,没做的功能自己做
目录树
├── certs # 存放证书相关文件
│ ├── certs.ldif
│ ├── ldap.crt
│ ├── ldap.csr
│ ├── ldap.key
│ ├── rootCA.key
│ ├── rootCA.pem
│ └── rootCA.srl
├── compose # 存放 docker-compose 启动相关文件
│ ├── build # 部署需要的文件
│ │ ├── bitnami-docker-openldap-master # git项目
│ │ ├── Dockerfile # build 文件
│ │ ├── libopenldap.sh # openldap 正式启动前需要做的各种骚操作
│ │ └── run.sh # openldap 启动文件
│ └── docker-compose.yml # docker-compose 配置
├── data # 容器映射目录
└── ldif # 镜像中没做的、需要额外补充的 openldap 配置文件
├── memberof_conf.ldif # 开启 memberOf 支持
├── mod_ppolicy.ldif # 开启账号安全策略
├── ppolicy.ldif # 添加账号安全策略配置
├── refint1.ldif # 开启 refint 支持(memberOf 需要)
├── refint2.ldif # 添加 refint 配置(memberOf 需要)
└── self_change_passwd.ldif # 设置用户可以自己改密码
准备工作
# 拉当前最新分支2.4.56
docker pull bitnami/openldap:2.4.56
# 生成几个基础文件夹
## 根目录
mkdir -p /srv/openldap
## ssl证书存放目录
mkdir /srv/openldap/certs
chmod g+rwX /srv/openldap/certs
## docker-compse 相关脚本存放目录
mkdir /srv/openldap/compose
## docker 构建相关文件存放目录
mkdir -p /srv/openldap/compose/build
## 容器数据映射目录
mkdir /srv/openldap/data
chmod g+rwX /srv/openldap/data
## ldap 启动时调整内容存放目录
mkdir /srv/openldap/ldif
构建新镜像
处理 SSL 相关
# 生产证书
export base_dir="/srv/openldap/certs"
export map_dir="/opt/certs"
openssl genrsa -out "${base_dir}/rootCA.key" 2048
openssl req -x509 -new -nodes -subj "/C=CN/ST=ShangHai/L=ShangHai/O=ldap/OU=lework/CN=ldap-ca" -key "${base_dir}/rootCA.key" -sha256 -days 1024 -out "${base_dir}/rootCA.pem"
openssl genrsa -out "${base_dir}/ldap.key" 2048
openssl req -new -subj "/C=CN/ST=ShangHai/L=ShangHai/O=ldap/OU=lework/CN=ldap-server.lework.com" -key "${base_dir}/ldap.key" -out "${base_dir}/ldap.csr"
openssl x509 -req -in "${base_dir}/ldap.csr" -CA "${base_dir}/rootCA.pem" -CAkey "${base_dir}/rootCA.key" -CAcreateserial -out "${base_dir}/ldap.crt" -days 3650 -sha256
cat > "${base_dir}/certs.ldif" << EOF
dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: "${map_dir}/rootCA.pem"
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: "${map_dir}/ldap.crt"
dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: "${map_dir}/ldap.key"
EOF
# 给 key 授权(key 默认是600,docker 容器是 nonroot 运行,无法读取)
chmod 644 /srv/openldap/certs/*.key
添加额外的 openldap 配置文件
# memberOf
cat > "/srv/openldap/ldif/memberof_conf.ldif" << EOF
#开启memberof支持
dn: cn=module{0},cn=config
cn: modulle{0}
objectClass: olcModuleList
objectclass: top
olcModuleload: memberof
olcModulePath: /opt/bitnami/openldap/lib/openldap
#新增用户支持memberof配置
dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfUniqueNames
olcMemberOfMemberAD: uniqueMember
olcMemberOfMemberOfAD: memberOf
EOF
cat > "/srv/openldap/ldif/refint1.ldif" << EOF
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
EOF
cat > "/srv/openldap/ldif/refint2.ldif" << EOF
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof uniqueMember manager owner
EOF
# ppolicy 用户安全策略
cat > "/srv/openldap/ldif/mod_ppolicy.ldif" << EOF
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: ppolicy
EOF
cat > "/srv/openldap/ldif/ppolicy.ldif" << EOF
dn: olcOverlay=ppolicy,olcDatabase={2}hdb,cn=config
changeType: add
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: ou=users,dc=ichilson,dc=com
olcPPolicyHashCleartext: TRUE
EOF
# 允许用户自己改密码
cat > "/srv/openldap/ldif/self_change_passwd.ldif" << EOF
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword by self write by dn.base="cn=admin,dc=ichilson,dc=com" write by anonymous auth by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {1}to * by dn.base="cn=admin,dc=ichilson,dc=com" write by self write by * read
EOF
源码修改
# 拉取项目代码(因为需要改动一两个 shell 脚本来启动 SSL 认证)
cd /srv/openldap/compose/build
wget https://github.com/bitnami/bitnami-docker-openldap/archive/master.zip
# 解压拷贝需要改动的 shell,至于为什么是这两个文件,自己去看 Dockerfile 一步一步往下钻
unzip master.zip
rm master.zip -rf
cp bitnami-docker-openldap-master/2/debian-10/rootfs/opt/bitnami/scripts/libopenldap.sh .
cp bitnami-docker-openldap-master/2/debian-10/rootfs/opt/bitnami/scripts/openldap/run.sh .
# 往 libopenldap.sh 编写添加 SSL 证书脚本
vim libopenldap.sh
#########################
# 添加 SSL 证书
#########################
ldap_open_ssl() {
info "ldapmodify certs.ldif"
debug_execute ldapmodify -Y EXTERNAL -H "ldapi:///" -f "/opt/certs/certs.ldif"
info "finish ldapmodify certs.ldif"
}
#########################
# 打开 memberOf
#########################
ldap_open_memberof() {
info "ldapadd memberof_conf.ldif"
debug_execute ldapadd -Q -Y EXTERNAL -H "ldapi:///" -f "/opt/ldif/memberof_conf.ldif"
debug_execute ldapmodify -Q -Y EXTERNAL -H "ldapi:///" -f "/opt/ldif/refint1.ldif"
debug_execute ldapadd -Q -Y EXTERNAL -H "ldapi:///" -f "/opt/ldif/refint2.ldif"
info "finish ldapadd memberof_conf.ldif"
}
#########################
# 启用 ppolicy
# 这里启用策略之后,还需要自己根据需要给对应的dn添加用户安全策略类和对应的参数(可以等服务启动之后再用客户端修改)
# objectClass: pwdPolicy
# pwdAllowUserChange: TRUE
# pwdAttribute: 2.5.4.35
# #通过pwdCheckModule检查密码质量, 0为不控制,由SSO的认证模块自己控制
# pwdCheckQuality: 0
# #密码失效提前7天警告
# pwdExpireWarning: 604800
# #密码失败次数复位时间,1天
# pwdFailureCountInterval: 86400
# #密码过期不允许登录
# pwdGraceAuthNLimit: 0
# #保存密码历史3次,新密码不能与之相同
# pwdInHistory: 3
# #超过最多失败次数账号被锁定
# pwdLockout: TRUE
# #锁定后不能自动解锁,必须由管理员解锁
# pwdLockoutDuration: 0
# #密码有效期10年
# pwdMaxAge: 311040000
# #密码最大失败次数,超过后被账号锁定
# pwdMaxFailure: 5
# pwdMinAge: 0
# #密码最小长度
# pwdMinLength: 8
# pwdMustChange: FALSE
# pwdSafeModify: FALSE
#########################
ldap_open_ppolicy() {
info "ldapadd ppolicy.ldif"
debug_execute ldapadd -Y EXTERNAL -H "ldapi:///" -D "cn=config" -f "/opt/bitnami/openldap/etc/schema/ppolicy.ldif"
debug_execute ldapmodify -Y EXTERNAL -H "ldapi:///" -f "/opt/ldif/mod_ppolicy.ldif"
debug_execute ldapmodify -Y EXTERNAL -H "ldapi:///" -f "/opt/ldif/ppolicy.ldif"
info "finish ldapadd ppolicy.ldif"
}
#########################
# 允许用户自己改密码
#########################
ldap_open_self_change_passwd() {
info "ldapmodify self_change_passwd.ldif"
debug_execute ldapmodify -Y EXTERNAL -H "ldapi:///" -f "/opt/ldif/self_change_passwd.ldif"
info "finish ldapmodify self_change_passwd.ldif"
}
ldap_initialize() {
# 这里省略了一些代码
if ! is_dir_empty "$LDAP_DATA_DIR"; then
info "Using persisted data"
else
# 这里省略了一些代码
ldap_admin_credentials
# 添加的代码
ldap_open_ssl
ldap_open_memberof
ldap_open_ppolicy
ldap_open_self_change_passwd
# 这里省略了
fi
}
# 往 run.sh 插入开启 SSL 端口脚本
flags=("-h" "ldap://:${LDAP_PORT_NUMBER}/ ldapi:/// ldaps://:${LDAP_LDAPS_PORT_NUMBER}/" "-F" "${LDAP_CONF_DIR}/slapd.d" "-d" "256" "$@")
准备 build 文件
cat > "/srv/openldap/compose/build/Dockerfile" << EOF
FROM bitnami/openldap:2.4.56
COPY run.sh /opt/bitnami/scripts/openldap/
COPY libopenldap.sh /opt/bitnami/scripts/
EOF
构建
sudo docker build -t bitnami/openldap:2.4.56-self .
启动容器
编写 compose 文件
cat > "/srv/openldap/compose/docker-compose.yml" << EOF
version: '3'
services:
openldap:
image: 'bitnami/openldap:2.4.56-self'
container_name: 'openldap'
ports:
- '10389:1389'
- '10636:1636'
environment:
- LDAP_ROOT=dc=ichilson,dc=com
- LDAP_ADMIN_USERNAME=admin
- LDAP_ADMIN_PASSWORD=admin
# 初始用户(至少需要一个用户)
- LDAP_USERS=admin
- LDAP_PASSWORDS=admin
volumes:
- /srv/openldap/data:/bitnami/openldap
- /srv/openldap/certs:/opt/certs
- /srv/openldap/ldif:/opt/ldif
EOF
启动
docker-compose up -d
附录
docker 入门:https://www.runoob.com/docker/docker-tutorial.html
docker-compose 入门:https://www.runoob.com/docker/docker-compose.html
版权声明:本文为qiushun_fang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。