服務帳戶的記錄範例

本頁面提供範例,說明管理或使用服務帳戶時產生的稽核記錄。

如要進一步瞭解如何啟用及查看稽核記錄,請參閱「IAM 稽核記錄」。

建立服務帳戶的記錄

建立或修改服務帳戶時,身分與存取權管理 (IAM) 會產生記錄項目。以下範例顯示建立服務帳戶的記錄項目:

{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "example-user@example.com"
    },
    "methodName": "google.iam.admin.v1.CreateServiceAccount",
    "response": {
      "email": "my-service-account@my-project.iam.gserviceaccount.com",
      "@type": "type.googleapis.com/google.iam.admin.v1.ServiceAccount",
      "display_name": "My service account."
    }
  },
  "resource": {
    "type": "service_account"
  }
}

授予角色的記錄

本節顯示您授予與服務帳戶相關角色時收到的記錄項目。

授予服務帳戶使用者角色的記錄

主體可以模擬服務帳戶,取得與服務帳戶相同的權限。如要允許主體模擬服務帳戶,可以將服務帳戶使用者角色授予主體 (roles/iam.serviceAccountUser)。

以下範例顯示將服務帳戶使用者角色授予主體的記錄項目:

{
  "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "methodName": "google.iam.admin.v1.SetIAMPolicy",
    "request": {
      "@type": "type.googleapis.com/google.iam.v1.SetIamPolicyRequest",
      "resource": "projects/-/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com"
    },
    "resourceName": "projects/-/serviceAccounts/123456789012345678901",
    "response": {
      "@type": "type.googleapis.com/google.iam.v1.Policy",
      "bindings": [
        {
          "members": [
            "user:my-user@example.com"
          ],
          "role": "roles/iam.serviceAccountUser"
        }
      ]
    }
  },
  "resource": {
    "type": "service_account"
  }
}

授予服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator) 時,IAM 會產生類似的記錄項目,允許主體建立短期憑證。

授予服務帳戶資源存取權的記錄

您可以將角色授予特定資源的服務帳戶,允許服務帳戶存取該資源。如果擁有資源的服務也支援稽核記錄,則授予服務帳戶角色會產生稽核記錄項目。記錄項目包含 protoPayload.authenticationInfo.principalEmail 欄位,可識別將角色授予服務帳戶的主體。

以下範例顯示為專案的服務帳戶授予角色的稽核記錄項目。在本範例中,example-user@example.com將機構檢視者角色 (roles/resourcemanager.organizationViewer) 授予服務帳戶。protoPayload.serviceName 欄位設為 cloudresourcemanager.googleapis.com,因為 Resource Manager 是管理專案的Google Cloud 服務。此外,resource.type 欄位會設為 project

{
  "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "example-user@example.com"
    },
    "methodName": "SetIamPolicy",
    "request": {
      "@type": "type.googleapis.com/google.iam.v1.SetIamPolicyRequest",
      "resource": "my-project"
    },
    "resourceName": "projects/my-project",
    "response": {
      "@type": "type.googleapis.com/google.iam.v1.Policy",
      "bindings": [
        {
          "members": [
            "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
          ],
          "role": "roles/resourcemanager.organizationViewer"
        }
      ]
    },
    "serviceName": "cloudresourcemanager.googleapis.com"
  },
  "resource": {
    "type": "project"
  }
}

將服務帳戶附加至資源的記錄

如果使用者擁有服務帳戶的服務帳戶使用者角色 (roles/iam.serviceAccountUser),就能將服務帳戶附加至資源。當在資源上執行的程式碼存取 Google Cloud 服務和資源時,會使用附加至資源的服務帳戶做為身分。舉例來說,如果您將服務帳戶附加至 Compute Engine 執行個體,且執行個體上的應用程式使用用戶端程式庫呼叫 API,這些應用程式就會自動使用附加的服務帳戶進行驗證和授權。 Google Cloud

本節顯示將服務帳戶附加至資源時產生的一些記錄。

使用 iam.serviceAccounts.actAs 權限的記錄

如要將服務帳戶附加至資源,您必須具備 iam.serviceAccounts.actAs 權限。主體使用這項權限將服務帳戶附加至資源時,系統會產生稽核記錄。

以下範例顯示主體使用 iam.serviceAccounts.actAs 權限,將服務帳戶附加至 Compute Engine 執行個體的記錄項目。

