Ssh

如何鎖定 SSH 和/或 telnet 使用者只執行自定義 shell 而沒有其他命令或程序?

  • November 26, 2020

我在堆棧溢出時問過這個問題,但我認為在 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設置並執行其他命令或直接程式。

在我看來,如果您使用chsh將使用者的外殼設置為您的程序,然後添加說

Match User name
ForceCommand .

到 sshd_config,你應該完成了。當使用者登錄時,無論他們要求執行什麼命令,他們都將被迫執行program -c ..

引用自:https://serverfault.com/questions/1043751