帮你快速理解、总结文档立即下载
文档中心>TencentOS Server>操作指南>安全配置>认证及服务(PAM-Kerberos-SSSD)

认证及服务(PAM-Kerberos-SSSD)

最近更新时间:2026-08-27 18:07:01
我的收藏
本文介绍如何在 TencentOS Server 中配置 PAM(可插拔认证模块)、Kerberos 身份认证协议和 SSSD(系统安全服务后台程序),实现统一的认证与授权管理。

配置 PAM

PAM 简介

PAM(Pluggable Authentication Modules,可插拔认证模块)是一个模块化的认证机制,提供了一种统一的认证接口,使得应用程序可以更简便地处理各种认证技术,并返回验证结果(成功/失败)。PAM 允许系统管理员在不修改应用程序的情况下,灵活地配置和管理认证策略。
PAM 通过配置文件控制,配置文件定义了应用程序(服务)和实际执行身份验证任务的 PAM 模块之间的连接。每个应用程序或服务可能会有一个对应的 PAM 配置文件。例如,面向 SSH 的 PAM 配置文件名为 /etc/pam.d/sshd

PAM 配置文件

PAM 的全局配置文件为 /etc/pam.conf,PAM 的配置目录为 /etc/pam.d/。如果 /etc/pam.d/ 目录存在,则 /etc/pam.conf 文件会被忽略。
配置文件是一系列规则的集合,每个规则一行,包含以下四个字段:typecontrolmodule-pathmodule-arguments
其中,type 字段的可选取值及说明如下:
type 取值
说明
账户管理(Account)
提供账户验证类型的服务,例如检查用户密码是否过期,是否允许访问请求的服务等。
认证(Auth)
对用户进行认证并设置用户证书。可以使用密码、一次性密码、硬件认证等多种方式进行认证。
密码管理(Password)
更新认证机制,常用于管理用户密码的创建、更改和删除。例如设置密码的复杂度、过期时间等。
会话管理(Session)
在用户每次登录和退出时执行一些操作,例如记录用户的登录时间、执行环境设置、设置资源限制、分配文件系统空间等。
说明:如果上面表格中的字段值前面有一个 - 字符,表示如果由于系统中缺少该模块而无法加载该模块,则 PAM 库将不会记录到系统日志中。
control 字段的常用取值及说明如下:
control 取值
说明
required(必需)
模块必须成功执行,否则认证失败。失败后会继续执行后续模块,返回失败信息。
requisite(关键)
模块必须成功执行,否则认证立即失败,不再执行后续模块。
sufficient(充分)
模块成功执行,认证立即成功,不再执行后续模块。如果模块失败,认证不会立即失败,而是继续执行后续模块。
optional(可选)
模块执行结果不影响认证结果,除非它是唯一的模块。
include(包含)
将另一个 PAM 配置文件的内容直接插入到当前配置文件中。
substack(子堆栈)
将当前堆栈暂停,并开始执行被引用文件中的模块。当被引用文件中的所有模块执行完毕后,PAM 会恢复执行当前文件中的下一个模块。
对于更复杂的语法,有效的控制值具有以下形式:[value1=action1 value2=action2 ...]
模块路径 module-path:
PAM 模块在文件系统中的存放位置。可以使用 PAM 提供的模块,位于 /lib64/security/ 目录下;也可以通过绝对路径使用自定义模块。
模块参数 module-arguments:
为 PAM 模块提供的参数,不同的 PAM 模块提供不同的参数,可以通过 man 手册查看每个模块具体的参数,例如 man pam_unix

修改 PAM 配置

注意:PAM 模块配置后立即生效,因此修改配置时请谨慎,建议先在测试环境中验证配置,并备份现有配置文件避免错误。

限制特定用户访问

