์ง์› ID ์ œํœด ๋กœ๊ทธ ์˜ˆ์‹œ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” ์ง์› ID ์ œํœด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ๋˜๋Š” ๊ฐ์‚ฌ ๋กœ๊ทธ์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ง์› ID ์ œํœด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋“œ ํŒŒํ‹ฐ ID์—์„œ ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„Google Cloud ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜๋„๋ก ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ง์› ํ’€์„ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•  ๋•Œ IAM์ด ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง์› ํ’€์„ ๊ด€๋ฆฌํ•  ๋•Œ ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ API์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ํ™œ๋™์— ๋Œ€ํ•œ ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Identity and Access Management(IAM) API(๋กœ๊ทธ ์œ ํ˜• '๊ด€๋ฆฌ์ž ์ฝ๊ธฐ' ์‚ฌ์šฉ ์„ค์ •)

ํ† ํฐ ๊ตํ™˜ ํ”„๋กœ์„ธ์Šค ๋˜๋Š”Google Cloud ์ฝ˜์†”(์ œํœด) ๋กœ๊ทธ์ธ์— ๋Œ€ํ•œ ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€๋กœ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ API์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ํ™œ๋™์— ๋Œ€ํ•œ ๊ฐ์‚ฌ ๋กœ๊ทธ๋„ ์‚ฌ์šฉ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Security Token Service API(๋กœ๊ทธ ์œ ํ˜• '๊ด€๋ฆฌ์ž ์ฝ๊ธฐ' ์‚ฌ์šฉ ์„ค์ •)

์ง์› ํ’€ ๋งŒ๋“ค๊ธฐ ๋กœ๊ทธ

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ์ง์› ํ’€์„ ๋งŒ๋“œ๋Š” ๋กœ๊ทธ ํ•ญ๋ชฉ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ ์‚ฌ์šฉ์ž sam@example.com์€ ID๊ฐ€ 123456789012์ธ ์กฐ์ง์— ID๊ฐ€ my-pool์ธ ์ง์› ํ’€์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

{
  "logName": "organizations/123456789012/logs/cloudaudit.googleapis.com%2Factivity",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "sam@example.com",
    },
    "methodName": "google.iam.admin.v1.WorkforcePools.CreateWorkforcePool",
    "resourceName": "locations/global/workforcePools/my-pool",
    "serviceName": "iam.googleapis.com",
    "request": {
      "@type": "type.googleapis.com/google.iam.admin.v1.CreateWorkforcePoolRequest",
      "workforcePool": {
        "parent": "organizations/123456789012"
      },
      "workforcePoolId": "my-pool"
    }
  },
  "resource": {
    "type": "audited_resource"
  }
}

IdP ํ† ํฐ์„ ์ œํœด ํ† ํฐ์œผ๋กœ ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๋กœ๊ทธ

์ง์› ID ํ’€๊ณผ ์ง์› ID ํ’€ ๊ณต๊ธ‰์—…์ฒด๋ฅผ ์„ค์ •ํ•œ ํ›„ ID ๊ณต๊ธ‰์—…์ฒด(IdP)์˜ ํ† ํฐ์„ ๋งŒ๋“ค์–ด ์ œํœด ํ† ํฐ์œผ๋กœ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ํ™œ๋™์— Cloud ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ฉด IAM์€ ์ฃผ ๊ตฌ์„ฑ์›์ด ํ† ํฐ์„ ๊ตํ™˜ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ์‚ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ ํ•ญ๋ชฉ์—๋Š” ๋‹ค์Œ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • protoPayload.authenticationInfo.principalSubject: IdP ํ† ํฐ ์ œ๋ชฉ์ž…๋‹ˆ๋‹ค.
    • OIDC IdP์˜ ๊ฒฝ์šฐ ์ด ํ•„๋“œ์—๋Š” OIDC ํ† ํฐ์˜ sub ๋˜๋Š” ์ œ๋ชฉ, ํด๋ ˆ์ž„ ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
    • SAML IdP์˜ ๊ฒฝ์šฐ ์ด ํ•„๋“œ์— SAML ์–ด์„ค์…˜์— ์žˆ๋Š” Subject ์†์„ฑ์˜ NameID ํ•˜์œ„ ์†์„ฑ ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • protoPayload.metadata.mapped_principal: ํ† ํฐ์˜ ์ œ๋ชฉ์œผ๋กœ IAM ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ ๊ตฌ์„ฑ์›์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

    principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/IDENTIFIER
    
  • protoPayload.resourceName: ํ† ํฐ์ด ์—ฐ๊ฒฐ๋œ ์ง์› ํ’€ ์ œ๊ณต์—…์ฒด์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ† ํฐ ๊ตํ™˜ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฐ์‚ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” OIDC ํ† ํฐ์ด ์ œํœด ํ† ํฐ์œผ๋กœ ๊ตํ™˜๋ฉ๋‹ˆ๋‹ค.

