我有一个用户需要连接到远程机器M
(通过 ssh)并在一组固定的命令中运行一个(N
总共)。
这些命令依赖于python、其库以及对网络的特权访问(哪台机器M
具有)。
是否存在默认策略来限制 Linux 用户 shell 仅执行这些N
命令,而没有任何可能性:
- 进一步访问 fs
- 读取命令本身的内容
- 获取网络特权访问权限
- 和类似的
换句话说,用户登录后向用户提示有限的控制台的默认策略是什么,例如仅允许输入1
和之间的数字N
?
答案1
在 authorized_keys 文件中有一个巧妙的技巧,您可以使用命令选项来定义登录时要运行的命令,由密钥标识,因此如果您的 N 个命令是静态的 - 您可以在服务器上定义它们,然后就可以了。它不会限制网络,只会启动命令。它在 authorized_keys 文件中看起来会像这样:
command = "date" ssh-rsa AAAA
您可以找到有关此内容的更多信息教程
为了阻止用户访问网络 - 您可以使用 SELinux 或其他类似软件,也可以编写 eBPF 钩子来允许您想要的操作。
答案2
我们假设这不是一个仅包含他们需要的微型 chroot 或容器,而是一个通用的多用户操作系统。
如果自动化程度足够高,可能就不需要登录主机了。也许可以通过一些自助系统提供这些有限的选项,而这正是自动化所做的。
为了让它们在主机上执行操作,请尝试我称之为“强制文本菜单”的东西。您可能需要编写一个脚本。
严格限制某人做其他事情需要一些技巧。
- 以非特权用户身份登录,最好是该用户独有的。使用 doas 或 sudo 等工具升级特权。
- 授权此菜单是与 OpenSSH
ForceCommand
块一起运行的。 - 还可以从 shell 配置文件中执行它。exec 因此它会替换 shell 进程,并且当菜单退出时,它们的会话也会退出。
- 在菜单脚本中捕获信号。
- 小心那些可以运行任意命令的程序。攻击很容易在 vim 中,命令是
:shell
- 编写并使用作为菜单项包装脚本,以实现更复杂的操作或对输出的更多控制。
选择脚本语言来编写菜单。考虑使用现有的文本菜单库。输入循环本身并不困难,但使其强大、易于修改且具有良好的用户体验才是您在生产中真正想要的。