機密情報をセキュアに扱おう !

CodeGuru Secrets Detector & Secrets Manager 連携

2022-06-01
デベロッパーのためのクラウド活用方法

Author : 金杉 有見子

ビルダーの皆様、こんにちは。ソリューションアーキテクトの金杉です。

セキュリティという単語が話題に上がった時、皆様は何を連想しますか ? 認証認可、インフラストラクチャ、ネットワーク、アプリケーション、インシデント管理、組織・・・恐らく役割や経験から着眼点は異なるものの様々なキーワードを思い浮かべるでしょう。

以前、記事「ビルダーのビルダーによるビルダーのためのセキュリティ」でも紹介させていただいた通り、私達ビルダーはビジネスの成功のために自身でセキュリティを作り上げ、更に他のビルダーのためのセキュリティも作り上げていく必要があります。

本日は、その中でもアプリケーションセキュリティにフォーカスし、Amazon CodeGuru Reviewer の新しい機能である AWS Secrets Manager 連携について紹介したいと思います。

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

この記事のデモを無料でお試しいただけます »

毎月提供されるデベロッパー向けアップデート情報とともに、クレジットコードを受け取ることができます。 


Amazon CodeGuru Reviewer とは ?

Amazon CodeGuru Reviewer は、機械学習をベースとしたコードレビューを自動化し、推奨事項を提供するアプリケーションデベロッパー向けのサービスです。

2022 年 6 月現在は Java と Python を対象言語としており、リポジトリを連携するだけでプルリクエストをトリガーにしたり、GitHub Actions から AI よるコードレビューを実施することができます。また、オンデマンドなリポジトリのフルスキャンにも対応しています。検出事項は幅広く存在しますが、特にセキュリティ系の指摘は多くのお客様からご評価頂いてます。


AWS Secrets Manager とは ?

AWS Secrets Manager はアプリケーション内で使用する認証情報や機密情報を安全に保管するためのマネージドサービスです。機密情報 (=シークレット) を Secrets Manager より API コールで取得することができるため、アプリケーション内にハードコードする必要がなくなり、漏洩のリスクを低減することができます。また、Amazon RDS や Amazon ECS などのサービスとも統合されており、200 を超える AWS サービスの中でも、まさに縁の下の力持ちと言う位置づけにあります。

以下の図では、Secrets Manager の一般的なシナリオであるデータベースの認証情報を保管する例を示しています。

  1. データベース管理者は人事のデータベースを管理しています。MyCustomApp からアクセスする必要があるため、MyCustomApp 用の認証情報をデータベース側で作成し、必要なデータへアクセスできる権限をセットします。
  2. ステップ 1 で作成された認証情報を Secrets Manager で取得できるよう、Secrets Manager でデータベースアクセス用のパスワードが含まれたシークレットを作成します (暗号化して保存することが可能です)。
  3. アプリケーションからデータベースに接続する際に、Secrets Manager に対しあらかじめ保存しておいた認証情報の値を取得します。
  4. Secrets Manager はアプリケーションに対し認証情報を返却します
  5. アプリケーションは Secrets Manager より取得した認証情報を用いてデータベースにアクセスします。

以上が Secrets Manager を利用する際の一般的な流れになります。


CodeGuru Reviewer Secrets Detector & Secrets Manager 連携

Secrets Detector とは?Secrets Manager とどのように連携するのか ?

2021 年の re:Invent で CodeGuru Reviewer Secrets Detector と Secrets Manager の連携が発表されました。パスワード、API キー、認証情報などのシークレットをアプリケーションコード内にハードコードしないというプラクティスは普段から意識されている方も多いかもしれませんが、ローカルでの動作確認で一時的にハードコードしていて、それをそのままコミットしてしまったり、環境変数に組み込んでしまったりというケースはあるあるですよね。もちろん入念にチェックをされると思いますが、自動的に検出してくれるに越したことはないですよね。

このような課題を解決するために、CodeGuru Reviewer の Secrets Detector が発表されました。Secrets Detector はその名の通り、アプリケーションコード内の機密情報を検出する機能となっており、*.java*.py のようなファイル以外にも環境ファイル (*.env) やコンフィグ (*.config, *.cfg, *.conf, *.cnf, *.cf) 含めスキャンを実施してくれます。認証情報や API キー、アクセストークンなど多くの種類のシークレット検出に対応しており、AWS、Atlassian、Datadog、Databricks、GitHub、Hubspot、Mailchimp、Salesforce、SendGrid、Shopify、Slack、Stripe、Tableau、Telegram、Twilio などの一般的な API プロバイダーをサポートしています。