{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "example-user@example.com"
    },
    "serviceName": "iam.googleapis.com",
    "methodName": "iam.serviceAccounts.actAs",
    "authorizationInfo": [
      {
        "resource": "projects/-/serviceAccounts/sample-service-account@sample-project.iam.gserviceaccount.com",
        "permission": "iam.serviceAccounts.actAs",
        "granted": true,
        "permissionType": "ADMIN_WRITE"
      }
    ],
    "resourceName": "projects/-/serviceAccounts/sample-service-account@sample-project.iam.gserviceaccount.com",
    "request": {
      "name": "sample-service-account@sample-project.iam.gserviceaccount.com",
      "project_number": "787155667719",
      "@type": "type.googleapis.com/CanActAsServiceAccountRequest"
    },
    "response": {
      "success": true,
      "@type": "type.googleapis.com/CanActAsServiceAccountResponse"
    }
  },
  "insertId": "vojt0vd4fdy",
  "resource": {
    "type": "audited_resource",
    "labels": {
      "project_id": "sample-project",
      "method": "iam.serviceAccounts.actAs",
      "service": "iam.googleapis.com"
    }
  },
  "timestamp": "2024-08-05T21:56:56.097601933Z",
  "severity": "NOTICE",
  "logName": "projects/sample-project/logs/cloudaudit.googleapis.com%2Factivity",
  "receiveTimestamp": "2024-08-05T21:56:56.097601933Z"
}

設定 Compute Engine 執行個體以服務帳戶身分執行的記錄檔

如果使用者擁有服務帳戶的服務帳戶使用者角色 (roles/iam.serviceAccountUser),就能建立以該服務帳戶身分執行的 Compute Engine 虛擬機器 (VM) 執行個體。在這個情境中,使用者會使用自己的憑證建立 VM 執行個體,且要求會指定 VM 執行個體要使用的服務帳戶。

使用者建立 VM 執行個體時,Compute Engine 會建立多個記錄檔項目。以下範例顯示第一筆記錄項目,其中會識別建立 VM 執行個體的使用者,以及執行個體使用的服務帳戶。在這個範例中,使用者 example-user@example.com 建立的執行個體使用服務帳戶 my-service-account@my-project.iam.gserviceaccount.com。因此,protoPayload.authenticationInfo.principalEmail 欄位會設為 example-user@example.com,而 protoPayload.request.serviceAccounts[0].email 欄位會設為 my-service-account@my-project.iam.gserviceaccount.com

{
  "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "example-user@example.com"
    },
    "methodName": "v1.compute.instances.insert",
    "request": {
      "@type": "type.googleapis.com/compute.instances.insert",
      "serviceAccounts": [
        {
          "email": "my-service-account@my-project.iam.gserviceaccount.com"
        }
      ]
    },
    "resourceName": "projects/my-project/zones/us-central1-a/instances/my-instance"
  },
  "resource": {
    "type": "gce_instance"
  }
}

使用服務帳戶金鑰存取 Google Cloud 的記錄

本節顯示您在建立服務帳戶金鑰,然後使用該金鑰存取 Google Cloud時收到的記錄項目。

建立服務帳戶金鑰的記錄

如果您在服務帳戶中擁有服務帳戶金鑰管理員角色 (roles/iam.serviceAccountKeyAdmin),可以建立服務帳戶金鑰,然後使用該金鑰驗證對 Google Cloud 服務的要求。

以下範例顯示建立服務帳戶金鑰的記錄項目。在本範例中,使用者 example-user@example.com 為服務帳戶 my-service-account@my-project.iam.gserviceaccount.com 建立金鑰:

{
  "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "example-user@example.com",
    },
    "methodName": "google.iam.admin.v1.CreateServiceAccountKey",
    "request": {
      "@type": "type.googleapis.com/google.iam.admin.v1.CreateServiceAccountKeyRequest",
      "name": "projects/-/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com"
    },
    "resourceName": "projects/-/serviceAccounts/123456789012345678901"
  },
  "resource": {
    "type": "service_account"
  }
}

使用服務帳戶金鑰驗證的記錄

建立服務帳戶金鑰後,您可以使用該金鑰為服務帳戶要求 OAuth 2.0 存取權杖,然後使用存取權杖驗證對 Google Cloud 服務的要求。一般來說,這些服務的稽核記錄包含下列資訊:

  • protoPayload.authenticationInfo.principalEmail:存取權杖代表的服務帳戶電子郵件地址。
  • protoPayload.authenticationInfo.serviceAccountKeyName:用於要求 OAuth 2.0 存取權杖的服務帳戶金鑰。這個欄位會以完整資源名稱 (格式為 //iam.googleapis.com/projects/project-id/serviceAccounts/service-account-email/keys/key-id) 識別服務帳戶金鑰。

以下範例顯示建立 Memorystore for Redis 執行個體的要求稽核記錄項目。要求已透過服務帳戶的 OAuth 2.0 存取權杖完成驗證。在本範例中,服務帳戶名為 my-service-account@my-project.iam.gserviceaccount.com,服務帳戶金鑰 ID 則為 c71e040fb4b71d798ce4baca14e15ab62115aaef

{
  "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "my-service-account@my-project.iam.gserviceaccount.com",
      "serviceAccountKeyName": "//iam.googleapis.com/projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/c71e040fb4b71d798ce4baca14e15ab62115aaef"
    },
    "methodName": "google.cloud.redis.v1.CloudRedis.CreateInstance",
    "request": {
      "@type": "type.googleapis.com/google.cloud.redis.v1.CreateInstanceRequest"
    }
  }
}