{
  "logName": "organizations/123456789012/logs/cloudaudit.googleapis.com%2Fdata_access",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalSubject": "b6112abb-5791-4507-adb5-7e8cc306eb2e"
    },
    "metadata": {
      "mapped_principal": "principal://iam.googleapis.com/locations/global/workforcePools/oidc-pool/subject/a1234bcd-5678-9012-efa3-4b5cd678ef9a"
    },
    "methodName": "google.identity.sts.v1.SecurityTokenService.ExchangeToken",
    "resourceName": "locations/global/workforcePools/oidc-pool/providers/oidc-provider",
    "serviceName": "sts.googleapis.com",
    "request": {
      "@type": "type.googleapis.com/google.identity.sts.v1.ExchangeTokenRequest",
      "audience": "//iam.googleapis.com/locations/global/workforcePools/oidc-pool/providers/oidc-provider",
      "grantType": "urn:ietf:params:oauth:grant-type:token-exchange",
      "requestedTokenType": "urn:ietf:params:oauth:token-type:access_token",
      "subjectTokenType": "urn:ietf:params:oauth:token-type:id_token"
    }
  },
  "resource": {
    "type": "audited_resource"
  }
}

์„œ๋ช… ๋ฐ ์•”ํ˜ธํ™”๋œ SAML ์–ด์„ค์…˜ ๋กœ๊ทธ

์ด ์„น์…˜์—์„œ๋Š” ๋ณด์•ˆ ํ† ํฐ ์„œ๋น„์Šค์—์„œ ์„œ๋ช…๋œ SAML ์–ด์„ค์…˜์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ IdP์—์„œ ์ „์†ก๋œ ์•”ํ˜ธํ™”๋œ ์–ด์„ค์…˜์„ ๋ณตํ˜ธํ™”ํ•˜๋ฉด ์ƒ์„ฑ๋˜๋Š” Cloud ๊ฐ์‚ฌ ๋กœ๊ทธ์˜ ๋กœ๊ทธ ํ•ญ๋ชฉ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ง์› ID ์ œํœด์˜ ๊ฒฝ์šฐ ๊ด€๋ จ ๋กœ๊ทธ ํ•ญ๋ชฉ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

"keyInfo": [
  {
    "use": "verify"
    "fingerprint": "3C:B2:47:F8:A5:9A:8A:52:BD:1C:BC:96:B5:45:C1:8D:A7:F1:73:2D"
  },
  {
    "use": "decrypt"
    "resourceName": "//iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_NAME/providers/PROVIDER_NAME/keys/KEY_NAME"
  }
]

์ด ์ถœ๋ ฅ์—๋Š” ๋‹ค์Œ ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • fingerprint: SAML ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์˜ ์„œ๋ช…์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ X.509 ์ธ์ฆ์„œ SHA-256 ํ•ด์‹œ์˜ 16์ง„์ˆ˜ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. X.509 ์ธ์ฆ์„œ๋Š” ์ง์› ID ํ’€ ๊ณต๊ธ‰์—…์ฒด์— ์—ฐ๊ฒฐ๋œ SAML XML ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—์„œ ์ถ”์ถœ๋ฉ๋‹ˆ๋‹ค.
  • resourceName: ์•”ํ˜ธํ™”๋œ SAML ์–ด์„ค์…˜์„ ๋ณตํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ์ธ๋ ฅ ID ํ’€ ๊ณต๊ธ‰์—…์ฒด ํ‚ค์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋Š” ID ์ œํœด์—์„œ IdP๋กœ๋ถ€ํ„ฐ ์•”ํ˜ธํ™”๋œ SAML ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ œํœด ํ† ํฐ์œผ๋กœ Google Cloud API๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ๋กœ๊ทธ

IdP ํ† ํฐ์„ ์ œํœด ํ† ํฐ์œผ๋กœ ๊ตํ™˜ํ•œ ํ›„ ์ œํœด ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ Google Cloud API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ค‘ ์ผ๋ถ€๋Š” ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ์ œํœด ํ† ํฐ์„ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ์— Cloud Storage ๋ฒ„ํ‚ท์„ ๋‚˜์—ดํ•˜๋Š” ์š”์ฒญ์˜ ๊ฐ์‚ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

