LDAP从入门到实战:环境部署与配置指南(下)
#作者:朱雷
接上篇:《LDAP从入门到实战:环境部署与配置指南(上)》
链接: link
文章目录
- 2.5.添加账号
- 2.6.停止服务
- 2.7.使用TLS证书
- 2.7.1. TLS 证书
- 2.7.2. TLS 配置
- 2.7.3. 服务器配置
- 2.8.使用安全连接的反向代理
2.5.添加账号
添加管理员账号配置文件
[root@localhost openldap]# cat admin.ldif
dn: dc=zltest,dc=com
objectclass: dcObject
objectclass: organization
o: zl
dc: zltest
dn: cn=admin,dc=zltest,dc=com
objectclass: organizationalRole
cn: admin
添加账号
[root@localhost openldap]# ldapadd -x -D 'cn=admin,dc=zltest,dc=com' -W -f admin.ldif
Enter LDAP Password: # 输入mdb数据库配置的密码
adding new entry "dc=zltest,dc=com"
adding new entry "cn=admin,dc=zltest,dc=com"
验证添加
[root@localhost openldap]# ldapsearch -x -b 'dc=zltest,dc=com' '(objectclass=*)'
# extended LDIF
#
# LDAPv3
# base <dc=zltest,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# zltest.com
dn: dc=zltest,dc=com
objectClass: dcObject
objectClass: organization
o: zl
dc: zltest
# admin, zltest.com
dn: cn=admin,dc=zltest,dc=com
objectClass: organizationalRole
cn: admin
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
创建具有组属性的用户文件
[root@localhost openldap]# cat user.ldif
dn: ou=oa,dc=zltest,dc=com
ou: oa
objectclass: organizationalUnit
dn: cn=testuser,ou=oa,dc=zltest,dc=com
ou: oa
cn: testuser
sn: testuser
objectclass: inetOrgPerson
objectclass: organizationalPerson
添加用户
[root@localhost openldap]# ldapadd -x -D 'cn=admin,dc=zltest,dc=com' -W -f user.ldif
Enter LDAP Password:
adding new entry "ou=oa,dc=zltest,dc=com"
adding new entry "cn=testuser,ou=oa,dc=zltest,dc=com"
验证添加用户
[root@localhost openldap]# ldapsearch -x -b 'dc=zltest,dc=com' '(objectclass=*)'
# extended LDIF
#
# LDAPv3
# base <dc=zltest,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# zltest.com
dn: dc=zltest,dc=com
objectClass: dcObject
objectClass: organization
o: zl
dc: zltest
userPassword:: e1NIQX0rRG9XSGdBNFI0c2cyTjBCbGVOTTdqUmgyOGM9
# admin, zltest.com
dn: cn=admin,dc=zltest,dc=com
objectClass: organizationalRole
cn: admin
# oa, zltest.com
dn: ou=oa,dc=zltest,dc=com
ou: oa
objectClass: organizationalUnit
# testuser, oa, zltest.com
dn: cn=testuser,ou=oa,dc=zltest,dc=com
ou: oa
cn: testuser
sn: testuser
objectClass: inetOrgPerson
objectClass: organizationalPerson
# search result
search: 2
result: 0 Success
# numResponses: 5
# numEntries: 4
修改用户密码
[root@localhost openldap]# ldappasswd -x -D 'cn=admin,dc=zltest,dc=com' -w 123456 -s 654321 'cn=testuser,ou=oa,dc=zltest,dc=com'
[root@localhost openldap]# ldapsearch -x -b 'cn=testuser,ou=oa,dc=zltest,dc=com' '(objectclass=*)'
# extended LDIF
#
# LDAPv3
# base <cn=testuser,ou=oa,dc=zltest,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# testuser, oa, zltest.com
dn: cn=testuser,ou=oa,dc=zltest,dc=com
ou: oa
cn: testuser
sn: testuser
objectClass: inetOrgPerson
objectClass: organizationalPerson
userPassword:: e1NTSEF9eTZZVktFUmMraG0vcFZYTkVVbzBFcDJyZlQ0MWxUM1g=
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
给用户添加属性
[root@localhost openldap]# cat add_attr_testuser.ldif
dn: cn=testuser,ou=oa,dc=zltest,dc=com
changetype: modify
add: mail
mail: testuser@zltest.com
# 自己给自己添加属性提示权限不足
[root@localhost openldap]# ldapmodify -x -W -D "cn=testuser,ou=oa,dc=zltest,dc=com" -f add_attr_testuser.ldif
Enter LDAP Password:
modifying entry "cn=testuser,ou=oa,dc=zltest,dc=com"
ldap_modify: Insufficient access (50)
# 需用管理员账号添加
[root@localhost openldap]# ldapmodify -x -W -D "cn=admin,dc=zltest,dc=com" -f add_attr_testuser.ldif
Enter LDAP Password:
modifying entry "cn=testuser,ou=oa,dc=zltest,dc=com"
验证添加用户属性结果
[root@localhost openldap]# ldapsearch -x -b 'cn=testuser,ou=oa,dc=zltest,dc=com' '(objectclass=*)'
# extended LDIF
#
# LDAPv3
# base <cn=testuser,ou=oa,dc=zltest,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# testuser, oa, zltest.com
dn: cn=testuser,ou=oa,dc=zltest,dc=com
ou: oa
cn: testuser
sn: testuser
objectClass: inetOrgPerson
objectClass: organizationalPerson
userPassword:: e1NTSEF9eTZZVktFUmMraG0vcFZYTkVVbzBFcDJyZlQ0MWxUM1g=
mail: testuser@zltest.com
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
给用户删除属性
[root@localhost openldap]# cat delete_attr_testuser.ldif
dn: cn=testuser,ou=oa,dc=zltest,dc=com
changetype: modify
delete: mail
给用户替换属性
[root@localhost openldap]# cat replace_attr_testuser.ldif
dn: cn=testuser,ou=oa,dc=zltest,dc=com
changetype: modify
replace: mail
mail: testuser_new@zltest.com
重命名用户条目
[root@localhost openldap]# cat replace_attr_testuser.ldif
dn: cn=testuser,ou=oa,dc=zltest,dc=com
changetype: modrdn
newrdn: oa=it
deleteoldrdn: 1
删除用户条目
[root@localhost openldap]# cat delete_testuser.ldif
dn: cn=testuser,ou=oa,dc=zltest,dc=com
changetype: delete
# 执行删除命令
[root@localhost openldap]# ldapdelete -x -W -D "cn=admin,dc=zltest,dc=com" -f ./ delete_testuser.ldif
# 通过dn直接进行删除
[root@localhost openldap]# ldapdelete -x -W -D "cn=admin,dc=zltest,dc=com" "cn=testuser,ou=oa,dc=zltest,dc=com"
2.6.停止服务
[root@localhost openldap]# kill -INT `cat /usr/local/var/run/slapd.pid`
[root@localhost openldap]# ps -ef|grep slapd
root 6603 5278 0 15:43 pts/1 00:00:00 grep --color=auto slapd
通过更激烈的方法杀死 slapd 可能会导致信息丢失或数据库损坏
2.7.使用TLS证书
2.7.1. TLS 证书
OpenLDAP 客户端和服务器能够使用传输层安全性(TLS) 框架提供完整性和机密性保护。TLS 用途X.509证书用于承载客户端和服务器身份。所有服务器都必须具有有效证书,而客户端证书是可选的。
2.7.2. TLS 配置
获取所需证书后,必须在客户端和服务器上配置一些选项,以启用 TLS 并使用证书。至少,必须为客户端配置包含所有证书颁发机构(CA)证书。服务器必须配置加州证书以及它自己的服务器证书和私钥。
通常,单个 CA 会颁发服务器证书和所有受信任的客户端证书,因此服务器只需信任该签名 CA。但是,客户端可能希望连接到由不同组织管理的各种安全服务器,这些服务器的证书由许多不同的 CA 生成。因此,客户端可能需要在其配置中包含许多不同的受信任 CA 的列表。
2.7.3. 服务器配置
# 签署服务器证书的 CA 的证书
**TLSCACertificateFile** <CA文件名>
# 服务器证书
**TLSCertificateFile** <文件名>
# 服务器私钥文件
**TLSCertificateKeyFile** <文件名>
# OpenSSL 的密码规范,使用openssl ciphers -v ALL查看
TLSCipherSuite <密码套件规范>
# 此指令指定在/dev/urandom不可用时从哪个文件获取随机数,如系统有则不需要此选项
TLSRandFile <文件名>
# 包含 Diffie-Hellman 临时密钥交换参数的文件,使用基于 DHE 的密码套件所必需的
TLSDHParamFile <文件名>
# 指定用于椭圆曲线 Diffie-Hellman 临时密钥交换的曲线。这是在 OpenSSL 中使用基于 ECDHE 的密码套件所必需的:openssl ecparam -list_curves
TLSEC 名称 <名称>
# 指定在传入 TLS 会话中对客户端证书执行哪些检查:
# 默认情况下,此选项设置为never ,在这种情况下,服务器永远不会向客户端索要证书。# 如果设置为allow,服务器将要求提供客户端证书;如果没有提供,会话将正常进行。如# 果提供了证书但服务器无法验证,则忽略该证书并且会话正常进行,就像没有提供证书一# 样。如果设置为try,则请求证书,如果没有提供证书,会话将正常进行。如果提供了证
# 书但无法验证,则会话立即终止。如设置为demand,则请求证书并且必须提供有效证书,# 否则会话立即终止。
TLSVerifyClient { 从不 | 允许 | 尝试 | 要求 }
标**的指令是必须的其他为可选
2.8.使用安全连接的反向代理
使用nginx、haproxy等反向代理软件代理ldap 的389端口,在代理软件上配置SSL/TSL认证,代理请求到后端ldap服务,特别在多主、多从的环境下特别实用。
Nginx配置stream proxy server:
https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html
worker_processes auto;
stream {
upstream ldap_backend {
server 192.168.1.129:389;
server 192.168.1.130:389;
}
...
server {
listen 0.0.0.0:636 ssl;
server_name example.com;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
ssl_certificate /usr/local/nginx/conf/cert.pem;
ssl_certificate_key /usr/local/nginx/conf/cert.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
proxy_pass ldap_backend;
...
}
实际生产中推荐使用代理模式。