OpenLDAP使用,配置sudo权限并将LDAP用户添加到sudo组

前言

本文比较凌乱

环境

LDAPLDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是一种开放、跨平台、用于访问和维护分布式目录信息服务的标准协议。它广泛应用于企业环境中,用于用户身份验证、权限管理和访问控制。
本文中OpenLDAP指OpenLDAP应用。

环境说明:
    KVM虚拟机,OpenLDAP的服务端IP:
    192.168.122.105
    使用的
    dn: cn=admin,dc=example,dc=cn。

上边的都可以随便改的,KVM虚拟机随便设置,宿主机还可以用iptables来把虚拟机NAT转发出入

某些描述

随着企业内部各种开源平台越来越多,例如:gitlab、Jenkins、JumpServer、Rancher等,账号维护变成一件繁琐的事情,这时需要一个统一账号维护的平台,每人只需一个账号,在公司内部平台通用。而大多数开源平台都支持 LDAP,因此只要搭建好 LDAP 服务,将企业内部这些平台都对接到 LDAP,即可实现统一账号管理。
LDAP(Light Directory Access Portocol),它是基于 X.500 标准的轻量级目录访问协议。目录数据库是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。
LDAP目录服务是由目录数据库和一套访问协议组成的系统。

基本概念

  1. 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
  2. 条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。
  3. 对象类:与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来。
  4. 属性:描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。
关键字 英文全称 含义
dc Domain Component 域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置)
uid User Id 用户ID songtao.xu(一条记录的ID)
ou Organization Unit 组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织)
cn Common Name 公共名称,如“Thomas Johansson”(一条记录的名称)
sn Surname 姓,如“许”
dn Distinguished Name “uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一)
rdn Relative dn 相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson”

上述基本概念来自转载:https://www.cnblogs.com/strongmore/p/18113978

OpenLDAP服务端 客户端安装部署

服务端虚拟机主机上OpenLDAP server安装

流程:
    1.安装相关包
    2.OpenLDAP基础配置
    3.创建包含基本的域、组织单位(OU)、组和用户条目。

rpm

# yum 安装相关包
sudo yum -y install openldap openldap-servers openldap-devel openldap-clients

cd /etc/openldap/
#使用简单配置
# # [root@www openldap]# cat slapd.conf 
# include /etc/openldap/schema/core.schema
# include /etc/openldap/schema/collective.schema
# include /etc/openldap/schema/corba.schema
# include /etc/openldap/schema/cosine.schema
# include /etc/openldap/schema/duaconf.schema
# include /etc/openldap/schema/dyngroup.schema
# include /etc/openldap/schema/inetorgperson.schema
# include /etc/openldap/schema/java.schema
# include /etc/openldap/schema/misc.schema
# include /etc/openldap/schema/nis.schema
# include /etc/openldap/schema/openldap.schema
# include /etc/openldap/schema/ppolicy.schema
# include /etc/openldap/schema/pmi.schema

# pidfile /var/run/openldap/slapd.pid
# argsfile /var/run/openldap/slapd.args

# loglevel 256

# logfile  /var/logs/slapd.log

# database mdb

# maxsize 1073741824

# suffix "dc=example,dc=com"
# # 管理员帐号"cn=admin,dc=example,dc=com",双引号里边的。。。一整串都要输入
# rootdn "cn=admin,dc=example,dc=com"

# rootpw {SSHA}/PAr3OgCfOclNoIXmC2P4xTa9usVK8Dn

# directory /var/openldap-data

# index objectClass eq

###################################
## 下边使用的旧样式配置,也可以生成cn=config
## https://www.openldap.org/doc/admin26/slapdconf2.html   5.4
###  Converting old style slapd.conf(5) file to cn=config format
cat > myslapd.conf  << EOF 
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/pmi.schema

pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args

loglevel 256

logfile  /var/log/slapd.log

database mdb

maxsize 1073741824

suffix "dc=example,dc=com"
# 管理员帐号登录用"cn=admin,dc=example,dc=com",双引号里边的。。。一整串都要输入,在web登录界面那的时候
rootdn "cn=admin,dc=example,dc=com"
# 密码 123456
rootpw {SSHA}/PAr3OgCfOclNoIXmC2P4xTa9usVK8Dn
# 自定义数据库路径
directory /var/openldap-data
# 数据库索引设置,索引objectclass
index objectClass eq
EOF

mkdir /var/openldap-data 

cp /usr/share/openldap-servers/DB_CONFIG.example /var/openldap-data/DB_CONFIG

chown ldap:ldap -R /var/openldap-data