模擬服務帳戶以存取 Google Cloud的記錄

本節會顯示您為服務帳戶建立短期憑證,然後使用憑證模擬服務帳戶並存取 Google Cloud時收到的記錄項目。

建立短期憑證的記錄

如果您擁有服務帳戶的服務帳戶憑證建立者角色 (roles/iam.serviceAccountTokenCreator),可以為服務帳戶建立短期憑證,然後使用憑證模擬服務帳戶。舉例來說,您可能會建立短期憑證,從未在 Google Cloud上執行的應用程式呼叫 Google CloudAPI。

主體建立短期憑證時,IAM 可以產生稽核記錄。如要接收這些稽核記錄,請啟用資料存取活動的 IAM 稽核記錄

為資料存取活動啟用 IAM 稽核記錄後,每當主體建立短期憑證,IAM 就會產生稽核記錄項目。項目包含下列欄位:

  • protoPayload.authenticationInfo.principalEmail:建立短期憑證的主體。
  • resource.labels.email_id:產生短期憑證的服務帳戶。

以下範例顯示產生短期 OAuth 2.0 存取權杖的要求稽核記錄項目。在本例中,使用者 example-user@example.com 為服務帳戶 my-service-account@my-project.iam.gserviceaccount.com 建立存取權杖:

{
  "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "example-user@example.com"
    },
    "methodName": "GenerateAccessToken",
    "request": {
      "@type": "type.googleapis.com/google.iam.credentials.v1.GenerateAccessTokenRequest",
      "name": "projects/-/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com"
    },
    "serviceName": "iamcredentials.googleapis.com"
  },
  "resource": {
    "labels": {
      "email_id": "my-service-account@my-project.iam.gserviceaccount.com",
      "project_id": "my-project",
      "unique_id": "123456789012345678901"
    },
    "type": "service_account"
  }
}

使用短期憑證進行驗證的記錄

為服務帳戶建立短期憑證後,您可以在呼叫 Google CloudAPI 時,使用憑證模擬服務帳戶。

您呼叫的部分方法可能會產生稽核記錄。一般來說,這些記錄項目會顯示下列身分:

  • 短期憑證模擬的服務帳戶
  • 建立短期憑證的身分

舉例來說,假設使用者 example-user@example.com 為服務帳戶 my-service-account@my-project.iam.gserviceaccount.com 建立短期憑證。接著,使用者會使用短期憑證模擬服務帳戶,建立新的 Pub/Sub 主題。Pub/Sub 會產生記錄項目,識別服務帳戶和模擬服務帳戶的使用者:

{
  "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "my-service-account@my-project.iam.gserviceaccount.com",
      "serviceAccountDelegationInfo": [
        {
          "firstPartyPrincipal": {
            "principalEmail": "example-user@example.com"
          }
        }
      ]
    },
    "methodName": "google.pubsub.v1.Publisher.CreateTopic",
    "request": {
      "@type": "type.googleapis.com/google.pubsub.v1.Topic",
      "name": "projects/my-project/topics/my-topic"
    },
    "resourceName": "projects/my-project/topics/my-topic"
  },
  "resource": {
    "type": "pubsub_topic"
  }
}

服務專員執行的動作記錄

有時,當主體啟動作業時,服務代理程式會代表主體執行動作。不過,在查看服務代理人的稽核記錄時,可能難以判斷服務代理人是代表誰執行動作,以及原因。

為協助您瞭解服務代理程式動作的背景資訊,部分服務代理程式會在稽核記錄中加入其他詳細資料,例如與動作相關聯的工作,以及建立該工作的主體。

下列服務代理程式會在稽核記錄中加入這些額外詳細資料:

這些額外詳細資料位於稽核記錄的 serviceDelegationHistory 欄位中,該欄位會巢狀內嵌在 authenticationInfo 欄位中。這個欄位包含下列資訊:

  • 建立工作的原始主體
  • 執行動作的服務代理
  • 服務代理所屬的服務
  • 工作 ID

舉例來說,假設 example-user@example.com 使用 BigQuery Connection API 建立工作。這項作業需要 BigQuery Connection API 的其中一個服務代理程式執行動作。在本例中,服務代理程式動作的稽核記錄會包含類似下列內容的 serviceDelegationHistory 欄位:

{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "bqcx-442188550395-jujw@gcp-sa-bigquery-condel.iam.gserviceaccount.com",
      "serviceDelegationHistory": {
        "originalPrincipal": "user:my-user@example.com",
        "serviceMetadata": [
          {
            "principalSubject": "serviceAccount:bqcx-442188550395-jujw@gcp-sa-bigquery-condel.iam.gserviceaccount.com",
            "serviceDomain": "bigquery.googleapis.com",
          }
        ]
      }
    }
  }
}

後續步驟