{
  "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalSubject": "principal://iam.googleapis.com/locations/global/workforcePools/oidc-pool/subject/kalani@altostrat.com"
    },
    "methodName": "storage.buckets.list",
    "serviceName": "storage.googleapis.com",
  },
  "resource": {
    "type": "gcs_bucket"
  }
}

Google Cloud ์ฝ˜์†”(์ œํœด) ๋กœ๊ทธ์ธ ๋กœ๊ทธ

์ง์› ID ํ’€๊ณผ ํ•ด๋‹น IdP๋ฅผ ์„ค์ •ํ•œ ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ˜์†”(์ œํœด)์„ ์‚ฌ์šฉํ•˜์—ฌ Google Cloud ์— ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๊ณต์ ์ธ ๋กœ๊ทธ์ธ ๋กœ๊ทธ

์ด ์„น์…˜์—์„œ๋Š” ์„ฑ๊ณตํ•œ ๋กœ๊ทธ์ธ์˜ ๊ฒฐ๊ณผ๋กœ ๊ธฐ๋ก๋œ ์˜ˆ์‹œ Cloud ๊ฐ์‚ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” ์‚ฌ์šฉ์ž user@example.com์ด locations/global/workforcePools/my-pool/providers/my-provider ๊ณต๊ธ‰์—…์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹ค์Œ Cloud ๊ฐ์‚ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{
  "logName": "organizations/my-organization-id/logs/cloudaudit.googleapis.com%2Fdata_access",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalSubject": "user@example.com",
    },
    "serviceName": "sts.googleapis.com",
    "methodName": "google.identity.sts.SecurityTokenService.WebSignIn",
    "resourceName": "locations/global/workforcePools/my-pool/providers/my-provider",
    "request": {
      "@type": "type.googleapis.com/google.identity.sts.SecurityTokenService.WebSignInRequest",
      "provider": "//iam.googleapis.com/locations/global/workforcePools/my-pool/providers/my-provider",
      "continueUrl": "https://console.cloud.google",
      "host": "http://auth.cloud.google",
    },
    "metadata": {
       "mappedPrincipal": "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/user@example.com",
    }
  },
  "resource": {
    "type": "audited_resource",
    "labels": {
      "service": "sts.googleapis.com",
      "method": "google.identity.sts.SecurityTokenService.WebSignIn",
    }
  },
}

SAML ๊ณต๊ธ‰์—…์ฒด์˜ Cloud ๊ฐ์‚ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ•„๋“œ์— ์„œ๋ช… ํ‚ค ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "metadata": {
    "mappedPrincipal": "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/user@example.com",
    "keyInfo": [
      {
        "use": "verify",
        "fingerprint": "AE:CK:LM:EF:LK:OG:EH:IJ:KN:AL:OM:AD:NO",
      }
    ],
  }
}

์‹คํŒจํ•œ ๋กœ๊ทธ์ธ ๋กœ๊ทธ

์ด ์„น์…˜์—์„œ๋Š” ์‹คํŒจํ•œ ๋กœ๊ทธ์ธ์˜ ๊ฒฐ๊ณผ๋กœ ๊ธฐ๋ก๋œ Cloud ๊ฐ์‚ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” ์‚ฌ์šฉ์ž user@example.com์ด locations/global/workforcePools/my-pool/providers/my-provider ๊ณต๊ธ‰์—…์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜์ง€๋งŒ ํŠน์„ฑ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์•„ ์•ก์„ธ์Šค๊ฐ€ ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹ค์Œ Cloud ๊ฐ์‚ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{
  "logName": "organizations/my-organization-id/logs/cloudaudit.googleapis.com%2Fdata_access",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalSubject": "user@example.com",
    },
    "status": {
      "code": 3,
      "message": "The given credential is rejected by the attribute condition.",
    },
    "serviceName": "sts.googleapis.com",
    "methodName": "google.identity.sts.SecurityTokenService.WebSignIn",
    "resourceName": "locations/global/workforcePools/my-pool/subject/user@example.com",
    "request": {
      "@type": "type.googleapis.com/google.identity.sts.SecurityTokenService.WebSignInRequest",
      "provider": "//iam.googleapis.com/locations/global/workforcePools/my-pool/providers/my-provider",
      "host": "http://auth.cloud.google",
    },
    "metadata": {
      "mappedPrincipal": "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/user@example.com",
    }
  },
  "resource": {
    "type": "audited_resource",
    "labels": {
      "service": "sts.googleapis.com",
      "method": "google.identity.sts.SecurityTokenService.WebSignIn",
    }
  },
}

