リポジトリの秘匿化やってみた
こんにちは。
ココペリテクノロジー事業部Platform-Gの石井太一です。
みなさんGitHubリポジトリのセキュリティ管理はいかがでしょうか?
今回はセキュリティ管理の一つである、リポジトリ秘匿化ノウハウを紹介します。
事前知識
ココペリはインフラにAWSを使用し、IaCにCloudFormationを使用しています。
今回はECSで動いているアプリケーションのコードを秘匿化することを想定してお話しします。
ECSやParameterStoreの基礎知識はある前提で話を進めていきます。
秘匿化項目検索ツールの紹介
「そもそも秘匿化すべき項目が残っているのか分からない。」「ソースコードから秘匿化すべき項目をツールを使って抽出したい!」場合は、Gitleaksを使用することをオススメします。
こちらのツールを使用してリポジトリ全体を確認しましょう。
使用方法は他でまとめられているので、こちらでは割愛します。
私の場合は、gitleaks detect -vコマンドの出力結果をgrepで抽出し、対象項目を選定してみました。
環境変数の命名規則
1.パラメータ階層の使用
「どのサービスで使用されているパラメーターか」をパラメーターを見てパッと理解できるような命名が大事です。ParameterStoreは他のサービスも使用しているため、パラメータ階層を使用して分かりやすく管理するようにしました。
また今回の要件として下記がありました
テスト環境は複数あり、各環境から参照される可能性がある
本番環境とテスト環境で同じCloudFormationのテンプレートを使用してリソースを管理する
今回は/global/PJ名/パラメーター名という命名規則で設定してみました。
パラメータ階層の使用 - AWS Systems Manager
2.環境変数名の注意
私の失敗談なのですが、環境変数名に環境名を入れることはNGです。
具体的には「テスト環境特有の環境変数」「本番環境特有の環境変数」を設定したい場合です。
環境名を含む環境変数を設定してしまうと、環境変数が増えアプリケーションの実装が複雑になったりコードの可読性が落ちるなどの弊害が生じる可能性があります。環境変数を追加することを考えるあまり、大事なアプリケーション実装のことが抜け気味にならないように気をつけましょう。
安全なリリース方法
最後に安全にリリースする上での手順を紹介します。
1.テスト環境・本番環境のParameterStoreへ値を登録する
2.テスト環境・本番環境のECSタスク定義を更新する
ECSを使用しているため、ECSのタスク定義とECSタスク実行ロールの修正が必要でした。
タスク定義については、`ValueFrom`を利用してParameterStoreから参照する形にしました。
- Name: XXXXX
ValueFrom: !Sub "YYYYYY"
タスク実行ロールについては、下記実行権限を許可するようにCloudFormationのテンプレートを更新しました
- Effect: Allow
Action:
- "ssm:DescribeParameters"
- "ssm:GetParameter"
- "ssm:GetParameterHistory"
- "ssm:GetParameters"
- "ssm:GetParametersByPath"
Resource:
- !Sub "arn:${AWS::Partition}:ssm:${AWS::Region}:${AWS::AccountId}:parameter/xxxx/yyyy"
3.ECS Debugを利用して、ParameterStoreの値を環境変数として参照できているか動作確認する
ecs execute-command`等を利用しコンテナに入り、正しく環境変数を参照できているか確認します。ログにあえて出力することも可能ですが、機密情報がログに出力されることを避けるようにしました。
phpの場合は、`printenv`を使用して登録されている環境変数を一覧取得・確認します。全ての登録値が確認できるか慎重に確認します。
4.アプリケーションソースコードを修正し、環境変数経由で値を取得できるように修正する
最後にアプリケーションソースコードの該当箇所をハードコードから環境変数経由に修正して、リリースしていきます。
5.変更箇所のアプリケーションの動作確認を行う
まとめ
今回はリポジトリ秘匿化ノウハウを紹介しました。
リポジトリのセキュリティを高く保つことは非常に大事です。開発時から秘匿化を意識して実装・レビューすることを共通意識を持って開発していきたい所です。もし秘匿化されていない項目がGitHub管理されている場合は対応するなどしてメンテナンスしていきましょう。