Google Cloud の Assured OSS とは? Google 検証済 OSS パッケージを活用しソフトウェアサプライチェーンを保護する #cm_google_cloud_adcal_2024
はじめに
ラスメソッドの Google Cloud Advent Calendar 2024 の 22 日目のブログです!
Google Cloud Advent Calendar 2024 では Google Cloud が大好きな弊社エンジニアが技術ブログを持ち回りで毎日執筆中ですので、ご覧になっていただけると嬉しいです。
本日は Assured OSS について解説します。
OSS パッケージの利用におけるソフトウェアサプライチェーン保護の重要性と課題
様々なワークロードで OSS パッケージをインストールして活用するにあたり、ソフトウェアサプライチェーンのセキュリティに配慮する必要があります。
ソフトウェアサプライチェーンとは、コードの作成から、依存関係の管理、ビルド、テスト、パッケージング、配布、そして最終的なデプロイメントまでの一連の流れを指します。
コードの開発に OSS を利用するケースは一般的ですが、OSS に悪意のあるコードや脆弱性が含まれていないか十分に注意を払う必要があります。これは、ソフトウェアサプライチェーン保護における重要な課題の一つです。
解析・スキャンツールを CI/CD パイプラインに組み込んだり、SBOM(※) の活用などにより継続的にセキュリティリスクを監視するには多くの運用コストが費やされます。
※SBOM(Software Bill of Materials): ソフトウェアを構成するすべてのコンポーネント(ライブラリ、フレームワーク、モジュールなど)とそのバージョン、ライセンス情報を一覧化した「部品表」のこと。
また、開発元が良く知られるプロジェクトであったとしても、完全にセキュリティリスクがないとは言えません。以下のような事例もあります。
-
NPM にて管理される OSS のコードライブラリ「event-stream」の正規アップデートにバックドアが仕込まれる。「event-stream」 開発者が未知の開発者に開発を正式依頼し、悪意ある開発者に正規の開発プロセスの中でコードを仕込まれた。
-
NPM にて管理される 「ESLint」にアクセストークンを窃取する悪意あるコードが挿入される。メンテナがアカウントを乗っ取られ、正規の開発プロセスの中で混入。
-
有名な OSS パッケージによく似た名前の悪意あるパッケージを PyPI や npmjs などのリポジトリで提供。typo(誤植) による意図しないインストールを狙う。(タイポスクワッティング)
Assured OSS とは
ソフトウェアサプライチェーンのセキュリティ課題に対し、OSS の信頼性を高めるために Google が提供しているサービスが Assured OSS です。
Assured OSS は以下のような特徴を持ちます。
- Google がスキャンし発見した新たな脆弱性を修正した OSS パッケージを、 Google Cloud 管理のリポジトリ経由で利用できる
- 信頼できるサプライヤーから提供された OSS を利用できる
- SPDX や CycloneDX 形式(※1)で記述された SBOM でパッケージ詳細や脆弱性を検証できる
- 作成者の署名が付与され改ざんを検出可能な provenance (ソフトウェアの起源、履歴、および変更の記録)を通じて、OSS の完全性を検証できる
- 前述のプロセスにより SLSA(Supply-chain Levels for Software Artifacts) (※2) レベル3 の要件を満たす。
- 1,000 以上の Java および Python パッケージを利用できる
- 新しいパッケージが追加や削除された際の通知を Cloud Pub/Sub 経由で構成できる
- OSS の脆弱性やアップデートに関する情報の通知を受け取れる
※1.いずれも SBOM を表現するためのフォーマット
※2.ソフトウェアサプライチェーンのセキュリティを強化するためのフレームワークおよび一連のセキュリティガイドライン
もちろん、Assured OSS によって完全な安全性が保障されるわけではありませんが、Google が提供する様々なサービスで OSS を導入する際に適用されたセキュリティと経験を活用できるため、高度なセキュリティ対策を容易に導入することができます。
Assured OSS の概要は以下をご参照ください。
Assured OSS でサポートされるパッケージ
前述のとおり、1,000 以上の Java および Python パッケージがサポートされています。詳細は以下をご参照ください。
Assured OSS ティア
Assured OSS には free tier と premium tier があります。premium tier を利用するには Security Command Center Enterprise を購入する必要があります。
free tier
- PythonとJavaのオープンソースパッケージをキュレーション(検査や修正)したリポジトリ。
- Googleが管理するプロジェクトで作成されたリポジトリを参照可能。
- Artifact Registry を利用した構成は手動セットアップ。
- OSS パッケージ用のユニバーサルプロキシエンドポイントを Google Cloud 管理の Cloud Storage にて提供。OSS パッケージとそのメタデータを、Google によってビルドされたかどうかに関わらず一つのソースからダウンロード可能。
- AWS アカウントでのアクセスが可能。
premium tier
- Security Command Center Enterprise と統合。
- Python, Java に加え、JavaScriptオープンソースパッケージ(こちらはキュレーションはされていない)を提供。
- Artifact Registry を利用した構成が自動セットアップ済。
- ユーザ指定のプロジェクトで作成されたリポジトリを参照可能。
- Google が収集し署名するユニバーサルパッケージのメタデータを提供。このメタデータは、パッケージのビルド、脆弱性、パッケージの健全性に関する情報を提供します。パッケージの健全性情報は、Google がビルドしたパッケージでのみ利用可能です。
Assured OSS の利用方法
Assured OSS のパッケージは、Google Cloud が管理するリポジトリに保存されています。 以下のいずれかの方法で Assured OSS のパッケージにアクセスしダウンロードすることができます。
-
Assured OSS リポジトリのプロキシとして動作する Artifact Registry 仮想リポジトリを Google Cloud プロジェクトに設定します。ユーザは Artifact Registry 仮想リポジトリに接続してパッケージをダウンロードできます。
-
Assured OSS へのアクセス権限が付与されたサービスアカウントを使用して Assured OSS リポジトリに直接接続します。ユーザが Maven、Gradle、pip などのビルドツールを使用している場合はこの方法を使用します。
-
リポジトリ管理ツールである JFrog Artifactory または Sonatype Nexus のリモートリポジトリとして Assured OSS リポジトリに接続します。
Assured OSS を試してみる
今回は前述の 1. の方法で、Artifact Registry 仮想リポジトリを設定して Assured OSS free tier を試してみます。また、2. の方法で OSS パッケージのセキュリティメタデータをダウンロードしてみます。
ここで Artifact Registry 仮想リポジトリについて少し補足します。Artifact Registry 仮想リポジトリとは、複数のアップストリームリポジトリへのアクセスを集約する Google Cloud プロジェクト上の単一の Artifact Registry アクセスポイントです。Google Cloud 上から複数のリポジトリを参照する場合、安全性が確認できたリポジトリへのアクセスのみを許可したり、パッケージ管理ツールからの参照先リポジトリを追加したりといった運用は非常に大変です。参照すべきリポジトリのみを Artifact Registry 仮想リポジトリのアップストリームとして設定し、ワークロードからリポジトリを参照する際は Artifact Registry 仮想リポジトリのみを参照することで、セキュリティ統制と運用を大きく簡素化できます。
この Artifact Registry 仮想リポジトリ のアップストリームとして Assured OSS を指定できます。
Artifact Registry 仮想リポジトリで Assured OSS にアクセスする
作業手順は以下を参照します。
なお、Artifact Registry 仮想リポジトリについての詳細は以下をご参照ください。
1. Assured OSS の利用権限を付与するサービスアカウントを作成する
Assured OSS を利用するためには Assured OSS へのアクセス権限を持つサービスアカウントが必要となります。なお、アクセス権限はサービスアカウントへの IAM ロールのアタッチではなく、Google Cloud への利用申請によって付与されます。
利用申請に先立ち、アクセス権限を付与するサービスアカウントを事前に作成します。本検証では Cloud Shell から以下コマンドを実行し、assured-oss@<PROJECT_ID>.iam.gserviceaccount.com
というサービスアカウントを作成しました。
gcloud iam service-accounts create assured-oss
2. 利用申請
こちらの申込フォームにアクセスします。
Choose one of the actions to perform を Enable access にし、Company name, Admin name, Admin email address をそれぞれ記入します。
Choose one of the following access types は、Google Cloud service account email address にします。
Google Cloud service account email address(es) に、先ほど作成したサービスアカウントを記入します。
その他必要な項目と利用承諾にチェックをつけ、Submit をクリックします。
以下の画面が表示され、Assured OSS が利用可能となります。
After the request is submitted, you receive a confirmation email indicating the enablement success. In rare cases, the enablement process can take an hour or more.
登録したメールアドレス宛に、以下のメールも届いているかと思います。
3. Artifact Registry 仮想リポジトリを作成する
Cloud Console を利用して Assured OSS へのアクセスをプロキシするための Artifact Registry 仮想リポジトリを作成していきます。
[Artifact Registry] から [+リポジトリの作成] をクリックします。
各項目を以下のように設定します。
名前: assured-oss-virtual-repo
形式: Python
モード: 仮想
仮想アップストリーム リポジトリ:
優先度: 100
ポリシー名: AOSS Python
リポジトリ: projects/cloud-aoss/locations/us/repositories/cloud-aoss-python
ロケーションタイプ: マルチリージョン
マルチリージョン: us
最後に [作成] をクリックします。
作成されたリポジトリ名をクリックします。
上部にあるコピーマークをクリックし、仮想リポジトリの URL をコピーしておきます。のちほど、この URL にアクセスして Assured OSS から提供される Python パッケージをダウンロードします。
4. Assured OSS から Python パッケージをダウンロードする
作成した Artifact Registry 仮想リポジトリ経由で Assured OSS から Python パッケージをダウンロードしてみます。Assured OSS が提供している HTTP クライアントライブラリ OSS である urllib3
を指定します。
Cloud Shell にて以下コマンドを実行します。--index-url
に前章の手順でコピーしたリポジトリの URL を記述しますが、URL に /simple
を記述するのを忘れないようにしてください。
$ pip download --index-url <REPOSITORY URL>/simple urllib3
Looking in indexes: https://us-python.pkg.dev/<REPOSITORY URL>/assured-oss-virtual-repo/simple
Collecting urllib3
Downloading https://us-python.pkg.dev/<REPOSITORY URL>/assured-oss-virtual-repo/urllib3/urllib3-2.1.0-py3-none-any.whl (104 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 104.6/104.6 kB 9.3 MB/s eta 0:00:00
Saved ./urllib3-2.1.0-py3-none-any.whl
Successfully downloaded urllib3
Artifact Registry 仮想リポジトリ経由でパッケージがダウンロードできたことがわかります。
5. OSS のメタデータにアクセスしてみる
各 OSS バージョンにはセキュリティメタデータと呼ばれる、セキュリティ OSS に関する様々な付帯情報があります。これらの情報にアクセスし分析することで、OSS をサービスに組み込み可能であるか導入の判断とすることができます。メタデータには以下の情報があります。
- パッケージのビルドに関する情報
- パッケージの脆弱性情報
- パッケージに対して行われたテストの詳細
- パッケージのライセンス情報
取得できるメタデータについての詳細は以下をご参照ください。
これらのメタデータは Google Cloud が管理する Cloud Storage 上に保存されており、Assured OSS へのアクセス権限が付与されたサービスアカウントにてアクセスすることができます。
ここでは Python の暗号化ライブラリである cryptography
パッケージのビルドに関する情報について調べてみたいと思います。手順としては、Cloud Shell から Assured OSS へのアクセス権限が付与されたサービスアカウントの権限を借用して Assured OSS が管理するメタデータにアクセスします。なお、サービスアカウントの権限借用について詳しく知りたい方は以下ブログをご参照ください。
まずは、サービスアカウントの権限借用を構成するため、実行ユーザに サービス アカウント トークン作成者 (roles/iam.serviceAccountTokenCreator
) を付与します。
gcloud projects add-iam-policy-binding <PROJECT_ID> \
--member="user:<USER_ACCOUNT>" \
--role="roles/iam.serviceAccountTokenCreator" \
--condition=None
サービスアカウントの権限借用を行います。
gcloud config set auth/impersonate_service_account assured-oss@<PROJECT_ID>.iam.gserviceaccount.com
メタデータファイルは Google Cloud 管理の Cloud Storage 上に保存されているため、gcloud storage cp
コマンドを利用してメタデータをダウンロードします。パッケージのビルドに関する情報である buildinfo.zip
を指定します。
$ gcloud storage cp gs://cloud-aoss-metadata/python/cryptography/37.0.4/buildinfo.zip ./
$ unzip buildinfo.zip
Archive: buildinfo.zip
inflating: buildInfo.json
inflating: signature.zip
zipを解凍すると buildInfo.json
というファイルが展開されます。こちらからソースコードの情報や SBOM の情報などが確認できるかと思います。buildInfo.json
の記述に関する詳細情報はこちらをご参照ください。
脆弱性のアップデートに関する通知
Assured OSS の利用を申込する際に Vulnerability alert summary reports on a regular basis にチェックを入れると、Assured OSS が提供する OSS の脆弱性に関するアップデートが受け取れます。以下のようなメールが通知されてきました。
さいごに
ソフトウェアサプライチェーンの保護のため、OSS 導入に厳格なチェックを必要とするケースも多いと思います。Assured OSS の活用によって、OSS 導入検討のプロセスが容易にできる点が多くあることをご理解いただけたのではないでしょうか。
Google Cloud Advent Calendar 2024 の 明日 12/23 投稿は エノカワ です!