openldap tls 部署
LDAP相关概念
dn(Distinguished Name):区分名称,LDAP中每个条目都有自己的dn,dn是该条目在整棵树中的唯一标识,如同文件系统中,带路径的文件名就是DN。
rdn(Relative dn):相对区别名称,好比linux中的相对路径。
dc(Domain Component):域名组件。其格式是将完整的域名分成几部分,如将http://example.com变成
dc=example,dc=com。
uid(User ID):用户ID,如 san.zhang。
ou(Organization Unit):组织单元。
cn(Common Name):公共名称。
sn(surname):姓氏。
c(Country):国家,如“CN”或者“US”。
o(Organization):组织名,如XXX银行,XXX部门,XXX公司等等。
一、安装openldap
1. 使用yum命令安装openldap
yum install -y openldap compat-openldap openldap-clients openldap-servers openldap-devel
2. 签发证书
生成CA根证书的步骤
生成CA私钥(.key)-->生成CA证书请求(.csr)-->自签名得到根证书(.crt)
openssl genrsa -out ca.key 2048
openssl req -new -key ca.key -out ca.csr
openssl x509 -req -days 36500 -in ca.csr -signkey ca.key -out ca.crt
通常情况,我们部署在内网的服务会采用这种自签名的证书,只有部署公网服务时才会向CA机构申请证书。
生成用户证书的步骤
生成私钥(.key)-->生成证书请求(.csr)-->用CA根证书签名得到证书(.crt)
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
cp /etc/pki/tls/openssl.cnf ./
mkdir -p newcerts
touch index.txt
echo "00" > serial
vim /etc/pki/tls/openssl.cnf
dir = /nfs/tang/k8s/certs
openssl ca -days 36500 -cert ca.crt -keyfile ca.key -in server.csr -out server.crt -config openssl.cnf
TLSCACertificateFile /nfs/tang/k8s/certs/ca.crt
TLSCertificateFile /nfs/tang/k8s/certs/server.crt
TLSCertificateKeyFile /nfs/tang/k8s/certs/server.key
3. OpenLDAP的相关配置文件信息
/etc/openldap/slapd.conf:OpenLDAP的主配置文件,记录根域信息,管理员名称,密码,日志,权限等
/etc/openldap/slapd.d/*:这下面是/etc/openldap/slapd.conf配置信息生成的文件,每修改一次配置信息,这里的东西就要重新生成
/etc/openldap/schema/*:OpenLDAP的schema存放的地方
/var/lib/ldap/*:OpenLDAP的数据文件
/usr/share/openldap-servers/slapd.conf.obsolete 模板配置文件
/usr/share/openldap-servers/DB_CONFIG.example 模板数据库配置文件
OpenLDAP监听的端口: 默认监听端口:389(明文数据传输) 加密监听端口:636(密文数据传输)
4. 整合kerberos
wget http://web.mit.edu/kerberos/dist/krb5/1.19/krb5-1.19.4.tar.gz
tar -xvzf krb5-1.19.4.tar.gz
cd krb5-1.19.4/src/plugins/kdb/ldap/libkdb_ldap/
cp kerberos.schema /etc/openldap/schema
5. 实现mirror mode模式
vim /etc/openldap/slapd.conf
在/etc/openldap目录下编辑添加slapd.conf配置文件,添加如下内容:
cat > /etc/openldap/slapd.conf << EOF
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/kerberos.schema
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/cosine.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/collective.schema
allow bind_v2
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
loglevel -1
modulepath /usr/lib64/openldap
moduleload syncprov.la
serverID 1 ldap://k8s01
serverID 2 ldap://k8s02
serverID 3 ldap://k8s03
access to *
by anonymous auth
by self write
by users read
database config
rootdn "cn=config"
rootpw {SSHA}K3vJ69p1IBtu9rwSK4hEBogmACDzIsS7
access to *
by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage
by * break
syncrepl rid=001
provider=ldap://k8s01
bindmethod=simple
binddn="cn=config"
credentials=Tang@123456
searchbase="cn=config"
schemachecking=on
type=refreshAndPersist
retry="60 +"
syncrepl rid=002
provider=ldap://k8s02
bindmethod=simple
binddn="cn=config"
credentials=Tang@123456
searchbase="cn=config"
schemachecking=on
type=refreshAndPersist
retry="60 +"
syncrepl rid=003
provider=ldap://k8s03
bindmethod=simple
binddn="cn=config"
credentials=Tang@123456
searchbase="cn=config"
schemachecking=on
type=refreshAndPersist
retry="60 +"
overlay syncprov
mirrormode on
database monitor
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
by dn.base="cn=admin,dc=vimll,dc=com" read
by * none
database mdb
access to attrs=userPassword,shadowLastChange
by self write
by anonymous auth
by * none
suffix "dc=vimll,dc=com"
checkpoint 1024 15
rootdn "cn=admin,dc=vimll,dc=com"
rootpw {SSHA}K3vJ69p1IBtu9rwSK4hEBogmACDzIsS7
directory /var/lib/mdb
maxsize 1048576
index objectclass,entryCSN,entryUUID eq
index uid,uidNumber,gidNumber eq,pres
index ou,krbPrincipalName eq,pres,sub
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
syncrepl rid=101
provider=ldap://k8s01
bindmethod=simple
binddn="cn=admin,dc=vimll,dc=com"
credentials=Tang@123456
searchbase="dc=vimll,dc=com"
schemachecking=on
type=refreshAndPersist
retry="60 +"
syncrepl rid=102
provider=ldap://k8s02
bindmethod=simple
binddn="cn=admin,dc=vimll,dc=com"
credentials=Tang@123456
searchbase="dc=vimll,dc=com"
schemachecking=on
type=refreshAndPersist
retry="60 +"
syncrepl rid=103
provider=ldap://k8s03
bindmethod=simple
binddn="cn=admin,dc=vimll,dc=com"
credentials=Tang@123456
searchbase="dc=vimll,dc=com"
schemachecking=on
type=refreshAndPersist
retry="60 +"
mirrormode on
EOF
配置同步其他节点:
scp /etc/openldap/schema/kerberos.schema k8s02:/etc/openldap/schema/
scp /etc/openldap/schema/kerberos.schema k8s03:/etc/openldap/schema/
scp /etc/openldap/slapd.conf k8s02:/etc/openldap/
scp /etc/openldap/slapd.conf k8s03:/etc/openldap/
mkdir /var/lib/mdb/
rm -rf /var/lib/mdb/*
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/mdb/DB_CONFIG
chown ldap:ldap -R /var/lib/mdb
chown -R ldap:ldap /etc/openldap/
systemctl enable --now slapd
rm -rf /etc/openldap/slapd.d/*
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
chown -R ldap:ldap /etc/openldap/
systemctl restart slapd
6. 初始化根目录
openldap的根目录需要我们事先进行初始化才可用,我们使用ldapadd的命令方式向openldap服务添加根目录,具体操作如下: 编辑文件base.ldif,添加如下内容:
cat > base.ldif << EOF
dn: dc=vimll,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: JTKJ
dc: vimll
dn: ou=People,dc=vimll,dc=com
objectClass: organizationalUnit
ou: people
dn: ou=Group,dc=vimll,dc=com
objectClass: organizationalUnit
ou: group
EOF
执行如下命令,添加根目录:
ldapadd -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -f base.ldif
执行成功以后,会将根目录数据同步到两台openldap服务器上,这样就是实现mirror mode的高可用模式,可执行如下命令进行验证是否插入成功:
ldapsearch -x -H ldap://127.0.0.1:389 -b "dc=vimll,dc=com" -D "cn=admin,dc=vimll,dc=com" -w Tang@123456
7. 开启openldap日志访问功能
查看openldap配置是否开启日志记录功能
less /etc/openldap/slapd.d/cn\=config.ldif
olcLogLevel: Stats
如果未开启日志配置,执行如下指令,开启日志设置
编辑log_config.ldif文件,添加如下内容,保存退出,使用ldapmodify进行动态修改openldap服务配置:
cat > log_config.ldif << EOF
dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: stats
EOF
在openldap4.X版本以后,推荐使用ldapmodify指令修改openldap的配置,而无须重启openldap服务,因此执行如下指令将需要修改的配置内容同步到cn=config.ldif配置文件中去。
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f log_config.ldif
配置方法二
loglevel -1
rm -rf /etc/openldap/slapd.d/*
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
chown -R ldap.ldap /etc/openldap/slapd.d/
systemctl restart slapd
配置rsyslog
修改/etc/rsyslog.conf配置文件,添加如下内容:
cat >> /etc/rsyslog.conf << EOF
local4.* /var/log/slapd/slapd.log
EOF
然后重启rsyslog应用:
mkdir -p /var/log/slapd
chown ldap.ldap /var/log/slapd/
systemctl restart rsyslog
systemctl restart slapd
cat > addcerts.ldif << EOF
dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/cacerts/ca.crt
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/server.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/server.key
EOF
ldapmodify -Y EXTERNAL -H ldapi:/// -f addcerts.ldif
vim /etc/sysconfig/slapd
SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"
vim /etc/openldap/ldap.conf
更新为:
TLS_CACERTDIR /etc/openldap/cacerts
TLS_CACERT /etc/openldap/cacerts/ca.cert.pem
TLS_REQCERT allow
systemctl restart slapd
二、openldap 初始化操作
1. #创建自定义ou
cat > add_custom_ou.ldif << EOF
dn: ou=Users,dc=vimll,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Users
dn: ou=GitLab,dc=vimll,dc=com
objectClass: organizationalUnit
objectClass: top
ou: GitLab
EOF
ldapadd -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -f add_custom_ou.ldif
2. #创建自定义子ou
cat > add_custom_ou_son.ldif << EOF
dn: ou=Jenkins,ou=Group,dc=vimll,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Jenkins
dn: ou=GitLab,ou=Group,dc=vimll,dc=com
objectClass: organizationalUnit
objectClass: top
ou: GitLab
dn: ou=Users,ou=people,dc=vimll,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Jira
dn: ou=Confluence,ou=Group,dc=vimll,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Confluence
dn: ou=Admin,ou=People,dc=vimll,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Admin
dn: ou=Users,ou=People,dc=vimll,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Users
EOF
ldapadd -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -f add_custom_ou_son.ldif
3. #在People ou 子ou Users下面创建users用户组
cat > group_users.ldif << EOF
dn: cn=users,ou=Users,ou=People,dc=vimll,dc=com
objectClass: posixGroup
objectClass: top
cn: users
gidNumber: 1000
EOF
ldapadd -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -f group_users.ldif
4. 创建账户
添加用户wuyutang, 位置在People OU的子OU Users下,并绑定到People的用户组Users,创建tang用户于Users ou下,并绑定用户组Users.
cat > usersadd.ldif << EOF
dn: cn=wuyutang,ou=Users,ou=People,dc=vimll,dc=com
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: wuyutang
sn: wu
uid: wuyutang
userPassword: 123456
uidNumber: 1008
gidNumber: 1000
homeDirectory: /home/wuyutang
mail: wuyutang@vimll.com
title: add user wuyutang
dn: cn=tang,ou=Users,dc=vimll,dc=com
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: tang
sn: tang
uid: tang
userPassword: 123456
uidNumber: 1009
gidNumber: 1000
homeDirectory: /home/tang
mail: tang@vimll.com
title: add user tang
EOF
ldapadd -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -f usersadd.ldif
5. 为用户设置密码
ldappasswd -x -h 127.0.0.1 -p 389 -D "cn=admin,dc=vimll,dc=com" -w "Tang@123456" "cn=tang,ou=Users,dc=vimll,dc=com"
New password: DoUGE7is
6. 搜索信息
ldapsearch -x -H ldap://127.0.0.1:389 -b "dc=vimll,dc=com" -D "cn=admin,dc=vimll,dc=com" -w Tang@123456
ldapsearch -x -H ldap://127.0.0.1:389 -b "dc=vimll,dc=com" -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 "cn=wu*"
ldapsearch -x -H ldap://127.0.0.1:389 -b "dc=vimll,dc=com" -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 "ou=*"
echo MTIzNDU2 |base64 -d
ldapwhoami -x -H ldap://127.0.0.1:389 -D "cn=wuyutang,ou=Users,ou=People,dc=vimll,dc=com" -w Tang123 -e ppolicy -v
7. 删除操作
ldapdelete -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w "Tang@123456" "cn=tang,ou=Users,dc=vimll,dc=com"
ldapdelete -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w "Tang@123456" "cn=users,ou=Users,ou=People,dc=vimll,dc=com"
8. modify 修改操作
cat > user-modify.ldif << EOF
dn: cn=tang,ou=Users,dc=vimll,dc=com
changetype: add
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: tang
sn: tang
uid: tang
userPassword: 123456
uidNumber: 1009
gidNumber: 1000
homeDirectory: /home/tang
mail: tang@vimll.com
title: add user tang
EOF
ldapmodify -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w "Tang@123456" -f user-modify.ldif
dn: ou=Users,ou=people,dc=vimll,dc=com
changetype: add
objectClass: organizationalUnit
objectClass: top
ou: Jira
dn: cn=admin,ou=Users,ou=peoples,dc=vimll,dc=com
changetype: add
objectClass: groupOfUniqueNames
objectClass: top
cn: admin
uniqueMember: cn=admin,ou=Users,ou=People,dc=vimll,dc=com
ldapsearch -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -b "uid=admin,ou=People,dc=vimll,dc=com" dn uniqueMember
dn: cn=tang,ou=Users,dc=vimll,dc=com
changetype: modify
replace: titletitle: this is a new title
dn: cn=tang,ou=Users,dc=vimll,dc=com
changetype: add
add: description
description: this is a add description
cat > modrdn.ldif << EOF
dn: cn=tang,ou=Users,dc=vimll,dc=com
changetype: modrdn
newrdn: cn=tang123
deleteoldrdn: 0
newsuperior: ou=Users,dc=vimll,dc=com
EOF
ldapmodify -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w "Tang@123456" -f modrdn.ldif
cat > changepwd.ldif << EOF
dn: cn=tang123,ou=Users,dc=vimll,dc=com
changetype: modify
replace: userPassword
userPassword: Tang123
EOF
ldapmodify -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w "Tang@123456" -f changepwd.ldif
9. LDAP用户权限配置
cat > add_manager_ou_and_sonou.ldif << EOF
dn: ou=Manager,dc=vimll,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Manager
dn: ou=admins,ou=Manager,dc=vimll,dc=com
objectClass: organizationalUnit
objectClass: top
ou: admins
dn: ou=readonly,ou=Manager,dc=vimll,dc=com
objectClass: organizationalUnit
objectClass: top
ou: readonly
dn: ou=password_manager,ou=Manager,dc=vimll,dc=com
objectClass: organizationalUnit
objectClass: top
ou: password_manager
EOF
ldapadd -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -f add_manager_ou_and_sonou.ldif
......略
-rw------- 1 ldap ldap 2099 Feb 24 18:06 olcDatabase={2}mdb.ldif
cat > change-acl.ldif << EOF
dn: olcDatabase={2}mdb,cn=config
changetype: modify
delete: olcAccess
-
add: olcAccess
olcAccess: {0}to *
by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage
by * break
olcAccess: {1}to attrs=userPassword,shadowLastChange
by self write
by dn="cn=admin,dc=vimll,dc=com" write
by dn.children="ou=admins,ou=Manager,dc=vimll,dc=com" read
by dn.children="ou=password_manager,ou=Manager,dc=vimll,dc=com" write
by anonymous auth
by * none
olcAccess: {2}to *
by self read
by dn="cn=admin,dc=vimll,dc=com" write
by dn.children="ou=admins,ou=Manager,dc=vimll,dc=com" write
by dn.children="ou=password_manager,ou=Manager,dc=vimll,dc=com" read
by dn.children="ou=readonly,ou=Manager,dc=vimll,dc=com" read
by * none
EOF
olcAccess: {1}to attrs=userPassword,shadowLastChange
olcAccess: {2}to *
ldapmodify -Y EXTERNAL -H ldapi:/// -f change-acl.ldif
cat > add_readOnly.ldif << EOF
dn: cn=readuser,ou=readonly,ou=Manager,dc=vimll,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
description: LDAP read only user
cn: readuser
userPassword: Readuser@123
EOF
cat > add_pwd-manager.ldif << EOF
dn: cn=pwd-manager,ou=password_manager,ou=Manager,dc=vimll,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
description: LDAP change-pwd only user
cn: pwd-manager
userPassword: Pwd-manager@123
EOF
cat > add_admins.ldif << EOF
dn: cn=myadmin,ou=admins,ou=Manager,dc=vimll,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
description: LDAP admin user
cn: myadmin
userPassword: Myadmin@123
EOF
ldapadd -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -f add_readOnly.ldif
ldapadd -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -f add_pwd-manager.ldif
ldapadd -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -f add_admins.ldif
10. ldap 加载额外模块
cat > disable_anon.ldif << EOF
dn: cn=config
changetype: modify
add: olcDisallows
olcDisallows: bind_anon
dn: cn=config
changetype: modify
add: olcRequires
olcRequires: authc
dn: olcDatabase={-1}frontend,cn=config
changetype: modify
add: olcRequires
olcRequires: authc
EOF
ldapadd -Y EXTERNAL -H ldapi:/// -f disable_anon.ldif
cat > module.ldif << EOF
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib/ldap
olcModuleload: accesslog.la
olcModuleload: auditlog.la
olcModuleLoad: ppolicy.la
EOF
ldapadd -Y EXTERNAL -H ldapi:/// -f module.ldif
cat > ppolicy_db.ldif << EOF
dn: olcOverlay=ppolicy,olcDatabase={1}hmdb,cn=config
changetype: add
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=default,ou=Policies,dc=vimll,dc=com
olcPPolicyHashCleartext: TRUE
olcPPolicyUseLockout: TRUE
EOF
ldapadd -Y EXTERNAL -H ldapi:/// -f ppolicy_db.ldif
cat > ppolicy_group.ldif << EOF
dn: ou=Policies,dc=vimll,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Policies
EOF
ldapadd -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -f ppolicy_group.ldif
cat > ppolicy_rulues.ldif << EOF
dn: cn=default,ou=Policies,dc=vimll,dc=com
cn: default
objectClass: top
objectClass: device
objectClass: pwdPolicy
objectClass: pwdPolicyChecker
pwdAttribute: 2.5.4.35
pwdInHistory: 8
pwdMinLength: 8
pwdMaxFailure: 3
pwdFailureCountInterval: 1800
pwdCheckQuality: 2
pwdMustChange: TRUE
pwdGraceAuthNLimit: 0
pwdMaxAge: 3600
pwdExpireWarning: 1209600
pwdLockoutDuration: 900
pwdLockout: TRUE
EOF
ldapadd -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -f ppolicy_rulues.ldif
cat > pqchecker.ldif << EOF
dn: cn=default,ou=Policies,dc=vimll,dc=com
changetype: modify
add: pwdcheckmodule
pwdCheckModule: pqchecker.so
EOF
ldapadd -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -f pqchecker.ldif
cat > audit.ldif << EOF
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: auditlog
dn: olcOverlay=auditlog,olcDatabase={2}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcAuditLogConfig
olcAuditlogFile: /var/log/slapd/auditlog.log
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
by self write
by dn="cn=admin,dc=vimll,dc=com" write
by anonymous auth by * read
olcAccess: {1}to *
by self write
by dn="cn=admin,dc=vimll,dc=com" write
by * read
EOF
ldapadd -Y EXTERNAL -H ldapi:/// -f audit.ldif
11. sudo 模块加载
cat > sudo-overlay.ldif << EOF
dn: cn=sudo,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: sudo
olcAttributeTypes: {0}( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {1}( 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 )
olcAttributeTypes: {2}( 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 )
olcAttributeTypes: {3}( 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 )
olcAttributeTypes: {4}( 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 )
olcAttributeTypes: {5}( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'User(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {6}( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC 'Group(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {7}( 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 )
olcAttributeTypes: {8}( 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 )
olcAttributeTypes: {9}( 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 )
olcObjectClasses: {0}( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' DESC 'SudoerEntries' SUP top STRUCTURAL MUST cn MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ sudoOrder $ sudoNotBefore $ sudoNotAfter $ description ) )
EOF
cat > sudo.ldif << EOF
dn: ou=SUDOers,dc=vimll,dc=com
description: SUDOers
objectClass: organizationalUnit
objectClass: top
ou: SUDOers
dn: cn=defaults,ou=SUDOers,dc=vimll,dc=com
objectClass: top
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOption: !visiblepw
sudoOption: always_set_home
sudoOption: match_group_by_gid
sudoOption: always_query_group_plugin
sudoOption: env_reset
sudoOption: env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE 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
sudoOrder: 1
dn: cn=%wheel,ou=SUDOers,dc=vimll,dc=com
objectClass: top
objectClass: sudoRole
cn: %wheel
sudoUser: %wheel
sudoUser: wuyutang
sudoHost: ALL
sudoRunAsUser: ALL
sudoCommand: ALL
sudoOption: !authenticate
sudoOrder: 2
EOF
ldapadd -Y EXTERNAL -H ldapi:/// -f sudo-overlay.ldif
ldapadd -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w Tang@123456 -f sudo.ldif
cat > openssh-lpk-openldap.ldif << EOF
dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: {0}( 1.3.6.1.4.1.24552.500.1.1.1.13
NAME 'sshPublicKey' DESC 'MANDATORY: OpenSSH Public key'
EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: {0}( 1.3.6.1.4.1.24552.500.1.1.2.0
NAME 'ldapPublicKey' DESC 'MANDATORY: OpenSSH LPK objectclass'
SUP top AUXILIARY MUST ( sshPublicKey $ uid ) )
EOF
ldapadd -Y EXTERNAL -H ldapi:/// -f openssh-lpk-openldap.ldif
cat > mod_users.ldif << EOF
dn: cn=wuyutang,ou=Users,ou=People,dc=vimll,dc=com
changetype: modify
replace: homeDirectory
homeDirectory: /home/wuyutang
-
add: objectClass
objectClass: ldapPublicKey
-
add: sshPublicKey
sshPublicKey: ssh-rsa AAAAB3NzaC1yc2E-----------
EOF
ldapmodify -x -H ldap://127.0.0.1:389 -D "cn=admin,dc=vimll,dc=com" -w "Tang@123456" -f mod_users.ldif
三、 集成 sssd 使用
yum install -y install openldap-clients sssd sssd-client sssd-ldap sssd-tools authconfig nss-pam-ldapd oddjob-mkhomedir
echo "sudoers: file sss" >> /etc/nsswitch.conf
cat > /etc/sssd/sssd.conf << EOF
[domain/default]
debug_level = 9
autofs_provider = ldap
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldaps://ldap.vimll.com
ldap_search_base = dc=vimll,dc=com
ldap_sudo_search_base = ou=sudoers,dc=vimll,dc=com
ldap_default_bind_dn = cn=readuser,ou=readonly,ou=Manager,dc=vimll,dc=com
ldap_default_authtok = Readuser@123
ldap_tls_reqcert = never
ldap_id_use_start_tls = False
cache_credentials = True
ldap_tls_cacertdir = /etc/openldap/cacerts
ldap_user_object_class = posixAccount
ldap_user_name = uid
ldap_user_uid_number = uidNumber
override_homedir = /home/%u
default_shell = /bin/bash
entry_cache_timeout = 120
ldap_search_timeout = 10
ldap_network_timeout = 10
ldap_opt_timeout = 10
ldap_enumeration_search_timeout = 60
ldap_enumeration_refresh_timeout = 300
ldap_connection_expire_timeout = 600
ldap_sudo_smart_refresh_interval = 600
ldap_sudo_full_refresh_interval = 10800
[sssd]
services = nss, sudo, pam, autofs, ssh
config_file_version = 2
domains = default
domains = default
[nss]
homedir_substring = /home
filter_groups = root
filter_users = root
entry_negative_timeout = 20
entry_cache_nowait_percentage = 50
[pam]
[sudo]
[autofs]
[ssh]
[pac]
[ifp]
[secrets]
[session_recording]
EOF
chmod 600 /etc/sssd/sssd.conf
systemctl enable --now sssd oddjobd
authconfig --enablesssd --enablesssdauth --enablemkhomedir --enablerfc2307bis --enableldap --enableldapauth --disableldaptls --disableforcelegacy --disablekrb5 --ldapserver ldaps://ldap.vimll.com --ldapbasedn "dc=vimll,dc=com" --updateall
systemctl restart sssd oddjobd sshd
systemctl status sssd oddjobd sshd
id tang;id wuyutang