OpenLDAP docker 部署

  • Post author:
  • Post category:其他




OpenLDAP docker 部署



镜像

热度比较高的有两个镜像:

osixia/openldap



bitnami/openldap

osixia/openldap:

  1. 集成了 TLS 安全认证,默认开启
  2. 个人维护
  3. 6个月前更新

bitnami/openldap:

  1. 没有做签名认证
  2. 团队维护
  3. 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 版权协议,转载请附上原文出处链接和本声明。