安全基线-rm命令防护

限制 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/*

配置环境变量:

复制代码
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

日志示例

复制代码
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策略 ★★★★☆ 极高 军工/金融等敏感环境 极低
不可变基础设施 ★★★★★ 云原生/容器化生产环境

附加防护建议

  1. 备份策略

    • 使用 rsync + --link-dest 做硬链接快照
    • 启用ZFS/Btrfs文件系统自动快照
  2. 文件恢复工具

    bash 复制代码
    # 安装extundelete/testdisk
    sudo apt-get install extundelete
    extundelete /dev/sda1 --restore-file /home/user/important.doc
  3. 用户教育

    bash 复制代码
    # 在登录提示中增加警告
    echo "WARNING: Critical servers! Use 'rm' cautiously." >> /etc/motd

    ##################################################################################################################################################

今日推荐

小说:《玄镜高悬》

简介:

仙人成就道果证位道君,本可得求长生逍遥,然而一场席卷诸天万界的纪元大劫却击碎了道君们的逍遥梦。 为了培养出能够终结纪元大劫的大神通者,诸道君穷尽诸天,搜罗拥有特殊命格的修行者,负责搜罗仙人种子的机构被称之为【仙选殿】。 多年以后,面对大劫真相,玄清子将会回想起,在仙选殿中为荆雨等人激发命格的那个遥远的下午。

相关推荐
独立开阀者_FwtCoder1 分钟前
使用这个新的 ECMAScript 运算符告别 Try/Catch!
前端·javascript·github
云浪1 分钟前
让元素舞动!深度解密 CSS 旋转函数
前端·css
cdcdhj2 分钟前
vue中events选项与$on监听自定义事件他们的区别与不同,以及$emit与$on之间通信和mounted生命周期钩子函数有哪些作用和属性
前端·javascript·vue.js
Jinxiansen021114 分钟前
Vue 3 弹出式计算器组件(源码 + 教程)
前端·javascript·vue.js
东京老树根18 分钟前
SAP学习笔记 - 开发22 - 前端Fiori开发 数据绑定(Jason),Data Types(数据类型)
前端·笔记·学习
前端 贾公子30 分钟前
手写 vue 源码 === runtime-dom 实现
前端·javascript·css
江城开朗的豌豆1 小时前
JavaScript篇:typeof 的魔法:原来你是这样判断类型的!
前端·javascript·面试
hgdlip1 小时前
固定ip和非固定ip的区别是什么?如何固定ip地址
服务器·网络·tcp/ip
江城开朗的豌豆1 小时前
JavaScript篇:数组扁平化:从‘千层饼’到‘一马平川’的六种神操作 🥞→📜
前端·javascript·面试
IT葛大侠1 小时前
OSPF域间路由
运维·网络·计算机网络