서비스 계정에 대한 감사 로그

이 페이지에는 서비스 계정을 관리하거나 사용할 때 생성되는 감사 로그의 예시가 나와 있습니다.

감사 로그 사용 설정 및 보기에 대한 자세한 내용은 Cloud IAM 감사 로깅을 참조하세요.

역할 부여

이 섹션에서는 서비스 계정과 관련된 역할을 부여할 때 받게되는 로그 항목을 보여줍니다.

서비스 계정 사용자 역할 부여

구성원은 서비스 계정을 가장하여 서비스 계정과 동일한 권한을 얻을 수 있습니다. 구성원이 서비스 계정을 가장하도록 허용하려면 서비스 계정의 구성원에게 서비스 계정 사용자 역할(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:srini@example.com"
              ],
              "role": "roles/iam.serviceAccountUser"
            }
          ]
        }
      },
      "resource": {
        "type": "service_account"
      }
    }

구성원에게 단기 사용자 인증 정보를 만들 수 있는 서비스 계정 토큰 생성자 역할(roles/iam.serviceAccountTokenCreator)을 부여할 때 Cloud IAM은 유사한 로그 항목을 생성합니다.

리소스의 서비스 계정에 액세스 권한 부여

서비스 계정에서 리소스에 액세스할 수 있도록 특정 리소스에 대해 서비스 계정에 역할을 부여할 수 있습니다. 리소스를 소유한 서비스가 감사 로깅도 지원하는 경우 서비스 계정에 역할을 부여하면 감사 로그 항목이 생성됩니다. 로그 항목에는 서비스 계정에 역할을 부여한 구성원을 식별하는 protoPayload.authenticationInfo.principalEmail 필드가 포함됩니다.

다음 예시에서는 프로젝트의 서비스 계정에 역할을 부여하는 감사 로그 항목을 보여줍니다. 이 예시에서는 julia@example.com이 서비스 계정에 조직 뷰어 역할(roles/resourcemanager.organizationViewer)을 부여했습니다. Resource Manager는 프로젝트를 관리하는 Google Cloud 서비스이므로 protoPayload.serviceName 필드는 cloudresourcemanager.googleapis.com으로 설정됩니다. 또한 resource.type 필드는 project로 설정됩니다.

{
      "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "authenticationInfo": {
          "principalEmail": "julia@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"
      }
    }

서비스 계정으로 실행되도록 Compute Engine 인스턴스 설정

사용자에게 서비스 계정에 대한 서비스 계정 사용자 역할(roles/iam.serviceAccountUser)이 있는 경우 사용자는 서비스 계정으로 실행되는 Compute Engine 가상 머신(VM) 인스턴스를 만들 수 있습니다. 이 시나리오에서 사용자는 자신의 사용자 인증 정보로 VM 인스턴스를 만들고 요청에서 사용할 VM 인스턴스의 서비스 계정을 지정합니다.

사용자가 VM 인스턴스를 만들면 Compute Engine은 여러 로그 항목을 만듭니다. 다음 예시는 VM 인스턴스를 만든 사용자와 인스턴스가 사용하는 서비스 계정을 식별하는 첫 번째 로그 항목을 보여줍니다. 이 예시에서 사용자 jackie@example.com은 서비스 계정 my-service-account@my-project.iam.gserviceaccount.com을 사용하는 인스턴스를 만들었습니다. 따라서 protoPayload.authenticationInfo.principalEmail 필드는 jackie@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": "jackie@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 서비스에 대한 요청을 인증할 수 있습니다.

다음 예시에서는 서비스 계정 키를 만드는 로그 항목을 보여줍니다. 이 예시에서 사용자 sam@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": "sam@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 Cloud API를 호출하기 위해 단기 사용자 인증 정보를 만들 수 있습니다.

구성원이 단기 사용자 인증 정보를 만들면 Cloud IAM이 감사 로그를 생성할 수 있습니다. 이러한 감사 로그를 수신하려면 데이터 액세스 활동에 대해 Cloud IAM 감사 로그를 사용 설정해야 합니다.

데이터 액세스 활동에 대해 Cloud IAM 감사 로그를 사용 설정하면 Cloud IAM은 구성원이 단기 사용자 인증 정보를 만들 때마다 감사 로그 항목을 생성합니다. 항목에는 다음 필드가 포함됩니다.

  • protoPayload.authenticationInfo.principalEmail: 단기 사용자 인증 정보를 생성한 구성원입니다.
  • resource.labels.email_id: 단기 사용자 인증 정보가 생성된 서비스 계정입니다.

다음 예시에서는 단기 OAuth 2.0 액세스 토큰을 생성하는 요청에 대한 감사 로그 항목을 보여줍니다. 이 예시에서 사용자 amara@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": "amara@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 Cloud API를 호출할 때 서비스 계정 가장할 수 있습니다.

호출하는 메서드 중 일부는 감사 로그를 생성할 수 있습니다. 일반적으로 이러한 로그 항목은 다음 ID를 표시합니다.

  • 단기 사용자 인증 정보로 가장한 서비스 계정
  • 단기 사용자 인증 정보를 생성한 ID

예를 들어 yoon@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": "yoon@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"
      }
    }

다음 단계