web-dev-qa-db-ja.com

スクリプトをリモートでしか実行できないユーザーを追加する

1つのことしかできないユーザーを作成したいと思います:sshを介して、1つの特定のフォルダーにあるスクリプト(およびスクリプトへのコマンドライン引数)を指定します(この質問の目的のために、それを/local/remote_only_scripts/fooと呼びます)そのスクリプトを実行して、その出力を返します。

ユーザーに実行してほしくないいくつかの例を明確にするために:

  • ローカルでアカウントにログインします。ログインアプリケーションは/bin/loginです。 /local/remote_only_scripts/fooフォルダー内のスクリプトではないため、ユーザーが呼び出さないでください。
  • アカウントにリモートでログインします。繰り返しますが、ログイン(sshによって呼び出されるものですか?)は、関連するフォルダー内のスクリプトではありません。
  • ディレクトリの内容を一覧表示します。 lsは/bin/lsにあります。適切なディレクトリにあるスクリプトではありません。
  • そのディレクトリ内のファイルを編集します。 emacs、vi、gedit他のほとんどのエディターは、そのディレクトリのスクリプトではありません。
  • そのディレクトリ内のファイルの内容を表示します。
  • 彼が実行する権限を持っていないそのディレクトリ内のファイルを実行します。

これらは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の使用を許可すると、ローカルでログインできるようになる可能性があるため、他のメカニズムが必要になる場合があります。

14
HandyGandy

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... 

ユーザーがローカルにログインできないようにする方法はたくさんあります。あなたはどちらかをすることができます:

  • シェルを/ bin/falseに設定するだけです(おそらく/ bin/truesshには有効なログインが必要なので)
  • パスワードをロックします。passwd -lを参照してください

[〜#〜] edit [〜#〜]:制限オプションを追加し、ローカルアクセスを削除する方法を明確にしました。

12
Coren

ユーザーのログインシェルとしてこれを試してください:

#!/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;ここのプログラムで。これにより、sftpscpssh hostname commandなどのSSHからのコマンドが防止されます。

0
Arcege

たまたま、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

0
2bc