2017-07-31 9 views
0

SFTPとSSHの特別グループdeveloperで「通常の」ユーザーを拘留したいと考えています。SFTP + SSHの刑務所ユーザー

ユーザは(下にスクリプトを参照)、ユーザはコマンドのみの制限を実行することができ、SSH上/srv/DEVELOPMENT(SSH/SFTP)にANDをナビゲートすることができます。

なぜこれが欲しいですか?

私は少しのプロジェクトで作業します。最後の日、別の開発者は自分の経験でプロジェクトをサポートすることを望んでいませんでした。開発者は「開発者のウェブサイト」を編集して、Node.jsアプリケーションをSSH経由で起動/停止/再起動することができます。次の考えは次のとおりです。ユーザーはシェルを使用してアカウントのパスワードを変更する必要があります。

現在、私は次の手順でSSH-デーモンを設定している:

刑務所をSFTP

Match Group developer 
    X11Forwarding no 
    AllowTcpForwarding yes 
    ChrootDirectory /srv/DEVELOPMENT 
    ForceCommand internal-sftp 

ユーザーが追加された上で以下のコマンド/オプションによって:

useradd --base-dir /srv/ --home-dir /srv/ --no-user-group --shell /srv/shell.sh $USERNAME 
usermod -G developer $USERNAME 
id $USERNAME 
passwd $USERNAME 

現在のディレクトリアクセス許可

