OpenLDAP使用,配置sudo权限并将LDAP用户添加到sudo组
- 前言
- 环境
- OpenLDAP服务端 客户端安装部署
- 各类场景和需求
- phpLDAPadmin 使用(安装php8.0)
- Q&A
- LDAP基本概念
- 文件关系 openldap ldif、config、schema文件关系
前言
本文比较凌乱
环境
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目录服务是由目录数据库和一套访问协议组成的系统。
基本概念
- 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
- 条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。
- 对象类:与某个实体类型对应的一组属性,对象类是可以继承的,这样父类的必须属性也会被继承下来。
- 属性:描述条目的某个方面的信息,一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。
| 关键字 | 英文全称 | 含义 |
|---|---|---|
| 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 来设置配置项






配置 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的基本概念和详细解释:
- 目录服务(Directory Services)
目录服务是一个用于存储、组织和提供目录信息的系统。它类似于数据库,但专为高读写比例设计,通常用于存储诸如用户、组、计算机、网络设备等信息。
- LDAP 目录(LDAP Directory)
LDAP 目录是一种特定类型的目录服务,采用 LDAP 协议访问。LDAP 目录是树状结构的数据存储,称为目录信息树(DIT, Directory Information Tree)。
- LDAP 条目(Entry)
LDAP 目录中的每个记录称为条目。每个条目都有一个唯一的名称(DN, Distinguished Name),并包含一组属性(Attribute)。每个属性都有一个类型和一个或多个值。
- 属性(Attribute)
属性是 LDAP 条目的组成部分。每个属性都有一个类型(例如,cn 表示 common name,sn 表示 surname)和一个或多个值。例如,一个用户条目可能包含 cn、sn、mail 等属性。
- DN(Distinguished Name)
DN 是目录中条目的唯一标识符,类似于数据库中的主键。DN 是一个分层命名,包含组成该条目的所有命名组件。例如,cn=John Doe,ou=users,dc=example,dc=com 是一个完整的 DN。
- RDN(Relative Distinguished Name)
RDN 是 DN 中的相对部分。例如,在 cn=John Doe,ou=users,dc=example,dc=com 中,cn=John Doe 是 RDN。
- LDAP 操作
LDAP 支持多种操作来访问和管理目录信息,包括:
绑定(Bind):客户端向 LDAP 服务器进行身份验证。
搜索(Search):在目录中查找条目。
比较(Compare):检查条目的某个属性是否具有指定的值。
添加(Add):向目录中添加新条目。
删除(Delete):从目录中删除条目。
修改(Modify):修改现有条目的属性。
修改 DN(Modify DN):修改条目的 DN。
- 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=*。
- 模式(Schema)
模式定义了 LDAP 目录中可以存储哪些类型的条目和属性。它包括属性类型、对象类以及它们之间的关系。例如,inetOrgPerson 对象类定义了用户条目的一组标准属性。
- ACL(访问控制列表,Access Control List)
ACL 用于控制谁可以访问和操作 LDAP 目录中的哪些条目和属性。通过 ACL,可以定义详细的权限策略,确保目录数据的安全性。
- 同步和复制
LDAP 目录通常支持同步和复制机制,确保在分布式环境中不同服务器之间的数据一致性。这对于高可用性和负载均衡非常重要。
- 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
- LDAP 服务器和客户端
LDAP 服务器是提供目录服务的系统,例如 OpenLDAP、Microsoft Active Directory。LDAP 客户端是访问和管理目录信息的工具和应用程序,例如 ldapsearch、ldapmodify 等命令行工具,或者专用的管理界面工具。
- LDAP 安全性
LDAP 安全性涉及以下几个方面:
身份验证(Authentication):验证用户身份以确定其访问权限。LDAP 支持多种身份验证方法,包括简单绑定(用户名和密码)、SASL(Simple Authentication and Security Layer)和 Kerberos。
授权(Authorization):基于用户身份,确定其对目录数据的访问权限。通常使用 ACL(访问控制列表)来实现。
数据传输加密:使用 TLS/SSL 加密 LDAP 数据传输,确保数据在传输过程中不被窃听或篡改。
- LDAP 命名空间
LDAP 目录采用层次结构,命名空间是组织目录数据的一种方式。根条目位于树的顶部,子条目按照层次结构组织。通常使用域组件(dc)来命名顶级条目。例如,dc=example,dc=com 是一个常见的顶级命名空间。
- 对象类(Object Class)
对象类是模式定义的一部分,规定了条目中可以包含的属性。每个条目必须至少属于一个对象类。对象类分为三种类型:
结构对象类(Structural Object Class):定义条目的基本类型,必须是一个条目的唯一结构对象类。
辅助对象类(Auxiliary Object Class):提供附加属性,条目可以属于多个辅助对象类。
抽象对象类(Abstract Object Class):定义通用属性和规则,通常不会直接用于条目。
- 索引(Index)
LDAP 目录服务通过索引来加速搜索操作。索引是在特定属性上创建的,允许快速查找匹配的条目。例如,创建 cn 属性的索引可以显著提高根据 common name 搜索条目的效率。
- LDAP 过滤器
LDAP 过滤器用于搜索操作中指定查找条件。过滤器可以组合多个条件,支持逻辑运算符(如 AND、OR、NOT)。例如,以下过滤器查找 cn 为 "John" 且 mail 以 "example.com" 结尾的条目:
less
(&(cn=John)(mail=*@example.com))
- 分页搜索
分页搜索用于处理大型目录数据,避免一次性返回所有结果。客户端可以请求分页结果,每次返回部分条目,直到获取完整结果。这对于处理数万或数百万条目时尤为重要。
- LDAP 参考(Referral)
当一个 LDAP 服务器不能直接提供所需信息时,它可以返回一个参考,指示客户端向其他 LDAP 服务器请求数据。参考机制使得 LDAP 目录可以分布在多个服务器上,提高可扩展性和分布式管理能力。
- LDAP 中的不同树
LDAP 目录中通常有不同类型的树,用于组织不同类别的信息:
组织单位树(Organizational Unit Tree):按部门或组织结构组织用户和资源。
域树(Domain Tree):按域名组织,通常用于企业内部或跨企业的域名管理。
设备树(Device Tree):用于组织和管理网络设备、计算机等硬件资源。
- LDAP 与 Active Directory
Microsoft 的 Active Directory 是基于 LDAP 协议的目录服务,但它扩展了 LDAP,增加了许多企业级功能,如组策略、域服务、全局编录等。Active Directory 提供了丰富的管理工具和 GUI 界面,简化了大规模用户和资源管理。
- LDAP 与其他协议的集成
LDAP 可以与多种协议集成,提供统一的身份管理和访问控制,例如:
Kerberos:用于强身份验证和单点登录。
RADIUS:用于网络访问控制和管理。
OAuth 和 OpenID Connect:用于现代 Web 应用和 API 的身份验证和授权。
- 备份和恢复
LDAP 目录服务通常提供备份和恢复机制,确保数据的可靠性和持久性。备份可以是全备份或增量备份,恢复过程包括从备份文件中重建目录数据。
- 常见的 LDAP 工具
工具
ldapsearch:命令行工具,用于搜索 LDAP 目录。
ldapmodify:命令行工具,用于修改 LDAP 条目。
ldapadd:命令行工具,用于添加新条目到 LDAP 目录。
ldapdelete:命令行工具,用于删除 LDAP 条目。
phpldapadmin:基于 Web 的 LDAP 管理工具,提供直观的用户界面。
- LDAP 副本(Replication)
LDAP 副本是为了确保目录数据的高可用性和容错性,通过将数据复制到多个服务器上实现。常见的副本模式包括:
单主副本(Single Master Replication):一个主服务器处理所有写操作,其他从服务器处理读操作。优点是写操作冲突少,缺点是主服务器的单点故障风险。
多主副本(Multi-Master Replication):多个服务器都能处理写操作,并同步数据。优点是无单点故障,缺点是需要处理写冲突。
镜像副本(Mirror Mode Replication):两台服务器互为镜像,提供高可用性。
- 一致性检查(Consistency Checking)
一致性检查用于确保 LDAP 目录数据在复制和同步过程中保持一致。常见的一致性问题包括:
数据冲突:多主副本模式下,两个服务器同时修改同一条目时可能发生数据冲突。
数据丢失:复制过程中因网络或系统故障导致部分数据未能成功复制。
解决一致性问题的方法包括冲突检测和冲突解决策略。
- 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
- LDAP 控制(Controls)和扩展(Extensions)
LDAP 控制和扩展是协议的一部分,用于扩展标准操作的功能。控制(Controls)是附加到标准操作的附加参数,而扩展(Extensions)则是完全独立的新操作。常见的控制和扩展包括:
分页控制(Paged Results Control):用于分页搜索结果。
排序控制(Server-Side Sorting Control):服务器端排序搜索结果。
密码修改扩展(Password Modify Extended Operation):用于安全地修改用户密码。
- LDAP 协议版本
LDAP 有多个版本,目前最常用的是 LDAPv3(定义于 RFC 4511)。LDAPv3 是对 LDAPv2 的改进,增加了许多新功能和安全特性,如支持 SASL 身份验证和 TLS 加密。
- LDAP 服务器的配置和管理
配置和管理 LDAP 服务器涉及多个方面,包括模式管理、访问控制、备份与恢复、性能优化等。以下是一些常见的 LDAP 服务器配置示例:
OpenLDAP:开源 LDAP 实现,广泛用于各种操作系统。配置文件通常位于 /etc/openldap/slapd.conf 或 /etc/openldap/slapd.d/ 目录中。
Active Directory:微软的企业级目录服务,配置和管理通过 Active Directory 管理工具进行。
- LDAP 与其他目录服务的比较
LDAP 是一种广泛使用的目录服务协议,但它并不是唯一的选择。其他目录服务协议包括:
X.500:LDAP 的前身,复杂度和开销较大,主要用于大型企业和政府机构。
NIS(Network Information Service):早期的 Unix 网络信息服务,逐渐被 LDAP 替代。
Novell eDirectory:Novell 的目录服务产品,支持多种操作系统和平台。
- LDAP 的最佳实践
使用 LDAP 时,遵循一些最佳实践可以提高系统的可靠性、安全性和性能:
模式设计:根据实际需求设计合理的 LDAP 模式,避免冗余和不必要的复杂性。
索引优化:为常用的搜索属性创建索引,提高搜索效率。
访问控制:配置细粒度的 ACL,确保数据的安全性和访问控制。
备份和恢复:定期备份 LDAP 数据,制定详细的恢复计划。
监控和日志:启用服务器监控和日志记录,及时发现和解决问题。
- LDAP 在现代应用中的角色
在现代应用中,LDAP 仍然扮演着重要角色,特别是在以下领域:
身份管理(Identity Management):LDAP 是集中管理用户身份和认证信息的核心组件。
单点登录(Single Sign-On, SSO):通过集成 LDAP,可以实现多个系统间的单点登录。
应用集成:许多应用和服务(如邮件服务器、VPN、Web 应用)都支持与 LDAP 集成,用于用户认证和权限管理。
- LDAP 日志和监控
LDAP 服务器通常提供详细的日志记录功能,包括访问日志、错误日志和审计日志。通过分析这些日志,可以监控服务器的运行状态,发现潜在的问题。常见的监控指标包括:
搜索请求的数量
修改请求的数量
身份验证请求的成功和失败次数
服务器的资源使用情况(CPU、内存、磁盘)
- LDAP 的扩展功能
随着技术的发展,LDAP 也在不断扩展其功能,以满足新的需求。例如:
动态组(Dynamic Groups):基于搜索条件动态生成的组,成员自动更新。
虚拟目录(Virtual Directories):将多个目录服务的内容整合为一个虚拟视图,提供统一访问接口。
身份联合(Federation):跨组织的身份管理和认证,通常与 SAML(Security Assertion Markup Language)和 OAuth 等协议结合使用。
- 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 的工作中相互配合。以下是它们的详细关系和作用:
- 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
- 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
- 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 的不同配置阶段中扮演不同的角色。以下是它们之间的关系及如何相互转换的说明:
- .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 文件)所取代。
- .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
- .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 ) )
- .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 文件分别承担不同的功能,各自有不同的格式和用途。以下是它们之间的关系及如何进行转换。
- .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
- .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
- .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 文件格式是否正确。下面是一些步骤和示例:
-
使用 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 文件有格式错误,系统会输出错误信息,指出具体的问题所在。
-
使用 slaptest 测试 LDIF 文件
如果是测试 OpenLDAP 的配置文件,可以用 slaptest 命令验证。请注意,slaptest 仅用于验证配置文件,而不是普通的数据条目。
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
如果 LDIF 配置正确,将返回 "config file testing succeeded" 信息。如果有错误,会输出详细的错误提示。
-
使用 slapadd 命令测试(离线测试)
如果 OpenLDAP 服务器未启动,可以用 slapadd 命令测试 LDIF 文件。slapadd 是在离线模式下直接将条目写入数据库。
slapadd -l yourfile.ldif
如果文件格式正确,slapadd 会直接处理 LDIF 文件中的条目;如果有错误,会显示错误信息(如行号和错误类型),便于排查。
-
使用 ldapsearch 查看结果
如果将 LDIF 成功添加到数据库中,可以通过 ldapsearch 查询来验证数据是否正确加载。
ldapsearch -x -LLL -b "dc=example,dc=com"
通过以上方法,可以确保 LDIF 文件在语法和内容上都是正确的。如有错误,可以根据提示的信息逐步修复文件。
本文来自博客园,作者:ThreeFlower,转载请注明原文链接:https://www.cnblogs.com/huangjinbang1996/p/18335050

浙公网安备 33010602011771号