> For the complete documentation index, see [llms.txt](https://handbook.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://handbook.bsdcn.org/di-16-zhang-an-quan/16.5.-an-quan-deng-ji.md).

# 16.5.安全等级

安全等级是内核实现的安全机制。当安全等级设置为正值时，内核会限制某些任务的执行；即使是超级用户（`root`）也无法执行这些操作。

安全等级机制限制了以下操作的能力：

* 取消某些文件标志，例如 `schg`（系统不可变标志）。
* 通过 **/dev/mem** 和 **/dev/kmem** 写入内核内存。
* 加载内核模块。
* 修改防火墙规则。

## 16.5.1. 安全等级定义

内核运行时有五个不同的安全等级。任何超级用户进程能提升级别，但没有进程能降低它。

安全等级定义如下：

* **-1** 永久不安全模式 - 始终在不安全模式下运行系统。这是默认初始值。
* **0** 不安全模式 - 可关闭不可变标志和仅追加标志。所有设备可根据权限读写。
* **1** 安全模式 - 系统不可变和系统仅追加标志不能关闭；挂载文件系统的磁盘、**/dev/mem** 和 **/dev/kmem** 不能以写入方式打开；**/dev/io**（如果平台支持）不能被打开；不能加载或卸载内核模块（见 [kld(4)](https://man.freebsd.org/cgi/man.cgi?query=kld\&sektion=4\&format=html)）。不能使用 `debug.kdb.enter` sysctl 进入内核调试器。无法通过 `debug.kdb.panic`、`debug.kdb.panic_str` 等 sysctl 强制触发 panic 或陷阱。
* **2** 高安全模式 - 与安全模式相同，另外，无论是否已挂载，磁盘都不能写入（除了通过 [mount(2)](https://man.freebsd.org/cgi/man.cgi?query=mount\&sektion=2\&format=html)）。这个级别防止通过卸载文件系统来篡改文件系统，但也会抑制在系统处于多用户模式时运行 [newfs(8)](https://man.freebsd.org/cgi/man.cgi?query=newfs\&sektion=8\&format=html)。
* **3** 网络安全模式 - 与高安全模式相同，另外，IP 包过滤规则（见 [ipfw(8)](https://man.freebsd.org/cgi/man.cgi?query=ipfw\&sektion=8\&format=html)、[ipfirewall(4)](https://man.freebsd.org/cgi/man.cgi?query=ipfirewall\&sektion=4\&format=html) 和 [pfctl(8)](https://man.freebsd.org/cgi/man.cgi?query=pfctl\&sektion=8\&format=html)）不能更改，不能调整 [dummynet(4)](https://man.freebsd.org/cgi/man.cgi?query=dummynet\&sektion=4\&format=html) 或 [pf(4)](https://man.freebsd.org/cgi/man.cgi?query=pf\&sektion=4\&format=html) 配置。

> **技巧**
>
> 总结：在 FreeBSD 安全等级中，`永久不安全模式` 和 `不安全模式` 之间的关键区别是它们提供的安全程度。`永久不安全模式` 完全解除所有安全限制，而 `不安全模式` 放松了一些限制，但仍然维持一定的控制和安全性。

## 16.5.2. 修改安全等级

要更改系统的安全等级，首先需要通过执行以下命令启用 `kern_securelevel_enable`：

```sh
# sysrc kern_securelevel_enable="YES"
```

然后设置 `kern_securelevel` 的值为所需的安全等级：

```sh
# sysrc kern_securelevel=2
```

要检查正在运行的系统的安全等级状态，可执行以下命令：

```sh
# sysctl -n kern.securelevel
```

输出将包含当前的安全等级值。如果它大于 0，则至少启用了某些安全等级的保护措施。
