我在堆栈溢出时问过这个问题,但我认为在 serverfault 上可能更合适,因为它与系统管理和安全性有关。
我正在寻找一个 web 服务的原型,而不必处理 HTTP 和其他 web 问题,这样用户就可以登录并使用一个只通过 stdin 和 stdout 交互的简单程序。
经过一番研究,我意识到,这就是“shell”的作用(即它通过标准输入和标准输出提供用户与系统的交互),所以我决定创建一个特定的用户并将他们的 shell 设置为我的程序,我可以轻松地原型这种“网络服务”,甚至可能允许许多用户不同的用户在程序本身内部进行身份验证,并且都使用相同的 ssh 用户。
我的问题是,将用户的 shell 设置为我的自定义程序,而不是从该程序中调用任何其他脚本或程序,是否足以限制对系统的访问,以便用户无法直接读取或写入文件,例如例子?
为了解决这个问题,我编写了一个自定义的“shell”,它从标准输入读取整数 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 服务”通常是如何编写的?是否为用户编写自定义外壳,并以其他方式限制用户的权限和系统访问,通常是如何完成的?
编辑:我应该提到我使用的是linux系统,在这种情况下是manjaro(即arch),但我想知道openssh和unix系统的一般情况,是否有办法绕过用户的shell设置并运行其他命令或直接编程。