ssh
rsh
パスワードファイルからユーザーのシェルプログラムを使用してコマンドを実行することにより、伝統に従います。
これは、ssh
構成を一切含まずにこれを解決できることを意味します。
ユーザーにシェルアクセスを許可したくない場合は、そのユーザーのシェルをスクリプトに置き換えるだけです。調べると、/etc/passwd
各ユーザーにシェルコマンドインタープリターを割り当てるフィールドがあることがわかります。スクリプトは、インタラクティブログインssh user@host
とコマンドの両方のシェルとして使用されますssh user@host command arg ...
。
これが例です。foo
シェルがスクリプトであるユーザーを作成しました。スクリプトは、メッセージとmy arguments are:
それに続く引数(それぞれ別の行と山括弧内)を出力して終了します。ログの場合、引数はありません。これが何が起こるかです:
webserver:~
foo@localhost's password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.
ユーザーがコマンドを実行しようとすると、次のようになります。
webserver:~
foo@localhost's password:
my arguments are:
<-c>
<cat /etc/passwd>
私たちの「シェル」は、-c
コマンド全体を1つの引数として、それ/bin/sh
を受け取るのとまったく同じ方法でスタイル呼び出しを受け取ります。
ご覧のとおり、スクリプトをさらに開発して、-c
引数を使用して呼び出された場合を認識し、文字列を解析します(たとえば、パターンマッチングによって)。許可されている文字列は、を再帰的に呼び出すことで実際のシェルに渡すことができます/bin/bash -c <string>
。拒否の場合は、エラーメッセージを出力して終了することができます(-c
欠落している場合を含む)。
これをどのように書くか注意する必要があります。非常に具体的なことだけを許可し、それ以外はすべて許可しないポジティブマッチのみを書くことをお勧めします。
注:の場合root
でも、su
次のようにコマンドでシェルをオーバーライドすることで、このアカウントにログインできますsu -s /bin/bash foo
。(選択したシェルを置き換えます。)非ルートはこれを行うことができません。
スクリプトの例を次に示します。ユーザーを、の下のリポジトリへのアクセスにのみ使用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 )
;;
( * )
printf "command not allowed\n"
exit 1
;;
esac
gitpath=$(readlink -f "$2")
case "$gitpath" in
( /git/* )
;;
( * )
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]
。を使用してシェルを取得できます。