使用 pam_listfile.so 模块允许或拒绝特定用户访问某个服务。例如可以进行如下配置阻止 root 用户通过 SSH 登录。
1. 修改 /etc/pam.d/sshd 文件,在第一行添加以下规则以阻止 root 用户通过 SSH 登录。该规则通过 pam_listfile.so 模块检查登录用户名是否存在于拒绝列表中,控制标志选用 required,表示只有当模块检查通过(即用户不在拒绝列表中)时,认证才能继续:
auth required pam_listfile.so item=user sense=deny file=/etc/ssh/deniedusers onerr=fail
2. 创建文件 /etc/ssh/deniedusers,添加阻止 SSH 登录的用户名:
sudo vim /etc/ssh/deniedusers
3. 设置文件权限,避免被其他用户误操作:
sudo chmod 600 /etc/ssh/deniedusers
规则中各参数含义如下:
item=user:指定检查对象为 user
sense=deny:指定如果在 file 指定的文件中找到对应 user 要采取的动作,如果找不到则执行相反的动作
file=/etc/ssh/deniedusers:指定每行包含一个 user 的文件
onerr=fail:指定当错误发生时采取的动作
PAM 模块配置后立即生效,此时无法通过 root 用户访问 SSH 和登录服务。如需查看 pam_listfile.so 模块的更多参数,请执行 man pam_listfile 查看 man 手册。

限制用户登录会话数

使用 pam_limits.so 模块对系统资源设置限制。例如可以进行如下配置限制用户登录会话数。
1. 修改 /etc/pam.d/login/etc/pam.d/sshd 文件,添加一条规则启用 pam_limits.so 模块:
session required pam_limits.so
2. 编辑 /etc/security/limits.conf 文件,pam_limits.so 模块默认读取 /etc/security/limits.conf 配置文件和 /etc/security/limits.d/*.conf 文件。添加以下行限制用户 user1 和用户组 group1 的成员在同一时间最多只能有 3 个登录会话:
user1 - maxlogins 3
@group1 - maxlogins 3
PAM 模块配置后立即生效,用户 user1 登录多个会话会产生如下提示:
There were too many logins for 'user1'.

配置 Kerberos

基本概念

Kerberos 是一种身份认证协议,可以通过密钥系统为服务器和客户端程序提供双向身份验证和授权服务,实现单点登录和统一身份认证,提高系统的安全性和管理效率。
Kerberos 认证过程分为以下几个步骤:
1. Client 向 AS 请求 TGT:客户端向认证服务器(Authentication Service,AS)请求票据授权票据(Ticket Granting Ticket,TGT)。AS 验证客户端身份后,生成 TGT 并将其传送给客户端。客户端使用密钥解密 TGT,从中提取会话密钥。此时,客户端拥有一个有效的 TGT,用于请求访问服务的票据。
2. Client 向 TGS 请求 ST:当客户端需要访问受保护的服务时,客户端向票据授权服务(Ticket Granting Service,TGS)发送请求,附带 TGT 和一个新的认证器(Authenticator)。TGS 验证 TGT 和认证器,然后生成一个包含客户端和服务之间的会话密钥的服务票据(Service Ticket)。客户端接收 Service Ticket,解密并提取会话密钥。
3. Client 与 Server 通信:客户端使用会话密钥生成一个新的认证器,并将其与 Ticket 一起发送给服务。服务验证服务票据和认证器,确认客户端的身份。服务可以使用会话密钥与客户端安全地通信。
这个过程确保了客户端和服务之间的通信安全性,同时避免了在网络上传输明文密码。

使用与配置

环境配置

设置领域 realm 为:OPENCLOUDOS.COM
使用同一个 VPC 子网下的两台机器,一台作为密钥分发中心(Key Distribution Center,KDC),一台作为客户端。KDC 包含认证服务器(Authentication Server,AS)和票据授权服务器(Ticket Granting Server,TGS)。
主机名
内网 IP
角色
KDC
192.168.160.161
Master KDC
Client
192.168.160.165
Kerberos Client
在两台主机的 /etc/hosts 文件中配置如下,确保主机名能够被解析:
192.168.160.161 KDC
192.168.160.165 Client

服务端配置

1. 安装 Kerberos 服务器(KDC)和管理员工具:
dnf install krb5-server krb5-workstation krb5-libs
2. 配置 krb5.conf 文件:
文件默认路径为 /etc/krb5.conf,对 Kerberos 认证服务进行配置,所有使用 Kerberos 的主机上的文件都需要同步该文件。
[libdefaults]
default_realm = OPENCLOUDOS.COM

[realms]
OPENCLOUDOS.COM = {
kdc = 192.168.160.161
admin_server = 192.168.160.161
}
3. 配置 kdc.conf 文件:
文件默认路径为 /var/kerberos/krb5kdc/kdc.conf,修改 KDC 服务器上 Kerberos 域的配置信息。
[realms]
OPENCLOUDOS.COM = {
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
default_principal_flags = +preauth
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal
}
4. 配置 kadm5.acl 文件:
文件默认路径为 /var/kerberos/krb5kdc/kadm5.acl,该文件控制 Kerberos 数据库的管理权限,授予 admin 主体完全访问权限。
*/admin@OPENCLOUDOS.COM *
其中 */admin 是 Kerberos 中的账户形式,这个账户属于 OPENCLOUDOS.COM 这个域,最后的 * 表示符合 */admin 的账户拥有所有权限。
5. 创建 Kerberos 数据库并设置主密钥:
kdb5_util create -s -r OPENCLOUDOS.COM
-s 表示创建安全的 Kerberos 数据库,-r 指定数据库的 Kerberos 领域。数据库创建成功后,会在 /var/kerberos/krb5kdc/ 目录下生成新文件。
6. 添加 Kerberos 用户:
Kerberos 使用主体(principals)来表示用户、服务和其他实体。首先创建一个管理员主体并设置密码:
kadmin.local -q "addprinc root/admin"
添加 Kerberos 测试用户:
kadmin.local -q "addprinc krbtest/admin"
使用 listprincs 命令查看所有用户:
kadmin.local
kadmin.local: listprincs
7. 启动 Kerberos 服务并设置开机自启动:
sudo systemctl start krb5kdc
sudo systemctl start kadmin
sudo systemctl enable krb5kdc
sudo systemctl enable kadmin
启动服务后,可以查看日志文件 /var/log/krb5kdc.log/var/log/kadmind.log
8. 配置防火墙:
如果启动了防火墙,需要允许相关服务。以 firewalld 防火墙为例:
firewall-cmd --add-service=kerberos --permanent
firewall-cmd --add-service=kadmin --permanent
firewall-cmd --add-service=kpasswd --permanent
firewall-cmd --reload

