禁用 sysrq f (OOM-killer) 但保留其他 sysrq 键可操作

禁用 sysrq f (OOM-killer) 但保留其他 sysrq 键可操作

我正在遵循一个在启动时自动解密硬盘驱动器的指南,使用自生成的密钥和 tpm2 变量,接近尾声时,它使这一点似乎有意义:https://blastrock.github.io/fde-tpm-sb.html#disable-the-magic-sysrq-key

神奇的 SysRq 键允许运行一些特殊的内核操作。默认情况下,最危险的功能是禁用的,您应该保持这种状态以获得最大的安全性。

例如,其中之一 (f) 将调用 OOM-killer。此功能可能会杀死您的锁屏,从而使恶意用户能够完全访问您的桌面。

问题是我只找到了如何禁用全部sysrq 键,例如https://askubuntu.com/questions/911522/how-can-i-enable-the-magic-sysrq-key-on-ubuntu-desktop或者https://askubuntu.com/questions/11002/alt-sysrq-reisub-doesnt-reboot-my-laptop,使用/etc/sysctl.d/90-sysrq.conf以下行添加文件:

kernel.sysrq=1

我希望如果可能的话能够使用所有其他键,例如 REISUB,以防系统崩溃,并且只禁用该F键。

我还找到了这篇文章https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html,其中提到添加一个位掩码,例如:

  2 =   0x2 - enable control of console logging level
  4 =   0x4 - enable control of keyboard (SAK, unraw)
  8 =   0x8 - enable debugging dumps of processes etc.
 16 =  0x10 - enable sync command
 32 =  0x20 - enable remount read-only
 64 =  0x40 - enable signalling of processes (term, kill, oom-kill)
128 =  0x80 - allow reboot/poweroff
256 = 0x100 - allow nicing of all RT tasks

但我不明白如何仅禁用 sysrq-f,而将所有其他键设置为其默认值。

我的笔记本电脑(debian 12)上的当前设置如下:

$ grep -IirF sysrq /etc/sysctl.*
/etc/sysctl.conf:# 0=disable, 1=enable all, >1 bitmask of sysrq functions
/etc/sysctl.conf:# See https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html
/etc/sysctl.conf:#kernel.sysrq=438

$ grep -IirF sysrq /etc/sysctl.d/*
/etc/sysctl.d/99-sysctl.conf:# 0=disable, 1=enable all, >1 bitmask of sysrq functions
/etc/sysctl.d/99-sysctl.conf:# See https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html
/etc/sysctl.d/99-sysctl.conf:#kernel.sysrq=438

答案1

如果自启动以来(包括在 initramfs 中)没有任何进程写入内容/proc/sys/kernel/sysrq(可能通过命令),则默认值将按照内核编译时的配置进行。sysctl

您可以通过以下方式找到答案:

$ grep -i sysrq "/boot/config-$(uname -r)"
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x01b6
CONFIG_MAGIC_SYSRQ_SERIAL=y
CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE=""

对我来说(在 Debian 上也是如此),它是默认启用的,但使用 0x01b6,即 438 或 0b110110110 作为面具

要检查当前值:

$ cat /proc/sys/kernel/sysrq
438
$ sysctl kernel.sysrq
kernel.sysrq = 438

那是 2|4|16|32|128|256 所以:

  2 =   0x2 - enable control of console logging level
  4 =   0x4 - enable control of keyboard (SAK, unraw)
 16 =  0x10 - enable sync command
 32 =  0x20 - enable remount read-only
128 =  0x80 - allow reboot/poweroff
256 = 0x100 - allow nicing of all RT tasks

所以除了:

  8 =   0x8 - enable debugging dumps of processes etc.
 64 =  0x40 - enable signalling of processes (term, kill, oom-kill)

您可以检查位掩码的哪一位允许哪个键输入drivers/tty/sysrq.c在内核源代码中

f被允许SYSRQ_ENABLE_SIGNAL值 0x0040,即上面的 64,毫不奇怪。

该位还控制e(结束所有任务)、j(解冻所有冻结的 FS)、i(杀死所有任务)。

因此不可能启用除 之外的所有内容f。您能做的最好的e事情就是f通过将446写入.​ijcltpwzm/proc/sys/kernel/sysrq

但是,只有在调试某些与内核相关的问题时,您会失去对计算机的 shell 访问权限,或者没有非管理员能够物理访问连接到计算机的键盘或串行线,我才会偏离更安全的 438 默认值。


还请注意sysrq_always_enabled绕过所有限制的内核命令行参数。

相关内容