GNU/Linux >> Linux の 問題 >  >> Linux

ログイン後に SSH ユーザーを定義済みの一連のコマンドに制限する方法は?

キーを許可されたコマンド (authorized_keys ファイル内) に制限することもできます。

つまりユーザーは ssh 経由でログインせず、コマンドのセットが制限されますが、ssh 経由でこれらのコマンドを実行することのみが許可されます (例:"ssh somehost bin/showlogfile")


あなたが探しているのは、Restricted Shell と呼ばれるものです。 Bash には、ユーザーがホーム ディレクトリにあるコマンドのみを実行できる (他のディレクトリに移動できない) モードが用意されているため、これで十分な場合があります。

このスレッドは、少し古くなっていますが、非常にわかりやすいと思います。


ssh rsh に従います コマンドを実行するために、パスワード ファイルからユーザーのシェル プログラムを使用することにより、伝統を守ります。

これは、ssh を使わずにこれを解決できることを意味します。

ユーザーがシェルにアクセスできないようにする場合は、そのユーザーのシェルをスクリプトに置き換えるだけです。 /etc/passwd を見ると 各ユーザーにシェル コマンド インタープリターを割り当てるフィールドがあることがわかります。スクリプトは、対話型ログイン ssh [email protected] の両方のシェルとして使用されます コマンド ssh [email protected] command arg ... と同様 .

ここに例があります。ユーザー foo を作成しました そのシェルはスクリプトです。スクリプトはメッセージ my arguments are: を出力します その後にその引数が続き (それぞれ別の行にあり、山括弧で囲まれています)、終了します。この場合のログには、引数はありません。何が起こるかは次のとおりです:

webserver:~# ssh [email protected]
[email protected]'s password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.

ユーザーがコマンドを実行しようとすると、次のようになります:

webserver:~# ssh [email protected] cat /etc/passwd
[email protected]'s password:
my arguments are:
<-c>
<cat /etc/passwd>

私たちの「シェル」は -c を受け取ります /bin/sh とまったく同じ方法で、コマンド全体を 1 つの引数としてスタイル呼び出しを行います。

ご覧のとおり、今できることは、スクリプトをさらに開発して、-c で呼び出された場合を認識するようにすることです。 引数を指定してから、文字列を解析します (たとえば、パターン マッチングによって)。許可されている文字列は、/bin/bash -c <string> を再帰的に呼び出すことで、実際のシェルに渡すことができます。 . reject ケースは、エラー メッセージを出力して終了することができます (-c の場合を含む)。 がありません)。

この書き方には注意が必要です。非常に具体的なものだけを許可し、それ以外はすべて許可しない、肯定的な一致のみを作成することをお勧めします。

注: root の場合 su でシェルをオーバーライドすることで、このアカウントにログインできます。 コマンド、この su -s /bin/bash foo のように . (選択した代替シェル。) 非 root はこれを実行できません。

スクリプトの例を次に示します。ユーザーが ssh のみを使用するように制限します。 git の場合 /git の下のリポジトリへのアクセス .

#!/bin/sh

if [ $# -ne 2 ] || [ "$1" != "-c" ] ; then
  printf "interactive login not permitted\n"
  exit 1
fi

set -- $2

if [ $# != 2 ] ; then
  printf "wrong number of arguments\n"
  exit 1
fi

case "$1" in
  ( git-upload-pack | git-receive-pack )
    ;; # continue execution
  ( * )
    printf "command not allowed\n"
    exit 1
    ;;
esac

# Canonicalize the path name: we don't want escape out of
# git via ../ path components.

gitpath=$(readlink -f "$2")  # GNU Coreutils specific

case "$gitpath" in
  ( /git/* )
     ;; # continue execution
  ( * )
    printf "access denied outside of /git\n"
    exit 1
    ;;
esac

if ! [ -e "$gitpath" ] ; then
   printf "that git repo doesn't exist\n"
   exit 1
fi

"$1" "$gitpath"

もちろん、これらの Git プログラム git-upload-pack を信頼しています。 と git-receive-pack ユーザーがシステムにアクセスできるようにする穴やエスケープ ハッチを設けないでください。

これは、この種の制限スキームに固有のものです。ユーザーは特定のセキュリティ ドメインでコードを実行するように認証されており、そのドメインをサブドメインに制限する制限を設けています。たとえば、ユーザーに vim の実行を許可するとします。 特定のファイルに対してコマンドを実行して編集すると、ユーザーは :!sh[Enter] でシェルを取得できます .


Linux
  1. SSHトンネリングを設定する方法

  2. LShell(制限付きシェル)を使用してユーザーのSSHアクセスを制限する方法

  3. ユーザー環境変数を設定する方法は? (永続的に、セッションではありません)?

  1. シェルがログイン/インタラクティブ/バッチであるかどうかを確認する方法は?

  2. cronシェルを変更する方法(shからBash)?

  3. Sshに接続したらシェルコマンドを続行しますか?

  1. パスワードでSSHログインを無効にする方法

  2. CentOS / RHEL :SSH ログインを時間帯で制限する方法

  3. allow および deny ディレクティブを使用してユーザー/グループを制限するように SSH を構成する方法