#重新生成配置文件信息文件到slapd.d目录下
rm -rf /etc/openldap/slapd.d/*  #重新生成配置前,可以先删除旧配置

# 启动服务,先启动服务,配置后面再进行修改
sudo systemctl enable slapd && sudo systemctl start slapd

# 检测/etc/openldap/myslapd.conf是否有错误:
slaptest -f /etc/openldap/myslapd.conf
# 必须先启动slapd否则直接报错
slaptest -f /etc/openldap/myslapd.conf -F /etc/openldap/slapd.d/

chown ldap:ldap -R /var/openldap-data
chown ldap:ldap -R /etc/openldap/slapd.d/
# 重启slapd
systemctl restart slapd

##phpldapadmin自行网上搜索看看,或者
function LDAP_use_phpldapadmin(){
    # 安装apache和PHP
    yum -y install httpd php php-ldap php-gd php-mbstring  php-bcmath php-xml

    # 安装phpldapadmin
    yum -y install phpldapadmin

    # 修改配置
    # 开启外网访问,修改为 Require all granted

    # vim /etc/httpd/conf.d/phpldapadmin.conf
    #
    #  Web-based tool for managing LDAP servers
    #
    # Alias /phpldapadmin /usr/share/phpldapadmin/htdocs
    # Alias /ldapadmin /usr/share/phpldapadmin/htdocs

    # <Directory /usr/share/phpldapadmin/htdocs>
    #   <IfModule mod_authz_core.c>
    #     # Apache 2.4
    #     Require all granted
    #   </IfModule>
    #   <IfModule !mod_authz_core.c>
    #     # Apache 2.2
    #     Order Deny,Allow
    #     Deny from all
    #     Allow from 127.0.0.1
    #     Allow from ::1
    #   </IfModule>
    # </Directory>
    # 修改uid登录方式和关闭匿名登录和用户属性的唯一性
    sed -i 's/Require local/Require all granted/g' /etc/httpd/conf.d/phpldapadmin.conf

    # vim /etc/phpldapadmin/config.php
    # #397行取消注释,398行添加注释
    # $servers->setValue('login','attr','dn');
    # // $servers->setValue('login','attr','uid');
    sed -n '397p' /etc/phpldapadmin/config.php | grep -F "\$servers->setValue('login','attr','dn');" && sed -n '397p' /etc/phpldapadmin/config.php | grep '^[^\$]' && sed -i '397s/'''"^.*\$servers->setValue('login','attr','dn');"'''/'''"\$servers->setValue('login','attr','dn');"'''/g' /etc/phpldapadmin/config.php
    sed -n '398p' /etc/phpldapadmin/config.php | grep -F "\$servers->setValue('login','attr','uid');" && sed -n '398p' /etc/phpldapadmin/config.php | grep '^\$' && sed -i '398s/'''"^\$servers->setValue('login','attr','uid');"'''/'''"\/\/ \$servers->setValue('login','attr','uid');"'''/g' /etc/phpldapadmin/config.php

    # # 找到460行,取消注释,把true改为false 关闭匿名登录
    # $servers->setValue('login','anon_bind',false);
    sed -i '460s/'''"\$servers->setValue('login','anon_bind',true);"'''/'''"\$servers->setValue('login','anon_bind',false);"'''/g' /etc/phpldapadmin/config.php

    # # 找到519行,取消注释,设置用户属性的唯一性,这里我将cn sn给添加上
    # $servers->setValue('unique','attrs',array('mail','uid','uidNumber','cn','sn'))
    #这不用设

    # 安装php-fpm ,否则会报503错误
    yum install php-fpm -y
    systemctl enable --now php-fpm
    systemctl restart php-fpm
    systemctl restart httpd

    ## 访问
    # 如果在服务器上,网页输入 127.0.0.1/ldapadmin
    # 帐号密码
    ## dn
    # cn=admin,dc=example,dc=com
    ## 密码
    # 123456

# 其他LDAP管理工具
## Apache Directory Studio
##https://directory.apache.org/studio/
}

###下建域,添加两个用户
# 创建一个 LDIF 文件,包含基本的域、组织单位(OU)、组和用户条目。例如,创建 base.ldif 文件:
cat > /etc/openldap/base.ldif << EOF
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Example Organization
dc: example

dn: ou=People,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: People

dn: ou=Groups,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Groups
EOF
# 使用以下命令将上述条目添加到 LDAP 数据库中:
# sudo ldapadd -x -D cn=admin,dc=example,dc=com -W -f base.ldif
sudo ldapadd -x -D cn=admin,dc=example,dc=com -w 123456 -f base.ldif

cat > /etc/openldap/user1.ldif << EOF
#例子1  用户:test1
###用户(一组数据行之间不要有空格)
dn: uid=test1,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: test1
sn: User1
givenName: User1
cn: User1
displayName: User1
uidNumber: 10001
gidNumber: 10001
userPassword: {SSHA}8qW5iO4i9PoN7ZHhHy1f157XMOvjKuAv
gecos: User1
loginShell: /bin/bash
homeDirectory: /home/test1

###组(一组数据行之间不要有空格)
dn: cn=test1,ou=Groups,dc=example,dc=com
objectClass: posixGroup
cn: test1
gidNumber: 10001
memberUid: test1
EOF

cat > /etc/openldap/user2.ldif << EOF
#例子2 用户:testuser
###用户(一组数据行之间不要有空格)
dn: uid=testuser,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: Test User
sn: User
uid: testuser
uidNumber: 10000
gidNumber: 10000
homeDirectory: /home/testuser
loginShell: /bin/bash
gecos: Test User
userPassword: {SSHA}z7Ym7p6Zi92aPRHDcu5PE+Mu8eqT4FJn

###组(一组数据行之间不要有空格)
dn: cn=testuser,ou=Groups,dc=example,dc=com
objectClass: posixGroup
cn: Test User
gidNumber: 10000
memberUid: testuser
EOF

# 使用以下命令将上述条目添加到 LDAP 数据库中:
# ldapadd -x -D cn=admin,dc=example,dc=com -W -f user1.ldif
ldapadd -x -D cn=admin,dc=example,dc=com -w 123456 -f user1.ldif
# ldapadd -x -D cn=admin,dc=example,dc=com -W -f user2.ldif
ldapadd -x -D cn=admin,dc=example,dc=com -w 123456 -f user2.ldif

deb

sudo dpkg-reconfig slapd
配置部分需要设置下,参看教程,很是详细
https://www.cnblogs.com/autopwn/p/18214912
# deb 安装相关包,使用debconf初步配置,其实边还要dpkg-reconfig
# 非常详细教程:https://www.cnblogs.com/autopwn/p/18214912
debconf-set-selections <<EOF
slapd slapd/password1 password {SSHA}DdtQYhA0hLBmOMu8Rx/zrKc/Apq6JKgA
slapd slapd/password2 password {SSHA}DdtQYhA0hLBmOMu8Rx/zrKc/Apq6JKgA
slapd slapd/no_configuration boolean false
slapd slapd/domain string example.com
slapd shared/organization string example.com
slapd slapd/password1 password {SSHA}DdtQYhA0hLBmOMu8Rx/zrKc/Apq6JKgA
slapd slapd/password2 password {SSHA}DdtQYhA0hLBmOMu8Rx/zrKc/Apq6JKgA
slapd slapd/purge_database boolean false
slapd slapd/move_old_database boolean true
EOF

sudo apt update
sudo apt -y install slapd

## https://www.cnblogs.com/autopwn/p/18214912
## 参考教程,完成配置
sudo dpkg-reconfig slapd


# 创建一个 LDIF 文件,包含基本的域、组织单位(OU)、组和用户条目。例如,创建 base.ldif 文件:
cd /etc/ldap
cat > /etc/ldap/base.ldif << EOF
# dn: dc=example,dc=com
# objectClass: top
# objectClass: dcObject
# objectClass: organization
# o: Example Organization
# dc: example

dn: ou=People,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: People

dn: ou=Groups,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Groups
EOF
# 使用以下命令将上述条目添加到 LDAP 数据库中:
# sudo ldapadd -x -D cn=admin,dc=example,dc=com -W -f base.ldif
sudo ldapadd -x -D cn=admin,dc=example,dc=com -w 123456 -f base.ldif

cat > /etc/ldap/user1.ldif << EOF
#例子1  用户:test1
###用户(一组数据行之间不要有空格)
dn: uid=test1,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: test1
sn: User1
givenName: User1
cn: User1
displayName: User1
uidNumber: 10001
gidNumber: 10001
userPassword: {SSHA}8qW5iO4i9PoN7ZHhHy1f157XMOvjKuAv
gecos: User1
loginShell: /bin/bash
homeDirectory: /home/test1

###组(一组数据行之间不要有空格)
dn: cn=test1,ou=Groups,dc=example,dc=com
objectClass: posixGroup
cn: test1
gidNumber: 10001
memberUid: test1
EOF

cat > /etc/ldap/user2.ldif << EOF
#例子2 用户:testuser
###用户(一组数据行之间不要有空格)
dn: uid=testuser,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: Test User
sn: User
uid: testuser
uidNumber: 10000
gidNumber: 10000
homeDirectory: /home/testuser
loginShell: /bin/bash
gecos: Test User
userPassword: {SSHA}z7Ym7p6Zi92aPRHDcu5PE+Mu8eqT4FJn

###组(一组数据行之间不要有空格)
dn: cn=testuser,ou=Groups,dc=example,dc=com
objectClass: posixGroup
cn: Test User
gidNumber: 10000
memberUid: testuser
EOF
# 使用以下命令将上述条目添加到 LDAP 数据库中:
# ldapadd -x -D cn=admin,dc=example,dc=com -W -f user1.ldif
ldapadd -x -D cn=admin,dc=example,dc=com -w 123456 -f user1.ldif
# ldapadd -x -D cn=admin,dc=example,dc=com -W -f user2.ldif
ldapadd -x -D cn=admin,dc=example,dc=com -w 123456 -f user2.ldif

OpenLDAP服务端主机上直接进行验证

# client
# 目前没有直接在OpenLDAP服务端所在的虚拟机也配置客户端,即用服务端虚拟机主机和客户端虚拟机主机演示
## openldap-client工具验证
## ldapsearch是一个用于搜索和查询LDAP目录的工具。以下是一个使用ldapsearch进行查询验证的示例:
#ldapsearch -x -H ldap://服务器地址|hosts主机名|域名 -D "cn=管理员,dc=域名,dc=顶级域" -w 密码 -b "dc=域名,dc=顶级域" "(objectClass=\*)"
# ldapsearch -H ldap://127.0.0.1 -x -D 'cn=admin,dc=example,dc=com' -w '123456'  -b 'dc=example,dc=com' '(objectClass=*)'  
ldapsearch -H ldap://127.0.0.1 -x  -D 'cn=admin,dc=example,dc=com' -w '123456' -b 'dc=example,dc=com' '(objectClass=*)' 

OpenLDAP client安装

本KVM虚拟机中使用的LDAP服务
BASE dc=example,dc=com
URI ldap://192.168.122.105/
基本流程:
    1.pkg安装
    2.配置
    3.需要登录的改下pam模块,不需要的话其实3可以省
    4.验证,getent passwd 、 getent group能查到获取到的OpenLDAP用户;做完3才能去登录操作系统

deb

安装 OpenLDAP 认证、配置、pam等包

静默安装的配置
# 期间debconf需要配置一些信息ldap的配置,之后需要修改的话在/etc/ldap.conf
# 想要静默安装,可以预先使用 debconf-set-selections 来设置配置项,看ldap-auth-config包下的control/templates;或者安装好后用debconf-show,或安装debconf-utils用debconf-get-selections看配置
debconf-set-selections <<EOF
ldap-auth-config ldap-auth-config/ldapns/ldap-server string ldap://192.168.122.105/
ldap-auth-config ldap-auth-config/ldapns/base-dn string dc=example,dc=com
ldap-auth-config ldap-auth-config/ldapns/ldap_version select 3
ldap-auth-config ldap-auth-config/dbrootlogin boolean false
ldap-auth-config ldap-auth-config/dblogin boolean false
EOF

sudo apt install -y libnss-ldap libpam-ldap ldap-utils ldap-auth-client ldap-auth-config
非静默安装
sudo apt install -y ldap-auth-client ldap-auth-config libnss-ldap libpam-ldap ldap-utils nscd
# sudo apt install -y ldap-auth-client ldap-auth-config libnss-ldap libpam-ldap ldap-utils 

期间debconf需要配置一些信息ldap的配置,之后需要修改的话在/etc/ldap.conf

想要非交互式地安装,可以预先使用 debconf-set-selections 来设置配置项

1
1

配置 OpenLDAP 客户端

# # 配置 NSS
# # 编辑 /etc/nsswitch.conf 文件,确保以下行包含 ldap:
# # ```bash
# passwd:     files ldap
# group:      files ldap
# shadow:     files ldap
# # ```
grep "^passwd"  /etc/nsswitch.conf | grep ldap || sed -i '/^passwd/ s/$/ ldap/g' /etc/nsswitch.conf
grep "^shadow"  /etc/nsswitch.conf | grep ldap || sed -i '/^shadow/ s/$/ ldap/g' /etc/nsswitch.conf
grep "^group"  /etc/nsswitch.conf | grep ldap || sed -i '/^group/ s/$/ ldap/g' /etc/nsswitch.conf

配置 PAM 模块

# 注:ubuntu22.04不用改什么,因为libpam-ldap给帮配置了

# 查看下 /etc/pam.d/下common-各文件,确保包含: pam_ldap.so

rpm

最小化安装的话想要tab补全,可以安装下bash-completion

安装 OpenLDAP 认证、配置、pam等包

##会拉完依赖的
sudo yum install -y nss-pam-ldapd

配置 OpenLDAP 客户端

# 编辑 /etc/nslcd.conf 文件,设置以下参数:
# ```bash
# uri ldap://ldap.example.com/
# base dc=example,dc=com
# ```
sed -i "s/^uri.*/uri ldap:\/\/192.168.122.105\//g"  /etc/nslcd.conf
grep  "^uri" /etc/nslcd.conf || echo 'uri ldap://192.168.122.105' >> /etc/nslcd.conf

sed -i "s/^base.*/base dc=example,dc=com/g"  /etc/nslcd.conf
grep  "^base" /etc/nslcd.conf || echo 'base dc=example,dc=com' >> /etc/nslcd.conf

# 编辑 /etc/nsswitch.conf 文件,确保以下行包含 ldap:
# ```bash
# passwd:     files ldap
# group:      files ldap
# shadow:     files ldap
# ```
grep "^passwd"  /etc/nsswitch.conf | grep ldap || sed -i '/^passwd/ s/$/ ldap/g' /etc/nsswitch.conf
grep "^shadow"  /etc/nsswitch.conf | grep ldap || sed -i '/^shadow/ s/$/ ldap/g' /etc/nsswitch.conf
grep "^group"  /etc/nsswitch.conf | grep ldap || sed -i '/^group/ s/$/ ldap/g' /etc/nsswitch.conf

# 查看nslcd服务
# ```sh
# systemctl restart nslcd
# systemctl status nslcd
# ```
systemctl enable --now nslcd
systemctl restart nslcd
systemctl status nslcd

配置 PAM 模块

# 编辑 /etc/pam.d/system-auth 文件,确保包含:

# auth        required      pam_env.so
# auth        sufficient    pam_unix.so nullok try_first_pass
# auth        requisite     pam_succeed_if.so uid >= 500 quiet
# auth        sufficient    pam_ldap.so use_first_pass
# auth        required      pam_deny.so

# account     required      pam_unix.so
# account     sufficient    pam_localuser.so
# account     sufficient    pam_succeed_if.so uid < 500 quiet
# account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
# account     required      pam_permit.so

