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