OpenLDAP源码编译安装,并配置posixAccount在linux系统中的用户sudo权限

编译openldap,可作为kerberos的database。需要用到openssl 1.1.1或以上版本,以及kerberos包中带的kerberos.openldap.ldif文件。

一、准备

准备以下所需安装包:

  1. openssl-1.1.1.tar.gz 下载地址:https://ftp.openssl.org/source/old/1.1.1/openssl-1.1.1.tar.gz
  2. openldap-2.5.5.tgz 下载地址:https://www.openldap.org/software/download/OpenLDAP/openldap-release/openldap-2.5.5.tgz
  3. 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
  1. openldap需要用到openssl 1.1.1或以上版本,但是centos7截止到2021年07月14日官方yum源中没有并没有openssl 1.1.1以上的版本。所以使用源码进行编译。
  2. /opt目录下新建packages目录

    mkdir /opt/packages
  3. 将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
  4. 编译openssl-1.1.1时需要用到gcc,使用yum安装gcc

    yum -y install gcc
  5. 编译openssl-1.1.1并将其安装到/opt/openssl目录下

    ./config --prefix=/opt/openssl

    make && make install
2.2 编译openldap-2.5.5
  1. 编译openldap时需要用到的依赖包,使用yum进行安装。

    yum -y install unixODBC-devel.x86_64

    yum -y install gcc

  2. 下载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
  1. 配置openldap环境变量:

    vim /etc/profile

    追加如下配置:
    LDAP_HOME=/opt/openldap
    PATH=$PATH:$LDAP_HOME/bin:$LDAP_HOME/sbin:$LDAP_HOME/libexec
    export PATH
    
    source /etc/profile
  2. 准备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.ldif
    cp ./src/plugins/kdb/ldap/libkdb_ldap/kerberos.openldap.ldif /opt/openldap/etc/openldap/schema/kerberos.ldif
    
  3. 配置生成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 :
    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

    发生如下异常: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目录下,会生成如下内容:
    [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.ldif
    mv ./tmp/cn=config/cn=schema/cn={0}sudoers.ldif /opt/openldap/etc/openldap/schema/sudoers.ldif
    
  4. 修改/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
  5. 根据配置文件生成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
    
  6. 启动openldap

    slapd -F /opt/openldap/conf.d/
  7. 如果需要启动后在控制台数据日志:

    slapd -F /opt/openldap/conf.d/ -d -1

    关于日志,可参见openldap官方文档: https://www.openldap.org/doc/admin25/slapdconf2.html
  8. 安全停止openldap:

    kill -INT <进程号>
  9. openldap启动成功后,即可使用openldap相关工具连接openldap了。默认端口号389.推荐使用Apache Directory Studio,下载地址 https://directory.apache.org/studio/downloads.html

三、使用Apache Directory Studio创建openldap的dn

  1. step1
    step1

  2. step2,点击Check Network Parameter 按钮进行测试。如果发生如下异常,检查防火墙,关闭防火墙或者设置对应的防火墙规则

    step1error
    关闭防火墙并禁止开机启动:

    systemctl stop firewalld

    systemctl disable firewalld

  3. step3,之后再测试,如下:

    step1ok

  4. step4,点击Next,填写如下信息:

    step4
    其中,Bind DN or user一栏,填写的是我们在slapd.ldif中配置的olcRootDN的值,Bind password 一栏为olcRootPW加密时生成的密码,如我的是用admin加密的,此处为admin

  5. 点击Check Authentication按钮,进行测试。如果dn和密码都没有错,则可认证通过,点击Finish即可进行连接。

  6. 进入后如下:

    进入studio后的显示结果

  7. 创建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也可以为其他库的内容。

  8. 之后就可以在该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权限。
  1. 安装nss-pam-ldapd
    yum -y install nss-pam-ldapd
    
  2. 修改/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
    
  3. 修改/etc/nsswitch.conf
    # 增加ldap
    passwd:     files sss ldap
    shadow:     files sss ldap
    group:      files sss ldap
    
    # 新增一条
    sudoers:    files   ldap
    
  4. 拷贝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
    
  5. 将/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
    
  6. 重启nslcd服务

    systemctl restart nslcd
  7. 更新nslcd 配置
    authconfig --enableldap --enableldapauth --enablemkhomedir --ldapserver="localhost:389" --ldapbasedn="dc=bugboy,dc=com" --update
    
3.2 测试sudo权限
  1. 创建一个group的dn。
    dn: ou=groups,dc=bugboy,dc=com
    objectClass: organizationalUnit
    objectClass: top
    ou: groups
    
  2. 在该dn下面创建一个wheel组。
    dn: cn=wheel,ou=groups,dc=bugboy,dc=com
    objectClass: posixGroup
    objectClass: top
    cn: wheel
    gidNumber: 1001
    
  3. 创建一个users的dn。
    dn: ou=users,dc=bugboy,dc=com
    objectClass: organizationalUnit
    objectClass: top
    ou: users
    
  4. 在users下面创建一个admin用户。注意,admin的gidNumber为上述wheel组的gidNumber。

    admin
    ldif为:
    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创建更方便一些。
  5. 在系统中,查询是否有admin用户。

    id admin
    [root@bugboy ~]# id admin
    uid=10001(admin) gid=1001(wheel) 组=1001(wheel)
    [root@bugboy ~]#
    
    切换到admin用户:

    su admin

    查询是否具有sudo权限:

    sudo -l

    显示如下结果,表示sudo权限配置成功。
    [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显示结果如下:

    resulr

五、最后

至此,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的后端数据存储。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值