更に、機密情報を検出するだけでなく、Secrets Manager を使用し機密情報を保護するための設定連携とコード例を生成してくれます。それでは早速試してみましょう。

試してみる : サンプルコードの用意

今回例として AWS のアクセスキー ID とシークレットアクセスキーを使ったサンプルを作っていきたいと思います。Python 3.8 のアプリケーション内で、boto3 を使用し、IAM ユーザーをリストアップし print するというとても簡単な例を見てみましょう。

import boto3

session = boto3.session.Session(aws_access_key_id='XXXXXXXXXXXXXXXXXXXX', aws_secret_access_key='YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY')
client = session.client('iam')
resp = client.list_users()
print("Able to access iam user list:")
print(resp)

本来ならば IAM Role を使用したいところですが、今回はあえてアクセスキー ID とシークレットアクセスキーを boto3 session に引き渡してみます。

CodeGuru Reviewer を使用するにはコードリポジトリと連携する必要があるため、上記コードを demo.py ファイルに記載し、AWS CodeCommit で用意しておいたリポジトリの master branch に push しておきます。

クリックすると拡大します

CodeGuru Reviewer と連携

コードの準備が整いました。それではこのリポジトリを CodeGuru Reviewer と連携していきましょう。

  1. AWS コンソール CodeGuru Reviewer の画面から 「リポジトリ」>「リポジトリを関連付けて分析を実行」をクリックします。
  2. ソースプロバイダーに CodeCommit を指定し、対象のリポジトリをプルダウンの中から選択します。
  3. Run a repository analysis」でソースブランチを master とします。これにより、リポジトリ連携のタイミングで一度フルスキャンしコードレビューを実行することになります。同時にコードレビュー名も指定できますが、今回はデフォルトで指定された名前で進めていきます。
  4. 一通り確認し問題なければ右下の「リポジトリを関連付けて分析を実行」をクリックします。

リポジトリの関連付けにはおよそ 30 秒、コードレビューの完了までには 5 分から 10 分ほどかかります。

クリックすると拡大します

コードレビュー結果の確認

AWS コンソール CodeGuru Reviewer 画面の「コードレビュー」より、コードレビューの進捗が確認できます。

数分経ってコードレビューが完了したら、中身を見ていきましょう。

クリックすると拡大します

推奨事項が 2 件生成されていました。どちらも 3 行目、同じコードを指しています。

3 行目は boto3 session に AWS アクセスキーID とシークレットアクセスキーを渡した部分なので、期待通りですね。同じコードに対し指摘が出ているのは異なる detector が同時に問題を検知したためだと思われます。

前者は boto3、AWS SDK 利用に対する推奨事項、後者は Secrets Detector から生成された推奨事項に見えます。

クリックすると拡大します

Secrets Manager 連携

それでは指摘事項の下にある「Protect your credentials」をクリックします。

続いて「Create a new secret」をクリックすることで Secrets Manager で新たにシークレットを作成します。

クリックすると拡大します

Secrets Manager にて、「その他のシークレットのタイプ」を選択し、access_key_idsecret_access_key をストアします。名前は分かりやすいよう codeguru-secret-manager-secret として、作成します。

クリックすると拡大します

クリックすると拡大します

シークレットの作成が完了し、中身を見てみると、サンプルコードの欄があります。Python でのサンプルを見てみると、get_secret メソッドが定義されたコードが確認できます。

Exception ハンドリング含め、Secrets Manager 利用時のプラクティスの沿ったコード例が出力されているので、便利ですね!このアセットを使用して、簡単にアプリケーションコード内で Secrets Manager を使い始めることができそうです。

なお、Secrets Manager のシークレットに対するアクセス許可、及び暗号化で使用している Amazon Key Management Service へのアクセス許可は別途 IAM で定義する必要があるのでご注意ください。


まとめ

この記事では、CodeGuru Reviewer の Secrets Detector 及び Secrets Manager 連携の全容について紹介させていただきました。ぜひシークレットの保護にお役立てください。

それでは、let’s build securely !


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

金杉 有見子 (かなすぎ ゆみこ)
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト

インターネットメディアのお客様のクラウド活用をサポートするアーキテクト。旅とゲームが好き。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する