イメージのメタデータの提供

メタデータ プロバイダは、お客様のコンテナ イメージ用のメタデータを提供する企業です。プロバイダはお客様のイメージ用のメタデータを格納したり検索したりするために Container Analysis を使用できます。たとえば、お客様の Docker コンテナ用のセキュリティ管理を提供する企業は、Container Analysis を使用して、イメージのセキュリティ関連メタデータを格納したり取得したりできます。

このページでは、Container Analysis API を使用してお客様のイメージに対する脆弱性の詳細を提供する方法について説明します。同じ手順を実行して、Container Analysis でサポートされる任意の種類のメタデータを格納および取得できます。

はじめに

  1. プロジェクトで Container Analysis API を有効にします。既存のプロジェクトについて API を有効化することも、新しいプロジェクトを作成してから API を有効化することもできます。

    Container Analysis API を有効にする

  2. Container Analysis の概要をお読みください。

プロジェクトの脆弱性のメモとオカレンスの作成

ここでは、サードパーティ プロバイダがユーザーのプロジェクトにメモやオカレンスを作成する方法について説明します。

プロバイダとして、プロジェクト内に脆弱性の種類ごとにメモを作成し、お客様のプロジェクトにその脆弱性のオカレンスを作成します。

メモの作成

IAM 権限:

このタスクを実行するには、プロバイダのプロジェクト(メモが作成されるプロジェクト)で次の IAM 権限が必要です。

  • containeranalysis.notes.create

または、次の事前定義された IAM の役割を付与すると、必要なすべての権限が自動的に付与されます。

  • プロジェクトの Container Analysis メモの編集者の役割。

メモを作成するには:

API

  1. 脆弱性の説明と詳細が記載された note.json という名前のファイルを作成します。次のコードは、note.json ファイルの例を示しています。

    {
        "shortDescription": "A brief Description of the note",
        "longDescription": "A longer description of the note",
        "kind": "PACKAGE_VULNERABILITY",
        "vulnerabilityType": {
            "details": [
            {
                "package": "libexempi3",
                "cpeUri": "cpe:/o:debian:debian_linux:7",
                "minAffectedVersion": { "name": "2.5.7", "revision": "1"},
                "maxAffectedVersion": { "name": "2.5.9", "revision": "1"},
            },
            {
                "cpeUri": "something else"
            }
            ]
        }
    }
    
  2. 次の curl コマンドを実行して、[PROVIDER_PROJECT_ID] がプロジェクト ID であるメモを作成します。

    curl -X POST -H "Content-Type: application/json" -H \
        "Authorization: Bearer $(gcloud auth print-access-token)" \
        https://containeranalysis.googleapis.com/v1beta1/projects/[PROVIDER_PROJECT_ID]/notes?note_id=[NOTE_ID] -d @note.json
    

Java

Container Registry 用のクライアント ライブラリをインストールして使用する方法については、Container Registry のクライアント ライブラリをご覧ください。詳細については、Container Registry Java API のリファレンス ドキュメントをご覧ください。

/**
 * Creates and returns a new vulnerability Note
 * @param client The Grafeas client used to perform the API requests.
 * @param noteId A user-specified identifier for the Note.
 * @param projectId the GCP project the Note will be created under
 * @return the newly created Note object
 */
public static Note createNote(GrafeasV1Beta1Client client, String noteId, String projectId) {
  Note.Builder noteBuilder = Note.newBuilder();
  Vulnerability.Builder vulBuilder = Vulnerability.newBuilder();
  // Details about the your vulnerability can be added here
  // Example: vulBuilder.setSeverity(Severity.CRITICAL);
  noteBuilder.setVulnerability(vulBuilder);
  Note newNote = noteBuilder.build();

  final String projectName = ProjectName.format(projectId);
  return client.createNote(projectName, noteId, newNote);
}

Go

Container Registry 用のクライアント ライブラリをインストールして使用する方法については、Container Registry のクライアント ライブラリをご覧ください。詳細については、Container Registry Go API のリファレンス ドキュメントをご覧ください。

