编译openldap,可作为kerberos的database。需要用到openssl 1.1.1或以上版本,以及kerberos包中带的kerberos.openldap.ldif文件。
一、准备
准备以下所需安装包:
- openssl-1.1.1.tar.gz 下载地址:https://ftp.openssl.org/source/old/1.1.1/openssl-1.1.1.tar.gz
- openldap-2.5.5.tgz 下载地址:https://www.openldap.org/software/download/OpenLDAP/openldap-release/openldap-2.5.5.tgz
- krb5-1.19.1.tar.gz 下载地址:https://kerberos.org/dist/krb5/1.19/krb5-1.19.1.tar.gz
可能还会用到其他依赖包,后续使用yum进行安装。
二、编译并配置openldap
2.1 编译openssl-1.1.1
- openldap需要用到openssl 1.1.1或以上版本,但是centos7截止到2021年07月14日官方yum源中没有并没有openssl 1.1.1以上的版本。所以使用源码进行编译。
- 在
/opt
目录下新建packages目录mkdir /opt/packages
- 将openssl-1.1.1.tar.gz下载到
/opt/packages
目录下:cd /opt/packages
wget https://ftp.openssl.org/source/old/1.1.1/openssl-1.1.1.tar.gz
tar zxf openssl-1.1.1.tar.gz
cd openssl-1.1.1
- 编译openssl-1.1.1时需要用到gcc,使用yum安装gcc
yum -y install gcc
- 编译openssl-1.1.1并将其安装到/opt/openssl目录下
./config --prefix=/opt/openssl
make && make install
2.2 编译openldap-2.5.5
-
编译openldap时需要用到的依赖包,使用yum进行安装。
yum -y install unixODBC-devel.x86_64
yum -y install gcc
-
下载openldap源码包到
/opt/packages/
目录下,并编译安装到/opt/openldap
目录下。cd /opt/packages
wget https://www.openldap.org/software/download/OpenLDAP/openldap-release/openldap-2.5.5.tgz
tar zxf openldap-2.5.5.tgz
cd openldap-2.5.5
注意,编译时需要用到上文中已经编译好的openssl相关头文件以及库./configure CPPFLAGS="-I/usr/local/include -I/opt/openssl/include" LDFLAGS="-L/usr/local/lib -L/opt/openssl/lib" --datadir=/opt/openldap/data --enable-ldap --enable-cleartext --enable-sql --prefix=/opt/openldap/ --with-tls=openssl
注意,需要configure都校验通过后再进行编译安装。
make depend && make && make install
编译好后openldap就安装到了指定目录/opt/openldap目录下。
2.2 配置openldap
- 配置openldap环境变量:
vim /etc/profile
追加如下配置:
source /etc/profileLDAP_HOME=/opt/openldap PATH=$PATH:$LDAP_HOME/bin:$LDAP_HOME/sbin:$LDAP_HOME/libexec export PATH
- 准备kerberos.ldif。kerberos.ldif是kerberos提供的,在kerberos把openldap作为database时,其entry的规则。下载kerberos源码到
/opt/packages
中并解压:cd /opt/packages
wget https://kerberos.org/dist/krb5/1.19/krb5-1.19.1.tar.gz
tar zxf krb5-1.19.1.tar.gz
搜索kerberos.openldap.ldif,并将其拷贝到openldap的schema目录/opt/openldap/etc/openldap/schema/
下:cd krb5-1.19.1
find ./ -name "*.ldif"
结果为./src/plugins/kdb/ldap/libkdb_ldap/kerberos.openldap.ldif
拷贝并重新命名为kerberos.ldifcp ./src/plugins/kdb/ldap/libkdb_ldap/kerberos.openldap.ldif /opt/openldap/etc/openldap/schema/kerberos.ldif
- 配置生成sudo的ldif文件
3.1 到/root目录下新建一个sudoers目录:mkdir /root/sudoers
cd /root/sudoers
新建一个sudoers.schema文件,文件内容来自 https://www.sudo.ws/man/1.8.17/sudoers.ldap.man.html#Sudo_schema_for_OpenLDAP :
3.2 将sudoers.schema转化成sudoers.ldif文件。attributetype ( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.2 NAME 'sudoHost' DESC 'Host(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.3 NAME 'sudoCommand' DESC 'Command(s) to be executed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.4 NAME 'sudoRunAs' DESC 'User(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.5 NAME 'sudoOption' DESC 'Options(s) followed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'User(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC 'Group(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributetype ( 1.3.6.1.4.1.15953.9.1.8 NAME 'sudoNotBefore' DESC 'Start of time interval for which the entry is valid' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 ) attributetype ( 1.3.6.1.4.1.15953.9.1.9 NAME 'sudoNotAfter' DESC 'End of time interval for which the entry is valid' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 ) attributetype ( 1.3.6.1.4.1.15953.9.1.10 NAME 'sudoOrder' DESC 'an integer to order the sudoRole entries' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) objectclass ( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' SUP top STRUCTURAL DESC 'Sudoer Entries' MUST ( cn ) MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ sudoNotBefore $ sudoNotAfter $ sudoOrder $ description ) )
echo "include /root/sudoers/sudoers.schema" > sudoers.conf
mkdir tmp
slapadd -F ./tmp -f ./sudoers.conf -n 0
发生如下异常:slapadd: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory时,创建如下软连接:ln -s /opt/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
发生如下异常:slapadd: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory时,创建如下软连接:ln -s /opt/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
重新执行slapadd -F ./tmp -f ./sudoers.conf -n 0
注意,执行上诉命令可能没法停止(我也不知道为什么),可以手动ctrl+c
进行停止。
执行完后,在/root/sudoers/tmp
目录下,会生成如下内容:
其中我们要的为olcDatabase={0}config.ldif[root@bugboy sudoers]# tree tmp tmp ├── cn=config │ ├── cn=schema │ ├── cn=schema.ldif │ ├── olcDatabase={0}config.ldif │ └── olcDatabase={-1}frontend.ldif └── cn=config.ldif
修改该文件:vim ./tmp/cn\=config/cn\=schema/cn\=\{0\}sudoers.ldif
将
修改为:dn: cn={0}sudoers objectClass: olcSchemaConfig cn: {0}sudoers
并删除文件末尾的如下内容:dn: cn=sudoers,cn=schema,cn=config objectClass: olcSchemaConfig cn: sudoers
拷贝修改后的文件到structuralObjectClass: olcSchemaConfig entryUUID: 946efb8a-6db9-103b-8419-499855ab2a77 creatorsName: cn=config createTimestamp: 20210630063852Z entryCSN: 20210630063852.758605Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20210630063852Z
/opt/openldap/etc/openldap/schema/
目录下,并命名为sudoers.ldifmv ./tmp/cn=config/cn=schema/cn={0}sudoers.ldif /opt/openldap/etc/openldap/schema/sudoers.ldif
- 修改
/opt/openldap/etc/openldap/slapd.ldif
,如下:
将
修改为:include: file:///opt/openldap/etc/openldap/schema/core.ldif
将include: file:///opt/openldap/etc/openldap/schema/corba.ldif include: file:///opt/openldap/etc/openldap/schema/core.ldif include: file:///opt/openldap/etc/openldap/schema/collective.ldif include: file:///opt/openldap/etc/openldap/schema/cosine.ldif include: file:///opt/openldap/etc/openldap/schema/dsee.ldif include: file:///opt/openldap/etc/openldap/schema/duaconf.ldif include: file:///opt/openldap/etc/openldap/schema/inetorgperson.ldif include: file:///opt/openldap/etc/openldap/schema/java.ldif include: file:///opt/openldap/etc/openldap/schema/misc.ldif include: file:///opt/openldap/etc/openldap/schema/namedobject.ldif include: file:///opt/openldap/etc/openldap/schema/nis.ldif include: file:///opt/openldap/etc/openldap/schema/msuser.ldif include: file:///opt/openldap/etc/openldap/schema/openldap.ldif include: file:///opt/openldap/etc/openldap/schema/pmi.ldif include: file:///opt/openldap/etc/openldap/schema/kerberos.ldif include: file:///opt/openldap/etc/openldap/schema/sudoers.ldif
修改为(根据自己情况而定)olcSuffix: dc=my-domain,dc=com olcRootDN: cn=Manager,dc=my-domain,dc=com
将olcSuffix: dc=bugboy,dc=com olcRootDN: cn=admin,dc=bugboy,dc=com
修改为olcRootPW: secret
其中olcRootPW: {SSHA}2sz4NimLLWa2aWEqSubz8e65wyLFxqxL
{SSHA}2sz4NimLLWa2aWEqSubz8e65wyLFxqxL
是使用slappasswd命令生成的,也可以直接使用明文密码。
文件中的olcDbDirectory: /opt/openldap/var/openldap-data
是编译时指定并生成的,该目录需要提前创建。mkdir -p /opt/openldap/var/openldap-data
- 根据配置文件生成openldap的配置数据到conf.d下:
cd /opt/openldap/
mkdir conf.d
slapadd -n 0 -F conf.d/ -l etc/openldap/slapd.ldif
conf.d的内容如下:[root@bugboy openldap]# tree conf.d conf.d ├── cn=config │ ├── cn=schema │ │ ├── cn={0}corba.ldif │ │ ├── cn={10}nis.ldif │ │ ├── cn={11}msuser.ldif │ │ ├── cn={12}openldap.ldif │ │ ├── cn={13}pmi.ldif │ │ ├── cn={14}kerberos.ldif │ │ ├── cn={15}sudoers.ldif │ │ ├── cn={1}core.ldif │ │ ├── cn={2}collective.ldif │ │ ├── cn={3}cosine.ldif │ │ ├── cn={4}dsee.ldif │ │ ├── cn={5}duaconf.ldif │ │ ├── cn={6}inetorgperson.ldif │ │ ├── cn={7}java.ldif │ │ ├── cn={8}misc.ldif │ │ └── cn={9}namedobject.ldif │ ├── cn=schema.ldif │ ├── olcDatabase={0}config.ldif │ ├── olcDatabase={-1}frontend.ldif │ ├── olcDatabase={1}mdb.ldif │ └── olcDatabase={2}monitor.ldif └── cn=config.ldif 2 directories, 22 files
- 启动openldap
slapd -F /opt/openldap/conf.d/
- 如果需要启动后在控制台数据日志:
slapd -F /opt/openldap/conf.d/ -d -1
关于日志,可参见openldap官方文档: https://www.openldap.org/doc/admin25/slapdconf2.html - 安全停止openldap:
kill -INT <进程号>
- openldap启动成功后,即可使用openldap相关工具连接openldap了。默认端口号389.推荐使用Apache Directory Studio,下载地址 https://directory.apache.org/studio/downloads.html
三、使用Apache Directory Studio创建openldap的dn
-
step1
-
step2,点击Check Network Parameter 按钮进行测试。如果发生如下异常,检查防火墙,关闭防火墙或者设置对应的防火墙规则
关闭防火墙并禁止开机启动:systemctl stop firewalld
systemctl disable firewalld
-
step3,之后再测试,如下:
-
step4,点击Next,填写如下信息:
其中,Bind DN or user一栏,填写的是我们在slapd.ldif中配置的olcRootDN的值,Bind password 一栏为olcRootPW加密时生成的密码,如我的是用admin加密的,此处为admin -
点击Check Authentication按钮,进行测试。如果dn和密码都没有错,则可认证通过,点击Finish即可进行连接。
-
进入后如下:
-
创建dn,ldif如下:
dn: dc=bugboy,dc=com objectclass: dcObject objectclass: organization objectclass: top dc: bugboy o: bugboy
需要注意的是,此处dn需要与slapd.ldif中配置的olcSuffix一致,表示操作的是dc=bugboy,dc=com这个库。如果在slapd.ldif定义了其他库,此处ldif中的dn也可以为其他库的内容。
-
之后就可以在该dn下面创建entry了。
四、配置ldap的posixAccount在linux系统中的用户sudo权限
使用Apache Directory Studio或者ldap自带的导入ldif文件的工具创建一个sudoers,dn内容如下:
dn: ou=sudoers,dc=bugboy,dc=com
objectClass: organizationalUnit
ou: sudoers
Apache Directory Studio创建dn的方式已经在上文中的动图中展示过,下面使用openldap自带的工具进行导入。
创建一个sudo_dn.ldif文件,文件内容如上。然后使用如下命令导入到openldap中。
ldapadd -D cn=admin,dc=bugboy,dc=com -H ldap://localhost:389 -f sudo_dn.ldif -W -x
命令的更多参数,可以使用ldapadd --help
进行查看。
3.1 将openldap中用户同步到linux系统,并可以设置sudo权限。
- 安装nss-pam-ldapd
yum -y install nss-pam-ldapd
- 修改
/etc/sudo-ldap.conf
binddn cn=admin,dc=bugboy,dc=com bindpw admin uri ldap://localhost:389 sudoers_base ou=sudoers,dc=bugboy,dc=com
- 修改
/etc/nsswitch.conf
# 增加ldap passwd: files sss ldap shadow: files sss ldap group: files sss ldap # 新增一条 sudoers: files ldap
- 拷贝openldap下面的ldap.conf到/etc下面,并修改:
cp /opt/openldap/etc/openldap/ldap.conf /etc/
vim /etc/ldap.conf
base dc=bugboy,dc=com uri ldap://localhost:389 BINDDN cn=admin,dc=bugboy,dc=com BINDPW admin
- 将/etc/sudoers文件内容转化为ldif文件,并导入到openldap的
ou=sudoers,dc=bugboy,dc=com
dn中。cvtsudoers -f ldif -o /tmp/sudoers.ldif -b ou=sudoers,dc=bugboy,dc=com /etc/sudoers
ldapadd -D cn=admin,dc=bugboy,dc=com -H ldap://localhost:389 -f /tmp/sudoers.ldif -W -x
- 重启nslcd服务
systemctl restart nslcd
- 更新nslcd 配置
authconfig --enableldap --enableldapauth --enablemkhomedir --ldapserver="localhost:389" --ldapbasedn="dc=bugboy,dc=com" --update
3.2 测试sudo权限
- 创建一个group的dn。
dn: ou=groups,dc=bugboy,dc=com objectClass: organizationalUnit objectClass: top ou: groups
- 在该dn下面创建一个wheel组。
dn: cn=wheel,ou=groups,dc=bugboy,dc=com objectClass: posixGroup objectClass: top cn: wheel gidNumber: 1001
- 创建一个users的dn。
dn: ou=users,dc=bugboy,dc=com objectClass: organizationalUnit objectClass: top ou: users
- 在users下面创建一个admin用户。注意,admin的gidNumber为上述wheel组的gidNumber。
ldif为:
因为有密码,所以使用Apache Directory Studio创建更方便一些。dn: cn=admin,ou=users,dc=bugboy,dc=com objectClass: inetOrgPerson objectClass: organizationalPerson objectClass: person objectClass: posixAccount objectClass: top cn: admin gidNumber: 1001 homeDirectory: /home/admin sn: admin uid: admin uidNumber: 10001 loginShell: /bin/bash userPassword:: YWRtaW4=
- 在系统中,查询是否有admin用户。
id admin
切换到admin用户:[root@bugboy ~]# id admin uid=10001(admin) gid=1001(wheel) 组=1001(wheel) [root@bugboy ~]#
su admin
查询是否具有sudo权限:sudo -l
显示如下结果,表示sudo权限配置成功。
最终的openldap在Apache Directory Studio显示结果如下:[admin@bugboy root]$ sudo -l 我们信任您已经从系统管理员那里了解了日常注意事项。 总结起来无外乎这三点: #1) 尊重别人的隐私。 #2) 输入前要先考虑(后果和风险)。 #3) 权力越大,责任越大。 [sudo] admin 的密码: 匹配 %2$s 上 %1$s 的默认条目: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin, !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin 用户 admin 可以在 bugboy 上运行以下命令: (ALL) ALL [admin@bugboy root]$
四、最后
至此,openldap编译以及配置成功。
参考文章列表:
- oepnldap官方文档:
https://www.openldap.org/doc/admin25/ - sudo配置:
https://www.sudo.ws/sudo.html - mit kerberos官方文档:
https://web.mit.edu/kerberos/krb5-1.19/doc/admin/ - Apache Directory Studio使用文档:
https://nightlies.apache.org/directory/studio/2.0.0.v2021013-M16/userguide/apache_directory_studio/
下一篇,会介绍kerberos的源码编译安装,并使用此处的openldap作为kerberos的后端数据存储。