AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-601873

derekmc's questions

Martin Hope
derekmc
Asked: 2020-11-25 07:33:06 +0800 CST

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

  • 0

我在堆栈溢出时问过这个问题,但我认为在 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设置并运行其他命令或直接编程。

ssh web-services shell telnet
  • 1 个回答
  • 137 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve