質問: sshを使用してlinuxでrootとして自動コマンド実行を許可する sshを使用してroot特権を持つリモートサーバーでコマンドまたはスクリプトを自動実行できる適切な設定とは何ですか?私は次のオプションを知っています(漠然と一部のオプションについてのみ)。 root( permitrootlogin )による直接ログインを許可します(およびおそらくキー認証を強制します)。 パスワードを必要としないようにsudoを構成する(_ nopasswd のsudoersフラグ)およびtty(requirettyフラグ)。 特定の秘密鍵で認証されたときに、特定のコマンド/スクリプトの実行を許可するようにsudoを構成します。 スクリプトの所有者をrootとして設定し、 setuid権限 を設定します。 しかし、最初に、これらがセキュリティに及ぼす影響が何かはわかりません。たとえば、rootログインを許可することは好ましくないことを知っています。しかし、それが時代遅れの観点ではないのかどうかはわかりません。私が理解したことから、パスワード認証は危険であるように見えます。公開鍵認証を使用すると、直接rootログインが可能になる場合があります。また、一部のオプション、特にsudoについては、必要な構成についてもわかりません。私はそれらすべてをググることはできますが、見逃してしまうセキュリティ上の考慮事項があるかもしれません。そのため、私は専門家の意見を求めています。server-side設定を求めていることに注意してください。実行はsshのようなツールではなくプログラムによってトリガーされるため、自動client認証などを探していません。背景:アクティブになる stack overflowのsshタグ は、頻繁に出てくる質問の1つです。さまざまなプログラミング言語(c#、java)を使用してrootアカウントを使用し、リモートのunix/linuxサーバーサーバーでsshを介してコマンド/スクリプト(またはsftpサーバー)を実行しようとする人々が試みるさまざまなハッキングについて、vb.net、pythonなど)およびsshライブラリ(ssh.net、jsch、paramikoなど)。人々が試みる実装は、通常suまたはsudoを使用してみます。次に、パスワードの入力を求めます。そのため、実装はパスワードをコマンド入力にフィードしようとします。 suおよびsudoは、パスワードプロンプトに ターミナルエミュレーション を必要とすることが多いため、実装にはptyが必要です。端末エミュレーションとのセッションは ansiエスケープコード 、ページネーションなどのインタラクティブ機能を使用することが多いため、これはさらに問題を引き起こします。これらすべてにより、削除または解釈さえしようとする、さらに信頼性の低いハッキングが大量に発生します。 ansiエスケープコードまたはページネーションを回避するのに十分な大きさのターミナルをシミュレートします。多くのうちいくつかの例: インタラクティブsshセッションでパスワードが不要な場合でも、jschで実行される「sudo」コマンドにはパスワードが必要です pythonでparamikoモジュールを使用してrootユーザーに切り替えるときに「端末から実行する必要があります」 pythonを使用したsshで「su -l」を使用してコマンドを実行 ユーザーを切り替える必要がある場合にjschをsftpに使用 私は通常、これらのハックの実装に関するヘルプを提供できますが、sudo/suを自動化するよりも優れた方法があるという提案も通常追加します。しかし、私は実際には「より良い方法」とされるものの詳細を提供することに自信がありません。それで、私はスーパーユーザーの観点からcanonical回答を探しています。これは、スタックオーバーフローの目的で参照および適応できます。
回答: 同様の状況での私のセットアップは/home/blesseduser/.ssh/authorized_keysです。no-port-forwarding,command="/usr/local/bin/audited-command" ssh-rsa aaaab... そのスクリプト内で、ssh_original_command変数のサニタイズ(およびいくつかの監査)を実行し、ユーザーが実行したいコマンドを抽出します。すべての許可されたコマンドは、/home/blesseduser/binへのシンボリックリンクとしてユーザー/usr/local/bin/sudo-runnerにあります。#!/bin/bash -e sudo /usr/local/bin/$(basename $0) "$@" シンボリックリンクは、sudoersファイルからスクリプトによって生成されます。コマンドが存在しない場合は、彼のbinディレクトリの内容がリストされます。ポート転送を制限しないと、悪いことが起こります。