限制 rm
命令使用的多层级解决方案
方案 1:基础防护(个人/小型团队)
1.1 别名替换法
bash
# 在 ~/.bashrc 或全局 /etc/bash.bashrc 中添加
alias rm='echo "Use trash-cli instead. Install via: sudo apt-get install trash-cli"'
alias rm='trash-put' # 安装后替换为实际命令
优点 :简单易行,防止误删 缺点 :可通过 /bin/rm
或 \rm
绕过
1.2 文件系统只读挂载
bash
# 对关键目录启用只读保护
sudo mount -o remount,ro /path/to/critical/directory
适用场景:保护静态配置文件目录
方案 2:中级防护(适合运维团队)
2.1 权限控制
bash
# 移除普通用户的rm执行权限
sudo chmod 750 /bin/rm # 仅root和特定用户组可执行
# 或通过sudoers限制
visudo -f /etc/sudoers.d/secure_rm
# 允许用户组admin使用rm但禁止-rf
%admin ALL=(ALL) !/bin/rm -rf *, /bin/rm [!-]*, /bin/rm *
验证命令:
bash
sudo -l # 检查生效规则
2.2 使用安全删除工具
安装 safe-rm
:
bash
sudo apt-get install safe-rm
配置保护列表:
bash
# /etc/safe-rm.conf 添加受保护路径
/
/etc
/var
/home/*
配置环境变量:
bash
vim ~/.bashrc
alias rm='safe-rm'
alias sudo='sudo '
source ~/.bashrc
效果:
bash
rm -rf /etc # 输出:"Skipping /etc"
sudo rm -rf /etc # 输出:"Skipping /etc",不建议直接使用重要的目录做测试,可以单独创建一个目录,如/123
方案 3:企业级防护(结合审计与管控)
3.1 强制审计日志(Auditd)
bash
# 监控所有rm命令执行
sudo auditctl -a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -k file_deletion
# 生成审计报告
ausearch -k file_deletion | aureport -f -i
日志示例:
bash
time->Mon Oct 2 14:00:00 2023
type=PROCTITLE msg=audit(1696252800.123:456): proctitle="rm"-rf"/data"
type=SYSCALL msg=audit(...): arch=c000003e syscall=263 success=yes exit=0 ...
3.2 SELinux/AppArmor 强制访问控制
AppArmor 策略示例:
bash
# /etc/apparmor.d/deny-rm
/bin/rm {
deny /etc/** rmx,
deny /opt/app/** rmx,
}
激活策略:
bash
sudo apparmor_parser -r /etc/apparmor.d/deny-rm
3.3 文件防删除属性
bash
# 使用chattr锁定文件
sudo chattr +i /critical/file.conf # 不可删除
sudo chattr +a /var/log/audit.log # 仅追加
查看属性:
bash
lsattr /critical/file.conf
方案 4:云原生/容器化环境
4.1 只读文件系统(Docker/K8s)
yaml
# Kubernetes Pod配置示例
securityContext:
readOnlyRootFilesystem: true
volumes:
- name: ephemeral
emptyDir: {}
4.2 使用不可变基础设施
- 通过Terraform声明资源:
hcl
resource "aws_s3_bucket" "logs" {
bucket = "app-logs"
lifecycle {
prevent_destroy = true # 阻止删除
}
}
方案对比与选型建议
方案 | 防护强度 | 实施复杂度 | 适用场景 | 绕过风险 |
---|---|---|---|---|
别名替换 | ★☆☆☆☆ | 低 | 个人开发机 | 高 |
safe-rm | ★★☆☆☆ | 中 | 中小型运维团队 | 中 |
Auditd审计 | ★★★☆☆ | 高 | 合规审计要求 | 低 |
SELinux策略 | ★★★★☆ | 极高 | 军工/金融等敏感环境 | 极低 |
不可变基础设施 | ★★★★★ | 中 | 云原生/容器化生产环境 | 无 |
附加防护建议
-
备份策略:
- 使用
rsync
+--link-dest
做硬链接快照 - 启用ZFS/Btrfs文件系统自动快照
- 使用
-
文件恢复工具:
bash# 安装extundelete/testdisk sudo apt-get install extundelete extundelete /dev/sda1 --restore-file /home/user/important.doc
-
用户教育:
bash# 在登录提示中增加警告 echo "WARNING: Critical servers! Use 'rm' cautiously." >> /etc/motd