客户端配置

安装 Kerberos 客户端:
dnf install krb5-workstation krb5-libs
配置 krb5.conf 文件:
需要与 KDC 中的 krb5.conf 文件保持一致。
验证 KDC 颁发票据:
使用 kinit 命令验证 KDC 颁发票据。票据会存储在凭证缓存文件中,该命令也可用于测试 Kerberos 认证服务:
kinit krbtest/admin
查看当前缓存中的票据及其信息:
klist
销毁缓存及其包含的票据:
kdestroy

配置 SSSD

SSSD 简介

系统安全服务后台程序(System Security Services Daemon,SSSD)是一种用于访问远程目录和身份验证机制的系统服务。
SSSD 维护一个守护进程,后者是一个介于本地用户和数据存储之间的进程,可以用来访问多种验证服务器,如 LDAP、Kerberos 等,并提供授权。本地客户端首先连接 SSSD,再由 SSSD 联系外部资源提供者,如一台远程服务器。
SSSD 的特点:
避免了本地每个客户端程序对认证服务器大量连接,所有本地程序仅联系 SSSD,由 SSSD 连接认证服务器或 SSSD 缓存,有效降低了负载。
允许离线授权。SSSD 可以缓存远程服务器的用户认证身份,这允许在远程认证服务器宕机时,继续成功授权用户访问必要的资源。

SSSD 常用命令

查询 SSSD 的状态信息:
idm.example.com 域生成报告:
sssctl access-report idm.example.com
显示特定用户的用户数据:
sssctl user-checks -a acct -s sshd example.user
查询域信息:
显示可用域列表:
sssctl domain-list
显示特定域的用户数据:
sssctl domain-status idm.example.com
配置拼写错误检查:
sssctl config-check

SSSD 常用配置

启用离线验证:
/etc/sssd/sssd.conf 文件中添加如下选项:
[domain/your-domain-name]
cache_credentials = true
配置离线身份验证时间限制:
[pam]
offline_credentials_expiration = 3
注意: offline_credentials_expiration 默认为 0,即不限制。
配置 DNS 服务发现(以 LDAP 为例):
/etc/sssd/sssd.conf 文件中添加如下选项:
[domain/your-domain-name]
id_provider = ldap
ldap_uri = _srv_
chpass_provider = ldap
ldap_chpass_dns_service_name = ldap
可选项:
默认情况下,服务发现使用系统主机名的域部分作为域名,要使用不同的 DNS 域,请使用 dns_discovery_domain 选项指定域名。
默认情况下,针对 LDAP 服务类型的服务发现扫描。要使用不同的服务类型,请使用 ldap_dns_service_name 选项指定类型。
默认情况下,SSSD 尝试查找 IPv4 地址。如果尝试失败,SSSD 会尝试查找 IPv6 地址。要自定义此行为,请使用 lookup_family_order 选项。
配置访问规则:
access_provider 设置为 simple 模式,可以基于用户名或组允许或拒绝访问:
[domain/your-domain-name]
access_provider = simple
simple_allow_users = user1, user2
simple_allow_groups = group1
注意:如果拒绝对特定用户/组的访问,则会自动允许对所有其他用户/组的访问。因此,允许访问特定用户通常被认为比拒绝对特定用户的访问更安全。

SSSD 使用场景举例(以 OpenLDAP 客户端为例)

将 TencentOS Server 配置为 OpenLDAP 客户端,实现如下功能:
验证存储在 OpenLDAP 用户账户数据库中的用户。
使用 SSSD 服务检索用户数据。
通过 TLS 加密的连接与 OpenLDAP 服务器通信。

环境准备

1. 切换到 root,并安装软件包:
dnf -y install openldap-clients sssd sssd-ldap oddjob-mkhomedir
2. OpenLDAP 服务器已安装并配置了用户信息。
3. 已持有 OpenLDAP 服务器证书颁发机构的 root CA 签名证书链的 PEM 格式副本。

具体步骤

1. 将身份验证提供者切换到 sssd:
authselect select sssd with-mkhomedir
2. 将证书副本复制到 /etc/openldap/certs 目录:
cp core-dirsrv.ca.pem /etc/openldap/certs
3. 将 LDAP 服务器的 URL 和后缀添加到 /etc/openldap/ldap.conf 文件中:
URI ldap://ldap-server.example.com/
BASE dc=example,dc=com
4. /etc/openldap/ldap.conf 文件的 TLS_CACERT 选项指定证书路径:
TLS_CACERT /etc/openldap/certs/core-dirsrv.ca.pem
5. /etc/sssd/sssd.conf 文件中,将环境信息添加到 ldap_urildap_search_base 参数中:
[domain/default]
ldap_uri = ldap://ldap-server.example.com/
ldap_search_base = dc=example,dc=com
6. /etc/sssd/sssd.conf 文件中指定 TLS 身份验证要求:
cache_credentials = True
ldap_tls_cacert = /etc/openldap/certs/core-dirsrv.ca.pem
ldap_tls_reqcert = hard
7. 调整 /etc/sssd/sssd.conf 文件的权限:
chmod 600 /etc/sssd/sssd.conf
8. 重启并启用 SSSD 服务和 oddjobd 守护进程:
systemctl restart sssd oddjobd
systemctl enable sssd oddjobd
9. 验证。通过 id 命令指定 LDAP 用户从 LDAP 服务器检索用户数据:
id <ldap_user>