【読書メモ】【6章】詳解 Terraform 第3版 ―Infrastructure as Codeを実現する

技術書

 

↓の本の「6章 シークレットを管理する」のメモを残します。


 

前章のメモ

 

シークレットとは?

 

機密情報のこと。

DBのパスワード、APIキー、SSHキー、AWSの認証情報など。

 

シークレット管理の基本

 

シークレット管理の大原則は

プレーンテキストのシークレットをバージョン管理システムに保存しない

 

理由は、比較的容易に閲覧でき、誰がいつ情報にアクセスしたのかを把握できないから

 

AWSの認証情報をGitHubのpublicなリポジトリにハードコードしてしまい、

その情報を悪用され、後日AWSから多額の請求がきてしまうなんて話もあります。

 

シークレットの取り扱いには十分に注意しましょう

 

シークレット管理ツールとTerraform

プロバイダの認証情報

 

例えば、AWSへデプロイするときには認証を突破する必要があります。

この認証情報をどのように管理するのがよいでしょうか??

Terraformでデプロイを実行するのが人かマシンかで分けて考えてみます

 

人がTerraformを使ってデプロイする

 

ローカルPCでterraform applyコマンドを実行する場合です。

  1. 汎用的なシークレットマネージャに保存し、環境変数に設定する
  2. aws-valut のような各プロバイダ専用のシークレットマネージャを使用する

 

マシンがTerraformを使ってデプロイする

 

マシン=GitHub ActionsやCircleCI、Jenkinsサーバなどのこと。

 

  1. CIサービスの環境変数を使用する
    • 認証情報を手動で管理する必要があり大変
  2. CIサーバとしてのEC2インスタンスのプロファイルにIAMロールを設定する。
    • 手動で認証情報を管理する必要がない
  3. OIDCを使う
    • CIサービスとクラウドプロバイダ間の信頼関係を使用するため認証情報の管理がない
    • OIDCを使用できるGitHubのリポジトリやブランチを絞れるのでセキュア

 

GitHub ActionsでOIDCを使用したAWSへのCI/CDワークフローの作り方は↓を参考にしてください!

 

リソースとデータソース

環境変数を使う

 

Terraformでsensitive=trueの変数を定義し、TF_VARから始まる環境変数を読み込むようにする方法

 

  • コストがかからない
  • 取り扱いが簡単で、他のツールとの連携も容易

 

  • 手動での管理のため設定間違いが起きやすい
  • コードの理解が難しくなる

 

暗号化されたファイルを使う

 

暗号化したシークレットをファイルに保存して、バージョン管理システムにアップする方法

 

具体的には、AWSのKMSで作った暗号鍵でシークレットを暗号化してファイルに保存します。

それをバージョン管理システムにアップし、必要に応じて複合化して使います。

 

  • 様々な暗号化に適応している
  • バージョン管理システムにアップするためある環境への反映忘れを防げる

 

  • 暗号鍵を管理する手間や使用するコストが増える
  • 手作業でバージョン管理システムにファイルをあげるのでミスが起きやすい

 

シークレットストアを使う

 

AWS Secrets ManagerやGoogle Secret Managerなどを使う方法

 

  • ブラウザから操作でき簡単。
  • ローテートや暗号化などシークレットの取り扱い標準化が簡単。
  • 誰がどのデータにアクセスしたのかという監査ログがとれる

 

  • ある環境への反映漏れが起きやすい
  • マネージドなシークレットストアはお金がかかる
  • セルフマネージドなシークレットストアは管理するための時間もかかる

 

ステートファイルとプランファイル

 

ステートファイル=terraform apply してデプロイした結果

プランファイル=terraform planの出力結果

 

これらのファイルにはシークレットが記載されてしまうため、

  1. ファイルを暗号化できるバックエンドを選ぶ
  2. バックエンドへアクセスできる人を絞る

ことが必要です

 

 

次章のメモ

 


コメント

タイトルとURLをコピーしました