์„œ๋น„์Šค ๊ฒฝ๊ณ„ ์ผ๊ด„ ๋ณ€๊ฒฝ

Access Context Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ก์„ธ์Šค ์ˆ˜์ค€ ๋ฐ ์„œ๋น„์Šค ๊ฒฝ๊ณ„์™€ ๊ฐ™์ด ์กฐ์ง์˜ ์•ก์„ธ์Šค ์ •์ฑ…์— ์†ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ผ๊ด„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๊ด„ ์ž‘์—…์˜ ๋ชจ๋“  ๋ถ€๋ถ„์ด ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ์ฃผ์ œ์—์„œ๋Š” ์„œ๋น„์Šค ๊ฒฝ๊ณ„์˜ ์ผ๊ด„ ๊ต์ฒด๋งŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์•ก์„ธ์Šค ์ˆ˜์ค€์˜ ์ผ๊ด„ ๊ต์ฒด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Access Context Manager ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์„œ๋น„์Šค ๊ฒฝ๊ณ„ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ

์ผ๊ด„ ์ž‘์—…์€ ์กฐ์ง์˜ ๋ชจ๋“  ์„œ๋น„์Šค ๊ฒฝ๊ณ„์— ์˜ํ–ฅ์„ ์ฃผ๋ฏ€๋กœ ๊ฒฝ๊ณ„์˜ ์ „์ฒด ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๋ชฉ๋ก์„ YAML ํ˜•์‹์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝ๊ณ„๋ฅผ ์ผ๊ด„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜•์‹์ด ์ง€์ •๋œ ์„œ๋น„์Šค ๊ฒฝ๊ณ„ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์„œ๋น„์Šค ๊ฒฝ๊ณ„ ๋‚˜์—ด(ํ˜•์‹ ์ง€์ •๋จ)์„ ์ฐธ์กฐํ•˜์„ธ์š”.

replace-all ๋ช…๋ น์–ด๋กœ ๋ชจ๋“  ์„œ๋น„์Šค ๊ฒฝ๊ณ„ ๊ตฌ์„ฑ์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฝ๊ณ„ ๋‚ด์— etag ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋Š” ์‚ฌ์ด์— etag๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ replace-all ๋ช…๋ น์–ด์—์„œ etag ๋ถˆ์ผ์น˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ etag ํ™•์ธ์„ ์ ์šฉํ•˜๋ ค๋ฉด ์ตœ์ƒ์œ„ --etag ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด replace-all ์š”์ฒญ์— ๋Œ€ํ•ด etag๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ„ ๋‚ด์˜ ๊ฐ etag ์†์„ฑ์„ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๋Œ€์‹  etag๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ --format์„ ์ง€์ •ํ•˜์—ฌ etag ์†์„ฑ ์—†์ด ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gcloud access-context-manager perimeters list \
  --policy=POLICY_NAME \
  --format="json(name,title,description,perimeterType,status,spec,useExplicitDryRunSpec)"

์„œ๋น„์Šค ๊ฒฝ๊ณ„ ์ผ๊ด„ ๋ฐ”๊พธ๊ธฐ

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์„œ๋น„์Šค ๊ฒฝ๊ณ„๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋ชจ๋“  ์„œ๋น„์Šค ๊ฒฝ๊ณ„๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ ๋Œ€์ฒดํ•˜๋ ค๋ฉด replace-all ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud access-context-manager perimeters replace-all POLICY_NAME \
  --source-file=FILE \
  --etag=ETAG \

๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • POLICY_NAME์€ ์กฐ์ง์˜ ์•ก์„ธ์Šค ์ •์ฑ… ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ๊ธฐ๋ณธ ์•ก์„ธ์Šค ์ •์ฑ…์„ ์„ค์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • FILE์€ ๊ธฐ์กด ์„œ๋น„์Šค ๊ฒฝ๊ณ„์˜ ์ƒˆ ์„ค์ •์„ ์ •์˜ํ•˜๋Š” .yaml ํŒŒ์ผ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    - name: accessPolicies/11271009391/servicePerimeters/storage_perimeter
      title: Storage Perimeter
      description: Perimeter to protect Storage resources.
      perimeterType: PERIMETER_TYPE_REGULAR
      status:
        restrictedServices:
        - storage.googleapis.com
    - name: accessPolicies/11271009391/servicePerimeters/bigquery_perimeter
      title: BigQuery Perimeter
      description: Perimeter to protect BigQuery resources.
      perimeterType: PERIMETER_TYPE_REGULAR
      status:
        restrictedServices:
        - bigquery.googleapis.com
    

    YAML ํŒŒ์ผ ํ˜•์‹ ์ง€์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Access Context Manager ServicePerimeterConfig ๊ฐ์ฒด์˜ JSON ๊ตฌ์กฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  • ETAG(์„ ํƒ์‚ฌํ•ญ)๋Š” ์กฐ์ง ์•ก์„ธ์Šค ์ •์ฑ…์˜ ๋Œ€์ƒ ๋ฒ„์ „์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ETag๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด ์ผ๊ด„ ์ž‘์—…์€ ์ตœ์‹  ๋ฒ„์ „์˜ ์กฐ์ง ์•ก์„ธ์Šค ์ •์ฑ…์„ ํƒ€๊ฒŸํŒ…ํ•ฉ๋‹ˆ๋‹ค.

    ์•ก์„ธ์Šค ์ •์ฑ…์˜ ์ตœ์‹  ETag์™€ list ์•ก์„ธ์Šค ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

API

๋ชจ๋“  ์„œ๋น„์Šค ๊ฒฝ๊ณ„๋ฅผ ์ผ๊ด„ ๊ต์ฒดํ•˜๋ ค๋ฉด servicePerimeters.replaceAll๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

POST https://accesscontextmanager.googleapis.com/v1/accessPolicies/POLICY_NAME/servicePerimeters.replaceAll?alt=json

๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • POLICY_NAME์€ ์กฐ์ง์˜ ์•ก์„ธ์Šค ์ •์ฑ… ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์š”์ฒญ ๋ณธ๋ฌธ

์š”์ฒญ ๋ณธ๋ฌธ์—๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ง€์ •ํ•˜๋Š” ServicePerimeterConfig ๊ฐ์ฒด ๋ชฉ๋ก์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ฒฝ์šฐ ETag๋ฅผ ํฌํ•จํ•˜์—ฌ ํŠน์ • ๋ฒ„์ „์˜ ์กฐ์ง ์•ก์„ธ์Šค ์ •์ฑ…์„ ํƒ€๊ฒŸํŒ…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ETag๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด ์ผ๊ด„ ์ž‘์—…์€ ์ตœ์‹  ๋ฒ„์ „์˜ ์กฐ์ง ์•ก์„ธ์Šค ์ •์ฑ…์„ ํƒ€๊ฒŸํŒ…ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
  "servicePerimeters": [
    object (ServicePerimeterConfig),
    object (ServicePerimeterConfig),
    ...
  ]
  "etag": string
}

์‘๋‹ต ๋ณธ๋ฌธ

ํ˜ธ์ถœ์ด ์„ฑ๊ณตํ•˜๋ฉด ํ˜ธ์ถœ์˜ ์‘๋‹ต ๋ณธ๋ฌธ์— ๊ฒŒ์‹œ ์ž‘์—…์— ๋Œ€ํ•œ ์„ธ๋ถ€์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” Operation ๋ฆฌ์†Œ์Šค๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์‘๋‹ต ์˜ˆ:

{
  "name": "operations/accessPolicies/11271009391/replacePerimeters/1583523447707087",
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.identity.accesscontextmanager.v1.ReplaceServicePerimetersResponse",
    "servicePerimeters": [
      {
        "name": "accessPolicies/11271009391/servicePerimeters/storage_perimeter",
        "title": "Storage Perimeter",
        "description": "Perimeter to protect Storage resources.",
        "status": {
          "accessLevels": [
            "accessPolicies/11271009391/accessLevels/corpnet_access"
          ],
          "restrictedServices": [
            "bigtable.googleapis.com"
          ]
        }
      },
      {
        "name": "accessPolicies/11271009391/servicePerimeters/storage_perimeter",
        "title": "BigQuery Perimeter",
        "description": "Perimeter to protect BigQuery resources.",
        "status": {
          "accessLevels": [
            "accessPolicies/11271009391/accessLevels/prodnet_access"
          ],
          "restrictedServices": [
            "bigtable.googleapis.com"
          ]
        }
      }
    ]
  }
}