Gitリポジトリでセンシティブな秘密や資格情報を保護する方法
アプリケーションのコードにアクセスするハッカーは、独自ソフトウェアにとって壊滅的な影響を与える可能性がありますが、Gitに認証情報を保存することで、彼らに高度なデータベースアクセスを与えることがあります。
アプリケーションのコードにアクセスするハッカーは、プロプライエタリソフトウェアにとって壊滅的な影響を与える可能性がありますが、Gitに資格情報を保存すると、データベースへの権限のあるアクセスを許可してしまうことがあります。たとえGitリポジトリがハッキングされる予定がなくても、潜在的な損害を最小限に抑えることは良いリスク管理です。
攻撃ベクトルとしてのソースコントロールアクセス
オープンソースソフトウェアは安全でないわけではありません。結局のところ、インターネットを運営するために使用される多くのソフトウェアは、GitHub上で公開されて開発されています。コードが公開されているということは、ハッカーが脆弱性を見つけるのが容易になるということですが、オープンソースは透明性とコミュニティによるバグ修正において素晴らしいものであることが証明されています。
しかし、これはクローズドソースソフトウェアが本質的により安全であることを意味するわけではありません。開発者がソース管理がプライベートであると仮定する際、彼らはしばしばAPIキーやデータベースの資格情報などの秘密を管理する際に最も簡単な解決策を選びます。それは、適切な秘密管理を使用するのではなく、アプリケーションにハードコーディングすることです。
ハッカーの主要な攻撃ベクターの一つは、ソースコントロールへのアクセスを得て、そこにあるべきでないAPIキーや他の秘密情報をスキャンすることです。これにより、彼らは権限を引き上げ、ネットワークの残りの部分を攻撃することができ、しばしば機密の顧客データやデータベースにアクセスすることができます。
最近、TSAの「搭乗禁止」リストがこの正確な方法で漏洩しました。安全でないJenkinsビルドサーバーが一般に公開されており、これはアクセス制御の背後にあるプライベートサブネット用に設定する際にしばしば起こる一般的なミスです。Jenkinsサーバー上で、ハッカーはビルド履歴にアクセスすることができ、その中にはコードが含まれており、アプリケーションにハードコーディングされた航空会社のAWS S3認証情報を見つけました。
ソース管理に秘密を保存しないでください
すべてのアプリケーションは、APIキーおよびデータベースの認証情報を安全に保存するための異なる方法を持っていますが、いくつかの一般的な方法があります。
最初の方法は、設定ファイルを使用することで、これは本番環境のサーバーに展開でき、アプリケーションが実行時に読み取ることができます。たとえば、ASP.NETプロジェクトはデフォルトで使用します。
appsettings.jsonソース管理に保存されている間は空のファイルです。アプリケーションを展開する管理者が本番用設定ファイルを展開する責任があります。
環境変数も使用でき、これはアプリケーションを実行する前にシステムによって設定されます。これは、作成済みのコンテナに認証情報を簡単に注入する方法として、Dockerコンテナで一般的に使用されます。例えば、PortainerはそのDockerウェブインターフェースの一部として環境変数管理を提供しています。
一般的に、古くなった資格情報はセキュリティリスクを伴うため、秘密を定期的に回転させることは良いアイデアです。秘密を回転管理できるツールの一つは、AWSのSecrets Managerで、これはAWSアプリケーションに対して秘密を簡単に供給できるストレージシステムとして機能します。
AWS以外のアプリケーションや、類似のサービスを使用するアプリケーションにおいて、Secrets ManagerにアクセスするためにはIAMキーが必要であるため、IAMキーの管理が必要になります。これは、最初に抱えていた問題そのものです。
しかし、AWSのIAMシステムは、役割と権限の個別管理を可能にします。例えば、所有している各サーバー用にユーザーを作成し、Secrets Managerでアクセスできるキーを制御することができます。また、IAMユーザーにセキュリティポリシーを強制し、定期的にローテーションを要求することもできます。
ビルドスクリプトに秘密を保存しないでください
開発者が犯すことのできる最も悪いセキュリティミスの一つは、CI/CDパイプラインで使用されるビルドスクリプトに本番デプロイメント用のキーを保存することです。
たとえば、アプリケーションをサーバーやAmazon S3のようなストレージサービスにビルド、テスト、そして最も重要なことにデプロイするために使用されるシェルスクリプトやYAMLファイルがあるかもしれません。しかし、攻撃者がこのスクリプトにアクセスできるようになると、サーバーやストレージバケットに何でもデプロイすることができるようになります。
これを回避する一般的な方法の1つは、GitHub Secretsのような秘密管理ツールを使用することです。これにより、リポジトリ内に資格情報が保存され、GitHub Actionsのビルドスクリプトで名前でアクセスできるようになります。
もしあなたのアプリケーションがGitHub Actionsを使用して自動的にデプロイされ、機能するために認証情報が必要な場合、Secretsを使用してそれらをビルドプロセスにランタイム時に注入することもできます。必要な設定ファイルを作成するか、必要な環境変数を設定することによってです。この方法で、あなたのリポジトリは公開でも構わず、デプロイ前に本番の認証情報が注入されたアプリケーションをビルドすることができます。
組織内で作成されたGitHub Secretsは複数のリポジトリ間で共有することもでき、セキュアなキーを中央で管理する簡単な方法を提供します。JenkinsやTeamCityなどの他のビルドサーバーツールも、組み込みのシークレット管理機能を備えています。



