Linux 可以在没有 shell 的情况下工作吗?

Linux 可以在没有 shell 的情况下工作吗?

我所在的团队刚刚完成了用于控制机器的原型系统的构建(多个 C++ 程序,以及在 Ubuntu Server 16.04 上运行的一些 IPC、网络和设备 I/O)。一切都是由 systemd 在启动时启动和管理的,并且几乎是自我调节的,不需要用户干预。

我们现在想要尝试保护系统,防止人们试图检查、复制或窃取我们的系统(如果他们确实愿意,他们将能够访问计算机)。我们考虑的方法之一是从 Linux 中删除 shell/终端,因为它不是必需的,而且会让黑客更难操纵系统。我们大多是应用程序员,只有中等水平的 Linux 系统管理经验,因此我们有以下问题:

  1. 首先,是否确实可行。为了澄清这一点,我们希望删除任何允许用户运行命令(例如cd, cat, ls, apt-get, scp.

  2. 如果可能的话,那么这是可取的,并且它实际上会增加系统的安全性。这样做还有其他优点或缺点吗?还有其他选择吗?

  3. 怎样才能实现呢。

答案1

虽然禁用 shell 可能会限制攻击面,但限制 /usr/bin 中的读取访问会容易得多。为了限制用户的 shell 访问,将登录 shell 设置为 /sbin/nologin 是有效的。如果想法是限制您可以在终端上执行的操作,那么:

  • 将efistub 与安全启动结合使用。

Ubuntu 应该已经是这样了。

  • 在 initram 中禁用救援 shell。

这涉及提取 initram、编辑 init 脚本并删除救援函数中的 shell 调用。

  • 禁用系统上的 ttys。

因为你只是使用 systemd

systemctl disable [email protected]

您将根本无法与系统交互。您可以使用启用了安全启动的第二个系统,该系统允许远程或本地维护,否则您必须拆下硬盘并使用 chroot 在另一个系统上进行修改。

这不会阻止创建 ptty,这意味着 SSH 仍然可以工作。

答案2

嗯,从技术上讲,Linux 只是内核,它不需要任何 shell。但要做任何有用的事情,您需要在用户空间中运行一些东西。如果您设法将所需的所有内容集成到一个流程中,则可以将其替换为/sbin/init并拥有没有其他系统上的用户空间进程。

在实践中,您可能需要等效的udev其他管道,可能是 DHCP 客户端。 (可以在内核命令行上设置静态 IPv4 配置。)

使用传统的 sysvinit 风格初始化,一切都依赖于 shell 脚本( 中的脚本/etc/init.d/,链接来自/etc/rc*.d),因此使用它是正确的。但systemd 的要点之一是它不太依赖 shell,所以这可能是可行的,如果您运行的所有服务都有 systemd 单元文件(而不是init.d脚本),并且它们不使用 shell 脚本执行其他任何操作。

在一个 Ubuntu 系统(17.10)上,我至少有console-setupkeyboard-setup并且 Postfix 似乎在其单元文件中有 shell 脚本。前两个可能并不重要,因为您没有在没有 shell 的情况下登录控制台,但可能还有其他人需要它......

如果确实需要一个无 shell 系统,我可能会从头开始,或者从比 Ubuntu 这样成熟的系统更简单的东西开始。不过,移除/bin/sh并看看系统能走多远,这将是一个有趣的实验。


您提到安全是这样做的动机之一。如果没有 shell,任何依赖于启动 shell 的 shellcode 都会失败,这可能会阻止更简单的攻击者。但原则上,当攻击者可以运行任意代码时,没有什么可以阻止他们在没有 shell 的情况下手动执行他们想要的操作,或者只是在系统上加载 shell 并运行它。这只是攻击者准备使用多少时间的问题。

无 shell 系统的一个明显缺点是配置它会更困难,因为您不能只是登录来启动编辑器或重新启动服务。您需要从“救援磁盘”启动系统或完全重建系统才能进行更改。

请注意,禁用登录系统的常用方式(getty虚拟控制台、SSH 等)并不能有效阻止攻击者。他们更有可能利用您正在运行的任何服务中的错误,而不是善意地询问您的系统是否允许他们登录。

答案3

我的第一个选择是禁用屏幕上的 ttys 并禁用/限制 ssh,这样基本上就没有什么可以登录的了: https://askubuntu.com/questions/357039/how-do-i-disable-virtual-consoles-tty1-6

另一种可能性是禁用用户自己的登录: 出于安全原因禁用用户 shell

相关内容