# password    requisite     pam_cracklib.so try_first_pass retry=3
# password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
# password    sufficient    pam_ldap.so use_authtok
# password    required      pam_deny.so

# session     optional      pam_keyinit.so revoke
# session     required      pam_limits.so
# session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
# session     required      pam_unix.so
# session     optional      pam_ldap.so

验证

#查询passwd,group数据,如果列出OpenLDAP用户即获取用户部分配置正常
getent passwd
getent group
#如果安全策略允许su切换用户,用普通用户su切换用户测试,或者注销登录OpenLDAP用户,这是测试PAM模块是否正确配置
su  test1
# ## 终端互交运维
# ldapadd   ldapdelete   ldapmodify   ldappasswd   ldapurl       ldapcompare  ldapexop     ldapmodrdn   ldapsearch   ldapwhoami  

# slapacl     slapauth    slapd       slapindex   slapschema   slapadd     slapcat     slapdn      slappasswd  slaptest 
# #### search 查找
# ```sh
# # 指定IP,可客户端去查服务端
# ldapsearch -H ldap://127.0.0.1 -x  -D 'cn=admin,dc=example,dc=com' -w '123456' -b 'dc=example,dc=com' '(objectClass=*)' 
# #服务端本地查询所有条目
# ldapsearch -x -b 'dc=example,dc=com'
# # 根据cn过滤
# ldapsearch -x -b 'dc=example,dc=com' 'cn=admin'
# # 根据uid过滤
# ldapsearch -x -b 'dc=example,dc=com' 'uid=testuser'

各类场景和需求

需求:为OpenLDAP配置sudo权限并将LDAP用户添加到sudo组(完成)

目的:使用sudo的LDAP支持
方式:1.使用sudo对OpenLDAP的支持,直接管理sudo权限
途径:为添加sudo.schema配置,该操作才会在ObjectClasses添加sudoRole,之后,管理OpenLDAP里的组和用户
方式:2.使用主机本机/etc/sudoers配置,直接在OpenLDAP建满足/etc/sudoers配置文件的组或用户,即通过GID和UID
参考链接:
https://www.cnblogs.com/panwenbin-logs/p/16164467.html
https://blog.csdn.net/qq_40171314/article/details/139987424

以下是大概思路

1. 安装必要的软件包

确保已安装必要的软件包:

sudo apt-get update
sudo apt-get install sudo-ldap

2. 配置LDAP服务器

编辑slapd.conf或cn=config中的相关配置文件,以支持sudo相关的架构。

添加sudo架构

下载并安装sudo架构:

wget https://github.com/sudo-project/sudo/blob/main/docs/schema.OpenLDAP
sudo cp schema.OpenLDAP /etc/ldap/schema/sudo.schema

编辑OpenLDAP的配置文件以包含sudo架构。例如,编辑slapd.conf:

include         /etc/ldap/schema/sudo.schema

加载sudo架构

如果使用cn=config配置,请按照以下步骤进行:

将sudo架构转换为LDIF格式:

sudo slaptest -f /etc/ldap/schema/sudo.schema -F /tmp/ldif_output

导入生成的LDIF文件:

ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/ldif_output/cn=config/cn=schema/cn={X}sudo.ldif

其中,{X}是适当的数字,取决于现有的schema数目。

3. 创建sudo规则

创建包含sudo规则的LDIF文件,例如sudoers.ldif:

dn: ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: SUDOers

dn: cn=defaults,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: defaults
sudoOption: !authenticate

dn: cn=admin,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: admin
sudoUser: %admins
sudoHost: ALL
sudoCommand: ALL

将sudoers.ldif导入LDAP:

ldapadd -x -D cn=admin,dc=example,dc=com -W -f sudoers.ldif

4. 配置LDAP客户端

注:ubuntu22.04使用,rpm下可以直接建
编辑/etc/sudo-ldap.conf文件,配置LDAP服务器:

uri ldap://ldap.example.com
sudoers_base ou=SUDOers,dc=example,dc=com
binddn cn=admin,dc=example,dc=com
bindpw secret

5. 将用户添加到sudo组

编辑用户的LDAP条目,将其添加到sudo组。创建一个LDIF文件,例如user_sudo.ldif:

dn: cn=example_user,dc=example,dc=com
changetype: modify
add: objectClass
objectClass: posixGroup
-
add: memberUid
memberUid: example_user

将用户添加到sudo组:

ldapmodify -x -D cn=admin,dc=example,dc=com -W -f user_sudo.ldif

6. 验证配置

使用LDAP用户登录并验证sudo权限:

su - example_user
sudo -l

这应该列出该用户具有的sudo权限。

================
以上为添加sudo.schema配置的操作,该操作才会在ObjectClasses添加sudoRole条目,仅参考

server OpenLDAP服务端虚拟机所使用配置sudo脚本

deb

###deb
cat > /etc/ldap/sudoers_rules.ldif << EOF
dn: ou=SUDOers,dc=example,dc=com  # 注意修改这里改为 dn: ou=SUDOers,dc=funsine,dc=com
ou: SUDOers
objectClass: top
objectClass: organizationalUnit

#openLDAP首先会在子树中寻找cn=defaults条目,如果找到则所有dusoOption属性都会被解析为全局默认值  类似/etc/sudoers文件中的Defaults文件
dn: cn=defaults,ou=SUDOers,dc=example,dc=com  
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOption: requiretty
sudoOption: !visiblepw
sudoOption: always_set_home
sudoOption: env_reset
sudoOption: env_keep="COLORS DISPLAY HOSTNAME HISTSIZE TNPUTRC KDEDIR LS COLORS"
sudoOption: env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
sudoOption: env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
sudoOption: env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
sudoOption: env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
sudoOption: secure_path=/sbin:/bin:/usr/sbin:/usr/bin
sudoOption: logfile = /var/log/sudo
EOF

rpm

###rpm
###开启sudoRole
cat > /etc/openldap/schema/sudo.schema <<EOF
#
# OpenLDAP schema file for Sudo
# Save as /etc/openldap/schema/sudo.schema and restart slapd.
# For a version that uses online configuration, see schema.olcSudo.
#

attributetype ( 1.3.6.1.4.1.15953.9.1.1
    NAME 'sudoUser'
    DESC 'User(s) who may  run sudo'
    EQUALITY caseExactMatch
    SUBSTR caseExactSubstringsMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

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 (deprecated)'
    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 caseExactMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

attributetype ( 1.3.6.1.4.1.15953.9.1.7
    NAME 'sudoRunAsGroup'
    DESC 'Group(s) impersonated by sudo'
    EQUALITY caseExactMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

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 $ sudoOrder $ sudoNotBefore $
          sudoNotAfter $ description )
    )
EOF

sed  '#include /etc/openldap/schema/pmi.schema#ainclude /etc/openldap/schema/sudo.schema' /etc/openldap/myslapd.conf

# 检测/etc/openldap/myslapd.conf是否有错误:
slaptest -f /etc/openldap/myslapd.conf
# 必须先启动slapd否则直接报错
slaptest -f /etc/openldap/myslapd.conf -F /etc/openldap/slapd.d/


cat > /etc/openldap/sudoers_rules.ldif << EOF
#####  sudo 规则条目
dn: ou=SUDOers,dc=example,dc=com  
ou: SUDOers
objectClass: top
objectClass: organizationalUnit

#####  sudo defaults规则条目
#openLDAP首先会在子树中寻找cn=defaults条目,如果找到则所有dusoOption属性都会被解析为全局默认值  类似/etc/sudoers文件中的Defaults文件
dn: cn=defaults,ou=SUDOers,dc=example,dc=com  
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOption: requiretty
sudoOption: !visiblepw
sudoOption: always_set_home
sudoOption: env_reset
sudoOption: env_keep="COLORS DISPLAY HOSTNAME HISTSIZE TNPUTRC KDEDIR LS COLORS"
sudoOption: env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
sudoOption: env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
sudoOption: env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
sudoOption: env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
sudoOption: secure_path=/sbin:/bin:/usr/sbin:/usr/bin
sudoOption: logfile = /var/log/sudo

##### sudo下边各组规则条目
#定义admin组,组内用户可以在任何主机上执行sudo命令,没有任何限制
dn: cn=admins,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: admins
sudoUser: %admin
sudoHost: ALL
sudoCommand: ALL

# #定义manager组,组内用户可以在任何主机上执行sudo命令,没有任何限制
# dn: cn=%manager,ou=SUDOers,dc=example,dc=com 
# objectClass: sudoRole
# objectClass: top
# cn: %manager
# sudoUser: ALL
# sudoHost: ALL
# sudoCommand: ALL
# sudoRunAsUser: ALL

#定义app组,允许组内可以sudo切换到系统appman用户下,不需要密码
dn: cn=%app,ou=SUDOers,dc=example,dc=com  
objectClass: sudoRole
cn: %app
sudoUser: %app
sudoHost: ALL
sudoRunAsUser: appman
sudoOption: !authenticate
sudoCommand:/bin/bash

# #定义admin组,组内用户只能sudo执行允许的命令,其他越权命令不允许执行
# dn: cn=%admin,ou=SUDOers,dc=example,dc=com 
# objectClass: sudoRole
# cn: %admin
# sudoUser: %admin
# sudoHost: ALL
# sudoOption: authenticate
# sudoCommand: /bin/rm
# sudoCommand: /bin/rmdir
# sudoCommand: /bin/chmod
# sudoCommand: /bin/chown
# sudoCommand: /bin/dd
# sudoCommand: /bin/mv
# sudoCommand: /bin/cp
# sudoCommand: /sbin/fsck*
# sudoCommand: /sbin/*remove
# sudoCommand: /usr/bin/chattr
# sudoCommand: /sbin/mkfs*
# sudoCommand: !/usr/bin/passwd
# sudoOrder: 0

#定义limit组,组内用户只能在limit.example.com机器上执行chattr命令,其他都不允许
dn: cn=%limit,ou=SUDOers,dc=example,dc=com  
objectClass: top
objectClass: sudoRole
cn:%limit
sudoCommand:/usr/bin/chattr
sudoHost: limit.example.com
sudoOption: !authenticate
sudoRunAsUser: ALL
sudoUser:%limit
EOF


