データ侵害を防ぐには?シークレット検出を活用
2024年9月16日
0 分で読めますソフトウェア開発者にとって、アプリケーションのセキュリティを確保することは最重要課題です。その重要な取り組みの一つが、シークレットの管理とシークレット検出ツールの活用です。ここでいうシークレットとは、APIキー、データベースの認証情報、暗号化キーなど、機密性の高い情報を指します。これらに不正にアクセスされたり、漏えいしたりすると、データ侵害や深刻な事業損失など、壊滅的な結果を招く恐れがあります。
開発現場では、シークレットのハードコードがよく見られます。アクセス制御が必要な外部サービスやデータベース、その他のコンポーネントを手早く簡単に認証できるためです。たとえば、特に開発の初期段階では、APIキーやデータベースの認証情報がアプリケーションに直接ハードコードされていることは珍しくありません。
この方法は時間の節約になるように思えるかもしれませんが、シークレット検出を利用すれば簡単に回避できるさまざまなセキュリティリスクを招きます。
開発の早い段階でシークレットを検出できれば、データ侵害を防げるとしたらどうでしょうか。以下は、Snyk IntelliJ IDE拡張機能が、JavaScriptアプリケーション内でハードコードされたシークレットやその他のデータベース認証情報を検出している画面です。

開発者、DevOps担当者、セキュリティ担当者は、シークレットのライフサイクル全体を通して、適切に保護、管理、監視されるよう継続的に取り組んでいます。しかし、アプリケーションアーキテクチャが複雑化、分散化するにつれ、シークレットを安全かつ効率的に管理することは大きな課題となっています。
ソフトウェア開発におけるシークレットとは?
ソフトウェア開発における「シークレット」とは、漏えいするとシステムやデータへの不正アクセスや悪用につながる恐れのある機密情報を指します。次のような情報が含まれます。
パスワード:ユーザー認証で本人確認を行ったり、リソースへのアクセスを得たりするために使われる秘密のフレーズや文字列です。
APIキー:APIキーは、APIに対してユーザー、開発者、または呼び出し元プログラムを認証するために使われる一意の識別子です。
トークン:トークンはサーバーによって作成されるデータで、ユーザーの識別情報、トークンの有効性、発行時刻などを含む場合があります。JSON Web Token(JWT)がその代表例です。
開発者がシークレットの取り扱いでよく犯すミス
開発者はシークレットを扱う際に、さまざまなミスを犯しがちです。よくある例をいくつか紹介します。
シークレットのハードコード:開発者はシークレットをアプリケーションのソースコードに直接記述しがちです。コードベースにアクセスできる人なら誰でもシークレットを取得できる可能性があるため、これは非常に危険な行為です。
シークレットの不適切な保管:シークレットを暗号化せずに、プレーンテキストファイルや設定ファイル、データベースに保管することもよくあるミスです。
シークレットのローテーション不足:シークレットを定期的に変更、ローテーションすることは、優れたセキュリティ対策です。しかし、多くの開発者はこれを見落とし、同じシークレットを長期間使い続けています。
不適切なシークレット管理がもたらす影響
不適切なシークレット管理は広範囲に及ぶ深刻な結果を招く可能性があり、ソフトウェア開発ライフサイクルにシークレット検出の仕組みを導入する重要性を示しています。
データ侵害:不適切なシークレット管理がもたらす最も差し迫った危険な結果は、データ侵害の可能性です。漏えいしたシークレットを攻撃者が入手すれば、システムに容易に侵入し、機密データにアクセスしたり、インフラ全体を掌握したりする恐れがあります。たとえば、APIキーを使ってアプリケーションになりすましたり、データベースの認証情報を使ってデータを盗んだり改ざんしたり、証明書を使って既存の暗号化を破ったりできます。データ侵害は、大きな経済的損失や評判の低下、法的責任につながる可能性があります。
規制への不適合:データプライバシーやセキュリティに関する規制がますます厳しくなるなか、不適切なシークレット管理はコンプライアンス違反につながる恐れがあります。GDPR、CCPA、HIPAAなどの規制に違反すると、高額な罰金や法的制裁を科される可能性があります。
ビジネス競争力の低下:シークレットによって、独自のアルゴリズムやビジネスロジック、戦略的データにアクセスできる場合があります。これらが漏えいすると、競争優位性の喪失や知的財産の盗難につながる恐れがあります。
Gitリポジトリからシークレットが簡単に漏えいする例を紹介します。
2回目のコミットでシークレットを削除しても、リポジトリの履歴には残っており、アクセスできる人なら誰でも取得できます。
こうした影響を回避し、アプリケーションのセキュリティ態勢を強化するには、シークレット検出と管理のソリューションを活用することが不可欠です。Snykなどのツールを使えば、開発者がSnyk IDE extensionをインストールした際に開発の早い段階でコードベース内の漏えいしたシークレットを見つけたり、Snykのシークレット検出機能をCI/CDパイプラインに統合して検出したりできます。
シークレット検出の仕組み
シークレット検出とは、コードベース内で漏えいする可能性のあるAPIキー、パスワード、トークンなどの機密情報、つまり「シークレット」を特定するプロセスです。こうしたシークレットが漏えいしたり悪用されたりすると、不正アクセスやデータ侵害につながる恐れがあります。
シークレット検出は、悪用される前に漏えいの可能性があるシークレットを特定して警告することで、データ侵害の防止に役立ちます。たとえば、誤って公開リポジトリにコミットされたシークレットを、悪意ある攻撃者に見つかる前に検出して削除できます。シークレットを効果的に検出するには、コードベースを自動スキャンして潜在的なシークレットを探し、警告するツールを使うことが重要です。その方法の一つが、正規表現(regex)や既知のパターンを使って、シークレットの可能性がある情報を特定することです。
たとえば、次のようなパターンでAPIキーを検出できます。
これは単純な例ですが、基本的な考え方は同じです。既知のパターンを検索することで、コード内のシークレットの可能性がある情報を特定できます。実際の環境では、Snykなどのシークレット検出ツールが、はるかに高度な手法でシークレットを検出します。

