私は PHP アプリを備えた nginx を持っています。また、このサーバーに Ansible をインストールし、プレイブックをコピーしました。やりたいことは、Web アプリを通じて Ansible プレイブックを実行することです。これを安全に行う方法を知りたいです。
Nginx はユーザー nginx で実行され、php-fpm は apache で実行され、ansible には独自のユーザーがいます。Php アプリは /var/www/html/ にあり、ansible プレイブックは /var/www/html/ansible にありますが、これらのディレクトリは誰でも読み取り可能です。
フローは次のようになります。
- ユーザーがウェブページ上でアクションを選択する
- ajaxはそれをphpに送信します
- phpはansibleコマンドを準備し、ansibleプレイブックを実行します
- Ansibleが実行される
- php は stdout と stderr をキャッチし、それを json として Web ページに送り返します。
- ajax はウェブページに stdout と stderr を表示します。
今、php スクリプトで、exec('ansible-playbook site.yml -t ...') を実行する予定です。これは、apache ユーザーとして実行されます。それとも、sudo を使用して ansible のユーザーで起動する必要がありますか? それとも、nginx、php-fpm、ansible を nobody で起動する方が良いでしょうか?
これに最適なものが何なのかは分かりません。
ご意見ありがとうございます。
答え1
Ansible の既存の Web インターフェースには次のものがあります。
- セマフォ
- タワーまたはAWX
自分で構築したい場合は、アンシブルランナーAnsible を実行するためのスクリプト/Python ライブラリ/コンテナとして。ansible-playbook は対話型の使用を目的としており、安定した API はありません。
独自のものを作成する前に、これがインフラストラクチャに対してさまざまなことを実行する権限を持つアプリケーションであることを理解してください。インストールされた Web サーバーのデフォルトのセキュリティ モデルによって制限されることはありません。
たとえば、Web サーバーを実行するユーザーとは別の、専用のユーザーとして実行されるジョブ ランナー デーモンを作成できます。この方法では、ユーザー nginx が sudo で自動的にルート権限を取得することはできず、いくつかの API を経由する必要もあります。
実行中のプレイブックを分離できる可能性も高く評価しています。AWXは実装することを選択しましたchroot スタイルのジョブ分離。
一般的に、安全で使いやすい Web アプリの開発は、1 つの回答では解決できないほど大きなトピックです。開発トピックについては、より優れた Stack Exchange サイトがあります。既存のものを調べてください。