์ด ํ์ด์ง์๋ ์๋น์ค ๊ณ์ ์ ๊ด๋ฆฌํ๊ฑฐ๋ ์ฌ์ฉํ ๋ ์์ฑ๋๋ ๊ฐ์ฌ ๋ก๊ทธ์ ์์๊ฐ ๋์ ์์ต๋๋ค.
๊ฐ์ฌ ๋ก๊ทธ ์ฌ์ฉ ์ค์ ๋ฐ ๋ณด๊ธฐ์ ๋ํ ์์ธํ ๋ด์ฉ์ 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", } ] } } } }
๋ค์ ๋จ๊ณ
- IAM์ ๊ฐ์ฌ ๋ก๊ทธ ๊ตฌ์ฑ ๋ฐ ๋ณด๊ธฐ
- Cloud ๊ฐ์ฌ ๋ก๊ทธ์ ๋ํด ์์ธํ ์์๋ณด๊ธฐ
- ์๋น์ค ๊ณ์ ์ ๋ํด ์์๋ด ๋๋ค.
- ์๋น์ค ๊ณ์ ์์ฑ ๋ฐ ๊ด๋ฆฌ
- ์๋น์ค ๊ณ์ ์ ๊ฐ์ฅํ๊ธฐ ์ํด ๋จ๊ธฐ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๋ง๋ค๊ธฐ