// createNote creates and returns a new vulnerability Note.
func createNote(ctx context.Context, client *containeranalysis.GrafeasV1Beta1Client, noteID, projectID string) (*grafeaspb.Note, error) {
	projectName := fmt.Sprintf("projects/%s", projectID)

	req := &grafeaspb.CreateNoteRequest{
		Parent: projectName,
		NoteId: noteID,
		Note: &grafeaspb.Note{
			Type: &grafeaspb.Note_Vulnerability{
				// The 'Vulnerability' field can be modified to contain information about your vulnerability.
				Vulnerability: &vulnerability.Vulnerability{},
			},
		},
	}

	return client.CreateNote(ctx, req)
}

メモのオカレンスの作成

IAM 権限:

このタスクを実行するには、次の IAM 権限が必要です。

  • 顧客のプロジェクトでの containeranalysis.occurrences.create
  • 自分のプロジェクトでの containeranalysis.notes.attachOccurrence

または、次の事前定義された IAM の役割を付与すると、必要なすべての権限が自動的に付与されます。

  • お客様のプロジェクトに対する Container Analysis 実行回数の編集者の役割
  • 自分のプロジェクトに対する Container Analysis メモの添付者の役割

メモのオカレンスを作成するには:

API

  1. 次の内容のファイルを occurrence.json という名前で作成します。

    {
        "resourceUrl": "<resource_url>",
        "noteName": "projects/<provider-project-id>/notes/<note_id>",
        "kind": "PACKAGE_VULNERABILITY",
        "vulnerabilityDetails": {
            "packageIssue": [{
                "affectedLocation": {
                    "cpeUri": "7",
                    "package": "a",
                    "version":  {
                        "epoch": "1"
                        "name": "namestring"
                        "revision": "r"
                    },
                },
                "fixedLocation": {
                    "cpeUri": "cpe:/o:debian:debian_linux:7",
                    "package": "a",
                    "version":  {
                        "epoch": "2"
                        "name": "namestring"
                        "revision": "1"
                    }
                }
            }]
        }
    }
    
  2. 次の curl コマンドを実行します。[CUSTOMER_PROJECT_ID] は顧客のプロジェクト ID です。

    curl -v -X POST -H "Content-Type: application/json" -H \
        "Authorization: Bearer $(gcloud auth print-access-token)" \
        https://containeranalysis.googleapis.com/v1beta1/projects/[CUSTOMER_PROJECT_ID]/occurrences -d @occurrence.json
    

Java

Container Registry 用のクライアント ライブラリをインストールして使用する方法については、Container Registry のクライアント ライブラリをご覧ください。詳細については、Container Registry Java API のリファレンス ドキュメントをご覧ください。

/**
 * Creates and returns a new Occurrence of a previously created vulnerability Note
 * @param client The Grafeas client used to perform the API requests.
 * @param imageUrl the Container Registry URL associated with the image
 *                 example: "https://gcr.io/project/image@sha256:foo"
 * @param noteId the identifier of the Note associated with this Occurrence
 * @param occProjectId the GCP project the Occurrence will be created under
 * @param noteProjectId the GCP project the associated Note belongs to
 * @return the newly created Occurrence object
 */
public static Occurrence createOccurrence(GrafeasV1Beta1Client client, String imageUrl,
    String noteId, String occProjectId, String noteProjectId) {
  final NoteName noteName = NoteName.of(noteProjectId, noteId);
  final String occProjectName = ProjectName.format(occProjectId);

  Occurrence.Builder occBuilder = Occurrence.newBuilder();
  occBuilder.setNoteName(noteName.toString());
  Details.Builder detailsBuilder = Details.newBuilder();
  // Details about the vulnerability instance can be added here
  occBuilder.setVulnerability(detailsBuilder);
  // Attach the occurrence to the associated image uri
  Resource.Builder resourceBuilder = Resource.newBuilder();
  resourceBuilder.setUri(imageUrl);
  occBuilder.setResource(resourceBuilder);
  Occurrence newOcc = occBuilder.build();
  return client.createOccurrence(occProjectName, newOcc);
}