CI/CDパイプラインへのシークレット検出の統合
シークレット検出のメリットを最大限に活用するには、継続的インテグレーション/継続的デリバリー(CI/CD)パイプラインに統合する必要があります。これにより、開発プロセスの最も早い段階でシークレットの可能性がある情報を検出できます。
たとえば、新しいコミットがプッシュされるたびにシークレット検出スキャンを実行するよう、CI/CDパイプラインを設定できます。シークレットが検出された場合にパイプラインを失敗させ、チームに問題を通知することも可能です。
この例では、snyk code testコマンドがパイプラインの最初のステップとしてシークレット検出スキャンを実行します。シークレットが検出されるとパイプラインは失敗し、ビルドとデプロイのステップは実行されません。
Snykでシークレット検出を実装する
データ侵害は、評判や顧客からの信頼を損ない、金銭的な制裁につながる恐れもある深刻な事態です。APIキー、トークン、パスワードなどのシークレットが漏えいすると、悪意ある攻撃者にシステムへの侵入経路を与えてしまいます。これを防ぐ効果的な方法の一つは、開発パイプラインにシークレット検出を導入することです。この章では、SnykのSASTを活用してシークレットのコミットを回避し、データ侵害を防ぐ方法を説明します。
Snykのシークレット検出機能の概要
Snykは、包括的なアプリケーションセキュリティソリューションの一環として、高精度なシークレット検出機能を提供しています。コードリポジトリをスキャンしてシークレットの可能性がある情報を見つけ、安全に通知できます。この機能は、コーディング中にリアルタイムのフィードバックや提案を提供するSnyk Code製品に組み込まれています。
Snykのシークレット検出機能は、高度なパターンとヒューリスティックを用いて、攻撃者に悪用される恐れのあるコード内のシークレットを特定します。
リアルタイムのシークレット検出に向けたSnyk IDE拡張機能の設定
Snykのシークレット検出機能を使うには、Snyk IDE拡張機能を設定する必要があります。この拡張機能はSnykの機能を開発環境に直接統合し、コーディング中にリアルタイムのフィードバックや提案を提供します。
IDE拡張機能を設定する手順:
IDE(Visual Studio Code、IntelliJなど)の拡張機能セクションを開きます
「Snyk」を検索します
Snyk拡張機能をインストールします
プラグインを起動するか、IDEを再起動します
Snyk拡張機能をインストールすると、開発中にコードを自動的にスキャンし、シークレットの可能性がある情報を検出します。
Snykでシークレットのコミットを防ぐためのベストプラクティス
Snykでシークレットを検出する際は、いくつかのベストプラクティスに従うことが重要です。
シークレットをコードリポジトリにコミットしないでください。プライベートリポジトリを使っていても、漏えいのリスクは常にあります。Snykがシークレットを検出した場合は、コードから削除し、可能であればそのシークレットを無効化してください。
シークレットの保管には環境変数を使用してください。シークレットをコードにハードコードするのではなく、環境変数を使用しましょう。シークレットを管理しやすくなり、コードリポジトリにコミットされるリスクを低減できます。
Snykでコードリポジトリを定期的にスキャンしてください。定期的なスキャンにより、シークレットの見落としを防げます。Snykで自動スキャンを設定すれば、簡単に実施できます。
シークレット管理の重要性をチームに周知してください。チーム全員が、シークレットをコミットするリスクとSnykのシークレット検出機能を使う重要性を理解する必要があります。
これらのベストプラクティスに従い、Snykを活用することで、シークレットの漏えいやデータ侵害のリスクを大幅に低減できます。セキュリティは一度きりの作業ではなく、継続的な取り組みです。Snykにこちらから登録して、セキュリティ強化への第一歩を踏み出しましょう。
Snykの学習リソースで、シークレット管理、ツール、ベストプラクティスの詳細をご覧ください。
シークレット管理の高度な戦略
アプリケーションセキュリティとソフトウェア開発において、APIキー、パスワード、証明書などのシークレット管理は重要な課題です。適切なシークレット管理は、コンプライアンスの強化やデータ侵害の防止につながります。ここでは、シークレット管理を強化するための高度な戦略を紹介します。
環境変数を活用したシークレット管理
シークレットを安全に管理する方法の一つは、環境変数を使うことです。環境変数は多くのプログラミング言語で利用でき、シークレットをコードベースから分離できます。特にオープンソースプロジェクトでは、シークレットの偶発的な漏えいを防ぐうえで重要です。
Pythonでの例を見てみましょう。
この例では、SECRET_KEYはシークレットキーを保管する環境変数です。os.environ.get()関数は環境変数の値を取得します。環境変数が見つからない場合は、Noneを返します。
シークレット管理ツールとサービスの活用
シークレット管理ツールやサービスを活用することで、シークレットのセキュリティを大幅に強化できます。HashiCorp Vaultなどのツールや、AWS Secrets Manager、Azure Key Vaultなどのクラウドサービスは、シークレットを安全に保管し、アクセスを厳格に制御するのに役立ちます。
AWS SDK for Pythonを使ってAWS Secrets Managerからシークレットを取得する例を紹介します。
この例では、my_secretはAWS Secrets Managerに保存されたシークレットの名前です。get_secret_value()関数でシークレットを取得します。
シークレットのローテーションを自動化する
シークレットのローテーションを自動化することは、シークレット管理において重要な要素です。定期的にシークレットを変更することで、攻撃者が古いシークレットを使って不正アクセスするリスクを防げます。
AWS Secrets Managerなどのシークレット管理サービスを利用すれば、自動化できます。AWS Secrets Managerは、Amazon RDS、Amazon DocumentDB、Amazon Redshiftのシークレットの自動ローテーションに対応しています。
AWS Secrets Managerでシークレットの自動ローテーションを設定する方法を、以下の例で説明します。
この例では、my_secretはローテーション対象のシークレット名、my_lambda_functionはローテーションを実行するAWS Lambda関数、 AutomaticallyAfterDaysはローテーションの間隔(日数)です。
アプリケーションのセキュリティを強化するには、Snykのようなセキュリティ製品の利用をご検討ください。Snykのシークレット検出機能は、コードベース内のシークレットを特定し、公開を防ぎます。こちらからSnykに登録できます。
ここで紹介した方法は、シークレット管理を強化する数多くの手段の一部です。これらをほかの予防的なセキュリティ対策と組み合わせることで、脅威に対するアプリケーションの防御力を大幅に高め、ソフトウェア開発とコンプライアンスへの取り組みを安全かつ効果的に進められます。
シークレットの漏えいによる過去のデータ侵害
データ侵害は、アプリケーションセキュリティとソフトウェア開発の分野で長年にわたり問題となっています。よくある原因の一つが、シークレット(認証情報)の漏えいです。不正アクセスやデータ流出につながります。このセクションでは、シークレットの漏えいが原因で発生した過去のデータ侵害を取り上げ、そこから得られた教訓とシークレット検出の重要性について説明します。
Uberのデータ侵害:認証情報の漏えいが招いた結果
2016年、Uberで大規模なデータ侵害が発生し、5,700万人の顧客とドライバーのデータが漏えいしました。原因は、開発者が使用していた非公開のGitHubリポジトリにAWS認証情報が露出していたことでした。攻撃者はその認証情報を入手してUberのAWSアカウントにアクセスし、大量の機密データをダウンロードしました。
このインシデントは、認証情報を安全に保管することの重要性と、非公開のリポジトリであっても、コードリポジトリにシークレットを保存するリスクを浮き彫りにしています。
Cloudflare:盗まれたOkta認証トークンの影響
2019年、Cloudflareは大規模なデータ侵害の被害に遭いました。Cloudflareの従業員から盗まれたOktaの認証トークンがGitHub上にあったことが原因です。攻撃者はこのトークンを使ってCloudflareの社内システムにアクセスし、顧客の機密データを漏えいさせました。
このインシデントは、認証トークンなどの秘密鍵を、たとえ安全だと考えられていてもコードリポジトリに保存することに、潜在的なリスクがあると示しています。
Codecov:ハードコードされたシークレットが大規模な侵害につながった経緯
2021年、コードカバレッジレポートを開発者向けに提供するプラットフォームCodecovで、大規模なデータ侵害が発生しました。攻撃者はDockerイメージの作成プロセスにあったバグを悪用し、ハードコードされたシークレットを露出させました。攻撃者はこれらのシークレットを使ってCodecovのBash Uploaderスクリプトを改変し、ユーザー環境から機密データを外部に送信できるようにしました。
このインシデントから得られる教訓は何でしょうか。ハードコードされたシークレットは重大なリスクとなります。こうしたリスクを軽減するには、シークレットの検出と管理にSnykのようなツールを活用するのが最善です。
Sumo Logic:得られた教訓
クラウドベースのログ管理企業Sumo Logicは2023年、AWSアカウントの侵害を伴うセキュリティ侵害を発表しました。この侵害は2023年11月3日に検出されました。認証情報が侵害され、不正アクセスが発生したものの、同社はネットワークとシステムに影響はなく、顧客データも安全に暗号化されていることを確認しました。これを受け、Sumo Logicは影響を受けたインフラを保護し、漏えいした可能性のある認証情報を更新しました。
GitHub:非公開SSH秘密鍵の漏えい事例
皮肉なことに、コードホスティングで広く利用されているGitHubでも、SSH秘密鍵の漏えいによるデータ侵害が発生しました。この鍵は誤って公開リポジトリにコミットされ、不正ユーザーがGitHubの社内システムにアクセスするために使われました。
このインシデントも、ここまでに取り上げた多くの事例と同様に、データ侵害を防ぐうえで、シークレットを適切に管理・検出することが重要だと示しています。
