OpenLDAP主服务器端配置ACL限制同步至消费端的记录属性
我来帮你搞定这个问题!你思路是对的,确实可以在主节点(provider)通过ACL来限制同步账号能读取的属性,从源头把敏感字段拦下来,比在消费端过滤更稳妥,完全符合你隐私合规的需求。
先给你理清楚核心逻辑:syncrepl是消费端主动拉取,但它得用专门的同步账号(比如你说的cn=replicator,dc=my,dc=company,dc=com)来访问主节点数据。我们只要给这个账号设置ACL,让它看不到特定字段,消费端自然同步不到这些内容。
具体配置步骤
编写针对性的ACL规则
针对你的MDB数据库(olcDatabase={0}mdb),调整ACL规则,重点是给同步账号设置read attrs=!gecos(意思是允许读取除了gecos之外的所有属性)。完整的ACL条目可以这么写:olcAccess: {0}to * by dn.exact="cn=replicator,dc=my,dc=company,dc=com" read attrs=!gecos by * break如果要排除多个字段,比如还要排除电话号码,就改成
attrs=!gecos,!telephoneNumber就行,用逗号分隔多个属性。应用ACL配置
我们用ldapmodify命令来修改配置,先写一个LDIF文件(比如叫acl_modify.ldif):dn: olcDatabase={0}mdb,cn=config changetype: modify replace: olcAccess olcAccess: {0}to * by dn.exact="cn=replicator,dc=my,dc=company,dc=com" read attrs=!gecos by * break olcAccess: {1}to * by dn.exact="cn=admin,dc=my,dc=company,dc=com" write by * read👉 注意:第二个ACL条目是示例,你要替换成自己原有管理员权限的规则,别把原有正常权限覆盖了!
然后执行命令加载这个LDIF:
ldapmodify -Y EXTERNAL -H ldapi:/// -f acl_modify.ldif这个命令是用本地root权限通过LDAPI接口修改配置,不需要输入密码(前提是你有服务器的root权限)。
验证ACL是否生效
用同步账号测试能不能读取gecos字段:ldapsearch -x -D "cn=replicator,dc=my,dc=company,dc=com" -W -b "dc=my,dc=company,dc=com" "(objectClass=inetOrgPerson)" gecos输入同步账号的密码后,如果返回结果里没有gecos字段,或者提示权限不足,说明ACL已经生效了,消费端同步的时候自然拿不到这个字段。
几个关键注意事项
- ACL顺序很重要:OpenLDAP的ACL是从上到下匹配的,匹配到第一条符合规则的就会停止,所以一定要把针对同步账号的规则放在最前面(也就是
{0}这个位置)。 - 不要破坏原有权限:修改ACL的时候,一定要保留管理员的读写权限以及其他正常业务的权限,别把整个数据库的权限搞乱了。
- 最小权限原则:同步账号只需要
read权限就够了,千万别给write或者更高权限,降低安全风险。
备注:内容来源于stack exchange,提问作者Dave Spear

