私は主に学習とテストに使用するホームWebサーバーを持っています。私はDebian BullseyeでApache2を使用しています。
私が遊んだことの1つは、PHPを使用してWebサーバー上でBashスクリプトを実行することです。これらのスクリプトの中には、ユーザーセッションの終了、Apacheでの仮想サーバーの起動、停止などの操作を実行するため、sudoが必要です。
これらのスクリプトはパブリックディレクトリの外にあり、ユーザーアカウント(www-dataグループ)が所有しています。権限は所有者=rwx、グループ=x、その他=なしです。
www-dataユーザーにsudoアクセス権があります
www-data ALL=(root) NOPASSWD: /path/to/scripts.sh
Webサーバーにsudoアクセスを許可するのは悪い考えですが、より良い(より安全な?)方法を考えることができないという記事を読んだことがあります。 setuidを考えましたが、これがより安全なオプションであるかどうかはわかりません。
高い権限でスクリプトを実行する必要がある場合、安全な方法は何ですか?それとも、sudoが特定のスクリプトのみを許可するのが最善のアプローチですか?
ありがとう
答え1
Webサーバーのユーザー(この場合はwww-data)にsudoアクセスを許可すると、Webサーバー上で実行されているすべてのスクリプトが潜在的に高い権限で任意のコマンドを実行できるため、セキュリティ上のリスクが発生する可能性があります。これは、スクリプトが適切に削除され検証されていないと、システムがコマンドインジェクションやその他の攻撃にさらされる可能性があるため、特に危険です。
より安全な代替策は、特定のスクリプトに高い権限を付与するよりきめ細かいアプローチを使用することです。たとえば、Web サーバーのユーザーに sudo アクセス権を付与する代わりに、sudoer などのツールを使用して、特定のユーザーまたはグループに昇格した特権で特定のコマンドを実行する権限を付与できます。
あなたの場合、スクリプトの正確なパスを指定し、www-dataのみがsudoを使用してスクリプトを実行できるようにすることでこれを行いました。これは、スクリプトが必要なタスクを実行できるようにしながら、悪用の可能性を制限するため、優れたアプローチです。
考慮すべきもう1つのオプションは、別々のプロセスまたはサービスを使用して高い権限を必要とするタスクを実行することです。たとえば、Web サーバーからの要求を受け取り、高い権限で必要なコマンドを実行するデーモンまたはシステム・サービスを作成できます。これは、Webサーバー上の特権タスクをさらに分離し、潜在的なセキュリティリスクを制限するのに役立ちます。
全体として、すべてのユーザーまたはプロセスに高い権限を付与することがセキュリティに与える影響を慎重に検討し、きめ細かいアプローチを使用して潜在的なリスクを制限することが重要です。
私が提供できる最新のアドバイスは、WebサーバーのSelinux設定を見て、Selinuxを使用してプロセスシステムの呼び出しを制限できることです。
答え2
スクリプト/コマンドが安全に実行されるとsudo
/SUID
問題になりません。
セキュリティスクリプト/プログラムを作成する方法は、Stackexchangeレスポンスではなく本に答えています。
あなたの場合は、昇格された権限を持つすべてのコマンドに実際にroot権限が必要かどうかを検討するのが合理的かもしれません。たとえば、ユーザーのプロセスを終了するためにそのユーザーになるだけでは不十分ですroot
。
許可された(または許可されていない)ユーザーを列挙したり、sudoers
ラッパースクリプトを使用してUIDが1000以上であることを確認したりできます(ユーザーアカウントが開始されていると仮定)。
ルートプロセスの制限
ルートとして実行されるプロセスの機能を制限するために実行できるタスクはたくさんあります。最も簡単な方法は、おそらく(インスタンス化された)Systemdサービスを使用することです。または、systemd-run
これで簡単にアクセスできるからですman systemd.exec
。たとえば、非常に制限されたファイルシステムアクセスのみが必要であり、Webサーバーの再ロード/再ロードの開始をトリガーするためにネットワークアクセスは必要ありません。