Google Cloud Platform

コンテナのセキュリティ(第 3 回): Grafeas で管理するコンテナ イメージのメタデータ

編集部注 : コンテナのセキュリティをテーマとする連載の第 3 回目です。

コンテナのすばらしいところは作成、変更、共有が簡単なことですが、簡単さゆえにコンテナを本番環境にデプロイしても安全なのかという疑問も湧いてきます。これに対する答えの 1 つは、誰がかかわったのか、どこに格納されたのか、既知の脆弱性が入り込んでいないかといったメタデータを追跡することで得られます。

昨年 10 月に Google とパートナー数社が発表した Grafeas というオープンソース プロジェクトは、コンテナ イメージの構造化メタデータ API を提供します。Grafeas は、パッケージの脆弱性スキャン結果などのメタデータ処理を単純化し、さまざまなタイプの情報を追跡できます。

  • “Build” メタデータは、ビルド ポリシーに従ってコンテナ イメージをビルドしたことの証明に使用できます。ビルドには、チェックインされたソース コードを持つ信頼性の高いビルダを使用します。
  • “Package Vulnerability” メタデータは、脆弱性スキャン サービスの情報を含んでおり、脆弱性を抱えたコンテナのデプロイ ポリシーを策定するのに役立ちます。
  • “Image Basis” メタデータは、コンテナの元になったベース イメージと、コンテナ イメージ構築時に使われた追加レイヤの情報を含んでいます。
  • “Package Manager” メタデータは、コンテナ イメージにどのパッケージがインストールされているかを示します。
  • “Deployment History” メタデータは、どのリソースがいつデプロイされたかを突き止めるのに使用できます。

Grafeasのメタデータを掘り下げていけば、環境内のコンテナを把握し、コンテナのデプロイに制約を設けることができます。コンテナをデプロイする前に Grafeas のメタデータをチェックし、ポリシーに適合しているかどうかをチェックすべきであり、ここでものを言うのが Grafeas メタデータの最後のタイプ、全能の “Attestation” です。Grafeas から得られたメタデータがポリシーに従っていれば、イメージがデプロイ要件を満たしていることを証明する Attestation を書き込めます。これにより、Kubernetes Admission Controller を使用して必要な Attestation の有無をチェックし、なければデプロイをブロックできます。

  occurrencesResponse := grafeas.ListOccurrencesResponse{}
 
imageUrl := "https://gcr.io/myproject/name@sha256hash"
hasFixableVulnerability := false
 
// Iterate through occurrences looking for vulnerability occurrences for this image
for _, occurrence := range occurrencesResponse.Occurrences {
  resourceUrl := occurrence.ResourceUrl
  if imageUrl != resourceUrl && occurrence.Kind != grafeas.Note_PACKAGE_VULNERABILITY {
    continue
  }
  details := occurrence.GetVulnerabilityDetails()
  issues := details.GetPackageIssue()
  // This vulnerability is fixable, we should not insert an attestation
  for _, i := range issues {
    if i.FixedLocation != nil {
      hasFixableVulnerability = true
    }   
  }
}
 
// If there are no fixable vulnerabilities, create an attestation occurrence
if !hasFixableVulnerability {
  occ := &grafeas.Occurrence{
    ResourceUrl: imageUrl,
    NoteName:    "projects/vulnerabilty-certification/notes/vuln-free",
    Details: &grafeas.Occurrence_AttestationDetails{
      AttestationDetails: &grafeas.AttestationAuthority_AttestationDetails{
        Signature: &grafeas.AttestationAuthority_AttestationDetails_PgpSignedAttestation{
          PgpSignedAttestation: &grafeas.PgpSignedAttestation{
            Signature:   "MySignature",
            ContentType: grafeas.PgpSignedAttestation_SIMPLE_SIGNING_JSON,
            KeyId:       "ThisIsMyKeyId",
          },
        },
      },
    },
  }
  req := grafeas.CreateOccurrenceRequest{Occurrence: occ}
}

