如何锁定 SSH 和/或 telnet 用户以仅运行自定义 shell 而不运行其他命令或程序?

如何锁定 SSH 和/或 telnet 用户以仅运行自定义 shell 而不运行其他命令或程序?

我在 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 .

相关内容