ldapadd -x -D cn=admin,dc=example,dc=com -w 123456 -f sudoers_rules.ldif

# ldapsearch -H ldap://127.0.0.1 -x  -D 'cn=admin,dc=example,dc=com' -w '123456' -b 'dc=example,dc=com' '(objectClass=*)' 

# # delete 删除,添加多了再次添加不上就先删了呗
# ldapdelete -x -D 'cn=admin,dc=example,dc=com' -w '123456' 'dn那个条目:后边完整条目'
# ldapdelete -x -D 'cn=admin,dc=example,dc=com' -w '123456' 'ou=SUDOers,dc=example,dc=com'

client OpenLDAP客户端虚拟机配置

deb

###deb
#先设置root用户密码,安装sudo-ldap需要,这个可以集中管理;ubuntu22.04要装的
sudo passwd root
sudo apt install sudo-ldap

##修改下/etc/nsswitch.conf
grep "^passwd"  /etc/nsswitch.conf | grep ldap || sed -i '/^passwd/ s/$/ ldap/g' /etc/nsswitch.conf
grep "^shadow"  /etc/nsswitch.conf | grep ldap || sed -i '/^shadow/ s/$/ ldap/g' /etc/nsswitch.conf
grep "^group"  /etc/nsswitch.conf | grep ldap || sed -i '/^group/ s/$/ ldap/g' /etc/nsswitch.conf
###必备,没有就加 sudoers:        ldap files
grep "^sudoers"  /etc/nsswitch.conf | grep ldap || sed -i '/^sudoers/ s/$/ ldap/g' /etc/nsswitch.conf && grep "^sudoers"  /etc/nsswitch.conf | grep ldap || echo 'sudoers:        ldap files' >> /etc/nsswitch.conf

##修改/etc/sudo-ldap.conf,其实是link软链接的/etc/sudo-ldap.conf -> ldap/ldap.conf
sed -i "s/^SUDOERS_BASE.*/SUDOERS_BASE    ou=SUDOers,dc=example,dc=com/g"  /etc/sudo-ldap.conf 
grep "^SUDOERS_BASE" /etc/sudo-ldap.conf || echo 'SUDOERS_BASE    ou=SUDOers,dc=example,dc=com' >> /etc/sudo-ldap.conf
sed -i "s/^URI.*/URI     ldap:\/\/192.168.122.105/g"  /etc/sudo-ldap.conf 
grep "^URI" /etc/sudo-ldap.conf || echo 'URI     ldap://192.168.122.105' >> /etc/sudo-ldap.conf

rpm

###rpm
#方法一:sudo-ldap操作,这个可以集中管理,man sudoers.ldap查看下说明,
#    Configuring ldap.conf
#        Sudo   reads   the   /etc/ldap.conf   file   for   LDAP‐specific
#        configuration.  Typically, this file is shared between different
#        LDAP‐aware  clients.   As  such,  most  of  the settings are not
#        sudo‐specific. The /etc/ldap.conf file is parsed by sudo  itself
#        and  may support options that differ from those described in the
#        system’s ldap.conf(5) manual.  The  path  to  ldap.conf  may  be
#        overridden via the ldap_conf plugin argument in sudo.conf(5).

#        On   systems   using  the  OpenLDAP  libraries,  default  values
#        specified in /etc/openldap/ldap.conf or the user’s .ldaprc files
#        are not used.
#        sudo  supports  a  variety  of  LDAP  library   implementations,
#        including  OpenLDAP,  Netscape‐derived (also used by Solaris and
#        HP‐UX), and IBM LDAP (aka Tivoli).  Some options are specific to
#        certain LDAP  implementations  or  have  implementation‐specific
#        behavior.  These differences are noted below where applicable.

#        Only  those options explicitly listed in /etc/ldap.conf as being
#        supported by sudo are honored.  Configuration options are listed
#        below in upper case but are parsed in a case‐independent manner.

#        Lines beginning with a pound sign (‘#’)  are  ignored.   Leading
#        white space is removed from the beginning of lines.


# rpm的话直接在建个/etc/ldap.conf,然后追加如下:
# SUDOERS_BASE    ou=SUDOers,dc=example,dc=com
# URI     ldap://192.168.122.105

#方法二:直接在LDAP中建/etc/sudoers里边满足的UID、GID,组和用户吧

##修改下/etc/nsswitch.conf
grep "^passwd"  /etc/nsswitch.conf | grep ldap || sed -i '/^passwd/ s/$/ ldap/g' /etc/nsswitch.conf
grep "^shadow"  /etc/nsswitch.conf | grep ldap || sed -i '/^shadow/ s/$/ ldap/g' /etc/nsswitch.conf
grep "^group"  /etc/nsswitch.conf | grep ldap || sed -i '/^group/ s/$/ ldap/g' /etc/nsswitch.conf
###必备,没有就加 sudoers:        ldap files
grep "^sudoers"  /etc/nsswitch.conf | grep ldap || sed -i '/^sudoers/ s/$/ ldap/g' /etc/nsswitch.conf && grep "^sudoers"  /etc/nsswitch.conf | grep ldap || echo 'sudoers:        ldap files' >> /etc/nsswitch.conf

# ##修改/etc/sudo-ldap.conf,其实是link软链接的/etc/sudo-ldap.conf -> ldap/ldap.conf
sed -i "s/^SUDOERS_BASE.*/SUDOERS_BASE    ou=SUDOers,dc=example,dc=com/g"  /etc/ldap.conf
grep "^SUDOERS_BASE" /etc/ldap.conf || echo 'SUDOERS_BASE    ou=SUDOers,dc=example,dc=com' >> /etc/ldap.conf
sed -i "s/^URI.*/URI     ldap:\/\/192.168.122.105/g"  /etc/ldap.conf
grep "^URI" /etc/ldap.conf || echo 'URI     ldap://192.168.122.105' >> /etc/ldap.conf

另一种方式,即查看操作系统里边/etc/sudoers配置,手动配置组gidNumber和/etc/sudoers,/etc/passwd的GID一样即可,用户加到该组

此处略,常规的操作而已


需求:OpenLDAP用户登陆自动创建家目录挂载点挂载文件夹,退出后卸载并删除家目录挂载

验证过,但太菜
不太好用的方案,主要还要测试定制

1.本地用户不能删,LDAP统一管理的用户登录时新建挂载点,挂载,退出时,卸载,删除挂载点
2.挂载卸载的步骤节点,有顺序要求
因为pam.d在退出的不同阶段也插了点,在特定点分开执行mount  umount,例如开头节点就mount, 完全退出的节点再unmount

以下为AI的简单拷贝内容:

openldap 用户登陆自动创建家目录挂载点挂载文件夹,退出后卸载并删除家目录挂载

要实现用户登录时自动创建家目录挂载点并挂载特定文件夹,退出后卸载并删除家目录挂载点,可以通过编辑PAM(Pluggable Authentication Modules)配置来实现。

以下是实现这一功能的步骤和示例代码:

编辑/etc/pam.d/common-session文件,添加自定义的PAM会话管理模块。

使用你喜欢的文本编辑器,如vi或nano
sudo vi /etc/pam.d/common-session

在文件中添加以下内容(或pam_mkhomedir.so,pam_exec.so配合):
session optional pam_exec.so /usr/local/bin/mount-home.sh

创建/usr/local/bin/mount-home.sh脚本,并添加挂载和卸载逻辑。

#!/bin/bash

# logger `(env)`
#检查本地用户
function check_some {
    local user="$1"
    if `(grep -q "^$user" /etc/passwd )`; then
        logger here is local user 本地用户
        exit ;
    fi
}
check_some "$PAM_USER"

# OpenLDAP域管理的用户,在用户登录时挂载目录(放在session开始)
function mount_home {
    local user="$1"
    local home_src="/path/to/shared/folder"
    local home_tgt="/home/$user"
 
    if [ ! -d "$home_tg"  ];then
        # 创建家目录挂载点
        mkdir -p "$home_tgt"
    fi
        
    # 挂载文件夹到家目录挂载点
    sync
    mount --bind "$home_src" "$home_tgt"
 
    # 设置权限和所有权
    chown "$user:$user" "$home_tgt"
    chmod 0700 "$home_tgt"
}


# OpenLDAP域管理的用户,用户退出会话时卸载挂载点
function umount_home {
    local user="$1"
    local home_tgt="/home/$user"

    # 卸载挂载点
    sync
    umount -l "$home_tgt"

    if [ -z `(ls -A "$home_tgt")` ];then
        # 删除家目录挂载点
        rmdir "$home_tgt"
    else
        logger "$home_tgt" is not null ! 不为空
    fi
}
 
# 检查是挂载还是卸载
case "$PAM_TYPE" in
    open_session)
        mount_home "$PAM_USER"
        ;;
    close_session)
        umount_home "$PAM_USER"
        ;;
esac

确保脚本具有执行权限:

sudo chmod +x /usr/local/bin/mount-home.sh

确保/path/to/shared/folder是你想要挂载的文件夹路径。

请注意,这个脚本是一个基本示例,你可能需要根据你的具体环境进行调整,比如处理网络文件系统或其他类型的挂载。另外,请确保挂载操作的用户有足够的权限,通常需要root权限才能执行挂载操作。


pam_mkhomedir.so 模块

pam_mkhomedir.so 是一个 PAM(可插拔认证模块)模块,用于在用户首次登录时自动创建用户的家目录。

如果你需要配置 pam_mkhomedir.so 模块,你通常需要编辑 /etc/pam.d/common-account 文件,并添加以下行:

session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
#或者,建议用下边这条,0022不太合适
session required pam_mkhomedir.so skel=/etc/skel/

这行的含义是:当用户的账户信息变动时(例如账户被创建时),pam_mkhomedir.so 会被调用,创建用户的家目录,并且将 /etc/skel 目录下的文件复制到新家目录中。umask=077 指定了新家目录的权限掩码,这里设置为 0777 减去 umask 值(通常为 0022),即 0755,这意味着家目录对于所有者是可读写执行,而对于组和其他用户则是可读执行。

确保 /etc/skel 目录存在并包含你希望新用户在其家目录中看到的任何配置文件。

如果你需要进一步定制 pam_mkhomedir.so 的行为,可以查看该模块的手册页(通常通过 man pam_mkhomedir 命令访问)来了解更多选项。


