1つのことしかできないユーザーを作成したいと思います:sshを介して、1つの特定のフォルダーにあるスクリプト(およびスクリプトへのコマンドライン引数)を指定します(この質問の目的のために、それを/local/remote_only_scripts/foo
と呼びます)そのスクリプトを実行して、その出力を返します。
ユーザーに実行してほしくないいくつかの例を明確にするために:
/bin/login
です。 /local/remote_only_scripts/foo
フォルダー内のスクリプトではないため、ユーザーが呼び出さないでください。/bin/ls
にあります。適切なディレクトリにあるスクリプトではありません。これらはexamplesであることに注意してください。ユーザーが実行できないようにしたくないアクションは他にもたくさんあります。アクションを検討するときは、「これは/local/remote_only_scripts/foo
のスクリプトによって行われていますか?」と尋ねます。答えが「いいえ」の場合、ユーザーはそれを行うことができないはずです。答えが「はい」の場合、ユーザーはそれを実行できるはずです。
PS:「ユーザーを追加する」とはどういう意味かを明確にしましょう。 sshサブシステムにユーザーを追加するという意味ではありません。むしろ、ユーザーをコンピュータシステムに追加することを意味します。したがって、たとえば、私はdebian安定版を実行しているシステムを持っており、そのアドレスwww.hg.bar.comでそれを呼び出します。ユーザーを追加したい(kuser、users-admin、useradd、または同様の方法で)彼をhg_guestと呼びます。 hg_guestはローカルにログインできないか、上記のリストにあることを実行できません。 hg_guestで実行できるのは、スクリプトを「リモート」で実行することだけです。彼はssh経由でできるはずだと言いましたが、今考えてみると、sshの使用を許可すると、ローカルでログインできるようになる可能性があるため、他のメカニズムが必要になる場合があります。
Authorized_keysファイルにはcommandオプションがあります。このオプションは、まさにあなたが望むことをするようです。
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...
ユーザーがローカルにログインできないようにする方法はたくさんあります。あなたはどちらかをすることができます:
passwd -l
を参照してください[〜#〜] edit [〜#〜]:制限オプションを追加し、ローカルアクセスを削除する方法を明確にしました。
ユーザーのログインシェルとしてこれを試してください:
#!/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;ここのプログラムで。これにより、sftp
、scp
、ssh hostname command
などのSSHからのコマンドが防止されます。
たまたま、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