特定のビジネスニーズを満たすため、独自のメタデータを Artifact Analysis に提供することもできます。たとえば、顧客の Docker コンテナ用のセキュリティ管理を提供する組織は、Artifact Analysis を使用して、イメージのセキュリティ関連メタデータを格納または取得できます。
次の手順では、Artifact Analysis API を使用してイメージの構成証明メタデータを提供する方法について説明します。同じ手順で、Artifact Analysis がサポートするあらゆる種類のメタデータを保存または取得できます。
始める前に
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
Enable the Container Analysis API.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
Enable the Container Analysis API.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init - プロジェクトのメタデータのアクセス制御を設定する方法について学習する。Artifact Analysis コンテナ スキャンで作成されたオカレンスからメタデータのみを使用する場合は、この手順をスキップします。
プロジェクトのメモとオカレンスを作成する
このセクションでは、メモとオカレンスを作成する方法について説明します。この例では、ATTESTATION 種類を使用します。
プロバイダとして、プロジェクト内に証明書ごとにメモを作成し、お客様のプロジェクトにその証明書のオカレンスを作成します。
メモの作成
次の手順で注釈を作成し、注釈 ID を指定します。
API
構成証明の説明と詳細を含む
note.jsonという名前のファイルを作成します。次のコードは、note.jsonファイルの例を示しています。{ "shortDescription": "A brief Description of the note", "longDescription": "A longer description of the note", "kind": "ATTESTATION", "attestation": { "hint": { "humanReadableName": "my-attestation-authority" } } }メモの JSON 表現について詳しくは、メモ API ドキュメントをご覧ください。
次の curl コマンドを実行してメモを作成します。
curl -v -H "Content-Type: application/json" -H \ "Authorization: Bearer $(gcloud auth print-access-token)" \ https://containeranalysis.googleapis.com/v1/projects/PROVIDER_PROJECT_ID/notes?note_id=NOTE_ID -d @note.jsonここで
- PROVIDER_PROJECT_ID はプロジェクト ID です。
- NOTE_ID はメモの識別子を指定します。最大 100 文字の文字列を使用します。
Java
Artifact Analysis 用のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Java API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
import com.google.cloud.devtools.containeranalysis.v1.ContainerAnalysisClient;
import io.grafeas.v1.GrafeasClient;
import io.grafeas.v1.Note;
import io.grafeas.v1.ProjectName;
import io.grafeas.v1.Version;
import io.grafeas.v1.AttestationNote;
import java.io.IOException;
import java.lang.InterruptedException;
public class CreateNote {
// Creates and returns a new Note
public static Note createNote(String noteId, String projectId)
throws IOException, InterruptedException {
// String noteId = "my-note";
// String projectId = "my-project-id";
final String projectName = ProjectName.format(projectId);
Note newNote =
Note.newBuilder()
// Associate the Note with the metadata type
// https://docs.cloud.google.com/artifact-registry/docs/analysis
// Here, we use the type "attestation"
.setAttestation(
AttestationNote.newBuilder()
.setHint(
AttestationNote.Hint.newBuilder()
.setHumanReadableName("my-attestation-authority")))
.build();
// Initialize client that will be used to send requests. After completing all of your requests,
// call the "close" method on the client to safely clean up any remaining background resources.
GrafeasClient client = ContainerAnalysisClient.create().getGrafeasClient();
Note result = client.createNote(projectName, noteId, newNote);
return result;
}
}
Go
Artifact Analysis 用のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Go API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
import (
"context"
"fmt"
containeranalysis "cloud.google.com/go/containeranalysis/apiv1"
grafeaspb "google.golang.org/genproto/googleapis/grafeas/v1"
)
// createNote creates and returns a new attestation Note.
func createNote(noteID, projectID string) (*grafeaspb.Note, error) {
ctx := context.Background()
client, err := containeranalysis.NewClient(ctx)
if err != nil {
return nil, fmt.Errorf("NewClient: %w", err)
}
defer client.Close()
projectName := fmt.Sprintf("projects/%s", projectID)
req := &grafeaspb.CreateNoteRequest{
Parent: projectName,
NoteId: noteID,
Note: &grafeaspb.Note{
Type: &grafeaspb.Note_Attestation{
Attestation: &grafeaspb.AttestationNote{
Hint: &grafeaspb.AttestationNote_Hint{
HumanReadableName: "my-attestation-authority",
},
},
},
},
}
return client.GetGrafeasClient().CreateNote(ctx, req)
}
Node.js
Artifact Analysis 用のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Node.js API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
/**
* TODO(developer): Uncomment these variables before running the sample
*/
// const projectId = 'your-project-id', // Your Google Cloud Project ID
// const noteId = 'my-note-id' // Id of the note
// Import the library and create a client
const {ContainerAnalysisClient} = require('@google-cloud/containeranalysis');
const client = new ContainerAnalysisClient();
// Construct request
// Associate the Note with a metadata type
// https://docs.cloud.google.com/artifact-registry/docs/analysis
// Here, we use the type "attestation"
const formattedParent = client.getGrafeasClient().projectPath(projectId);
// Creates and returns a new Note
const [note] = await client.getGrafeasClient().createNote({
parent: formattedParent,
noteId: noteId,
note: {
attestation: {
hint: {
humanReadableName: 'my-attestation-authority',
},
},
},
});
console.log(`Note ${note.name} created.`);
Ruby
Artifact Analysis 用のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Ruby API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
# note_id = "A user-specified identifier for the note"
# project_id = "Your Google Cloud project ID"
require "google/cloud/container_analysis"
# Initialize the client
client = Google::Cloud::ContainerAnalysis.container_analysis.grafeas_client
parent = client.project_path project: project_id
note = {
attestation: {
hint: {
human_readable_name: "attestation-authority"
}
}
}
response = client.create_note parent: parent, note_id: note_id, note: note
puts response.name
Python
Artifact Analysis 用のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Python API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
from google.cloud.devtools import containeranalysis_v1
from grafeas.grafeas_v1 import types, Version
def create_note(note_id: str, project_id: str) -> types.grafeas.Note:
"""Creates and returns a new attestation note."""
# note_id = 'my-note'
# project_id = 'my-gcp-project'
client = containeranalysis_v1.ContainerAnalysisClient()
grafeas_client = client.get_grafeas_client()
project_name = f"projects/{project_id}"
note = {
"attestation": {
"hint": {
"human_readable_name": "attestation-authority",
}
}
}
response = grafeas_client.create_note(
parent=project_name, note_id=note_id, note=note
)
return response
メモのオカレンスを作成する
メモのオカレンスを作成するには:
API
構成証明の説明と詳細を含む
occurrence.jsonという名前のファイルを作成します。次のコードは、occurrence.jsonファイルの例を示しています。{ "resourceUri": "your-resource-uri-here", "noteName": "projects/your-note-project/notes/your-note-id", "kind": "ATTESTATION", "attestation": { "serializedPayload": "eW91ci1wYXlsb2FkLWhlcmU=", "signatures": [ { "publicKeyId": "your-key-id-here", "signature": "eW91ci1zaWduYXR1cmUtaGVyZQ==" } ] } }メモの JSON 表現について詳しくは、メモ API ドキュメントをご覧ください。
次の curl コマンドを実行して、オカレンスを作成します。
curl -v -H "Content-Type: application/json" -H \ "Authorization: Bearer $(gcloud auth print-access-token)" \ https://containeranalysis.googleapis.com/v1/projects/PROVIDER_PROJECT_ID/occurrences/ -d @occurrence.jsonここで
- PROVIDER_PROJECT_ID はプロジェクト ID です。
- NOTE_ID はメモの識別子を指定します。最大 100 文字の文字列を使用します。
Java
Artifact Analysis 用のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Java API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
import com.google.cloud.devtools.containeranalysis.v1.ContainerAnalysisClient;
import com.google.protobuf.ByteString;
import io.grafeas.v1.AttestationOccurrence;
import io.grafeas.v1.GrafeasClient;
import io.grafeas.v1.NoteName;
import io.grafeas.v1.Occurrence;
import io.grafeas.v1.ProjectName;
import io.grafeas.v1.Signature;
import java.io.IOException;
public class CreateOccurrence {
// Creates and returns a new attestation Occurrence associated with an existing Note
public static Occurrence createOccurrence(
String resourceUrl, String noteId, String occProjectId, String noteProjectId)
throws IOException {
// String resourceUrl = "https://gcr.io/project/image@sha256:123";
// String noteId = "my-note";
// String occProjectId = "my-project-id";
// String noteProjectId = "my-project-id";
final NoteName noteName = NoteName.of(noteProjectId, noteId);
final String occProjectName = ProjectName.format(occProjectId);
Occurrence newOcc =
Occurrence.newBuilder()
.setNoteName(noteName.toString())
.setResourceUri(resourceUrl)
.setAttestation(
AttestationOccurrence.newBuilder()
.setSerializedPayload(ByteString.copyFrom("your-payload-here", "UTF-8"))
.addSignatures(
Signature.newBuilder()
.setPublicKeyId("your-key-id-here")
.setSignature(ByteString.copyFrom("your-signature-here", "UTF-8"))))
.build();
// Initialize client that will be used to send requests. After completing all of your requests,
// call the "close" method on the client to safely clean up any remaining background
// resources.
GrafeasClient client = ContainerAnalysisClient.create().getGrafeasClient();
Occurrence result = client.createOccurrence(occProjectName, newOcc);
return result;
}
}
Go
Artifact Analysis 用のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Go API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
import (
"context"
"fmt"
containeranalysis "cloud.google.com/go/containeranalysis/apiv1"
grafeaspb "google.golang.org/genproto/googleapis/grafeas/v1"
)
// createsOccurrence creates and returns a new Occurrence of a previously created attestation note.
// Use this style of URL when you use Google Artifact Registry.
// resourceURL := "https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image"
// noteID := "my-note"
ctx := context.Background()
client, err := containeranalysis.NewClient(ctx)
if err != nil {
return nil, fmt.Errorf("NewClient: %w", err)
}
defer client.Close()
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 resource uri.
ResourceUri: resourceURL,
// Details about the attestation can be added here.
Details: &grafeaspb.Occurrence_Attestation{
Attestation: &grafeaspb.AttestationOccurrence{
SerializedPayload: []byte("..."),
Signatures: []*grafeaspb.Signature{
{
PublicKeyId: "...",
Signature: []byte("..."),
},
},
},
},
},
}
return client.GetGrafeasClient().CreateOccurrence(ctx, req)
}
Node.js
Artifact Analysis 用のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Node.js API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
/**
* TODO(developer): Uncomment these variables before running the sample
*/
// const noteProjectId = 'your-project-id', // Your Google Cloud Project ID
// const noteId = 'my-note-id', // Id of the note
// const occurrenceProjectId = 'your-project-id', // The Google Cloud Project ID of the occurrence
// If you are using Google Artifact Registry
// const imageUrl = 'https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image:123' // Image to attach metadata to
// Import the library and create a client
const {ContainerAnalysisClient} = require('@google-cloud/containeranalysis');
const client = new ContainerAnalysisClient();
// Construct request
const formattedParent = client
.getGrafeasClient()
.projectPath(occurrenceProjectId);
const formattedNote = client
.getGrafeasClient()
.notePath(noteProjectId, noteId);
// Creates and returns a new Occurrence associated with an existing Note
const [occurrence] = await client.getGrafeasClient().createOccurrence({
parent: formattedParent,
occurrence: {
noteName: formattedNote,
resourceUri: imageUrl,
attestation: {
serializedPayload: Buffer.from('your-payload-here').toString('base64'),
signatures: [
{
publicKeyId: 'your-key-id-here',
signature: Buffer.from('your-signature-here').toString('base64'),
},
],
},
},
});
console.log(`Occurrence created ${occurrence.name}.`);
return occurrence;
Ruby
Artifact Analysis 用のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Ruby API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
# note_id = "A user-specified identifier for the note"
# project_id = "Your Google Cloud project ID"
# note_project = "The project that contains the note"
# occurrence_project = "The project that contains the occurrence"
require "google/cloud/container_analysis"
require "base64"
# Initialize the client
client = Google::Cloud::ContainerAnalysis.container_analysis.grafeas_client
note_path = client.note_path project: note_project, note: note_id
project_path = client.project_path project: occurrence_project
occurrence = {
note_name: note_path,
resource_uri: resource_url,
attestation: {
serialized_payload: Base64.encode64("your-payload-here"),
signatures: [
{
public_key_id: "your-key-id-here",
signature: Base64.encode64("your-signature-here")
}
]
}
}
response = client.create_occurrence parent: project_path, occurrence: occurrence
puts response.name
Python
Artifact Analysis 用のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Python API のリファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
import base64
from google.cloud.devtools import containeranalysis_v1
from grafeas.grafeas_v1 import types
def create_occurrence(
resource_url: str, note_id: str, occurrence_project: str, note_project: str
) -> types.grafeas.Occurrence:
"""Creates and returns a new occurrence of a previously
created attestation note."""
# note_id = 'my-note'
# project_id = 'my-gcp-project'
client = containeranalysis_v1.ContainerAnalysisClient()
grafeas_client = client.get_grafeas_client()
formatted_note = f"projects/{note_project}/notes/{note_id}"
formatted_project = f"projects/{occurrence_project}"
occurrence = {
"note_name": formatted_note,
"resource_uri": resource_url,
"attestation": {
"serialized_payload": base64.b64encode(b"your-payload-here").decode("utf-8"),
"signatures": [
{
"public_key_id": "your-key-id-here",
"signature": base64.b64encode(b"your-signature-here").decode("utf-8"),
}
],
},
}
return grafeas_client.create_occurrence(
parent=formatted_project, occurrence=occurrence
)
特定のメモのすべてのオカレンスを取得する
notes.occurrences.list() を使用して、お客様のプロジェクト全体での特定の構成証明のすべてのオカレンスを表示できます。
API
メモのすべてのオカレンスを一覧表示するには、次のように GET リクエストを送信します。
GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/notes/NOTE_ID/occurrences
詳細については、projects.notes.occurrences.list API エンドポイントをご覧ください。
Java
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Java API リファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Go
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Go API リファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Node.js
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Node.js API リファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Ruby
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Ruby API リファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Python
Artifact Analysis のクライアント ライブラリをインストールして使用する方法については、Artifact Analysis クライアント ライブラリをご覧ください。詳細については、Artifact Analysis Python API リファレンス ドキュメントをご覧ください。
Artifact Analysis に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
次のステップ
コンテナ イメージのメモとオカレンスを表示、フィルタリングする方法については、脆弱性オカレンスを表示するをご覧ください。
通知を設定する方法については、Pub/Sub 通知をご覧ください。