一些不为人知的 OpenBSD 功能

1.简介 §

在这篇博文中,你将了解到一些 OpenBSD 有用但并不普及的功能。

它们通常有一个小众的用途,但重要的是要知道它们的存在,以防止你重新发明轮子:)

OpenBSD 官方网站

2.特性 §

下面列出的特性并不都是 OpenBSD 特有的,因为有些特性在其他 BSD 系统中也能找到。大多数知识对 Linux 用户来说并不有用。

2.1.安全级别

安全级别是一个名为 kern.securelevel 的 sysctl,它有 4 个不同的值,从 -1 级到 2 级,而且只能提高级别。默认情况下,系统会在多用户状态下进入安全级别 1(普通安装启动时的默认状态)。

然后可以升级到最后一个安全级别(2),这将启用以下额外安全功能:

  • 所有原始磁盘都是只读的,因此无法更改存储设备
  • 时间几乎被锁定,只能以小步慢走的方式修改时钟(可能每隔一段时间最多修改 1 秒钟)
  • 无法修改、刷新或更改 PF 防火墙规则

该功能主要适用于规则很少更改的专用防火墙。防止时间改变对远程日志记录非常有用,因为它可以确定事情发生的 “时间”,并确保过去的日志没有被修改。

默认的安全级别 1 已经启用了一些额外的安全功能,如 “不可变 “和 “仅限附加 “文件标志,这些被忽视的标志(可以用 chflags 应用)可以锁定文件,防止任何人修改它们。只允许添加的标记对日志非常有用,因为你不能修改日志内容,但这并不能阻止添加新内容,历史记录也不能通过这种方式修改。

OpenBSD 手册页面:securelevel

OpenBSD 手册页面: 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(默认!)下,无法删除 sappndschg 标志,需要在单用户模式下启动才能删除这些标志。

提示:使用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

OpenBSD manual pages: chflags

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 之类在运行命令前随机运行一小时的睡眠命令。

OpenBSD 手册页面:crontab

2.5.自动安装媒体 §

OpenBSD 有一个很酷的功能,就是可以轻松创建一个带有预配置答案的安装媒体。这可以通过在 bsd.rd install 内核中注入一个特定文件来实现。

semarie@创建了一个名为upobsd的简单工具,可以轻松修改bsd.rd文件以包含自动安装文件。

除了自动安装 OpenBSD 的用户、ssh 配置、要安装的设置等,还可以添加一个 site.tgz 压缩包,以及通常的设置压缩包,其中包括你想添加到系统中的文件,这可以包括一个脚本,在第一次启动时运行,以触发一些自动化!

如果你在生产环境中运行 OpenBSD,而且有很多设备需要管理,那么这些功能是必不可少的。

GitHub 项目页面: upobsd

OpenBSD 手册页面: autoinstall

2.6. apmd 守护进程钩子hooks §

Apmd 当然运行在大多数 OpenBSD 笔记本电脑和台式机上,但它有一些与命令行标志无关的功能,你可能已经错过了。

它有不同的文件名,可以包含在某些事件(如挂起、恢复、休眠等)发生时运行的脚本。

一个经典的用法是在挂起时在 X 会话中运行 xlock,这样系统在恢复时就会要求输入密码。

旧博文:从 apmd 挂起脚本运行 xlock

手册页面解释了一切,但基本上,当你将笔记本电脑连接到电源插头时,运行备份程序的工作原理是这样的:

# mkdir -p /etc/apm
# vi /etc/apm/powerup

您需要编写一个常规脚本:

#!/bin/sh

/usr/local/bin/my_backup_script

然后,使其可执行

# chmod +x /etc/apm/powerup

当系统重新接上交流电源时,守护进程 apmd 会自动运行此脚本。

该方法适用于

  • 休眠
  • 恢复
  • 挂起
  • 待机
  • 休眠
  • 开机
  • 关机

这样就很容易根据这些事件安排任务。

OpenBSD 手册页面:apmd(FILES 部分)

2.7.使用 hotplugd 实现设备事件钩子hook §

与 apmd 在事件发生时运行脚本有点类似,hotplugd 是一项服务,允许在添加/移除设备时运行脚本。

一个典型的用法是在插入系统时自动挂载 USB 记忆棒,或在打开 USB 打印机时启动杯子守护进程。

脚本会接收两个参数,分别代表设备类别和设备名称,因此可以在脚本中使用它们来了解连接的设备。手册中提供的示例是一个很好的起点。

脚本的编写其实并不简单,你需要列出一份精确的硬件列表,并说明每种硬件的运行情况,同时不要忘记跳过未知硬件。别忘了让脚本可执行,否则将无法运行。

OpenBSD 手册页面:hotplugd

2.8.Altroot §

最后,还有一个看起来很酷的功能。在日常脚本中,如果 /etc/fstab 中存在 OpenBSD 分区 /altroot/,且日常脚本环境变量为 ROOTBACKUP=1,则根分区将复制到该分区。这就允许额外的根分区与主根分区保持同步。显然,如果备用根分区在另一个硬盘上,这将更有用。复制是通过 dd 完成的。你可以查看 /etc/daily 脚本,了解具体代码。

不过,如果没有安装引导加载程序或在磁盘上创建 EFI 分区,则不清楚如何从该分区启动……

OpenBSD manual pages: hier (hier stands for file system hierarchy)

OpenBSD manual pages: daily

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

阅读余下内容
 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注


京ICP备12002735号