近年では、ソースコードのリポジトリにGitHubやGitLabなど、オンラインのDevOpsプラットフォームを利用するケースが増加しています。ここでよくご相談をいただく内容としては、自社の重要な知的財産であるソースコードをオンラインのサービスに保管することは、セキュリティの観点にて問題がないのか?という点です。
本稿では、そのようなご相談への一つの解として、英国・国家サイバーセキュリティセンター(NCSC:National Cyber Security Centre)が公開する「安全な開発と展開のためのガイダンス」より、コードリポジトリ保護に関する10のガイダンスについて、その内容や対策の具体例について2回に分けてご紹介いたします。
『Secure development and deployment guidance』
https://www.ncsc.gov.uk/collection/developers-collection
『Protect your code repository』
https://www.ncsc.gov.uk/collection/developers-collection/principles/protect-your-code-repository
リポジトリ保護の重要性
まずソースコードの保護においては、ソースコードの保管先であるリポジトリのセキュリティが、十分に確保されていることが重要です。リポジトリが十分に保護されていない場合、ソースコードの改ざん、漏えい、消失の懸念があることはもちろんのこと、攻撃者によって不正なコードを埋め込まれることによって、第三者に被害をもたらすリスクもあります。
一方で、セキュリティとは何のために存在するものかで言えば、それはビジネス上の利点を損なわずに、安全に事業・サービスを提供するためにあります。本稿ではオンラインプラットフォームを用いたソースコード管理の利点については言及しませんが、リポジトリ保護の観点で、適切なセキュリティ対策を講じることは、懸念されるリスクをはるかに上回るメリットをもたらすものであると、当社では考えています。
英国・国家サイバーセキュリティセンター(NCSC:National Cyber Security Centre)が公開する「安全な開発と展開のためのガイダンス」では、自社およびサプライヤーの開発手法を改善・評価するための8つの原則を提示しており、その1つとして、コードリポジトリの保護について、次の10項目を示しています。なお、本項目はオンライン・オフライン(オンプレ)など、環境に依存するものではありません。
①信頼できるリポジトリを選択する
②リポジトリのエクスポージャ(露出度)を考慮する
③アクセス認証情報の保護する
④シークレットをソースコードから分離する
⑤不要なアクセス権限の取り消しを行う
⑥リスクモデルに公開される(オープンな)コードの分析を含める
⑦すべてのコード変更のレビューする
⑧悪意のあるコード変更を防止する
⑨一般に公開されているリポジトリを使用する場合は自身のIDに注意する
⑩コードを確実にバックアップする
本稿では前半として、上記1〜5の項目について紹介していきます。
①信頼できるリポジトリを選択する
基盤となるインフラを含め、リポジトリ自体がどのように管理されているかを考慮してください。これらのコンポーネントのセキュリティが損なわれていると、そこに保存するコードの信頼性を主張することが難しくなります。リポジトリがサービスプロバイダーによって管理されている場合は、NCSCのクラウドセキュリティ原則に照らして検討してください。リポジトリの上にコードの暗号署名と検証のプロセスを重ねることで、コードが改ざんされていないという信頼性を高めることができます。
リポジトリがセキュリティ侵害を受けた場合には、ソースコードの信頼性が損なわれます。そのため、リポジトリサーバのハードニング(堅牢化)はもちろんのこと、不正なコミットを防ぐ観点においては、暗号署名のないソースコードのコミットを拒否するなどの施策を用いることが有効です。
また、ハードニングに際しては、プラットフォーム診断などによるプラットフォーム脆弱性の洗い出しや、セキュリティベストプラクティスに基づいた、OS・ミドルウェアの設定強化が、その具体施策として考えられます。
②リポジトリのエクスポージャ(露出度)を考慮する
技術的には、コードリポジトリに変更を加えることができる人の権限を最小化するモデルを実施します。すべてのアクティビティが帰属すること(権限のあるアカウントによるアクティビティであること)を確認します。
具体施策としては、上記記載の通り、各アカウントに対して必要最小限の権限を付与すること、また、権限設定の見直しを定期的に実施することが考えられます。そのためには、各担当者に与えられている業務を洗い出し、それぞれに必要となる最小限の権限を定義・設定する必要があるでしょう。
③アクセス認証情報を保護する
リポジトリへのユーザーのアクセスは、多くの場合、パスワードや秘密鍵などの認証情報を使用して認証されます。これらの認証情報を紛失すると、攻撃者に不正なアクセスを許すことになります。開発環境でこれらの認証情報を使用・管理している間は、開発者がこれらの認証情報を保護するようにしてください。秘密鍵はパスワードで保護する必要があります。FIDO U2F セキュリティ・キーのようなハードウェア・トークンにバックアップすることで、悪用が難しくなります。また、アクセスキーのローテーションというオプションを検討してください。
まず認証の強化としては、ハードウェア・トークンを用いた多要素認証を用いることは、なりすまし等による不正アクセスを防止する観点において、有効な手段です。
また、オンラインプラットフォームにてリポジトリを管理しているのであれば、IPアドレスやアクティブなセッションの有無、Cookieに基づいて不明なサインインを検出する手段(リスクベース認証の一つ)も考えられます。
④シークレットをソースコードから分離する
シークレットをソースコードから論理的に分離し、インジェクションプロセスを慎重に定義することで、シークレットの漏洩を防ぐことができます。さらに信頼性を高めるために、鍵のローテーションやコードリポジトリの秘密鍵の自動スキャンなど、積極的な管理を検討してください。
ここでいうシークレットとは、主には
- 特権アカウント認証情報
- パスワード
- 証明書
- SSHキー
- APIキー
- 暗号化キー
などを指しています。
これらの情報がプレーンテキストでハードコードされている、あるいはシークレットがローテーションされずに利用されている場合、攻撃者にとって、それらの情報は、不正アクセス等のサイバー攻撃に用いる材料として有用です。
ソリューションの例として、AWSでは Secret Manager、Azureでは key vaultが提供されており、APIを呼び出してシークレットを提供することで、ハードコードを行う必要がなくなります。
⑤不要なアクセス権限の取り消しを行う
リポジトリへのアクセスは、必要がなくなったとき、あるいは情報が漏洩したときに、速やかに取り消されるべきである。チームが進化していく中で、誰がアクセスすべきか、誰がアクセスすべきでないかを常に把握することが重要です。
プロジェクトの終了、人事異動、退職等のイベントに基づいて、リポジトリへのアクセス権を適宜見直す必要があります。不要なアクセス権が残存している場合、内部不正やなりすましによる不正アクセス被害の起因となる恐れがあるため、ユーザ管理、アクセス権の管理については、人事異動等のタイミングはもちろんのこと、定期的な棚卸しを実施してください。
まとめ
今回は英国NCSCが公開している、ソースコードリポジトリ保護のためのガイドラインに基づいて、必要となるアクションについて、その一部をご紹介いたしました。
特にリポジトリ管理をオンラインプラットフォームにて行う場合、オンプレでのリポジトリ管理と比較し、なりすましによる不正アクセスのリスクが高いことからも、「3. アクセス認証情報の保護」および「5. 不要なアクセス権限の取り消し」は、基本的な対策です。
改めて対策状況の見直しや、現状評価を実施いただくことを推奨いたします。
弊社では「P-SS 情報セキュリティ評価サービス」を通じて、セキュリティ対策状況を把握し、どこに弱点があるか、攻撃を受けやすい脆弱性があるかを可視化、必要な対策の優先順位をつけることを可能にします。
⇒「P-SS 情報セキュリティ評価サービス」|PNC株式会社
https://www.pnc.jp/pss.html
ご興味がございましたら、ぜひお問い合わせください。
次回は引き続き、コードリポジトリの保護の10項目のうち、後半部分をご紹介予定です。