๋กœ๊ทธ์•„์›ƒ ๋กœ๊ทธ

์ด ์„น์…˜์—์„œ๋Š” ๋กœ๊ทธ์•„์›ƒ ์ด๋ฒคํŠธ์˜ ๊ฒฐ๊ณผ๋กœ ๊ธฐ๋ก๋˜๋Š” Cloud ๊ฐ์‚ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” locations/global/workforcePools/my-pool/providers/my-provider ๊ณต๊ธ‰์—…์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž user@example.com์ด ๋กœ๊ทธ์•„์›ƒ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹ค์Œ Cloud ๊ฐ์‚ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{
  "logName": "organizations/my-organization-id/logs/cloudaudit.googleapis.com%2Fdata_access",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalSubject": "user@example.com",
    },
    "serviceName": "sts.googleapis.com",
    "methodName": "google.identity.sts.SecurityTokenService.WebSignOut",
    "resourceName": "locations/global/workforcePools/my-pool/providers/my-provider",
    "request": {
      "@type": "type.googleapis.com/google.identity.sts.SecurityTokenService.WebSignOutRequest",
      "provider": "//iam.googleapis.com/locations/global/workforcePools/my-pool/providers/my-provider",
      "host": "http://auth.cloud.google"
    },
    "metadata": {
      "mappedPrincipal": "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/user@example.com",
    }
  },
  "resource": {
    "type": "audited_resource",
    "labels": {
      "service": "sts.googleapis.com",
      "method": "google.identity.sts.SecurityTokenService.WebSignOut"
    }
  },
}

OAuth ํ๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๋กœ๊ทธ์ธ ๋กœ๊ทธ

์ง์› ID ํ’€ ๋ฐ ์ง์› ID ํ’€ ์ œ๊ณต์—…์ฒด๋ฅผ ์„ค์ •ํ•œ ํ›„ OAuth ํ๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ Google Cloud ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ฐ์‚ฌ ๋กœ๊ทธ ํ™œ๋™์— Cloud ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•œ ํ›„ IAM์€ ์ฃผ ๊ตฌ์„ฑ์›์ด OAuth ํ๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ์‚ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ ํ•ญ๋ชฉ์—๋Š” ๋‹ค์Œ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • protoPayload.authenticationInfo.principalSubject: IdP ํ† ํฐ ์ œ๋ชฉ์ž…๋‹ˆ๋‹ค.
    • OIDC IdP์˜ ๊ฒฝ์šฐ ์ด ํ•„๋“œ์—๋Š” OIDC ํ† ํฐ์˜ sub ๋˜๋Š” ์ œ๋ชฉ, ํด๋ ˆ์ž„ ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
    • SAML IdP์˜ ๊ฒฝ์šฐ ์ด ํ•„๋“œ์— SAML ์–ด์„ค์…˜์— ์žˆ๋Š” Subject ์†์„ฑ์˜ NameID ํ•˜์œ„ ์†์„ฑ ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • protoPayload.metadata.mapped_principal: ํ† ํฐ์˜ ์ œ๋ชฉ์œผ๋กœ IAM ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ ๊ตฌ์„ฑ์›์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

    principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/IDENTIFIER
    
  • protoPayload.resourceName: ํ† ํฐ์ด ์—ฐ๊ฒฐ๋œ ์ง์› ํ’€ ์ œ๊ณต์—…์ฒด์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ† ํฐ ๊ตํ™˜ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฐ์‚ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ ์ฃผ ๊ตฌ์„ฑ์›์€ OIDC ์ œ๊ณต์—…์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œํœด๋ฉ๋‹ˆ๋‹ค.

{
  "logName": "organizations/123456789012/logs/cloudaudit.googleapis.com%2Fdata_access",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalSubject": "b6112abb-5791-4507-adb5-7e8cc306eb2e"
    },
    "metadata": {
      "mapped_principal": "principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/IDENTIFIER"
    },
    "methodName": "google.identity.sts.v1.SecurityTokenService.ExchangeOauthToken",
    "resourceName": "locations/global/workforcePools/POOL_ID/providers/WORKFORCE_PROVIDER_ID",
    "serviceName": "sts.googleapis.com",
    "request": {
      "@type": "type.googleapis.com/google.identity.sts.v1.ExchangeOauthTokenRequest",
      "grantType": "authorization_code",
    }
  },
  "resource": {
    "type": "audited_resource"
  }
}

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