AWS シークレットマネージャーから値を取得する方法

近年、サイバー攻撃が頻繫に発生しており、セキュリティ対策に追われている方も多いと思います。
私のプロジェクトでもセキュリティの一環として、機密情報は処理の中で直書きしないように暗号化する対応をしました。

その中で今回は、パスワードをAWSのシークレットマネージャーに登録し、バッチ処理でパスワードの値を取得するやり方をお伝えします。
※DBはPostgresql16.8 を使用しています。

手順① シークレットマネージャーの登録
  まずはAWSのシークレットマネージャーにパスワードを登録します。
  下記手順で実施することが可能です。
    (1) AWSにログイン
    (2) Secrets Manager のページを開く
    (3) 「新しいシークレットを保存」をクリック
    (4) シークレットのタイプを選択し、「その他のシークレットのタイプ」 を選択
    (5) キー/値ペアを入力(キー: test_password、値:XXXXXX ※パスワードをセット)
    (6) シークレット名を設定(シークレット名: test/db/credentials、説明:バッチ用データベースパスワード)
    (7) ローテーション設定 「自動ローテーションを無効にする」を選択
    (8) 確認して保存

手順② IAMポリシーの設定
  バッチ処理がシークレットマネージャーから値を取得できるように、IAMポリシーを設定します。
    (1) AWS Console にログイン
    (2) IAMのページを開く
      サービス検索で「IAM」と入力してください。
    (3) 左メニュー「ロール」をクリック
    (4) 検索欄に対象のロール名を入力
    (5) ロール名をクリック
    (6)「許可を追加」→「インラインポリシーを作成」をクリック
    (7) JSONタブを選択して以下を貼り付け
       {
        ”Version”: “2012-10-17″,
        ”Statement”: [
         {
          ”Effect”: “Allow”,
          ”Action”: “secretsmanager:GetSecretValue”,
          ”Resource”: “arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:test/db/credentials-*”
         }
        ]
       }
       ※Resourceには対象のシークレットのARNを指定します。
       ※末尾の「*」はバージョンサフィックスのワイルドカードです。
    (8) ポリシー名を入力
    (9)「ポリシーを作成」をクリック

手順③ バッチ処理でパスワードを取得する
  シークレットマネージャーに登録したパスワードをバッチ処理から取得する方法を説明します。
  今回はバッチスクリプト(.bat)と設定ファイル(.ini)を使った実装例をご紹介します。

  ■設定ファイル(ini)
    接続情報をiniファイルに定義します。
    パスワードは記載せず、SECRET_NAMEのみ指定します。

    ; 環境設定
    HOST=xxxx.ap-northeast-1.rds.amazonaws.com
    DB=testdb
    USERID=test
    PORT=XXXXX
    SECRET_NAME=test/db/credentials
      ※SECRET_NAMEには手順①で登録したシークレット名を指定します。

  ■バッチスクリプト(bat)
    以下の流れでパスワードを取得します。
      【処理の流れ】
        ①iniファイルを読み込む
        ②プロセスIDで一意の一時ファイルを生成
        ③AWS CLIでシークレットマネージャーからパスワードを取得して一時ファイルに出力
        ④PowerShellで一時ファイルからパスワードを抽出
        ⑤一時ファイルを削除(セキュリティ対応)
        ⑥取得したパスワードをPGPASSWORDにセット

      【コーディング例】 ※コーディング例はあくまで抜粋です
        REM iniファイル読込
        for /f “usebackq tokens=1* delims==” %%a in (“%INIFILE%”) do (
         SET %%a=%%b
        )

        REM Secrets Manager からパスワード取得
        aws secretsmanager get-secret-value ^
         –secret-id %SECRET_NAME% ^
         –query SecretString ^
         –output text > “%TEMP_FILE%”

        REM PowerShell でパスワード取得・抽出
         powershell -NoProfile -Command ^
         ”Get-Content ‘%TEMP_FILE%’ | ^
         ConvertFrom-Json | ^
         Select-Object -ExpandProperty test_password”

        REM 一時ファイル削除(重要)
        del /F /Q “%TEMP_FILE%”

      【ポイント】
      ・パスワードは一時ファイル経由で取得し、処理後すぐに削除することでセキュリティリスクを最小化しています。
      ・プロセスIDを一時ファイル名に含めることで、並列実行時のファイル競合を防いでいます。

  ■まとめ
    今回はAWSシークレットマネージャーを使って、バッチ処理からパスワードを安全に取得する方法をご紹介しました。

    【今回やったこと】
      ・シークレットマネージャーへのパスワード登録
      ・IAMポリシーの設定
      ・バッチスクリプトからのパスワード取得

    設定ファイルにパスワードを直書きする運用と比べ
      ・パスワードの一元管理ができる
      ・ソースコードや設定ファイルにパスワードが残らない
      ・アクセス権限を細かく制御できる
    といったメリットがあります。

    セキュリティ対応の参考になれば幸いです。

技術情報

前の記事

EVALについて