SSH authorized_keysコマンドオプション:複数のコマンド?


16

authorized_keysには、キーを単一のコマンドに制限するcommand = "..."オプションがあります。キーを複数のコマンドに制限する方法はありますか?たとえば、そこに正規表現があるか、他の構成ファイルを編集しますか?

回答:


9

いいえ。Isは「許可」コマンドではなく、「forced」コマンド(ForceCommandオプションとして)です。

唯一の可能性は、異なるコマンドに異なるキーを使用するか、からパラメータを読み取ることですstdin


25

コマンドは「強制」されるため、キーごとに1つのコマンドしか持てません。

ただし、ラッパースクリプトは使用できます。呼び出されたコマンドは、元のコマンドラインを環境変数として取得し、$SSH_ORIGINAL_COMMAND評価できます。

たとえば、これを~/.ssh/allowed-commands.sh以下に配置します。

#!/bin/sh
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.

case "$SSH_ORIGINAL_COMMAND" in
    "systemctl restart cups")
        systemctl restart cups
        ;;
    "shutdown -r now")
        shutdown -r now
        ;;
    *)
        echo "Access denied"
        exit 1
        ;;
esac

次に、それを参照~/.ssh/authorized_keysします

command="/home/user/.ssh/allowed-commands.sh",…

有用。スクリプトで使用できるようにSSH_ORIGINAL_COMMAND(per man sshd)を追加するのはsshd自体であることを明確にする価値があるかもしれません。また、特定のパターンSSH_ORIGINAL_COMMANDを実行できる自動化スクリプトの例を示します。参照してくださいunixwars.blogspot.com/2014/12/getting-sshoriginalcommand.html
セドリック・ナイト

7

偉大なSSHのThe Secure Shell:The Definitive Guide book by O'Reillyの第8章には、次のようなスクリプトを使用した良い例があります。

#!/bin/sh

/bin/echo "Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit"

/bin/echo "Your choice:"

read ans

while [ "$ans" != "q" ]
do
   case "$ans" in
      1)
         /bin/date
         ;;
      2)
         /usr/bin/who
         ;;
      3)
         /usr/bin/top
         ;;
      q)
         /bin/echo "Goodbye"
         exit 0
         ;;
      *)
         /bin/echo "Invalid choice '$ans': please try again"
         ;;
   esac
   /bin/echo "Your choice:"
   read ans
done
exit 0

.authorized_keysファイルでこれを次のように使用します。

command="/path/to/your/script.sh" <ssh-key>

...これを行うときにあなたに与えますssh

Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit
Your choice:

しかし、このような基本的にスクリプト休憩scpsftpおよび他のすべてのものは、あなたがいつか役に立つかもしれません。
-Jakuje

3
@Jakujeこれcommandは一般的なオプションでは有効ではありませんか?
gf_

1

他のアプローチでは、たとえば、特定のユーザーの制限付きシェルを使用したり、特定のディレクトリにあるすべてのファイル/スクリプトへのコマンドを制限するラッパーを使用して、ラッパーを変更せずにコマンドのリストを増やします。

別の記事では、許可されたコマンドに対するコマンドライン引数も許可しますが、正規表現として表されたルールでロックダウンすることを許可する汎用スクリプトについて説明しています。

この例は、次のように表現されます。

command="only systemctl shutdown"

そして、.onlyrules次のコンテンツでファイルが作成されます。

\:^systemctl restart cups$:{p;q}
\:^shutdown -r now$:{p;q}

この「唯一の」アプローチの利点は、ユーザーおよび状況ごとに個別のスクリプトを記述する必要がないことです。


シェルを変更する際の問題は、制限されることを意図していないキーを持つものであっても、すべてのログインに適用されることです。さらに、シェルログインのみで管理者アクセス権がない場合は、構成済みのシェルを必要なものに変更することはできません。ただし、authorized_keysファイルは引き続き編集できます。
カスペルド

「制限付きシェル」を使用できますForcedCommand
ゲオルクレーナー

使用されているアカウントが通常のユーザーアカウントであり、必要なアクションが特権である場合、sudoを使用してチェックを行い、authorized_keysコマンドオプションを「sudo $ SSH_ORIGINAL_COMMAND」に設定できますか?
スティーブディー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.