1 つのことだけを実行できるユーザーを作成したいと思います。つまり、ssh 経由で特定のフォルダー (この質問では と呼ぶことにします/local/remote_only_scripts/foo
) にあるスクリプト (およびスクリプトへのコマンドライン引数) を指定し、そのスクリプトを実行して出力を返すことです。
明確にするために、ユーザーに実行させたくない操作の例をいくつか挙げます。
- アカウントにローカルにログインします。ログイン アプリケーションは です
/bin/login
。これはフォルダー内のスクリプトではない/local/remote_only_scripts/foo
ため、ユーザーが呼び出すことはできません。 - アカウントにリモートでログインします。再度ログイン (これは ssh で呼ばれるものでしょうか?) は、関連するフォルダー内のスクリプトではありません。
- ディレクトリの内容を一覧表示します。 ls は にあります
/bin/ls
。適切なディレクトリ内のスクリプトではありません。 - そのディレクトリ内のファイルを編集します。emacs、vi、gedit などのほとんどの他のエディターは、そのディレクトリ内のスクリプトではありません。
- そのディレクトリ内のファイルの内容を表示します。
- 実行権限のないディレクトリ内のファイルを実行します。
これらは例ユーザーに実行させたくないアクションは他にもたくさんあります。アクションを検討する際には、「これは のスクリプトによって実行されているか/local/remote_only_scripts/foo
?」と自問してください。答えが「いいえ」の場合、ユーザーはそれを実行できないようにする必要があります。答えが「はい」の場合、ユーザーはそれを実行できる必要があります。
PS: 「ユーザーの追加」の意味を明確にしておきましょう。ユーザーを何らかの ssh サブシステムに追加するという意味ではありません。むしろ、ユーザーをコンピュータ システムに追加するという意味です。たとえば、debian stable を実行しているシステムがあり、そのアドレスは www.hg.bar.com です。ユーザーを追加したいのですが (kuser、users-admin、useradd などを使用して)、そのユーザーを hg_guest と呼びます。hg_guest はローカルにログインすることも、上記のリストにある操作を実行することもできません。hg_guest で実行できるのは、スクリプトを「リモート」で実行することだけです。ssh 経由で実行できるはずだと言いましたが、今考えてみると、ssh の使用を許可するとローカルにログインできるようになるので、他のメカニズムが必要になるかもしれません。
答え1
あります指示authorized_keys ファイルのオプション。このオプションはまさにあなたが望むことを実行するようです。
これは chroot や制限されたシェルではないことに注意してください。ssh 経由でのみこれらのコマンドを実行できます。あなたの例では、次のようになります。
ssh somehost /local/remote_only_scripts/foo
この authorized_keys ファイルの場合:
command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key...
ユーザーがローカルにログインできないようにしたい場合は、さまざまな方法があります。次のいずれかを実行できます。
- シェルを/bin/偽(おそらく必要になるだろう/bin/真sshには有効なログインが必要なため)
- パスワードをロックするには、
passwd -l
編集: 制限オプションを追加し、ローカル アクセスを削除する方法を明確にしました。
答え2
ユーザーのログイン シェルとしてこれを試してください:
#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
if [ ! -x "$basedir/$prog" ]; then
echo "Invalid program: $prog"
else
case "$prog $args" in
*\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
echo "Invalid character in command";;
*)
eval "$prog $args"
echo;; # force a trailing newline after the program
esac
fi
done
Coren の回答のように、これをファイルに明示的に記述することもできますauthorized_keys
が、ここでは '.../foo; をプログラムに置き換えます。これにより、、、などの SSH コマンドが防止さsftp
れscp
ますssh hostname command
。
答え3
万が一、ユーザーが 1 つのスクリプトのみにアクセスする必要がある場合、これは私にとって非常に便利です。ユーザーを追加し、そのユーザーのデフォルト シェルをスクリプトのパスに変更します。ユーザーが SSH 経由で接続すると、スクリプトが実行され、セッションが閉じられます。
server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest
server1:/ # grep hg_guest /etc/passwd
hg_guest:x:2002:100::/home/hg_guest:/local/remote_only_scripts/foo/script.sh