编译openldap,可作为kerberos的database。需要用到openssl 1.1.1或以上版本,以及kerberos包中带的kerberos.openldap.ldif文件。
准备以下所需安装包:
可能还会用到其他依赖包,后续使用yum进行安装。
/opt
目录下新建packages目录mkdir /opt/packages
/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
yum -y install gcc
./config --prefix=/opt/openssl
make && make install
编译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目录下。
vim /etc/profile
LDAP_HOME=/opt/openldap PATH=$PATH:$LDAP_HOME/bin:$LDAP_HOME/sbin:$LDAP_HOME/libexec export PATHsource /etc/profile
/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
/opt/openldap/etc/openldap/schema/
下:cd krb5-1.19.1
find ./ -name "*.ldif"
./src/plugins/kdb/ldap/libkdb_ldap/kerberos.openldap.ldif
cp ./src/plugins/kdb/ldap/libkdb_ldap/kerberos.openldap.ldif /opt/openldap/etc/openldap/schema/kerberos.ldif
mkdir /root/sudoers
cd /root/sudoers
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 ) )3.2 将sudoers.schema转化成sudoers.ldif文件。
echo "include /root/sudoers/sudoers.schema" > sudoers.conf
mkdir tmp
slapadd -F ./tmp -f ./sudoers.conf -n 0
ln -s /opt/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
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
目录下,会生成如下内容:[root@bugboy sudoers]# tree tmp tmp ├── cn=config │ ├── cn=schema │ ├── cn=schema.ldif │ ├── olcDatabase={0}config.ldif │ └── olcDatabase={-1}frontend.ldif └── cn=config.ldif其中我们要的为olcDatabase={0}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
cd /opt/openldap/
mkdir conf.d
slapadd -n 0 -F conf.d/ -l etc/openldap/slapd.ldif
[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
slapd -F /opt/openldap/conf.d/
slapd -F /opt/openldap/conf.d/ -d -1
kill -INT <进程号>
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了。
使用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
进行查看。
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
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
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
systemctl restart nslcd
authconfig --enableldap --enableldapauth --enablemkhomedir --ldapserver="localhost:389" --ldapbasedn="dc=bugboy,dc=com" --update
dn: ou=groups,dc=bugboy,dc=com objectClass: organizationalUnit objectClass: top ou: groups
dn: cn=wheel,ou=groups,dc=bugboy,dc=com objectClass: posixGroup objectClass: top cn: wheel gidNumber: 1001
dn: ou=users,dc=bugboy,dc=com objectClass: organizationalUnit objectClass: top ou: users
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=因为有密码,所以使用Apache Directory Studio创建更方便一些。
id admin
[root@bugboy ~]# id admin uid=10001(admin) gid=1001(wheel) 组=1001(wheel) [root@bugboy ~]#切换到admin用户:
su admin
sudo -l
[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在Apache Directory Studio显示结果如下:
至此,openldap编译以及配置成功。
参考文章列表:
下一篇,会介绍kerberos的源码编译安装,并使用此处的openldap作为kerberos的后端数据存储。