#file:/etc/pam.d/common-session

# /etc/pam.d/common-session - session-related modules common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of modules that define tasks to be performed
# at the start and end of interactive sessions.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules.  See
# pam-auth-update(8) for details.

# here are the per-package modules (the "Primary" block)

###myadd
session	optional	        pam_exec.so  /usr/local/bin/mount_LDAP_home.sh
session required        pam_mkhomedir.so skel=/etc/skel
###myadd

session	[default=1]			pam_permit.so
# here's the fallback if no module succeeds
session	requisite			pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
session	required			pam_permit.so
# The pam_umask module will set the umask according to the system default in
# /etc/login.defs and user settings, solving the problem of different
# umask settings with different shells, display managers, remote sessions etc.
# See "man pam_umask".
session optional			pam_umask.so
# and here are more per-package modules (the "Additional" block)

###myadd
session	optional	pam_exec.so  /usr/local/bin/umount_LDAP_home.sh
###myadd

session	required	pam_unix.so 
session	optional			pam_sss.so 
session	optional			pam_ldap.so 
session	optional	pam_systemd.so 
# end of pam-auth-update config

需求:OpenLDAP,要限制特定用户只能登录特定的几台机器

没验证过,ACLs之后在试试

1. 使用访问控制规则(ACLs)(访问控制列表,Access Control List)

在OpenLDAP的配置文件slapd.conf或slapd.ldif中,你可以定义访问控制规则(ACLs)来限制用户的访问。以下是一个示例,它限制用户只能从特定的IP地址登录:

access to attrs=userPassword
    by dn="cn=admin,dc=example,dc=com" write
    by anonymous auth
    by self write
    by * none

access to *
    by dn="cn=admin,dc=example,dc=com" write
    by dn="cn=readonly,dc=example,dc=com" read
    by dn="cn=limited,dc=example,dc=com" read
    by * none

限制特定用户只能从特定的IP地址登录

access to attrs=*
    by dn="uid=limiteduser,ou=People,dc=example,dc=com" read
    by dn="uid=limiteduser,ou=People,dc=example,dc=com" + attrs=userPassword
    by * none

限制用户只能从特定的IP地址登录

access to dn.subtree="ou=People,dc=example,dc=com"
    by ip=192.168.1.0/24 read
    by ip=192.168.2.0/24 read
    by * none

在这个例子中,192.168.1.0/24和192.168.2.0/24是允许访问的IP地址范围。

2. 使用SSH密钥

另一种方法是在SSH服务器上配置密钥认证,并限制用户只能使用特定的密钥来登录。这可以在用户的LDAP条目中存储SSH公钥,并在SSH服务器上配置authorized_keys文件来限制访问。

3. 使用PAM模块

如果你使用的是Linux系统,可以利用PAM(Pluggable Authentication Modules)模块来限制用户登录。你可以创建一个自定义的PAM模块或修改现有的PAM配置来检查用户的来源IP地址。

以下是一个PAM配置的例子,限制用户只能从特定的IP地址登录:

#编辑PAM配置文件,通常是 /etc/pam.d/sshd
session required pam_listfile.so item=user sense=allow file=/etc/allowed_users onerr=succeed

### 创建 /etc/allowed_users 文件,列出允许登录的用户和来源IP
### 格式为:用户名:来源IP
limiteduser:192.168.1.10
limiteduser:192.168.2.20

注意事项

这些方法需要你具备足够的权限来修改LDAP和系统配置。
记得在实施这些限制之后,测试以确保它们按预期工作,并确保不会意外地阻止合法用户。
安全策略应该定期审查和更新以适应变化的环境和需求。

需求:禁用用户、配置隐藏systemUser本地系统用户(NSS去找file的用户)登录界面配置

方式方法:
1.auth required pam_succeed_if.so user != testuser  #pam.d中禁用户登录,auth阶段禁
2.gdm lightdm的配置greeter隐藏用户登录

GMD(GNOME Display Manager)

要在使用GDM(GNOME Display Manager)的系统上禁用特定用户登录图形化界面,可以通过修改配置文件和设置用户权限来实现。以下是具体步骤:
方法2不好用
方法3,4可用

方法二:修改用户 Shell

通过设置用户的登录 Shell 为 /usr/sbin/nologin,可以防止用户登录图形界面和控制台:

修改用户 Shell

使用 chsh 命令修改用户的 Shell:

sudo chsh -s /usr/sbin/nologin username

例如:

sudo chsh -s /usr/sbin/nologin testuser

恢复用户 Shell

如果需要恢复用户的 Shell,可以将其改回默认 Shell,例如 /bin/bash:


    sudo chsh -s /bin/bash username

方法三:配置 PAM

通过PAM(Pluggable Authentication Modules)配置可以进一步控制用户的登录行为:

编辑 GDM PAM 配置文件

打开 GDM 的 PAM 配置文件进行编辑:

sudo vim /etc/pam.d/gdm-password

添加限制规则

添加以下内容以禁止特定用户登录:

auth required pam_succeed_if.so user != username

例如,要禁止用户 testuser 登录,添加:

auth required pam_succeed_if.so user != testuser

保存并关闭文件

方法四:使用 accountsservice

accountsservice 允许对用户进行细粒度的控制,可以通过以下方法实现:

创建用户配置文件

在 /var/lib/AccountsService/users/ 目录下创建一个以用户名命名的文件,例如 testuser:

sudo vim /var/lib/AccountsService/users/testuser

配置隐藏NSS中file用户登录界面配置
在文件中添加以下内容:

[User]
SystemAccount=true

保存并关闭文件

重启 GDM 服务

使更改生效,需要重启 GDM 服务:

sudo systemctl restart gdm

以上方法均可用来禁用特定用户登录图形化界面,根据具体需求选择适合的方法进行配置。

注意:客户端主机要正确重启操作系统

Lightdm

差不多的配置,可以搜搜其他文档
[在 LightDM 中配置用户名登录(即手动输入用户名而非显示用户列表)]https://blog.csdn.net/qq_43420088/article/details/141053533

需求:OpenLDAP源码编译

https://www.openldap.org/software/download/
https://www.openldap.org/software/download/OpenLDAP/
https://www.openldap.org/software/
https://www.openldap.org/software/release/install.html

OpenLDAP服务端

deb

sudo apt-get install -y build-essential libltdl-dev libtool-bin pkg-config libwiredtiger-dev libssl-dev

配置编译参数

./configure --prefix=/usr/local/openldap --enable-slapd --enable-modules --enable-backends=mod --enable-overlays=mod --with-tls=openssl

编译并安装

make depend
make
sudo make install

OpenLDAP客户端

启用NSS(name-service switch)关于LDAP动态链接库支持就可以找到LDAP中的用户

NSS (name-service switch) 名称服务转换,开启ldap登录
只需libnss-ldap.so动态链接库及/etc/ldap.conf配置文件,修改/etc/nsswitch.conf关键文件,
其他库是pam或者其他要用的
最基础的配置

或源码编译nss-ldap动态链接库

https://github.com/PADL/nss_ldap

需求:openldap 记录openldap用户在登录的主机信息,开启日志;rsyslog集中管理日志

要记录 OpenLDAP 用户在登录时的主机信息,可以通过配置 OpenLDAP 的日志记录功能来实现。这通常涉及以下几个步骤:

配置 OpenLDAP 日志级别

首先,需要调整 OpenLDAP 的日志级别,以确保记录所需的详细信息。可以通过修改 slapd 配置文件(通常位于 /etc/ldap/slapd.conf 或 /etc/openldap/slapd.conf)或使用 cn=config 动态配置。

如果使用配置文件方式,请添加或修改以下行以设置适当的日志级别(例如,stats 和 stats2 可以记录绑定操作):

bash

loglevel stats stats2

如果使用 cn=config,可以使用 ldapmodify 命令进行配置。例如,创建一个 LDIF 文件 loglevel.ldif:

ldif

dn: cn=module{0},cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: stats stats2

然后执行:

bash

ldapmodify -Y EXTERNAL -H ldapi:/// -f loglevel.ldif

启用并配置 auditlog 叠加模块

auditlog 叠加模块可以帮助记录详细的操作日志,包括绑定操作及其相关信息。

加载 auditlog 模块

首先,确保 auditlog 模块已被加载。可以通过在配置文件中添加以下内容来加载模块:

ldif

dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: auditlog.la

执行:

bash

ldapmodify -Y EXTERNAL -H ldapi:/// -f load_auditlog.ldif

配置 auditlog 叠加

创建一个 LDIF 文件 auditlog_config.ldif,内容如下:

ldif

dn: olcOverlay=auditlog,olcDatabase={1}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcAuditlogConfig
olcOverlay: auditlog
olcAuditlogFile: /var/log/openldap/audit.log
olcAuditlogType: bind

这里假设你使用的是 hdb 数据库,具体数据库类型请根据实际情况调整。olcAuditlogFile 指定了审计日志的存储路径。

执行:

bash

ldapadd -Y EXTERNAL -H ldapi:/// -f auditlog_config.ldif

配置日志文件权限

确保 OpenLDAP 进程有权限写入指定的日志文件目录。例如:

bash

mkdir -p /var/log/openldap
chown ldap:ldap /var/log/openldap
chmod 750 /var/log/openldap

重启 OpenLDAP 服务

完成配置后,重启 OpenLDAP 服务以使更改生效:

bash

sudo systemctl restart slapd

分析日志文件

现在,OpenLDAP 会在 /var/log/openldap/audit.log 中记录用户绑定(登录)操作。日志中将包含用户的 DN、绑定时间以及客户端的 IP 地址等信息。例如:

sql

bind user="uid=john,ou=users,dc=example,dc=com" method=SIMPLE ip=192.168.1.100

通过分析这些日志,可以获取用户在登录时的主机信息。

使用外部工具进行日志分析(可选)

为了更方便地分析和监控登录事件,可以考虑使用如 logwatch、Splunk 或 ELK Stack(Elasticsearch, Logstash, Kibana)等日志管理和分析工具。

增强安全性(建议)