実際、Grafeas を使用すれば、あらゆるタイプのセキュリティ ポリシーを強制的なものにすることができます。特定の秘密鍵で署名されたコンテナ イメージだけにデプロイを許可する方法については、Kelsey Hightower 執筆のチュートリアルを参照してください。

しかも、話はそれだけにとどまりません。たとえば、脆弱性を抱えるコンテナ イメージのデプロイをブロックしたり、デプロイされるイメージはすべてセキュリティ チームが認めたベース イメージから構築されるようにしたり、イメージがビルド パイプラインを通過することを強制したりすることもできます。可能性は無限です。

Grafeas を活用して 50 万のコンテナ イメージを管理している Shopify

コンテナ オーケストレーションのために Kubernetes に移行するといったインフラストラクチャの大きな変更は、ワークロード管理のあり方を変えるチャンスでもあります。デプロイ関連のあらゆるメタデータを格納する一元的なシステムに Grafeas を活用している Shopify は、1 日に 6,000 ものコンテナをビルドし、業務の簡素化に役立てています。

Grafeas は、次のような根本的な疑問に答えられるようにしてくれます。

  • コンテナはいつ作成されたか
  • コンテナ内でどのようなコードが実行されているか
  • コンテナは誰が作成したのか
  • 実行中のコンテナはどこに配置されているのか
  • コンテナに既知の脆弱性は存在するのか、存在する場合はコンテナを本番環境から取り除き、交換しなければならないのか

Shopify の継続的インテグレーション / デプロイ(CI/CD)パイプラインは、誰がコードをビルドしたか、いつビルドされたか、コミット ハッシュは何か、テストに合格しているかなどの情報を提供します。Shopify では、このデータを Grafeas の Build メタデータに格納し、監査において変更の追跡に使えるデジタル ペーパー トレイルとしています。

ビルド後は、既知の脆弱性がコンテナに含まれているかどうかをテストします。脆弱性のリストはいつでも変更される可能性があるので、チェックは定期的に行います。Grafeas の Package Vulnerability メタデータの情報はチェックのたびに更新されるため、イメージをいつ本番環境から外して新しいセキュアなものをデプロイするかについて、しっかりとした情報を基に判断できます。

次の段階として、Deployment History メタデータでデプロイ情報を追跡し、いつどこで誰がコンテナをデプロイしたのか、現在の状態はどうなのかについて把握できるようにするつもりです。また、その情報を用いて、環境内で実行されているものの “部品表” を作ります。

Grafeas のメタデータは、デプロイに関するあらゆる疑問に答えてくれます。また、コンテナのデプロイを制限したい場合にもメタデータを使用できます。ワークロードの作成中、Kubernetes Admission Controller は Grafeas に対してコンテナのメタデータを問い合わせ、判断を下します。既知の脆弱性というような定義済みポリシーへの違反が見つからなければ、Admission Controller はワークロードの作成を許可します。

本番環境で Grafeas を活用すると、デプロイをあらゆる角度から検証できます。それによってインフラストラクチャを保護し、クラウドで起きていることの履歴情報を残すことができるのです。

Grafeas コミュニティにご参加を!

私たちは現在、Grafeas API 仕様のベータ版策定に向けて作業を進めています。また、ほかのプロジェクトとの共同作業も行っています。たとえば、in-toto が Grafeas メタデータをベースとする認証を作成できるようにするべく、in-toto チームと共同で作業しています。

Grafeas のコミュニティはどんどん広がっており、いつでもコントリビューターを歓迎します。ぜひご参加ください。

* この投稿は米国時間 4 月 12 日、Shopify の Security Engineer である Felix Glaser と、Google Container Registry の Software Engineer である Wendy Dembowski によって投稿されたもの(投稿はこちら)の抄訳です。

- By Felix Glaser, Security Engineer, Shopify; and Wendy Dembowski, Software Engineer, Google Container Registry