不能用 chattr +i 锁定 ~/.ssh/authorized_keys 文件——这会彻底禁止所有写入(包括 root),导致 SSH 登录失败、自动化部署中断;应改用 chattr +a 配合目录 700 权限实现安全追加。
直接结论:不能用锁定文件来“防止非法添加公钥”——这会同时阻止合法的 SSH 公钥更新,导致用户无法登录。
为什么
不适合保护
因为
(immutable)属性会让文件彻底不可修改、不可删除、不可重命名,连 root 也无法写入或追加内容。而
是一个需要动态维护的文件:运维添加新密钥、自动化脚本更新、CI/CD 注入部署密钥、甚至用户自己通过
添加公钥,都依赖对该文件的写权限。
一旦执行:
后续任何写操作都会失败,报错:
(即使你是 root,且文件权限是 600)
常见误操作后果包括:
SSH 登录失败(
读取失败或跳过该文件)
报
Ansible 或 Puppet 部署密钥任务静默失败
手动
直接被内核拒绝
真正有效的替代方案:用
+ 严格目录权限
如果你的核心诉求是「只允许追加、禁止覆盖或清空」,
(append-only)才是更合理的选择——它允许向文件末尾写入(如追加新公钥),但禁止截断、重写、删除已有行。
CentOS Linux 7.9.2009
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
下载
实操步骤:
确保
目录权限为
:
设置
为追加模式:
确认生效:
应显示
注意点:
对目录也有效:设在
上时,只允许在该目录下创建/修改文件,但不允许删除——这对防止恶意替换整个
文件也有辅助作用
不阻止
这类绕过行为,所以必须配合
目录的
权限和属主控制
某些旧内核(a 属性,建议先验证:
更健壮的做法:结合
+ 权限最小化
如果系统频繁由多个脚本或服务更新
(比如 CI 推送密钥),光靠
不足以避免竞态写入。此时应引入显式锁机制:
示例 Bash 片段(安全追加公钥):
关键点:
使用
文件描述符锁,避免多进程并发写乱序
仍需保证
文件本身可写(即不能设
)
推荐把该逻辑封装成独立脚本,并限制执行者为特定管理组(如
)
最后提醒:最常被忽略的是
目录的属主和权限。哪怕
被锁死,只要攻击者能写入
目录,就能替换整个文件——所以
比单独锁文件更重要。
chattr +i~/.ssh/authorized_keyschattr +iauthorized_keysiauthorized_keysssh-copy-idchattr +i ~/.ssh/authorized_keysPermission deniedsshdssh-copy-idCould not append to authorized_keysecho ... >> authorized_keyschattr +aa~/.ssh700chmod 700 ~/.sshauthorized_keyschattr +a ~/.ssh/authorized_keyslsattr ~/.ssh/authorized_keys----a-------e---+a~/.sshauthorized_keys+arm authorized_keys && touch authorized_keys~/.ssh700chattr +a /tmp/test && echo x >> /tmp/testflockauthorized_keyschattrexec 200>>"$HOME/.ssh/authorized_keys"
flock -n 200 || { echo "locked"; exit 1; }
echo "$NEW_KEY" >>"$HOME/.ssh/authorized_keys"
flock -u 200flockauthorized_keys+issh-admins~/.sshauthorized_keys~/.sshchown $USER:$USER ~/.ssh && chmod 700 ~/.ssh