为了保护日志文件的安全性,建议:
    定期备份日志文件。
    限制对日志文件的访问权限,仅允许授权人员查看。
    配置日志轮转(如使用 logrotate)以防止日志文件过大。

注意事项:

性能影响:增加日志记录级别可能会对 OpenLDAP 服务器的性能产生一定影响,尤其是在高负载环境下。请根据实际需求和服务器性能进行调整。

隐私合规:确保记录和存储用户登录信息符合相关隐私保护法规和政策。

通过上述配置,您可以有效地记录 OpenLDAP 用户在登录时的主机信息,从而增强系统的审计和安全性。

phpLDAPadmin 使用(安装php8.0)

https://github.com/leenooks/phpLDAPadmin/wiki/Docker-Container
https://blog.csdn.net/OceanWaves1993/article/details/136048686

Q&A

Q:配置了LDAP认证的客户端,未有网络连接 ,NetworkManager在开机启动时,nss_ldap: could not connect to any LDAP server is unavailable ,且服务一直阻塞等待超时,需调整未有网络时认证

配置 LDAP 客户端超时时间

调整 LDAP 客户端的超时设置,避免因网络不可用导致长时间阻塞。

如果使用的是nss_ldap(即libnss-ldap软件包),man nss_ldap可以查看具体可以配置
编辑 /etc/ldap.conf
添加或修改以下选项:

bind_policy soft
timelimit 0
bind_timelimit 1

# bind_policy soft:LDAP 服务器不可用时快速失败,而不是阻塞。
# timelimit 和 bind_timelimit:查询和绑定的超时时间(秒)。

rpm中nslcd,最后还是得看使用的nss_ldap库是哪个

A: bind_policy soft:LDAP 服务器不可用时快速失败,而不是阻塞。这个很重要,去查认证时阻塞导致等待时间过长,很影响体验.

Q:ldap客户端访问到LDAP服务器,但是每次查询的时候会提示__sasl_plugin_load failed on sasl_canonuser_init

确认 SASL 插件是否安装

如果需要使用 SASL,检查是否安装了必要的 SASL 库和插件。
安装 Cyrus SASL

确保系统中已安装 Cyrus SASL 库及其 LDAP 支持插件:

sudo apt install libsasl2-modules libsasl2-modules-ldap

https://gitee.com/src-openeuler/cyrus-sasl/issues/I472VA
rpm中应该是 cyrus-sasll和cyrus-sasl-ldapdb等包

A:不影响认证速度,但是可能影响journal中观感

LDAP基本概念

LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是一种开放、跨平台、用于访问和维护分布式目录信息服务的标准协议。它广泛应用于企业环境中,用于用户身份验证、权限管理和访问控制。以下是LDAP的基本概念和详细解释:

  1. 目录服务(Directory Services)

目录服务是一个用于存储、组织和提供目录信息的系统。它类似于数据库,但专为高读写比例设计,通常用于存储诸如用户、组、计算机、网络设备等信息。

  1. LDAP 目录(LDAP Directory)

LDAP 目录是一种特定类型的目录服务,采用 LDAP 协议访问。LDAP 目录是树状结构的数据存储,称为目录信息树(DIT, Directory Information Tree)。

  1. LDAP 条目(Entry)

LDAP 目录中的每个记录称为条目。每个条目都有一个唯一的名称(DN, Distinguished Name),并包含一组属性(Attribute)。每个属性都有一个类型和一个或多个值。

  1. 属性(Attribute)

属性是 LDAP 条目的组成部分。每个属性都有一个类型(例如,cn 表示 common name,sn 表示 surname)和一个或多个值。例如,一个用户条目可能包含 cn、sn、mail 等属性。

  1. DN(Distinguished Name)

DN 是目录中条目的唯一标识符,类似于数据库中的主键。DN 是一个分层命名,包含组成该条目的所有命名组件。例如,cn=John Doe,ou=users,dc=example,dc=com 是一个完整的 DN。

  1. RDN(Relative Distinguished Name)

RDN 是 DN 中的相对部分。例如,在 cn=John Doe,ou=users,dc=example,dc=com 中,cn=John Doe 是 RDN。

  1. LDAP 操作

LDAP 支持多种操作来访问和管理目录信息,包括:

绑定(Bind):客户端向 LDAP 服务器进行身份验证。
搜索(Search):在目录中查找条目。
比较(Compare):检查条目的某个属性是否具有指定的值。
添加(Add):向目录中添加新条目。
删除(Delete):从目录中删除条目。
修改(Modify):修改现有条目的属性。
修改 DN(Modify DN):修改条目的 DN。
  1. LDAP URL

LDAP URL 用于指定 LDAP 服务器的位置以及执行操作的详细信息。一个 LDAP URL 的示例如下:

bash

ldap://ldap.example.com:389/ou=users,dc=example,dc=com?cn,sn?sub?(objectClass=*)

这表示在 ldap.example.com 服务器的 389 端口上,搜索 ou=users,dc=example,dc=com,获取 cn 和 sn 属性,进行子树范围的搜索,筛选条件是 objectClass=*。

  1. 模式(Schema)

模式定义了 LDAP 目录中可以存储哪些类型的条目和属性。它包括属性类型、对象类以及它们之间的关系。例如,inetOrgPerson 对象类定义了用户条目的一组标准属性。

  1. ACL(访问控制列表,Access Control List)

ACL 用于控制谁可以访问和操作 LDAP 目录中的哪些条目和属性。通过 ACL,可以定义详细的权限策略,确保目录数据的安全性。

  1. 同步和复制

LDAP 目录通常支持同步和复制机制,确保在分布式环境中不同服务器之间的数据一致性。这对于高可用性和负载均衡非常重要。

  1. LDIF(LDAP 数据交换格式,LDAP Data Interchange Format)

LDIF 是一种标准文本格式,用于表示 LDAP 条目和更新操作。LDIF 文件可以用来导入和导出 LDAP 数据。例如,以下是一个简单的 LDIF 条目:

ldif

dn: cn=John Doe,ou=users,dc=example,dc=com
cn: John Doe
sn: Doe
mail: john.doe@example.com
objectClass: inetOrgPerson
  1. LDAP 服务器和客户端

LDAP 服务器是提供目录服务的系统,例如 OpenLDAP、Microsoft Active Directory。LDAP 客户端是访问和管理目录信息的工具和应用程序,例如 ldapsearch、ldapmodify 等命令行工具,或者专用的管理界面工具。

  1. LDAP 安全性

LDAP 安全性涉及以下几个方面:

身份验证(Authentication):验证用户身份以确定其访问权限。LDAP 支持多种身份验证方法,包括简单绑定(用户名和密码)、SASL(Simple Authentication and Security Layer)和 Kerberos。
授权(Authorization):基于用户身份,确定其对目录数据的访问权限。通常使用 ACL(访问控制列表)来实现。
数据传输加密:使用 TLS/SSL 加密 LDAP 数据传输,确保数据在传输过程中不被窃听或篡改。
  1. LDAP 命名空间

LDAP 目录采用层次结构,命名空间是组织目录数据的一种方式。根条目位于树的顶部,子条目按照层次结构组织。通常使用域组件(dc)来命名顶级条目。例如,dc=example,dc=com 是一个常见的顶级命名空间。

  1. 对象类(Object Class)

对象类是模式定义的一部分,规定了条目中可以包含的属性。每个条目必须至少属于一个对象类。对象类分为三种类型:

结构对象类(Structural Object Class):定义条目的基本类型,必须是一个条目的唯一结构对象类。
辅助对象类(Auxiliary Object Class):提供附加属性,条目可以属于多个辅助对象类。
抽象对象类(Abstract Object Class):定义通用属性和规则,通常不会直接用于条目。
  1. 索引(Index)

LDAP 目录服务通过索引来加速搜索操作。索引是在特定属性上创建的,允许快速查找匹配的条目。例如,创建 cn 属性的索引可以显著提高根据 common name 搜索条目的效率。

  1. LDAP 过滤器

LDAP 过滤器用于搜索操作中指定查找条件。过滤器可以组合多个条件,支持逻辑运算符(如 AND、OR、NOT)。例如,以下过滤器查找 cn 为 "John" 且 mail 以 "example.com" 结尾的条目:

less

(&(cn=John)(mail=*@example.com))
  1. 分页搜索

分页搜索用于处理大型目录数据,避免一次性返回所有结果。客户端可以请求分页结果,每次返回部分条目,直到获取完整结果。这对于处理数万或数百万条目时尤为重要。

  1. LDAP 参考(Referral)

当一个 LDAP 服务器不能直接提供所需信息时,它可以返回一个参考,指示客户端向其他 LDAP 服务器请求数据。参考机制使得 LDAP 目录可以分布在多个服务器上,提高可扩展性和分布式管理能力。

  1. LDAP 中的不同树

LDAP 目录中通常有不同类型的树,用于组织不同类别的信息:

组织单位树(Organizational Unit Tree):按部门或组织结构组织用户和资源。
域树(Domain Tree):按域名组织,通常用于企业内部或跨企业的域名管理。
设备树(Device Tree):用于组织和管理网络设备、计算机等硬件资源。
  1. LDAP 与 Active Directory

Microsoft 的 Active Directory 是基于 LDAP 协议的目录服务,但它扩展了 LDAP,增加了许多企业级功能,如组策略、域服务、全局编录等。Active Directory 提供了丰富的管理工具和 GUI 界面,简化了大规模用户和资源管理。

  1. LDAP 与其他协议的集成

LDAP 可以与多种协议集成,提供统一的身份管理和访问控制,例如:

Kerberos:用于强身份验证和单点登录。
RADIUS:用于网络访问控制和管理。
OAuth 和 OpenID Connect:用于现代 Web 应用和 API 的身份验证和授权。
  1. 备份和恢复

LDAP 目录服务通常提供备份和恢复机制,确保数据的可靠性和持久性。备份可以是全备份或增量备份,恢复过程包括从备份文件中重建目录数据。

  1. 常见的 LDAP 工具

工具

ldapsearch:命令行工具,用于搜索 LDAP 目录。
ldapmodify:命令行工具,用于修改 LDAP 条目。
ldapadd:命令行工具,用于添加新条目到 LDAP 目录。
ldapdelete:命令行工具,用于删除 LDAP 条目。
phpldapadmin:基于 Web 的 LDAP 管理工具,提供直观的用户界面。
  1. LDAP 副本(Replication)

