์„œ๋น„์Šค ๊ณ„์ • ๋กœ๊ทธ ์˜ˆ์‹œ

์ด ํŽ˜์ด์ง€์—๋Š” ์„œ๋น„์Šค ๊ณ„์ •์„ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ๋•Œ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์‚ฌ ๋กœ๊ทธ์˜ ์˜ˆ์‹œ๊ฐ€ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ๋กœ๊ทธ ์‚ฌ์šฉ ์„ค์ • ๋ฐ ๋ณด๊ธฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM ๊ฐ์‚ฌ ๋กœ๊น…์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์„œ๋น„์Šค ๊ณ„์ • ๋งŒ๋“ค๊ธฐ ๋กœ๊ทธ

์„œ๋น„์Šค ๊ณ„์ •์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ๋•Œ Identity and Access Management(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)์„ ๋ถ€์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. 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": "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 ์„œ๋น„์Šค์™€ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ๋•Œ ๋ฆฌ์†Œ์Šค์— ์—ฐ๊ฒฐ๋œ ์„œ๋น„์Šค ๊ณ„์ •์„ ID๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋น„์Šค ๊ณ„์ •์„ Compute Engine ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ  ์ธ์Šคํ„ด์Šค์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Google Cloud API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ธ์ฆ๊ณผ ์Šน์ธ์— ์—ฐ๊ฒฐ๋œ ์„œ๋น„์Šค ๊ณ„์ •์„ ์ž๋™์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ์„น์…˜์—์„œ๋Š” ์„œ๋น„์Šค ๊ณ„์ •์„ ๋ฆฌ์†Œ์Šค์— ์—ฐ๊ฒฐํ•˜๋ฉด ์ƒ์„ฑ๋˜๋Š” ์ผ๋ถ€ ๋กœ๊ทธ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์„œ๋น„์Šค ๊ณ„์ • ๊ฐ€์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ค‘ ์ผ๋ถ€๋Š” ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๋กœ๊ทธ ํ•ญ๋ชฉ์€ ๋‹ค์Œ ID๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹จ๊ธฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋กœ ๊ฐ€์žฅํ•œ ์„œ๋น„์Šค ๊ณ„์ •
  • ๋‹จ๊ธฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•œ ID

์˜ˆ๋ฅผ ๋“ค์–ด 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"
  }
}

์„œ๋น„์Šค ์—์ด์ „ํŠธ์—์„œ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์— ๋Œ€ํ•œ ๋กœ๊ทธ

์ฃผ ๊ตฌ์„ฑ์›์ด ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ฉด ์„œ๋น„์Šค ์—์ด์ „ํŠธ์—์„œ ์ฃผ ๊ตฌ์„ฑ์› ๋Œ€์‹  ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋น„์Šค ์—์ด์ „ํŠธ์˜ ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ๊ฒ€ํ† ํ•  ๋•Œ๋Š” ์„œ๋น„์Šค ์—์ด์ „ํŠธ๊ฐ€ ๋ˆ„๊ตฌ๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์–ด๋–ค ์ด์œ ๋กœ ์ž‘์—…์„ ์‹คํ–‰ํ–ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์—์ด์ „ํŠธ ์ž‘์—… ์ปจํ…์ŠคํŠธ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก ์ผ๋ถ€ ์„œ๋น„์Šค ์—์ด์ „ํŠธ๋Š” ๊ฐ์‚ฌ ๋กœ๊ทธ์— ์ž‘์—…๊ณผ ์—ฐ๊ฒฐ๋œ ์ž‘์—… ๋ฐ ์ž‘์—…์„ ๋งŒ๋“  ์ฃผ ๊ตฌ์„ฑ์›๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ์„ธ๋ถ€์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์„œ๋น„์Šค ์—์ด์ „ํŠธ๋Š” ๊ฐ์‚ฌ ๋กœ๊ทธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ์„ธ๋ถ€์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ถ”๊ฐ€ ์„ธ๋ถ€์ •๋ณด๋Š” authenticationInfo ํ•„๋“œ์— ์ค‘์ฒฉ๋œ ๊ฐ์‚ฌ ๋กœ๊ทธ์˜ serviceDelegationHistory ํ•„๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ์ž‘์—…์„ ๋งŒ๋“  ์›๋ž˜ ์ฃผ ๊ตฌ์„ฑ์›
  • ์ž‘์—…์„ ์‹คํ–‰ํ•œ ์„œ๋น„์Šค ์—์ด์ „ํŠธ
  • ์„œ๋น„์Šค ์—์ด์ „ํŠธ๊ฐ€ ์†ํ•œ ์„œ๋น„์Šค
  • ์ž‘์—… 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",
          }
        ]
      }
    }
  }
}

๋‹ค์Œ ๋‹จ๊ณ„