一些不为人知的 OpenBSD 功能
1.简介 §
在这篇博文中,你将了解到一些 OpenBSD 有用但并不普及的功能。
它们通常有一个小众的用途,但重要的是要知道它们的存在,以防止你重新发明轮子:)
2.特性 §
下面列出的特性并不都是 OpenBSD 特有的,因为有些特性在其他 BSD 系统中也能找到。大多数知识对 Linux 用户来说并不有用。
2.1.安全级别
安全级别是一个名为 kern.securelevel
的 sysctl,它有 4 个不同的值,从 -1 级到 2 级,而且只能提高级别。默认情况下,系统会在多用户状态下进入安全级别 1(普通安装启动时的默认状态)。
然后可以升级到最后一个安全级别(2),这将启用以下额外安全功能:
- 所有原始磁盘都是只读的,因此无法更改存储设备
- 时间几乎被锁定,只能以小步慢走的方式修改时钟(可能每隔一段时间最多修改 1 秒钟)
- 无法修改、刷新或更改 PF 防火墙规则
该功能主要适用于规则很少更改的专用防火墙。防止时间改变对远程日志记录非常有用,因为它可以确定事情发生的 “时间”,并确保过去的日志没有被修改。
默认的安全级别 1 已经启用了一些额外的安全功能,如 “不可变 “和 “仅限附加 “文件标志,这些被忽视的标志(可以用 chflags 应用)可以锁定文件,防止任何人修改它们。只允许添加的标记对日志非常有用,因为你不能修改日志内容,但这并不能阻止添加新内容,历史记录也不能通过这种方式修改。
其他 BSD 系统也有此功能。
2.2.内存分配器额外检查 §
OpenBSD 的内存分配器可以在系统范围内或按命令进行调整,以增加额外的检查。这既可以是出于安全考虑,也可以是为了查找程序中与内存分配相关的 bug(这是非常常见的……)。
应用更改有两种方法:
- 在全系统范围内使用
sysctl vm.malloc_conf
,可以立即使用 sysctl 命令,也可以在启动时在/etc/sysctl.conf
中使用(确保在此处引用其值,否则某些字符(如 >)会带来麻烦,我就遇到过这种情况……)。 - 在命令行中加入
env MALLOC_OPTIONS="flags" program_too_run
手册中列出了作为选项使用的标志,其中最容易使用的是 S(用于安全检查)。手册中指出,使用除 X 以外的任何标志的程序都是有问题的,所以如果你使用了 malloc 选项而导致程序崩溃,这并不是你的错。
OpenBSD 手册页面:malloc(搜索 MALLOC OPTIONS)
2.3.文件标志 §
你肯定已经习惯了权限或所有权等文件属性,但在许多文件系统中(包括 OpenBSD ffs),也有标记!
文件标志可以用 chflags
命令来修改,有几种可用的标志:
- nodump:防止文件被转储命令保存(除非你在转储中使用了一个标志来绕过它)
- sappnd:文件只能在写附加模式下使用,只有 root 可以设置/删除该标志
- schg:文件无法更改,成为不可变文件,只有 root 可以更改此标记
- uappnd:与 sappnd 模式相同,但用户可以更改标记
- uchg:与 schg 模式相同,但用户可以更改标记
如上文安全级别部分所述,在安全级别 1(默认!)下,无法删除 sappnd
和 schg
标志,需要在单用户模式下启动才能删除这些标志。
提示:使用chflags 0 file [...]
移除文件上的标记
你可以使用 ls -ol
查看文件上的标记,如下所示:
terra$ chflags uchg get_extra_users.sh
terra$ ls -lo get_extra_users.sh
-rwxr-xr-x 1 solene solene uchg 749 Apr 3 2023 get_extra_users.sh
terra$ chflags 0 get_extra_users.sh
terra$ ls -lo get_extra_users.sh
-rwxr-xr-x 1 solene solene - 749 Apr 3 2023 get_extra_users.sh
2.4.Crontab 额外参数 §
OpenBSD 的 crontab 格式在过去几年里有了一些新的变化。
- 时间字段的随机数:你可以在字段中使用
~
而不是数字或*
来生成一个随机值,这个值在 crontab 重新加载之前保持稳定。比如~/5
就可以。可以在20~40
的范围内强制使用随机值,以获得 20 到 40 之间的值。 - 只有当 cron 作业的返回代码不是
0
时才发送电子邮件:在时间和命令之间添加-n
,如0 * * * * -n /bin/something
。 - 一次只运行一个作业实例:在时间和命令之间添加
-s
,如* * * * -s /bin/something
。这对于不应该并行运行两次的 cron 作业来说非常有用,如果作业持续时间比平时长,可以确保在前一个作业完成之前,它不会启动新的实例。 - 不记录日志:在时间和命令之间添加 -q,如
* * * * -q /bin/something
,效果是该 cron 作业不会被记录到 /var/cron/log 中。
也可以使用 -ns
这样的组合标志。当你有多个系统,但不想让它们同时运行一个命令时,随机时间就很有用,比如它们会在远程服务器上触发一个巨大的 I/O。创建这个功能是为了防止通常的0 * * * * sleep $(( $RANDOM % 3600 )) && something
之类在运行命令前随机运行一小时的睡眠命令。
2.5.自动安装媒体 §
OpenBSD 有一个很酷的功能,就是可以轻松创建一个带有预配置答案的安装媒体。这可以通过在 bsd.rd
install 内核中注入一个特定文件来实现。
semarie@创建了一个名为upobsd的简单工具,可以轻松修改bsd.rd文件以包含自动安装文件。
除了自动安装 OpenBSD 的用户、ssh 配置、要安装的设置等,还可以添加一个 site.tgz 压缩包,以及通常的设置压缩包,其中包括你想添加到系统中的文件,这可以包括一个脚本,在第一次启动时运行,以触发一些自动化!
如果你在生产环境中运行 OpenBSD,而且有很多设备需要管理,那么这些功能是必不可少的。
2.6. apmd 守护进程钩子hooks §
Apmd 当然运行在大多数 OpenBSD 笔记本电脑和台式机上,但它有一些与命令行标志无关的功能,你可能已经错过了。
它有不同的文件名,可以包含在某些事件(如挂起、恢复、休眠等)发生时运行的脚本。
一个经典的用法是在挂起时在 X 会话中运行 xlock
,这样系统在恢复时就会要求输入密码。
手册页面解释了一切,但基本上,当你将笔记本电脑连接到电源插头时,运行备份程序的工作原理是这样的:
# mkdir -p /etc/apm
# vi /etc/apm/powerup
您需要编写一个常规脚本:
#!/bin/sh
/usr/local/bin/my_backup_script
然后,使其可执行
# chmod +x /etc/apm/powerup
当系统重新接上交流电源时,守护进程 apmd 会自动运行此脚本。
该方法适用于
- 休眠
- 恢复
- 挂起
- 待机
- 休眠
- 开机
- 关机
这样就很容易根据这些事件安排任务。
2.7.使用 hotplugd 实现设备事件钩子hook §
与 apmd 在事件发生时运行脚本有点类似,hotplugd 是一项服务,允许在添加/移除设备时运行脚本。
一个典型的用法是在插入系统时自动挂载 USB 记忆棒,或在打开 USB 打印机时启动杯子守护进程。
脚本会接收两个参数,分别代表设备类别和设备名称,因此可以在脚本中使用它们来了解连接的设备。手册中提供的示例是一个很好的起点。
脚本的编写其实并不简单,你需要列出一份精确的硬件列表,并说明每种硬件的运行情况,同时不要忘记跳过未知硬件。别忘了让脚本可执行,否则将无法运行。
2.8.Altroot §
最后,还有一个看起来很酷的功能。在日常脚本中,如果 /etc/fstab
中存在 OpenBSD 分区 /altroot/
,且日常脚本环境变量为 ROOTBACKUP=1
,则根分区将复制到该分区。这就允许额外的根分区与主根分区保持同步。显然,如果备用根分区在另一个硬盘上,这将更有用。复制是通过 dd 完成的。你可以查看 /etc/daily
脚本,了解具体代码。
不过,如果没有安装引导加载程序或在磁盘上创建 EFI 分区,则不清楚如何从该分区启动……
OpenBSD manual pages: hier (hier stands for file system hierarchy)
OpenBSD FAQ: Root partition backup
2.9. talk: 终端中的本地聊天 §
OpenBSD 自带了一个名为 “talk “的程序,它可以与本地或远程用户创建一对一的聊天(设置比较复杂)。这不是异步的,两个用户必须登录系统才能使用 talk
。
这个程序并不是 OpenBSD 独有的,它也可以在 Linux 上使用,但它非常有趣、有效且易于设置,所以我想把它写下来。
设置非常简单:
echo "ntalk dgram udp wait root /usr/libexec/ntalkd ntalkd" >> /etc/inetd.conf
# rcctl enable inetd
# rcctl start inetd
通信发生在本地主机的 UDP 端口 517 和 518 上,不要向互联网开放!如果要允许远程系统访问,请使用 VPN 加密通信,并只允许 VPN 使用 517/518 端口。
使用方法很简单,如果你想让 alice 和 bob 互相对话:
- alice 键入
talk bob
,bob 也必须登录 - bob 在终端上收到一条信息,显示 alice 想要通话
- bob 键入
talk alice
- 两个用户的终端界面都会出现,他们写的内容会出现在界面的上半部分,接收者的信息会出现在下半部分
这有点过时,但运行良好,而且是基本系统自带的。当你只想与某人通话时,它就能胜任。
3.结论 §
OpenBSD 上有很多有趣的功能,我想重点介绍一下,也许你会发现它们很有用。如果你知道哪些很酷的功能可以添加到这个列表中,请联系我!
本文文字及图片出自 Some OpenBSD features that aren't widely known