Go

Container Registry 用のクライアント ライブラリをインストールして使用する方法については、Container Registry のクライアント ライブラリをご覧ください。詳細については、Container Registry Go API のリファレンス ドキュメントをご覧ください。

// createsOccurrence creates and returns a new Occurrence of a previously created vulnerability Note.
func createOccurrence(ctx context.Context, client *containeranalysis.GrafeasV1Beta1Client, imageURL, noteID, occProjectID, noteProjectID string) (*grafeaspb.Occurrence, error) {
	req := &grafeaspb.CreateOccurrenceRequest{
		Parent: fmt.Sprintf("projects/%s", occProjectID),
		Occurrence: &grafeaspb.Occurrence{
			NoteName: fmt.Sprintf("projects/%s/notes/%s", noteProjectID, noteID),
			// Attach the occurrence to the associated image uri.
			Resource: &grafeaspb.Resource{
				Uri: imageURL,
			},
			// Details about the vulnerability instance can be added here.
			Details: &grafeaspb.Occurrence_Vulnerability{
				Vulnerability: &vulnerability.Details{},
			},
		},
	}
	return client.CreateOccurrence(ctx, req)
}

特定のメモのすべてのオカレンスを取得する

notes.occurrences.list() を使用して、お客様のプロジェクト全体での特定の脆弱性のすべてのオカレンスを表示できます。

IAM 権限:

このタスクを実行するには、次の IAM 権限が必要です。

  • 自分のプロジェクトでの containeranalysis.notes.listOccurrences

または、次の事前定義された IAM の役割を付与すると、必要なすべての権限が自動的に付与されます。

  • プロジェクトでの Container Analysis 実行回数の閲覧者の役割

メモのすべてのオカレンスを取得するには:

API

メモのすべてのオカレンスを一覧表示するには、次のように GET リクエストを送信します。

GET https://containeranalysis.googleapis.com/v1beta1/projects/PROJECT_ID/notes/NOTE_ID/occurrences

詳細については、projects.notes.occurrences.list API エンドポイントをご覧ください。

Java

Container Registry 用のクライアント ライブラリをインストールして使用する方法については、Container Registry のクライアント ライブラリをご覧ください。詳細については、Container Registry Java API のリファレンス ドキュメントをご覧ください。

/**
 * Retrieves all the Occurrences associated with a specified Note
 * Here, all Occurrences are printed and counted
 * @param client The Grafeas client used to perform the API requests.
 * @param noteId the Note's unique identifier
 * @param projectId the GCP project the Note belongs to
 * @return number of Occurrences found
 */
public static int getOccurrencesForNote(GrafeasV1Beta1Client client, String noteId,
    String projectId) {
  final NoteName noteName = NoteName.of(projectId, noteId);
  int i = 0;

  ListNoteOccurrencesRequest request = ListNoteOccurrencesRequest.newBuilder()
                                                                 .setName(noteName.toString())
                                                                 .build();
  for (Occurrence o : client.listNoteOccurrences(request).iterateAll()) {
    // Write custom code to process each Occurrence here
    System.out.println(o.getName());
    i = i + 1;
  }
  return i;
}

Go

Container Registry 用のクライアント ライブラリをインストールして使用する方法については、Container Registry のクライアント ライブラリをご覧ください。詳細については、Container Registry Go API のリファレンス ドキュメントをご覧ください。

// getOccurrencesForNote retrieves all the Occurrences associated with a specified Note.
// Here, all Occurrences are printed and counted.
func getOccurrencesForNote(ctx context.Context, client *containeranalysis.GrafeasV1Beta1Client, noteID, projectID string) (int, error) {
	req := &grafeaspb.ListNoteOccurrencesRequest{
		Name: fmt.Sprintf("projects/%s/notes/%s", projectID, noteID),
	}
	it := client.ListNoteOccurrences(ctx, req)
	count := 0
	for {
		occ, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return -1, err
		}
		// Write custom code to process each Occurrence here.
		fmt.Println(occ)
		count = count + 1
	}
	return count, nil
}

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...