https://12factor.net/configのdevopsガイドラインは、環境変数にWebサイトのシークレット(データベースパスワード、APIキーなど)を含めることを提案しています。テキストファイル(JSON、XML、YAML、INIなど)を使用する代わりにバージョン管理から無視される利点は何ですか?
.bash_profileおよびwebserver構成の環境変数を処理するよりも、秘密を使用して構成ファイルをコピーする方がはるかに簡単です。私は何かを見逃していますか?
https://12factor.net/configのdevopsガイドラインは、環境変数にWebサイトのシークレット(データベースパスワード、APIキーなど)を含めることを提案しています。テキストファイル(JSON、XML、YAML、INIなど)を使用する代わりにバージョン管理から無視される利点は何ですか?
.bash_profileおよびwebserver構成の環境変数を処理するよりも、秘密を使用して構成ファイルをコピーする方がはるかに簡単です。私は何かを見逃していますか?
回答:
作者は彼らの推論をリストしていますが、それは少しばらばらです。彼らの主な議論は、構成ファイルを誤ってチェックインするのは簡単であり、構成ファイルはさまざまな形式を持ち、システム全体に散在する可能性があるということです(これらの3つはすべて、認証トークンや資格情報のようなセキュリティ関連の構成のせいぜい平凡な引数です)。
私自身の経験から、基本的に次の3つのオプションがあり、関連する利点と欠点があります。
このアプローチをとる場合、理想的にはリポジトリ自体からそれらを分離し、アプリがコンテンツを保存するエリアの外にあることを確認する必要があります。
通常、これはスタートアップスクリプトから環境変数と値のリストを取得することによって行われますが、場合によっては、プログラム名の前にコマンドラインでそれらを記述することもあります。
hidepid
マウントオプション)を提供します/proc
が、デフォルトでは有効になっておらず、プロセスを所有するユーザーからの攻撃から保護しません。真剣に、これをすべてのコストで避けてください、それは安全ではありません、そして、それは維持するためにロバの痛みです。
環境変数は、Webサーバーのすべての子プロセスに継承されます。これは、サーバーに接続するすべてのセッションと、それらによって生成されるすべてのプログラムです。秘密は、これらのプロセスすべてに自動的に公開されます。
テキストファイルにシークレットを保持する場合は、サーバープロセスで読み取り可能である必要があり、すべての子プロセスでも読み取り可能である必要があります。しかし、少なくともプログラムはそれらを見つけて見つけなければなりません。自動的には提供されません。また、いくつかの子プロセスを異なるアカウントで実行し、それらのアカウントでのみシークレットを読み取り可能にすることもできます。たとえば、suEXECはApacheでこれを行います。
MYVAR=foo /path/to/some/executable
)を設定すると、プロセスとその子のみへの伝播が制限されます。子プロセスの環境。
環境変数やファイルに関しては、セキュリティ関連のトレードオフがいくつかあるとしても、セキュリティがこの推奨事項の主な推進力であるとは思いません。12factor.netの作成者は、Heroku PaaSの開発者でもありました(またはそうでしたか?)。誰もが環境変数を使用できるようにすることで、開発がかなり簡素化されたと思われます。さまざまな構成ファイルの形式と場所は非常に多様であり、それらをすべてサポートすることは困難でした。環境変数は比較すると簡単です。
行われた会話のいくつかを推測するのに、多くの想像力は必要ありません。
開発者A:「この秘密の設定ファイルUIは散らかっています!json、xml、csvを切り替えるドロップダウンが本当に必要ですか?」
開発者B:「ああ、誰もがアプリの構成に環境変数を使用しなければ、人生はとても壮大になるでしょう。」
開発者A:「実際には、セキュリティに関連するもっともらしい理由がいくつかあります。環境変数が誤ってソース管理にチェックインされることはおそらくないでしょう。」
開発者B:「デーモンを起動するスクリプト、または構成ファイルで環境変数を設定しませんか?」
開発者A:「Herokuではありません!UIに入力させます。」
開発者B:「見てください、12factor.netのドメイン名アラートが消えました。」1
1:ソース:構成。
構成ファイルの代わりに環境変数を使用する理由はいくつかありますが、見落とされる最も一般的なものの2つは、帯域外構成の有用性と、サーバー、アプリケーション、または組織の役割間の分離の強化です。考えられるすべての理由を網羅したリストを提示するのではなく、回答の中でこれら2つのトピックのみを取り上げ、それらがセキュリティに与える影響について軽く触れます。
すべてのシークレットを構成ファイルに保存する場合、それらのシークレットを各サーバーに配布する必要があります。つまり、コードと一緒にシークレットをリビジョン管理にチェックインするか、シークレット用の完全に別個のリポジトリまたは配布メカニズムを持つことを意味します。
秘密を暗号化しても、これを解決することはできません。鍵の管理と配布についても心配する必要があるため、問題を1つ削除するだけです。
要するに、環境変数は、開発を運用から分離する場合に、サーバーごとまたはアプリケーションごとのデータをソースコードから移動するためのアプローチです。これは、ソースコードを公開している場合に特に重要です。
秘密を保持するための構成ファイルを確かに持つことはできますが、秘密をソースコードに保存すると、特異性の問題が生じます。シークレットセットごとに個別のブランチまたはリポジトリがありますか?適切なシークレットのセットが適切なサーバーに到達するようにするにはどうすればよいですか?または、どこでも同じ(またはすべてを1つのファイルに収めている場合はどこでも読み取り可能)な「秘密」を持つことでセキュリティを低下させます。
サーバーごと、またはアプリケーションごとに一意のシークレットを使用する場合、環境変数を使用すると、多数のファイルを管理する必要がなくなります。新しいサーバー、アプリケーション、またはロールを追加する場合、新しいファイルを作成したり古いファイルを更新したりする必要はありません。問題のシステムの環境を更新するだけです。
カーネル/メモリ/ファイルセキュリティの徹底的な調査はこの回答の範囲外ですが、適切に実装されたシステムごとの環境変数は、「暗号化された」シークレットと同じくらい安全であることを指摘する価値があります。どちらの場合でも、ターゲットシステムは、使用するために、ある時点で復号化されたシークレットをメモリに保持する必要があります。
また、特定のノードの揮発性メモリに値が保存されている場合、オフラインでコピーおよび攻撃できるディスク上のファイルは存在しないことを指摘する価値があります。これは一般に、インメモリシークレットの利点と考えられていますが、決定的なものではありません。
環境変数と他の秘密管理手法の問題は、絶対的な問題よりもセキュリティと使いやすさのトレードオフの問題です。あなたのマイレージは異なる場合があります。
個人的には、環境変数を設定することはお勧めしません。.bashrc
これらはシェルによって開始されたすべてのプロセスから見えるようになりますが、デーモン/スーパーバイザーレベル(init / rcスクリプト、systemd config)で設定して、スコープが必要な場所に限定されるようにするためです。
別々のチームが操作を管理する場合、環境変数は、操作用の簡単なインターフェイスを提供し、構成ファイル/形式を知らずに、および/またはコンテンツのマングリングに頼ることなく、アプリケーションの環境を設定します。これは、運用チームが運用上のニーズ(展開の容易さ、スケーラビリティ、セキュリティなど)に基づいて展開システム(OS、スーパーバイザープロセス)を選択できる多言語/マルチフレームワーク設定で特に当てはまります。
別の考慮事項は、CI / CDパイプラインです-コードが異なる環境を通過するため(すなわち、dev、test / qa、ステージング、プロダクション)環境の詳細(展開ゾーン、データベース接続の詳細、資格情報、IPアドレス、ドメイン名など)は、専用の構成管理ツール/フレームワークによって最適に設定され、アプリケーションによって消費されます。環境からのプロセス(DRYで、1回書き込み、どこでも実行)。従来、開発者はこれらの運用上の懸念を管理する傾向がありましたが、コードに加えて構成ファイルまたはテンプレートをチェックインする傾向があり、運用要件が変わると回避策やその他の複雑さを追加する傾向があります(たとえば、新しい環境/展開/サイト、スケーラビリティ/セキュリティ重量を量ります、
生産のために、私は、アプリケーションでENVは-varsの設定好むEnvironmentFileなどの/etc/default/myapplication.conf
構成管理とのみによって読み取り可能セットで展開されているroot
ようなsystemd
(またはそのことについて何かが)専用の下でアプリケーションを起動することができますDeprivilegedシステムユーザでプライベートグループ。ops
およびの専用ユーザーグループでバックアップsudo
-これらのファイルは、デフォルトでは世界中で読み取り不可能です。これは、開発者/テスターが独自のEnvironmentFilesをdev / qa / test環境にドロップできるようにする一方で、Dev + Opsのすべての長所をサポートする12ファクター準拠であり、適切なセキュリティのすべての利点を備えています。