我在 stack overflow 上问了这个问题,但我认为在 serverfault 上问这个问题可能更合适,因为它与系统管理和安全有关。
我正在寻找一个 web 服务原型,而不需要处理 HTTP 和其他 web 问题,以便用户可以登录并使用仅通过 stdin 和 stdout 交互的简单程序。
经过一番研究,我意识到这就是“shell”的作用(即,它通过 stdin 和 stdout 提供用户与系统的交互),因此我决定创建一个特定的用户并将他们的 shell 设置为我的程序,我可以轻松地原型化这种“webservice”,甚至可能允许许多用户在程序内部进行不同的身份验证,并且都使用相同的 ssh 用户。
我的问题是,将用户的 shell 设置为我的自定义程序,并且不从该程序中调用任何其他脚本或程序,是否足以限制对系统的访问,以便用户无法直接读取或写入文件?
为了解决这个问题,我编写了一个自定义“shell”,它从 stdin 读取整数 n,并输出第 n 个斐波那契数。将其设置为用户的 shell 后,似乎 sftp 和通过 ssh 运行自定义命令不起作用,但我对 ssh 或 telnet 了解不够多,无法确信用户没有其他方式来提升对系统的访问权限。
作为示例,这是我的自定义“fibonacci shell”程序:
#include <stdio.h>
long fibonacci(int n){
long a = 0;
long b = 1;
for(int i=0; i<n; ++i){
if(i%2) a += b;
else b += a;
if(a<0 || b<0) return -1;
}
return (long[]){a, b}[n%2];
}
int main(int argc, char * argv[]){
char line[1024];
int x;
printf("Welcome to the fibonacci shell.\n");
printf("Type an integer n, and I will tell you the nth fibonacci number.\n");
while(1){
printf("> ");
if(fgets(line, sizeof line, stdin) <= 0) break;
int result = sscanf(line, "%d", &x);
if(result <= 0){
printf("fibshell: Please type a number.\n"); }
else{
printf("fib(%d) = %ld\n", x, fibonacci(x)); }
}
return 0;
}
由于其他安全问题,我不会用 C 编写我的原型,但我希望对此有所了解。
我对 ssh“ForceCommand”设置进行了一些研究,但这似乎不太合适,因为它似乎使用用户配置的 shell 调用命令。
将用户的 shell 设置为不调用其他命令的简单程序是否足以限制对 sftp 等其他设施的访问?是否可以大规模安全地执行此操作,例如数百或数千个用户,最多可能有 5-10 个用户同时使用相同的 ssh 登录访问此程序?
我知道 telnet 服务并不常见,但我在几个不同的环境中见过它们。我找到了一个用于下棋的在线 telnet 服务,我工作的一家制造公司也曾短暂地在内部使用 telnet 服务来报告订单状态。“telnet 服务”或“ssh 服务”通常是如何编写的?为用户编写自定义 shell,并以其他方式限制用户的权限和系统访问,通常是如何完成的?
编辑:我应该提到我正在使用 Linux 系统,在本例中是 Manjaro(即 Arch),但我想了解 OpenSSH 和 Unix 系统的一般情况,是否有办法绕过用户的 Shell 设置并直接运行其他命令或程序。
答案1
在我看来,如果你使用chsh
将用户的 shell 设置为你的程序,那么添加说
Match User name
ForceCommand .
到 sshd_config,你应该完成了。当用户登录时,无论他们要求运行什么命令,他们都将被强制运行program -c .
。