Loading... ## 环境 OS: CentOS 8.4.2105 PHP: 7.4.21 ## 注意 CentOS 7 中可能默认提供了 `openLDAP-servers` 包,本文中部分流程可能不适用 文中针对 `openLDAP` 的所有配置中,请将 `dc` 中的 `example`、`com`(例如 `dc=example,dc=cn`) 根据实际情况修改为自己的域(例如 `dc=leviatan,dc=cn`) 文中由用户手动创建的 `*.ldif` 文件不要放在 `/etc/openldap/slapd.d` 目录下,本文中存储在 `~/openldap` 目录下 线上大多数文档在 `dn` 中配置了 `olcDatabase={2}hdb,cn=config`,但笔者经过测试发现 `/etc/openldap/slapd.d/cn=config` 目录下只存在 `olcDatabase={2}mdb`,故进行了相应更改 ## 安装 openLDAP 由于 CentOS 8 的仓库中取消了对 `openLDAP-servers` 包的支持,这里使用 [Symas](https://symas.com/) 提供的第三方仓库 ```bash wget -q https://repo.symas.com/configs/SOFL/rhel8/sofl.repo -O /etc/yum.repos.d/sofl.repo dnf clean all dnf makecache dnf install symas-openldap-servers symas-openldap-clients ``` 启动 openLDAP ```bash systemctl start slapd ``` 自启动 ```bash systemctl enable slapd ``` ## openLDAP 基础配置 ### 生成并设置 openLDAP 管理员密码 openLDAP 中使用 `slappasswd` 来生成密码哈希,将哈希写入配置文件来修改密码 执行命令后输出如下 ```bash New password: Re-enter new password: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ``` 创建 `chrootpw.ldif` 文件,写入如下配置 ``` dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ``` > 1. `dn` 配置文件,这里指定为 `/etc/openldap/slapd.d/cn=config/olcDatabase={0}config` 文件 > 2. `changetype` 指定类型为 `modify`,更改 > 3. `add` 表示添加 `olcRootPw` 配置项 > 4. 指定 `olcRootPW` 配置项的值 执行如下命令将配置中的操作动态载入 openLDAP 服务器 ```bash ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif ``` 输出如下,表示操作成功 ```bash SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={0}config,cn=config" ``` ### 导入基本 schema openLDAP Server 默认提供了一些基本 schema 位于 `/etc/openldap/schema` 目录下,这些 schema 控制着条目拥有哪些对象类和属性,可以自行选择需要的进行导入,这里将所有 schema 都导入进去 ```bash ls /etc/openldap/schema/*.ldif | xargs -I {} ldapadd -Y EXTERNAL -H ldapi:/// -f {} ``` ### 修改域并创建域管理账户 使用 `slappasswd` 命令为域管理员账户创建密码,记录哈希 创建 `chdomain.ldif` 文件并写入如下配置 ``` dn: olcDatabase={1}monitor,cn=config changetype: modify replace: olcAccess olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=admin,dc=example,dc=com" read by * none dn: olcDatabase={2}mdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=example,dc=com dn: olcDatabase={2}mdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=admin,dc=example,dc=com dn: olcDatabase={2}mdb,cn=config changetype: modify replace: olcRootPW olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx dn: olcDatabase={2}mdb,cn=config changetype: modify add: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=example,dc=com" write by anonymous auth by self write by * none olcAccess: {1}to dn.base="" by * read olcAccess: {2}to * by dn="cn=admin,dc=example,dc=com" write by * read ``` 载入修改 ```bash ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif ``` 输出如下,表示操作成功 ```bash SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={1}monitor,cn=config" modifying entry "olcDatabase={2}mdb,cn=config" modifying entry "olcDatabase={2}mdb,cn=config" modifying entry "olcDatabase={2}mdb,cn=config" modifying entry "olcDatabase={2}mdb,cn=config" ``` ### 启用 `memberof` 模块 这个模块的作用是当你建一个组的时候,把一些用户添加到这个组里去,它会自动给这些用户添加一个 `memberOf` 属性,有很多应用需要检查这个属性。 创建 `add_memberof.ldif` 文件并写入如下配置 ``` dn: cn=module{0},cn=config cn: modulle{0} objectClass: olcModuleList objectclass: top olcModuleload: memberof.la olcModulePath: /usr/lib64/openldap dn: olcOverlay={0}memberof,olcDatabase={2}mdb,cn=config objectClass: olcConfig objectClass: olcMemberOf objectClass: olcOverlayConfig objectClass: top olcOverlay: memberof olcMemberOfDangling: ignore olcMemberOfRefInt: TRUE olcMemberOfGroupOC: groupOfUniqueNames olcMemberOfMemberAD: uniqueMember olcMemberOfMemberOfAD: memberOf ``` 创建 `refint1.ldif` 文件并写入如下配置 ``` dn: cn=module{0},cn=config add: olcmoduleload olcmoduleload: refint ``` 创建 `refint2.ldif` 文件并写入如下配置 ``` dn: olcOverlay=refint,olcDatabase={2}mdb,cn=config objectClass: olcConfig objectClass: olcOverlayConfig objectClass: olcRefintConfig objectClass: top olcOverlay: refint olcRefintAttribute: memberof uniqueMember manager owner ``` 依次执行如下命令 ```bash ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add_memberof.ldif ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif ``` 依次返回如下 ```bash # ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add_memberof.ldif adding new entry "cn=module{0},cn=config" adding new entry "olcOverlay={0}memberof,olcDatabase={2}mdb,cn=config" # ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif modifying entry "cn=module{0},cn=config" # ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif adding new entry "olcOverlay=refint,olcDatabase={2}mdb,cn=config" ``` ### 创建组织及管理角色 在上述基础上,我们来创建一个叫做 WindSpirit 的组织,并在其下创建一个 admin 的组织角色(该组织角色内的用户具有管理整个 LDAP 的权限)和 People 和 Group 两个组织单元 创建 `wsorg.ldif` 文件并写入如下配置 ``` dn: dc=example,dc=com objectClass: top objectClass: dcObject objectClass: organization o: WindSpirit Company dc: example dn: cn=admin,dc=example,dc=com objectClass: organizationalRole cn: admin dn: ou=People,dc=example,dc=com objectClass: organizationalUnit ou: People dn: ou=Group,dc=example,dc=com objectClass: organizationalRole cn: Group ``` 载入修改 ```bash ldapadd -x -D cn=admin,dc=example,dc=com -W -f wsorg.ldif ``` 输入密码后输出如下 ```bash adding new entry "dc=example,dc=com" adding new entry "cn=admin,dc=example,dc=com" adding new entry "ou=People,dc=example,dc=com" adding new entry "ou=Group,dc=example,dc=com" ``` ### 关闭匿名访问 创建 `disabled_anon.ldif` 文件并添加如下配置 ``` dn: cn=config changetype: modify add: olcDisallows olcDisallows: bind_anon dn: cn=config changetype: modify add: olcRequires olcRequires: authc dn: olcDatabase={-1}frontend,cn=config changetype: modify add: olcRequires olcRequires: authc ``` 载入修改 ```bash ldapadd -Y EXTERNAL -H ldapi:/// -f disabled_anon.ldif ``` 执行成功后输出如下 ```bash SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=config" modifying entry "cn=config" modifying entry "olcDatabase={-1}frontend,cn=config" ``` ## 安装 phpLDAPadmin 该业务需要增加 `php-ldpa` 模块支持 作者使用的 PHP 是由 Remi 提供的仓库,使用如下命令安装模块 ```bash dnf install php74-php-ldap ``` 还是由于 CentOS 8 中默认不提供 `openLDAP-servers` 包,`phpLDAPadmin` 包也默认不提供 可以直接在 [Release - leenooks/phpLDAPadmin - GitHub](https://github.com/leenooks/phpLDAPadmin/releases) 下载 Release 包 目前最新版本号为 `1.2.6.2` ```bash wget https://github.com/leenooks/phpLDAPadmin/archive/refs/tags/1.2.6.2.tar.gz ``` 将下载好的包移动到 Nginx 的 web 根目录下,解压并重命名为 `pla` ```bash tar zxvf 1.2.6.2.tar.gz mv phpLDAPadmin-1.2.6.2 pla ``` 本次配置中使用二级域名 `pla` 访问该业务,设置好 DNS 解析后在 Nginx 中**根据实际情况**增加配置 ```nginx server { listen 443 ssl; server_name pla.example.com; root html/pla; location / { index index.php; location ~ \.php(.*)$ { fastcgi_pass php-handler; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; fastcgi_param HTTPS on; include fastcgi_params; } } } ``` 进入 phpLDAPadmin 目录下的 `config` 目录,将 `config.php.example` 复制为 `config.php` ## 配置 DN 登录 默认使用 uid 登录,修改为 dn ```php $servers->setValue('login','attr','dn'); ``` 关闭匿名登录 ```php $servers->setValue('login','anon_bind',false); ``` 设置用户属性的唯一性,这里使用了 cn 和 sn,以确保用户名的唯一性 ```php $servers->setValue('unique','attrs',array('mail','uid','uidNumber','cn','sn')); ``` 最后修改:2022 年 01 月 05 日 © 允许规范转载