我编写了一个以控制台模式运行的简单应用程序。我想允许 Internet 上的人们通过 SSH 访问此主机并使用相关应用程序。
每次有人通过 SSH 连接到服务器时,我希望能够允许应用程序的一个实例在他们的 SSH 会话中运行。他们将使用该程序,然后在程序完成(即退出)后应关闭 SSH 会话。
注意事项如下:
- 我不想使用 .bash_profile 之类的 shell 脚本。这个脚本被黑客攻击的机会太多了!
- 我最好甚至不想为用户帐户分配有效的“shell”。换句话说,我希望用户 shell 类似于 /bin/false,这样 FTP、SFTP 等其他所有操作都将不被允许。我希望从帐户允许的唯一操作是访问这个特定的控制台应用程序,以该用户身份在非特权模式下运行。
- 我可能希望为不同的用户名提供多个这样的应用程序。例如,“搜索”将显示一个控制台应用程序,而“浏览”将显示另一个控制台应用程序,具体取决于用户的登录方式。
- 不需要为 SSH 会话设置密码。如果完全忽略身份验证就好了,但必须向最终用户提供 SSH 密码并不是什么大问题。这里唯一的事情当然是安全 - 我不希望允许该帐户做任何其他事情。
- 用户不必在终端上做任何特殊的事情。他们应该能够“ssh[电子邮件保护]”并获得服务。
执行的程序可能需要命令行参数。我很乐意编写包装器来执行此操作,但这会造成不安全性吗?例如,如果命令是“/usr/local/bin/myapp --mode=search”,我编写了如下脚本:
/bin/bash 复制代码
/usr/local/bin/myapp --mode=search
...这会造成不安全的情况吗?假设所有文件权限都已正确设置 - 用户无法修改文件。
这可能吗?如果可以,该如何做?更重要的是,该如何安全地做?
服务器已经提供了 SSH 供外部远程登录,这很好。显然,我仍然希望它能正常工作。例如,如果我以自己的用户身份登录,我希望像往常一样被要求输入密码,然后显示一个 shell。
谢谢!
F
答案1
有三个选项:
将应用程序(或适合它的包装器)设置为帐户的外壳。
这样,帐户就没有 shell。当用户传递命令时,它将作为命令行参数传递给带有标志的“shell”
-c
。您可以用它做任何您想做的事情。使用公钥认证并使用
command
中的选项定义每个用户可以运行什么.ssh/authorized_keys
。这允许对不同的密钥运行不同的命令,并允许撤销各个用户的权限。但是,它需要每个用户向您发送他们的公钥(私钥永远不应离开生成它们的机器,因此用户应该生成密钥并将公钥部分发送给您)。
该命令获取环境变量中通过 ssh 命令行传递的命令
SSH_ORIGINAL_COMMAND
,因此您可以根据需要使用它。在这种情况下,该帐户确实需要一个有效的 shell,因为
ssh
使用它来运行配置的命令。真的必须使用 ssh 吗?您提到它不需要经过身份验证,在这种情况下,也许直接从 ssh 启动它就
inetd
可以了。或者如果您需要终端而不仅仅是 stdin/stdout,可以使用 telnet。请注意,选项 1 也适用于 telnet。
如果您在编写包装器脚本时小心谨慎,那么它是安全的。如果它不接受任何输入,那应该没问题。如果您确实想使用输入(1. 中的命令行参数,SSH_ORIGINAL_COMMAND
2. 中的环境变量),则必须仔细清理它并正确引用它。
当然,根据您对应用程序本身的信任程度,您可能仍希望将其放在 chroot 或单独的命名空间中。
答案2
是的……使用公钥/私钥对。在 authorized_key 文件中,如果您进行研究,您会注意到您可以将私钥限制为特定密钥,甚至可以保护它不被允许仅来自特定的 IP 号码。
答案3
您需要在 sshd_config 文件中使用 ChrootDirectory。下面是一个不错的教程在流程上。