リモートでのみスクリプトを実行できるユーザーを追加する

リモートでのみスクリプトを実行できるユーザーを追加する

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 コマンドが防止さsftpscpます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

関連情報