配置Linux使用LDAP使用者認證
配置Linux使用LDAP使用者認證
本文首發:https://www.cnblogs.com/somata/p/LinuxLDAPUserAuthentication.html
我這裡使用的是CentOS完成的LDAP使用者管理,可能與網上的大部分教程不同,不過寫出來了,那麼是肯定能用的了,不過會有部分檔案,忘指教。
這裡使用的 OPENLdap 配合 CentOS7 完成的使用者管理,需要配置 nssswitch 、pam 和 sssd 3個服務,需要先有一定的瞭解才能完成本文的配置。
基礎配置
- 完成yum源的配置
mkdir /root/back tar -Jcvf /root/back/yum.repos.d-`date '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /etc/yum.repos.d/ rm -rf /etc/yum.repos.d/* curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum,repos.d/CentOS-epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum makecache
- 安裝必要軟體
yum -y install vim bash-completion openldap-servers openldap-clients nss-pam-ldapd sssd
OPENLdap服務初始化
初始化過程就不再過多贅述,詳細查詢《OPENLDAP 服務搭建和後期管理》。
- 首先停止資料庫服務:
systemctl stop slapd
- 然後編輯檔案:
# 首先備份檔案,以免無法復原 mkdir /root/back tar -Jcvf /root/back/slapd.config-`date '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /etc/openldap/slapd.d/ tar -Jcvf /root/back/slapd.data-`date '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /var/lib/ldap/ # 然後再刪除配置檔案 rm -rf /etc/openldap/slapd.d/* rm -rf /var/lib/ldap/* # 複製配置檔案到臨時目錄 mkdir /root/ldap cd /root/ldap
- 編寫slapd的配置檔案。這裡的配置檔案是從
/usr/share/openldap-servers/slapd.ldif
中演變而來的,主要修改了baseDN(suffix), OPENLDAPTLS,olcRootPW(密碼由 slappasswd 生成,本文中的密碼為: 123456) 和 include。
# file: /root/ldap/slapd.ldif dn: cn=config objectClass: olcGlobal cn: config olcArgsFile: /var/run/openldap/slapd.args olcPidFile: /var/run/openldap/slapd.pid olcTLSCertificateFile: /etc/openldap/certs/server.crt olcTLSCertificateKeyFile: /etc/openldap/certs/server.key olcTLSCACertificateFile: /etc/openldap/cacerts/cacert.pem dn: cn=schema,cn=config objectClass: olcSchemaConfig cn: schema include: file:///etc/openldap/schema/core.ldif include: file:///etc/openldap/schema/cosine.ldif include: file:///etc/openldap/schema/nis.ldif include: file:///etc/openldap/schema/inetorgperson.ldif dn: olcDatabase=frontend,cn=config objectClass: olcDatabaseConfig objectClass: olcFrontendConfig olcDatabase: frontend dn: olcDatabase=config,cn=config objectClass: olcDatabaseConfig olcDatabase: config olcAccess: to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage by * none dn: olcDatabase=monitor,cn=config objectClass: olcDatabaseConfig olcDatabase: monitor olcAccess: to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=black,dc=com" read by * none dn: olcDatabase=hdb,cn=config objectClass: olcDatabaseConfig objectClass: olcHdbConfig olcDatabase: hdb olcSuffix: dc=black,dc=com olcRootDN: cn=Manager,dc=black,dc=com olcRootPW: {SSHA}l1vBI/HOMKLEiQZgcm3Co+hFQI68rH1Q olcDbDirectory: /var/lib/ldap olcDbIndex: objectClass eq,pres olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
- 配置OPENSSL的證書。為openldap伺服器的加密隧道使用。
# 首先是建立CA服務的證書檔案
cd /etc/pki/CA
openssl genrsa -out private/cakey.pem 2048
openssl req -new -x509 -key private/cakey.pem -out cacert.pem # 這裡的證書建立過程就省略不寫了。
# 不過需要注意的是,必須要保證後面伺服器證書申請的開頭部分必須與證書開頭相同,否則無法通過CA簽發證書。
touch index.txt
echo "01" > serial
# 然後申請簽發伺服器證書
cd /etc/openldap/certs/
openssl genrsa -out server.key 2048
openssl ca -in server.csr -out server.crt -days 365
# 複製CA證書到指定位置
mkdir /etc/openldap/cacerts
cp /etc/pki/CA/cacert.pem /etc/openldap/cacerts/
- 根據配置生成伺服器的配置檔案
slapadd -F "/etc/openldap/slapd.d/" -b "cn=config" -l slapd.ldif
# 這裡還需要注意檔案屬主還是root的,需要改回為openldap
chown -R ldap:ldap /etc/openldap/slapd.d/*
# 然後再開啟服務即可
systemctl start slapd
_#################### 100.00% eta none elapsed none fast!
Closing DB...
- 初始化資料庫
dn: dc=black,dc=com
dc: black
objectClass: top
objectClass: domain
dn: cn=Manager,dc=black,dc=com
objectClass: organizationalRole
cn: Manager
description: LDAP Manager
dn: ou=People,dc=black,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: black.com
dn: ou=Group,dc=black,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: black.com
- 匯入至資料庫
ldapadd -x -D "cn=Manager,dc=black,dc=com" -w 123456 -f base.ldif # 將基礎資訊匯入資料庫。
adding new entry "dc=black,dc=com"
adding new entry "cn=root,dc=black,dc=com"
adding new entry "ou=People,dc=black,dc=com"
adding new entry "ou=Group,dc=black,dc=com"
- 那麼再使用apache directory studio來檢視 伺服器是否配置成功。
首先先將防火牆開啟
firewall-cmd --add-service=ldap
- 我們這裡先匯入一個使用者用於後面的測試使用
NSS 、PAM 和 SSSD 配置
NSS服務配置
如果想使 nss 可以查詢ldap,那麼首先就需要啟用一個叫 nslcd 的服務, 以下是該服務的配置檔案。
# file: /etc/nslcd.conf
uid nslcd
gid ldap
uri ldap://127.0.0.1/
base dc=black,dc=com
binddn cn=Manager,dc=black,dc=com
bindpw 123456
ssl no
tls_cacertdir /etc/openldap/cacerts
啟動服務
chmod 600 /etc/nslcd.conf
systemctl start nslcd
systemctl enable nslcd
配置nss
# file: /etc/nsswitch.conf
passwd: files ldap # 主要就是 passwd、shadow 和 group 這3行需要後面新增ldap
shadow: files ldap
group: files ldap
hosts: files dns myhostname
bootparams: nisplus [NOTFOUND=return] files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files sss
netgroup: nisplus sss
publickey: nisplus
automount: files nisplus sss
aliases: files nisplus
測試是否可用:
getent passwd | grep black
black❌1001:1001:black:/home/black:/bin/bash
PAM服務配置
這裡PAM的配置檔案我是從另一臺使用authconfig-tui 配置內容拷過來的。
# file: /etc/pam.d/system-auth
auth required pam_env.so
auth required pam_faildelay.so delay=2000000
auth [default=1 ignore=ignore success=ok] pam_succeed_if.so uid >= 1000 quiet
auth [default=1 ignore=ignore success=ok] pam_localuser.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth sufficient pam_sss.so forward_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account [default=bad success=ok user_unknown=ignore] pam_sss.so
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password sufficient pam_sss.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_sss.so
PAM不用進行服務重啟,直接可以使用
sssd服務配置
針對LDAP使用者登入,PAM配置會將其轉發給SSSD,由SSSD來認證使用者。
# file: /etc/sssd/sssd.conf
[domain/black.com]
autofs_provider = ldap
cache_credentials = True
ldap_search_base = dc=black,dc=com
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldap://127.0.0.1/
ldap_id_use_start_tls = True
ldap_tls_reqcert = never
ldap_tls_cacertdir = /etc/openldap/cacerts
[sssd]
services = nss, pam, autofs
domains = black.com
[nss]
homedir_substring = /home
[pam]
[sudo]
[autofs]
[ssh]
[pac]
[ifp]
[secrets]
[session_recording]
配置啟動服務,並且設定開機自啟動。
chmod 600 /etc/sssd/sssd.conf # 注意許可權的配置,否則無法啟動。
systemctl start sssd
systmctl enable sssd
測試
那麼這樣使用者認證的部分就製作好了,那麼現在來測試一下:
因為配置的 system-auth 檔案,並沒有配置 ssh 檔案,所以ssh是連線不進去的。所以這裡使用login來測試可行性。
指令碼
我為這個LDAP使用者認證寫了一個指令碼,方便新增使用者。我這裡還是要強調一下,CentOS雖然有提供 migrationtools 工具用於將使用者存放至LDAP資料庫,但是如果你把本地使用者全都提到 LDAP 資料庫,不保留本地使用者,那麼你就會發現,電腦就會無法重啟了,所以推薦不要把UID小於1000的使用者存放到 LDAP 伺服器。
指令碼放在gitee上了。https://gitee.com/somata/script/blob/master/ldap_adduser.sh
使用方法很簡單
然後再測試一下這個新增的使用者是否可以登入:
本文經「原本」原創認證,作者乾坤盤,訪問yuanben.io查詢【5AT479HZ】獲取授權資訊