UP | HOME

安全等级

Table of Contents

安全等级为 FreeBSD 内核内置安全机制,可通过 sysctl kern.securelevel 查看当前等级

对于运行时,该值只能在 -1 至 3 五个级别间单向提升(不可降低)

概述

安全等级是内核内置安全机制。安全等级为正值时,内核限制部分操作,root 用户亦不例外。

安全等级机制限制以下功能:

  • 取消设置某些文件标志

    如 schg 系统不可变标志
    
  • 通过 /dev/mem 和 /dev/kmem 写入内核内存
  • 加载内核模块
  • 更改防火墙规则

安全等级定义

内核共设五个安全等级。任何超级用户进程均可提升等级,但任何进程均不能降低等级。各安全等级定义如下:

  • -1: 永久不安全 模式 ,系统始终处于不安全模式
    • 此为默认初始值
  • 0: 不安全 模式
    • 可以关闭不可变和仅追加标志
    • 所有设备可依其权限读写
  • 1: 安全 模式
    • 无法关闭系统不可变和系统仅追加标志
    • 已挂载文件系统所在磁盘、/dev/mem 和 /dev/kmem 均不可打开以写入
    • 如果平台存在 /dev/io,则完全禁止打开
    • 无法加载或卸载内核模块
    • 禁止使用 sysctl debug.kdb.enter 进入内核调试器

      除非 MAC(9) 策略授予访问权限,例如 mac_ddb(4)
      
    • 也无法通过 debug.kdb.panic、debug.kdb.panic_str 及其他 sysctl 强制触发 panic 或 trap
  • 2: 高度安全 模式, 在安全模式基础上
    • 磁盘(无论是否已挂载)均不可打开以写入,mount 操作除外

      此等级可阻止以卸载文件系统方式篡改数据,但也意味着多用户模式下无法运行 newfs
      
    • 内核时间变更受限于不超过 1 秒

      超出此范围修改时间将产生日志消息“Time adjustment clamped to +1 second”
      
  • 3: 网络安全 模式, 在高度安全模式基础上
    • IP 数据包过滤规则 ipfw(8)ipfirewall(4)pfctl(8) 均无法修改, dummynet(4)pf(4) 配置也无法调整
永久不安全模式与不安全模式的关键差别在于:

前者彻底解除一切安全限制,而后者虽放宽了部分约束,仍保留相当程度的控制力

按 init(8) 的工作方式,如果系统初始安全等级为 0,init 会在首次进入多用户模式前将其提升至 1。由于安全等级只能提升不能降低,此后即便返回单用户模式,系统也至少维持在等级 1

另外需要注意,引导阶段过早将安全等级设为大于 1 的值,可能阻碍 fsck(8) 修复不一致的文件系统

因此建议在 /etc/rc 末尾(多用户启动操作全部完成后)再行设置

修改安全等级

首先确保安全等级设置被启用:

$ sysrc kern_securelevel_enable="YES"

再将 kern.securelevel 设为期望的安全等级(允许的取值范围为 -1 至 3):

$ sysrc kern_securelevel=2

# 重启后安全等级将生效
安全等级只能提升不能降低。设置后若需回退,必须重启系统并在单用户模式下修改

远程管理场景下,过高的安全等级可能限制磁盘写入、内核模块加载等操作,导致无法正常运维

建议先在测试环境中验证影响后再行应用于生产环境

查看运行中系统的当前安全等级:

$ sysctl -n kern.securelevel
2

输出为安全等级当前值

如果大于 0,说明系统至少已启用部分安全保护
Next: Root桌面登录 Previous:资源限制 Home: 安全管理