/srv    developer:root 0755 
/srv/DEVELOPMENT developer:root 0750 
/srv/DEVELOPMENT/* developer:root 0777 

SFTPと正しく動作します。 第2部は現在SSHでユーザーを拘束していますが、現在は少し難しくなっています。この手順は現時点では動作しません。とthatsは私の質問です。

chrootはinternal-sfptに限定されています。私がログインしようとすると、接続は接続のみSFTPのために許可されていることを、メッセージとともに中止されます。ここでは

ssh [email protected] 
[email protected]'s password: 
This service allows sftp connections only. 
Connection to example.com closed. 

は、私は、SSH-デーモン設定にForceCommandを削除していた>ログインは成功します。

しかし、ここでは私の問題である

私がログインしようとすると、何も実行ファイルは使用されませカント:

ssh [email protected] 
[email protected]'s password: 
Linux example.com 4.9.0-3-amd64 #1 SMP Debian 4.9.30-2+deb9u2 (2017-06-26) x86_64 
Last login: Sun Jul 30 18:00:11 2017 from **************** 
/srv/shell.sh: No such file or directory 
Connection to example.com closed. 

/srv/shell.shはサンプルのため、コマンドを制限するために、カスタムシェルスクリプトです:

#!/bin/bash 
    commands=("man" "passwd" "ls" "account", "whoami", "clear", "cd") 

    RED='\033[0;31m' 
    YELLOW='\033[0;33m' 
    MAGENTA='\033[0;35m' 
    CYAN='\033[0;36m' 
    NC='\033[0m' # No Color 
    INDENTATION=' ' 

    SYSTEM_UPTIME=`uptime --pretty` 
    SYSTEM_USERS=`who -q` 
    SYSTEM_QUOTA="None" 
    SYSTEM_RAM="None" 

    timestamp(){ 
     date +"%Y-%m-%d %H:%M:%S" 
    } 

    log(){ 
     echo -e "[$(timestamp)]\t$1\t$(whoami)\t$2" >> /var/log/developer-user/shell.log; 
    } 

    execute() { 
     # EXIT 
     if [[ "$ln" == "exit" ]] || [[ "$ln" == "q" ]] 
     then 
      exit 

     # HELP 
     elif [[ "$ln" == "help" ]] 
     then 
      echo "Type exit or q to quit." 
      echo "Commands you can use:" 
      echo " account" 
      echo " help" 
      echo " echo" 
      echo " man <ManPage>" 
      echo " passwd" 
      echo " ls" 
      echo " clear" 
      echo " cd" 

     # CD 
     elif [[ "$ln" =~ ^cd\ .*$ ]] 
     then 
      LAST=`pwd` 

      $ln 

      CURRENT=`pwd` 

      if [[ $CURRENT == "/srv" ]] 
      then 
       log CHANGE_DIR FAILED_PERMISSIONS "$ln" 
       echo -e "${RED}ERROR:${NC} Sorry, you can't change to the previous directory ${YELLOW}\"${CURRENT}\"${NC}." 
       cd $LAST 

      elif [[ ! "$CURRENT" =~ ^/srv/DEVELOPMENT ]] 
      then 
       log CHANGE_DIR FAILED_PERMISSIONS "$ln" 
       echo -e "${RED}ERROR:${NC} Sorry, you can't change to the directory ${YELLOW}\"${CURRENT}\"${NC}." 
       cd $LAST 

      elif [[ `stat -c "%G" ${CURRENT}` == "friendlounge" ]] 
      then 
       log CHANGE_DIR "$ln" 

      else 
       log CHANGE_DIR FAILED_PERMISSIONS "$ln" 
       echo -e "${RED}ERROR:${NC} You have no permissions on ${YELLOW}\"${CURRENT}\"${NC}." 
       cd $LAST 
      fi 
     # ECHO 
     elif [[ "$ln" =~ ^echo\ .*$ ]] 
     then 
      $ln 
      log COMMAND "$ln" 

     # ACCOUNT 
     elif [[ "$ln" = "account" ]] 
     then 
      echo -e "YOUR ACCOUNT:" 
      echo -e "Username: $(whoami)" 

     # OTHERS 
     else 
      ok=false 
      for cmd in "${commands[@]}" 
      do 
       if [[ "$cmd" == "$ln" ]] 
       then 
        ok=true 
       fi 
      done 
      if $ok 
      then 
       $ln 
      else 
       echo -e "${RED}ERROR:${NC} You have no permissions to execute ${YELLOW}\"${ln}\"${NC}." 
       log DENIED "$ln" 
      fi 
     fi 
    } 

    # WELCOME MESSAGE 
    echo -e "${INDENTATION}${MAGENTA}Account:${NC}${INDENTATION}$(whoami)" 
    echo -e "${INDENTATION}${MAGENTA}Date:${NC}${INDENTATION}${INDENTATION}$(timestamp)" 
    echo -e "${INDENTATION}${MAGENTA}Uptime:${NC}${INDENTATION}${INDENTATION}${SYSTEM_UPTIME}" 
    echo -e "${INDENTATION}${MAGENTA}Users:${NC}${INDENTATION}${INDENTATION}${SYSTEM_USERS}" 
    echo -e "${INDENTATION}${MAGENTA}Quota:${NC}${INDENTATION}${INDENTATION}${SYSTEM_QUOTA}" 
    echo -e "${INDENTATION}${MAGENTA}RAM:${NC}${INDENTATION}${INDENTATION}${SYSTEM_RAM}" 

    log LOGIN "[email protected]" 
    cd 
    trap "trap=\"\";log LOGOUT;exit" EXIT 

    # Optionally check for '-c custom_command' arguments passed directly to shell 
    # Then you can also use ssh [email protected] custom_command, which will execute /root/rbash.sh 
    if [[ "$1" == "-c" ]] 
    then 
     shift 
     execute "[email protected]" 
    else 
     while echo -e -n "${RED}$(whoami)${YELLOW}@${CYAN}$(hostname) ${YELLOW}$(pwd) ${MAGENTA}#${NC} " && read ln 
     do 
      execute "$ln" 
     done 
    fi 

このシェルスクリプトは、ユーザのpermissionをチェックし、強制的に0にしますディレクトリまたはサブディレクトリ。

/bin/bashなどの別のログインシェルを設定することは関係ありません。ログインごとに、エラーメッセージXXXX: No such file or directoryの後にSSHデーモンが接続を閉じます。

私は別のアクセス許可などを設定しようとしていました。私はsshを介して接続するために問題を解決することはできません。

誰でも知っていますか?

あなたは

  • に答える前にはい、私はいいえ、私は「ドン(サンプルのため、私の「自分」シェルのログインスクリプトを介してアクセス権を管理するための)可能なセキュリティ上の理由
  • を知らschrootまたはjailkitのような巨大な選択肢をインストールしたいのですが、最初の分を読んで、これらの選択肢は仮想マシン(?)のように完全に分離されたシステムを使用しています - 明示的な情報が間違っている場合に通知してください)
+0

? – spinkus

+0

重複:https://stackoverflow.com/a/32653528/2196426 – Jakuje

+0

@spinkusいいえ、私は/srv/shell.shを意味します。 –

答えて

0

あなたはこれを試すことができます、それは非常に使いやすいです。

3段階でユーザーを拘禁することができます。

    1. 追加ユーザーは、簡単な設定ファイルで刑務所を作成します。
    2. このユーザーを拘留します。

    ツールは次の場所にあります。あなたは/srv/shell.shあなたは/srv/DEVELOPMENT/srv/shell.shを意味しないと言うときhttps://github.com/pymumu/jail-shell

  • 関連する問題