Debian系统中,/etc/shadow文件的权限必须严格设置为640(rw-r-----),属主为root,属组为shadow,这是Linux用户密码安全的第一道防线。密码哈希轮换则是指通过chage命令、passwd命令或手动编辑shadow文件,定期更新用户密码哈希值,防止哈希被暴力破解或长期暴露在泄露风险中。下面我把这两个核心问题拆开,从权限配置、哈希机制、轮换策略到实际操作,一次性讲透。
一、/etc/shadow文件权限为什么是640在Debian系统中,/etc/shadow文件存储着所有用户的密码哈希值、上次修改时间、最小密码天数、最大密码天数、警告天数、不活动天数和过期时间等关键信息。这个文件一旦被非授权用户读取,攻击者就能拿到所有用户的密码哈希,离线暴力破解只是时间问题。
Debian默认将shadow文件的权限设置为640,属主root,属组shadow。这意味着只有root用户和shadow组的成员才能读取该文件。shadow组通常包含需要验证用户身份的程序,比如login、su、sudo等。普通用户完全没有读取权限。
你可以用以下命令直接查看当前权限:
ls -l /etc/shadow
正常输出应该类似:
-rw-r----- 1 root shadow 1234 Jun 15 10:30 /etc/shadow
如果你发现权限变成了644或者其他值,说明系统安全配置出了问题,必须立即修复。修复命令很简单:
chmod 640 /etc/shadow chown root:shadow /etc/shadow
有些管理员会犯一个错误,直接用chmod 600把属组权限也去掉。这样做虽然更"安全",但会导致shadow组的程序无法读取文件,login和su等工具会报错。640是安全性和功能性的最佳平衡点。
二、Debian shadow文件中密码哈希的结构解析打开/etc/shadow,每一行代表一个用户,字段用冒号分隔。以root用户为例:
root:$6$rounds=656000$AbCdEfGh$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:19500:0:99999:7:::
各字段含义如下:用户名、密码哈希、上次修改日期(从1970年1月1日起的天数)、最小密码天数、最大密码天数、警告天数、不活动天数、过期日期、保留字段。
重点看密码哈希部分。$6$表示使用SHA-512算法(通过crypt函数实现),rounds=656000表示哈希迭代了656000次,这是Debian 10及以上版本的默认配置。迭代次数越高,暴力破解的计算成本越大。Debian 9及更早版本默认使用$5$(SHA-256),迭代5000次。
如果你看到$1$,那是MD5,已经不安全了,必须升级。如果看到$2a$或$2b$,那是Blowfish,比MD5好但不如SHA-512。Debian 12 Bookworm默认已经全面使用SHA-512,这是当前主流Linux发行版中比较强的密码哈希方案。
三、密码哈希轮换的三种核心方法密码哈希轮换不是简单地"改个密码"就完了,它涉及到策略制定、强制执行和审计追踪。Debian提供了多种工具来实现轮换。
方法一:使用chage命令设置密码过期策略
chage是专门管理shadow文件中密码过期信息的工具。你可以查看某个用户的密码策略:
chage -l username
设置密码最大有效天数为90天:
chage -M 90 username
设置密码最小有效天数(防止用户频繁改密码绕过历史记录)为7天:
chage -m 7 username
强制用户下次登录时必须修改密码:
chage -d 0 username
这个-d 0参数非常实用,它把"上次修改日期"设为0,系统会认为密码已经过期,用户登录时会被强制要求设置新密码。适合新员工入职或者安全事件后的紧急轮换。
方法二:使用passwd命令直接轮换
最直接的方式就是让用户自己改密码,或者管理员代为修改:
passwd username
管理员可以用以下命令强制用户下次登录修改密码,同时设置过期策略:
passwd -e username
如果你需要批量强制所有用户修改密码,可以结合chage使用:
for user in $(awk -F: '$3 >= 1000 {print $1}' /etc/passwd); do chage -d 0 $user; done
这条命令会把所有UID大于等于1000的普通用户密码标记为过期。注意,不要对系统服务账户这样操作,可能导致服务中断。
方法三:手动编辑shadow文件(高风险,仅限紧急情况)
在极端情况下,比如系统无法正常登录,你可能需要直接编辑shadow文件。操作步骤:
cp /etc/shadow /etc/shadow.bak vipw -s
vipw -s会用系统默认编辑器打开shadow文件,并且会自动加锁防止并发修改。编辑完成后保存退出,系统会自动检查语法。千万不要直接用vim打开编辑,容易造成文件损坏。
手动修改哈希值时,你需要先生成一个新的哈希。可以用mkpasswd或openssl:
mkpasswd -m sha-512 -S saltsalt -s yourpassword
或者用openssl:
openssl passwd -6 -salt saltsalt yourpassword
把生成的哈希字符串替换shadow文件中对应字段即可。但这种方式绕过了系统的密码策略检查,不建议作为常规操作。
四、Debian系统级密码哈希算法配置Debian通过/etc/login.defs和/etc/pam.d/common-password来控制默认的密码哈希算法。查看当前配置:
grep ENCRYPT_METHOD /etc/login.defs
Debian 12中默认是SHA512。如果你想修改默认算法,编辑/etc/login.defs:
ENCRYPT_METHOD SHA512
同时要确保PAM配置正确,检查/etc/pam.d/common-password:
password [success=1 default=ignore] pam_unix.so sha512 shadow
这里的sha512参数必须和login.defs中的设置一致。如果你想让新用户强制使用更强的哈希,可以在这里加上rounds参数:
password [success=1 default=ignore] pam_unix.so sha512 shadow rounds=656000
rounds值越大,哈希计算越慢,安全性越高,但登录认证也会稍微变慢。656000是Debian 12的默认值,在安全性和性能之间取得了不错的平衡。对于高安全需求的服务器,可以考虑提高到1000000以上。
五、密码哈希轮换的最佳实践和审计建议第一,建立定期轮换制度。普通用户建议90天轮换一次,特权账户建议30-60天。使用cron配合chage可以自动化检查过期账户:
0 9 * * 1 chage -l $(awk -F: '$3 >= 1000 {print $1}' /etc/passwd) | grep "Password expires" | grep -v "never" | awk -F: '{print $1}' | xargs -I {} chage -W 7 {}
这条cron任务每周一早上9点检查所有普通用户,对即将过期的账户发送7天警告。
第二,监控shadow文件权限变化。可以用auditd设置审计规则:
auditctl -w /etc/shadow -p rwxa -k shadow_access
这样任何对shadow文件的读写操作都会被记录到/var/log/audit/audit.log中,方便事后追溯。
第三,避免密码复用。Debian的pam_pwhistory模块可以记录用户历史密码,防止重复使用。在/etc/pam.d/common-password中确认有:
password requisite pam_pwhistory.so use_authtok remember=12
remember=12表示记住最近12次密码,用户不能重复使用。这个模块需要先安装libpam-pwhistory包。
第四,对于无法交互式修改密码的系统账户(比如数据库服务账户),应该使用随机强密码并定期通过脚本轮换,同时确保这些账户的shell设置为/usr/sbin/nologin或/bin/false,减少攻击面。
六、常见问题排查问题一:用户无法登录,提示"Authentication failure"。先检查shadow权限是否正确,再检查PAM配置是否和哈希算法匹配。很多时候是升级系统后login.defs改了算法但PAM没同步。
问题二:shadow文件被意外修改导致权限错误。用备份恢复:
cp /etc/shadow.bak /etc/shadow chmod 640 /etc/shadow chown root:shadow /etc/shadow
问题三:想查看某个用户密码是否已过期。用:
chage -l username | grep "Password expires"
如果显示"Password expires : password must be changed",说明该用户下次登录必须改密码。
总结来说,Debian的shadow文件权限和密码哈希轮换是系统安全的基石。640权限是底线,SHA-512加高rounds是当前推荐配置,chage和passwd是日常管理的核心工具,auditd是事后审计的保障。把这几个环节都做到位,你的Debian服务器密码安全就有了扎实的基础。
