问题概述
在使用RPM(Redhat,Centos,Rocky)系统时,Kerberos用户可能会遇到登录失败的问题,错误信息显示为"Disk quota exceeded"。这个错误源于内核密钥环的配额限制,当用户的Kerberos票据尝试存储在内核密钥环时,由于配额不足而导致认证失败。
错误现象
登录过程中,系统日志(通常是/var/log/sssd/krb5_child.log)会记录以下关键错误:
[map_krb5_error](0x0020):1853: [122][Disk quota exceeded] [create_ccache](0x0020):1025: [122][Disk quota exceeded]
当然,如果使用systemctl命令也可以看到类似错误:
systemctl status sssd
根本原因分析
Linux内核密钥环服务用于在内核中缓存加密密钥、身份验证令牌和跨域用户映射等信息。每个用户的密钥使用受到两个内核参数的限制:
kernel.keys.maxkeys:用户可以拥有的最大密钥数量
kernel.keys.maxbytes:用户密钥可以消耗的最大字节数
当Kerberos客户端(krb5_child)尝试为用户创建凭证缓存时,如果当前用户的密钥使用已达到上述任一限制,就会触发"Disk quota exceeded"错误。
诊断步骤
1. 检查用户密钥使用情况
$ grep $(id -u $USER_NAME) /proc/key-users
输出示例:
1002: 13 13/13 13/200 3997/4000
各字段含义:
第一列:UID
倒数第二列:当前用户拥有的密钥数/最大允许密钥数(kernel.keys.maxkeys)
最后一列:当前用户密钥消耗的字节数/最大允许字节数(kernel.keys.maxbytes)
2. 查看系统所有用户的密钥使用排名
$ sort -k 5 -rn /proc/key-users
输出示例:
0: 466 465/465 171/1000000 6789/25000000 1002: 13 13/13 13/200 3997/4000 1001: 15 15/15 15/200 2000/4000 ...
从输出可以看出,UID 1002用户的字节使用量已接近上限(3997/4000),需要增加配额。
解决方案
解决方案1:增加内核密钥配额
1.1 临时增加kernel.keys.maxkeys
将用户可以拥有的最大密钥数增加到400:
# sysctl -w kernel.keys.maxkeys=400
1.2 永久增加kernel.keys.maxkeys
编辑/etc/sysctl.conf文件,添加或修改以下行:
kernel.keys.maxkeys = 400
然后重新加载配置:
# sysctl -p
1.3 临时增加kernel.keys.maxbytes
将用户密钥可以消耗的最大字节数增加到20000:
# sysctl -w kernel.keys.maxbytes=20000
1.4 永久增加kernel.keys.maxbytes
编辑/etc/sysctl.conf文件,添加或修改以下行:
kernel.keys.maxbytes = 20000
然后重新加载配置:
# sysctl -p
解决方案2:更改Kerberos凭证缓存类型
对于RHEL 8及更高版本,建议使用KCM(Kerberos Cache Manager)作为凭证缓存后端。
作为替代方案,可以使用FILE类型的缓存。编辑/etc/krb5.conf文件,将:
default_ccache_name = KEYRING:persistent:%{uid}替换为:
default_ccache_name = FILE:/tmp/krb5cc_%{uid}清理现有票据(可选)
如果需要清理当前用户的现有Kerberos票据:
$ kdestroy -A
解决方案3:配置SSSD KCM
步骤1:安装SSSD KCM组件
# 安装sssd-kcm软件包 dnf install sssd-kcm 或者 yum install sssd-kcm
如果系统中已安装该软件包,系统会提示已安装最新版本。
步骤2:配置Kerberos使用KCM缓存
编辑或创建KCM配置文件:
# vim /etc/krb5.conf.d/kcm_default_ccache
确保文件内容包含以下配置:
# 启用KCM凭证缓存需要启用KCM socket和服务: # systemctl enable sssd-kcm.socket sssd-secrets.socket # systemctl start sssd-kcm.socket ## 要禁用KCM凭证缓存,请注释以下行。 [libdefaults] default_ccache_name = KCM:
关键配置说明:
default_ccache_name = KCM:指定使用KCM作为默认的凭证缓存后端冒号(
:)是必须的,表示使用默认的KCM缓存
步骤3:检查主Kerberos配置文件
确保/etc/krb5.conf文件开头包含以下includedir指令:
includedir /etc/krb5.conf.d/ includedir /var/lib/sss/pubconf/krb5.include.d/
检查方法:
# 查看/etc/krb5.conf文件开头部分head -10 /etc/krb5.conf # 如果缺少includedir行,可以添加 vim /etc/krb5.conf
注意:这些includedir行应放在[libdefaults]部分之前,以确保正确加载配置文件。
步骤4:启用并启动KCM服务
# 启用KCM socket(开机自启动) systemctl enable sssd-kcm.socket # 启动KCM socket systemctl start sssd-kcm.socket # 检查服务状态 systemctl status sssd-kcm.socket
步骤5:重启SSSD服务
# 重启SSSD服务以应用更改 systemctl restart sssd # 检查SSSD服务状态 systemctl status sssd
最佳实践建议
监控密钥使用:定期检查
/proc/key-users,了解系统中各用户的密钥使用情况合理设置配额:根据实际使用需求调整配额,避免设置过大影响系统安全
使用KCM缓存:在RHEL 8+系统中优先考虑使用KCM作为缓存后端
日志监控:定期检查
/var/log/sssd/krb5_child.log日志文件,及时发现配额问题
总结
Kerberos用户因内核密钥配额不足无法登录的问题通常可以通过增加配额或更改缓存类型来解决。系统管理员应根据实际情况选择合适的解决方案,并建立适当的监控机制,确保系统的稳定运行和用户的正常访问。


网友留言: