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


14

私は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安定版を実行しているシステムを持っており、そのアドレス、www.hg.bar.comでそれを呼び出します。ユーザーを追加したい(kuser、users-adminまたはuseraddまたは同様の方法で)彼をhg_guestと呼びます。hg_guestはローカルにログインすることも、上記のリストにあることを行うこともできません。hg_guestができることは、スクリプトを「リモートで」実行することだけです。私は彼がssh経由でそうすることができるはずだと言ったが、今考えてみると、おそらくsshの使用を許可するとローカルでログインできるようになるので、他のメカニズムが必要になるかもしれない。

回答:


12

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 / falseに設定するだけです(sshには有効なログインが必要なので、おそらく/ bin / trueが必要です)
  • パスワードをロックします passwd -l

編集:さらに制限オプションを追加し、ローカルアクセスを削除する方法を明確にします。


クライアント側のsshでそのコマンドを指定する必要はないと思います。「強制」コマンドであるため、常に実行されます;)リモートサイトのユーザーには、/ etc / passwdで定義された有効なシェルが必要です。
ジリブ

1
の横にcommand=no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptyアカウントを本当に制限するためのオプションが必要です。
ジョフェル

OK。私は真夜中に目が覚め、答えを確認することにしました。私は眠いので、答え全体を吸収するのではなく、混乱させるような質問をします。これにより、hg_questがttyからログインできなくなりますか?
HandyGandy

@HandyGandyこれは最も単純な部分です。私はそれを行う2つの方法を追加しましたが、もっとあると思います
-Coren

0

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

#!/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

またauthorized_keys、Corenの回答のように、これをファイルに明示的に含めることもできます。ただし、 '... / fooを置き換えます。こちらのプログラムで。それは次のようにSSHからコマンドを防ぐことができますsftpscpssh hostname command


ユーザーがディレクトリからコマンドを実行できるようにしたい(そしてあまり多くない)場合は、上記の「prog」を削除し、selectステートメントを使用して選択のテキストメニューを提供できます。それらのプログラムの次に、引数の読み取りを行います。また、これをテストして、スクリプトのさまざまなポイントで多数のCtrl-Cを入力するとどうなるかを確認します。そこにもトラップコマンドが必要な場合があります。
ジョー

0

偶然、彼らは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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.