LDAP 副本是为了确保目录数据的高可用性和容错性,通过将数据复制到多个服务器上实现。常见的副本模式包括:

单主副本(Single Master Replication):一个主服务器处理所有写操作,其他从服务器处理读操作。优点是写操作冲突少,缺点是主服务器的单点故障风险。
多主副本(Multi-Master Replication):多个服务器都能处理写操作,并同步数据。优点是无单点故障,缺点是需要处理写冲突。
镜像副本(Mirror Mode Replication):两台服务器互为镜像,提供高可用性。
  1. 一致性检查(Consistency Checking)

一致性检查用于确保 LDAP 目录数据在复制和同步过程中保持一致。常见的一致性问题包括:

数据冲突:多主副本模式下,两个服务器同时修改同一条目时可能发生数据冲突。
数据丢失:复制过程中因网络或系统故障导致部分数据未能成功复制。

解决一致性问题的方法包括冲突检测和冲突解决策略。

  1. LDIF 文件格式和用法

LDIF(LDAP Data Interchange Format)是一种标准文本格式,用于表示 LDAP 条目和更新操作。LDIF 文件可以用来导入和导出 LDAP 数据,也可以用来批量修改目录数据。LDIF 文件的基本结构包括 DN、属性类型和值。以下是一些示例:

添加条目

ldif

dn: cn=John Doe,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
cn: John Doe
sn: Doe
mail: john.doe@example.com

修改条目

ldif

dn: cn=John Doe,ou=users,dc=example,dc=com
changetype: modify
replace: mail
mail: new.email@example.com

删除条目

ldif

dn: cn=John Doe,ou=users,dc=example,dc=com
changetype: delete
  1. LDAP 控制(Controls)和扩展(Extensions)

LDAP 控制和扩展是协议的一部分,用于扩展标准操作的功能。控制(Controls)是附加到标准操作的附加参数,而扩展(Extensions)则是完全独立的新操作。常见的控制和扩展包括:

分页控制(Paged Results Control):用于分页搜索结果。
排序控制(Server-Side Sorting Control):服务器端排序搜索结果。
密码修改扩展(Password Modify Extended Operation):用于安全地修改用户密码。
  1. LDAP 协议版本

LDAP 有多个版本,目前最常用的是 LDAPv3(定义于 RFC 4511)。LDAPv3 是对 LDAPv2 的改进,增加了许多新功能和安全特性,如支持 SASL 身份验证和 TLS 加密。

  1. LDAP 服务器的配置和管理

配置和管理 LDAP 服务器涉及多个方面,包括模式管理、访问控制、备份与恢复、性能优化等。以下是一些常见的 LDAP 服务器配置示例:

OpenLDAP:开源 LDAP 实现,广泛用于各种操作系统。配置文件通常位于 /etc/openldap/slapd.conf 或 /etc/openldap/slapd.d/ 目录中。
Active Directory:微软的企业级目录服务,配置和管理通过 Active Directory 管理工具进行。
  1. LDAP 与其他目录服务的比较

LDAP 是一种广泛使用的目录服务协议,但它并不是唯一的选择。其他目录服务协议包括:

X.500:LDAP 的前身,复杂度和开销较大,主要用于大型企业和政府机构。
NIS(Network Information Service):早期的 Unix 网络信息服务,逐渐被 LDAP 替代。
Novell eDirectory:Novell 的目录服务产品,支持多种操作系统和平台。
  1. LDAP 的最佳实践

使用 LDAP 时,遵循一些最佳实践可以提高系统的可靠性、安全性和性能:

模式设计:根据实际需求设计合理的 LDAP 模式,避免冗余和不必要的复杂性。
索引优化:为常用的搜索属性创建索引,提高搜索效率。
访问控制:配置细粒度的 ACL,确保数据的安全性和访问控制。
备份和恢复:定期备份 LDAP 数据,制定详细的恢复计划。
监控和日志:启用服务器监控和日志记录,及时发现和解决问题。
  1. LDAP 在现代应用中的角色

在现代应用中,LDAP 仍然扮演着重要角色,特别是在以下领域:

身份管理(Identity Management):LDAP 是集中管理用户身份和认证信息的核心组件。
单点登录(Single Sign-On, SSO):通过集成 LDAP,可以实现多个系统间的单点登录。
应用集成:许多应用和服务(如邮件服务器、VPN、Web 应用)都支持与 LDAP 集成,用于用户认证和权限管理。
  1. LDAP 日志和监控

LDAP 服务器通常提供详细的日志记录功能,包括访问日志、错误日志和审计日志。通过分析这些日志,可以监控服务器的运行状态,发现潜在的问题。常见的监控指标包括:

搜索请求的数量
修改请求的数量
身份验证请求的成功和失败次数
服务器的资源使用情况(CPU、内存、磁盘)
  1. LDAP 的扩展功能

随着技术的发展,LDAP 也在不断扩展其功能,以满足新的需求。例如:

动态组(Dynamic Groups):基于搜索条件动态生成的组,成员自动更新。
虚拟目录(Virtual Directories):将多个目录服务的内容整合为一个虚拟视图,提供统一访问接口。
身份联合(Federation):跨组织的身份管理和认证,通常与 SAML(Security Assertion Markup Language)和 OAuth 等协议结合使用。
  1. LDAP 相关的开源工具和项目

除了 OpenLDAP 和 phpldapadmin,还有许多开源工具和项目可以帮助管理和使用 LDAP:

Apache Directory Studio:功能强大的 LDAP 浏览器和目录管理工具。
FusionDirectory:基于 Web 的 LDAP 管理界面,支持多种插件和扩展。
FreeIPA:集成身份管理系统,基于 LDAP、Kerberos 和 DNS 等技术。

文件关系 openldap ldif、config、schema文件关系

ChatGPT said:
ChatGPT

在 OpenLDAP 中,LDIF 文件、config 配置文件和 schema 文件共同构成了 OpenLDAP 的数据结构、配置和架构定义。它们各自承担不同的角色,并在 OpenLDAP 的工作中相互配合。以下是它们的详细关系和作用:

  1. LDIF 文件 (.ldif)

LDIF(LDAP Data Interchange Format)文件是一种用于描述 LDAP 数据的标准格式,它主要用于在 LDAP 目录服务器中添加、删除、修改或导入数据。

用途:用于批量导入或导出数据,定义条目内容、结构和属性。
格式:基于文本的文件格式,用于表示目录条目。每个条目都以 dn(Distinguished Name,唯一标识符)开头,并包含若干属性。
典型用法:管理员可以编写 LDIF 文件,使用 ldapadd 或 ldapmodify 命令将数据加载到目录服务器中。
示例:

dn: cn=John Doe,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
cn: John Doe
sn: Doe
mail: johndoe@example.com
  1. config 配置文件 (cn=config)

OpenLDAP 的 cn=config 配置数据库 是服务器的核心配置数据库,自 OpenLDAP 2.3 版本起取代了传统的 slapd.conf 配置文件。

用途:控制服务器行为,包括设置全局参数、数据库定义、日志记录、访问控制等。
格式:使用类似 LDIF 格式的目录结构进行配置,称为动态配置(Dynamic Configuration)。在 cn=config 中,所有配置均以条目形式存在,便于直接修改而不必重启服务器。
典型用法:可以通过命令行工具(如 ldapmodify)直接编辑 cn=config 数据库,或通过 LDIF 文件批量应用更改。
示例:设置一个新的数据库的基本配置。

dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {1}hdb
olcSuffix: dc=example,dc=com
olcRootDN: cn=admin,dc=example,dc=com
  1. schema 文件(架构文件)

schema 文件定义了 LDAP 目录条目的结构和属性。架构文件是 LDAP 目录的核心,它决定了允许存储的数据类型、属性和关系。

用途:定义对象类(objectClass)、属性类型(attributeType)等,用于约束和标准化目录条目的内容。
格式:schema 文件通常以 .schema 扩展名保存,或以 LDIF 格式包含在 cn=config 中。
典型用法:
    在早期版本中,schema 文件以独立文件的形式存在,如 /etc/openldap/schema/core.schema。
    在 cn=config 中,可以通过动态加载和管理架构定义。
示例:自定义一个 person 类的架构。

objectClass ( 2.5.6.6 NAME 'person'
  DESC 'RFC2256: a person'
  SUP top STRUCTURAL
  MUST ( sn $ cn )
  MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )

三者之间的关系

数据层 (LDIF):
    LDIF 文件用于存储和导入目录数据,描述具体的条目实例及其属性。
    在 OpenLDAP 中,LDIF 是一种标准化的表示方法,既可用于目录内容(如用户和组信息),也可以用于 cn=config 动态配置。

配置层 (cn=config):
    cn=config 控制 OpenLDAP 服务器的配置和管理,包括哪些数据库和架构可以加载、访问控制规则等。
    通过 cn=config 加载 schema 文件,决定了 LDAP 服务器接受哪些对象类和属性类型。

架构层 (schema):
    schema 定义了目录的对象类、属性和数据类型,是所有条目内容的基础。
    schema 文件的内容被 cn=config 加载,以确保目录数据符合定义的结构约束。
    使用 LDIF 文件导入的数据必须符合 schema 文件中定义的规则(如属性和对象类的要求)。

配合使用的示例流程

配置 OpenLDAP:使用 cn=config 配置数据库,加载必要的 schema 文件。
定义架构:在 schema 文件中定义必要的对象类和属性。
导入数据:使用 LDIF 文件批量导入数据,确保数据符合 schema 文件的要求。
动态调整:如果需要更改配置或架构,可以直接通过 cn=config 修改,无需重启服务。

openldap .ldif文件、 .conf文件、 .schema文件之间关系,及如何转换
2/3
ChatGPT said:
ChatGPT

在 OpenLDAP 中,.ldif 文件、.conf 文件和 .schema 文件是常见的配置和数据文件类型。它们在 OpenLDAP 的不同配置阶段中扮演不同的角色。以下是它们之间的关系及如何相互转换的说明:

  1. .conf 文件

.conf 文件是 OpenLDAP 的传统配置文件,通常包括以下两个主要文件:

