キーを許可されたコマンド (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]
でシェルを取得できます .