slapd.conf:OpenLDAP 主服务器的配置文件,包含数据库后端、访问控制列表(ACL)、索引、日志级别等。
ldap.conf:客户端配置文件,用于设置客户端访问 OpenLDAP 服务器的基本参数(如 BASE 和 URI)。

示例内容:

slapd.conf 示例

database mdb
suffix "dc=example,dc=com"
rootdn "cn=admin,dc=example,dc=com"
rootpw secret
directory /var/lib/ldap

Schema include

include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema

注意:OpenLDAP 的 .conf 配置模式较旧,近年来已逐渐被动态配置模式(即 .ldif 文件)所取代。
  1. .ldif 文件

.ldif 文件(LDAP Data Interchange Format)是 OpenLDAP 中用于管理数据和配置的文件格式。它是基于文本的文件格式,用于导入和导出 LDAP 数据和配置。

.ldif 文件的用途:

数据导入/导出:用于导入和导出 LDAP 条目,例如组织结构和用户信息。
动态配置(cn=config):当 OpenLDAP 使用动态配置时,配置内容以 .ldif 格式存储,位于 cn=config 数据库中。这些配置文件存储在 /etc/ldap/slapd.d/ 或 /etc/openldap/slapd.d/ 目录下,替代了传统的 slapd.conf 文件。

示例内容:

基本条目结构示例

dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: Example Organization

dn: cn=admin,dc=example,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
userPassword: secret

  1. .schema 文件

.schema 文件用于定义 LDAP 数据库的模式,包括属性和对象类。模式定义了允许在 LDAP 数据库中存储哪些类型的条目和属性。

模式定义文件位置:

在传统配置中,.schema 文件通过 include 指令直接在 slapd.conf 中引用。
在动态配置(cn=config)中,.schema 文件需要转换为 .ldif 格式并加载到 cn=schema,cn=config 中。

示例内容:

core.schema 的片段

objectclass ( 2.5.6.6 NAME 'person'
DESC 'RFC2256: a person'
SUP top STRUCTURAL
MUST ( sn $ cn )
MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )

  1. .conf 和 .schema 到 .ldif 的转换

当使用动态配置模式时,OpenLDAP 不再直接支持 slapd.conf 和 .schema 文件,而是要求所有配置以 .ldif 格式保存。如果你需要将 .conf 和 .schema 文件转换为 .ldif 格式,可以按照以下步骤操作:
转换步骤

初始化 slapd.d 配置目录:先将原有 slapd.conf 配置文件导入到 cn=config。

sudo slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d

这会根据 slapd.conf 的内容生成 .ldif 文件,并存放在指定的 slapd.d 目录下。

将 .schema 文件转换为 .ldif 文件:

OpenLDAP 自带的 .schema 文件位于 /etc/openldap/schema/ 或 /usr/share/openldap/schema/。
通过以下脚本将 .schema 文件转换为 .ldif 格式:

使用 slapcat 命令转换

slapcat -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d -n 0 -l output.ldif

手动添加 .schema 到 cn=config:

使用 ldapadd 或 ldapmodify 命令将 .ldif 文件内容导入到 cn=schema,cn=config。

ldapadd -Y EXTERNAL -H ldapi:/// -f cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f inetorgperson.ldif

验证并重启 OpenLDAP 服务:

确保转换成功后,重新启动 OpenLDAP 服务,使新的 .ldif 配置生效。

sudo systemctl restart slapd

总结
文件类型 用途 使用场景
.conf OpenLDAP 的传统配置文件,描述数据库和服务配置。 已被 .ldif 动态配置取代,适用于旧版本或特定环境
.ldif 用于导入/导出 LDAP 数据或配置动态模式(cn=config)。 数据导入、导出或在动态配置模式下配置 OpenLDAP
.schema 定义 LDAP 中的对象类和属性,描述允许存储的数据类型和结构。 必须转换为 .ldif 格式,以用于动态配置

openldap .ldif文件、 .conf文件、 .schema文件之间关系,及之间如何转换
3/3
ChatGPT said:
ChatGPT

在 OpenLDAP 中,.ldif 文件、.conf 文件、.schema 文件分别承担不同的功能,各自有不同的格式和用途。以下是它们之间的关系及如何进行转换。

  1. .ldif 文件

LDIF (LDAP Data Interchange Format) 文件用于在 LDAP 目录之间导入、导出数据或进行配置修改。.ldif 文件使用一种标准的文本格式,描述 LDAP 条目的数据内容以及目录结构。

作用:定义 LDAP 条目,用于数据导入、导出,以及动态更新 LDAP 配置。
结构:由一系列条目组成,每个条目包含若干属性,格式为 属性: 值。
示例:

dn: cn=admin,dc=example,dc=com
objectClass: organizationalRole
cn: admin
description: LDAP Administrator

  1. .conf 文件

.conf 文件是 OpenLDAP 的静态配置文件。早期版本的 OpenLDAP 使用 slapd.conf 作为主配置文件,定义了目录结构、访问控制规则、数据库配置等。该文件在 OpenLDAP 2.3 之后逐渐被动态配置替代,即可以通过 .ldif 文件进行配置管理,而不再使用静态的 .conf 文件。

作用:提供静态的 OpenLDAP 配置。
示例(slapd.conf 文件):

Global Settings

include /etc/ldap/schema/core.schema
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args

Database Definition

database bdb
suffix "dc=example,dc=com"
rootdn "cn=admin,dc=example,dc=com"
rootpw {SSHA}bkjqQ3j5lwk7y1hqoRz6cA==
directory /var/lib/ldap

  1. .schema 文件

.schema 文件是 OpenLDAP 的架构文件,用于定义 LDAP 目录中的对象类和属性类型。每种 LDAP 数据结构都有自己特定的对象类和属性,这些内容都由 .schema 文件定义。

作用:定义对象类和属性,扩展 LDAP 目录服务的功能。
示例(core.schema 文件):

3 Define the person object class

objectClass ( 2.5.6.6 NAME 'person'
DESC 'Standard Person Object Class'
SUP top STRUCTURAL
MUST ( sn $ cn )
MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )

关系和转换

关系:
    .schema 文件为 LDAP 提供了数据结构定义(对象类和属性类型),可以在 .conf 文件中引入这些架构文件。
    .conf 文件(slapd.conf)中引用了 .schema 文件。.conf 文件定义了 LDAP 服务的全局配置、数据库、访问控制、架构文件引用等。
    .ldif 文件用于导入、导出或动态修改目录数据,且在 OpenLDAP 2.3 及更高版本中可以代替 slapd.conf 完成动态配置。

从 .schema 转换为 .ldif:
    在 OpenLDAP 新版本中,可以将 .schema 文件转换为 .ldif 格式,从而在动态配置模式下加载架构。以下是使用 slaptest 工具转换的方法:

slaptest -f /etc/openldap/schema/core.schema -F /etc/openldap/slapd.d

该命令会将 .schema 文件内容转化为 .ldif 格式的动态配置文件存放到 /etc/openldap/slapd.d/ 目录。

从 slapd.conf 转换为动态配置的 .ldif:

OpenLDAP 支持将静态配置文件 slapd.conf 转换为动态配置文件(.ldif 格式),以便在不重启的情况下应用配置更改。
例如,使用以下命令将 slapd.conf 转换为动态配置:

mkdir -p /etc/openldap/slapd.d
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d

这会将 slapd.conf 的内容转换为一组 .ldif 文件并存储在 /etc/openldap/slapd.d/ 中。

直接编辑动态配置的 .ldif 文件:

动态配置的 OpenLDAP 系统直接使用 .ldif 文件存储配置,可以使用 ldapmodify 命令修改这些 .ldif 文件,从而动态修改 OpenLDAP 配置。
例如,添加新的架构文件到动态配置中:

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/your_schema.ldif

总结

.ldif 文件:用于数据导入/导出,也可以用于动态配置。
.conf 文件:旧版静态配置文件,已逐步被动态 .ldif 配置替代。
.schema 文件:用于定义目录对象和属性的架构,通常被 .conf 文件引用或转换为 .ldif。

openldap ldif conf 文件测试是否正确
ChatGPT said:

要测试 OpenLDAP 的 LDIF 文件是否正确,可以使用 ldapadd 或 slapadd 命令来验证 LDIF 文件格式是否正确。下面是一些步骤和示例:

  1. 使用 ldapadd 命令测试 LDIF 文件

    ldapadd 是一个与 OpenLDAP 服务器交互的命令,适用于在线模式(即 OpenLDAP 服务正在运行的情况下)。可以使用它来测试 LDIF 文件的语法,并将条目添加到 LDAP 数据库中。

ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f yourfile.ldif

参数说明:
    -x:使用简单认证。
    -D:指定绑定的管理员 DN。
    -W:提示输入管理员密码。
    -f:指定要添加的 LDIF 文件。
示例输出: 如果文件格式正确,LDAP 会成功处理并返回提示。如果 LDIF 文件有格式错误,系统会输出错误信息,指出具体的问题所在。
  1. 使用 slaptest 测试 LDIF 文件

    如果是测试 OpenLDAP 的配置文件,可以用 slaptest 命令验证。请注意,slaptest 仅用于验证配置文件,而不是普通的数据条目。

slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/

如果 LDIF 配置正确,将返回 "config file testing succeeded" 信息。如果有错误,会输出详细的错误提示。
  1. 使用 slapadd 命令测试(离线测试)

    如果 OpenLDAP 服务器未启动,可以用 slapadd 命令测试 LDIF 文件。slapadd 是在离线模式下直接将条目写入数据库。

slapadd -l yourfile.ldif

如果文件格式正确,slapadd 会直接处理 LDIF 文件中的条目;如果有错误,会显示错误信息(如行号和错误类型),便于排查。
  1. 使用 ldapsearch 查看结果

    如果将 LDIF 成功添加到数据库中,可以通过 ldapsearch 查询来验证数据是否正确加载。

ldapsearch -x -LLL -b "dc=example,dc=com"

通过以上方法,可以确保 LDIF 文件在语法和内容上都是正确的。如有错误,可以根据提示的信息逐步修复文件。

posted @ 2024-07-31 18:50  ThreeFlower  阅读(701)  评论(0)    收藏  举报