IAM 조건 사용

IAM 조건을 사용하면 Cloud SQL 인스턴스를 포함하여 Google Cloud 리소스에 대해 조건 및 속성 기반의 액세스 제어를 정의하고 적용할 수 있습니다. IAM 조건에 대한 자세한 내용은 IAM 조건 개요 페이지를 참조하세요.

소개

Cloud SQL에서는 다음 속성을 기반으로 조건부 액세스를 적용할 수 있습니다.

  • 날짜/시간 속성: Cloud SQL 리소스에 대해 임시(만료됨), 예약, 기간 제한 액세스를 설정하기 위해 사용됩니다. 예를 들어 지정된 날짜까지 사용자가 데이터베이스 인스턴스에 액세스하도록 허용할 수 있습니다. 리소스 계층 구조의 모든 수준에서 날짜/시간 속성을 사용할 수 있습니다. 자세한 내용은 임시 액세스 구성을 참조하세요.
  • 리소스 속성: 태그, 리소스 이름, 리소스 유형, 리소스 서비스 속성을 기반으로 조건부 액세스를 구성하기 위해 사용됩니다. Cloud SQL에서는 데이터베이스 인스턴스의 속성을 사용하여 조건부 액세스를 구성할 수 있습니다. 예를 들어 사용자가 특정 태그가 있는 인스턴스에만 액세스하도록 허용할 수 있습니다. 자세한 내용은 리소스 기반 액세스 구성을 참조하세요.

사용 사례는 다음과 같습니다.

  • 사용자가 특정 인스턴스에 연결하도록 허용합니다.

  • 사용자가 특정 프리픽스 또는 서픽스(예: 'test')로 인스턴스를 만들 수 있도록 허용합니다.

  • 테스트 인스턴스의 백업 작업에 대한 액세스 제한

  • 사용자가 프로덕션 인스턴스를 제외하고 개발 및 테스트 인스턴스를 삭제하도록 허용합니다.

  • 사용자가 특정 날짜 또는 특정 시간에 관리 작업을 수행하도록 허용합니다.

사용자가 특정 인스턴스에 연결하도록 허용

사용자 또는 서비스 계정에 특정 Cloud SQL 인스턴스 하나에만 연결할 수 있는 권한을 부여한다고 가정해 보겠습니다. IAM 정책 바인딩에서 계정에 Cloud SQL 역할의 권한을 부여하는 IAM 조건을 포함할 수 있습니다.

기본적으로 사전 정의된 Cloud SQL 클라이언트 역할(roles/cloudsql.client)은 cloudsql.instances.connect 권한을 포함하며, 해당 구성원이 프로젝트에 있는 모든 Cloud SQL 인스턴스에 연결하도록 승인합니다. 정책 바인딩에 IAM 조건을 도입하여 이름이 지정된 인스턴스에만 권한을 부여할 수 있습니다.

콘솔

이 예시에서는 서비스 계정에 특정 인스턴스에 대한 Cloud SQL 클라이언트 역할을 부여하도록 프로젝트에 대해 기존 IAM binding을 수정하는 방법을 보여줍니다.

이 예시에서는 다음 변수가 사용됩니다.

  • PROJECT_ID: Google Cloud 프로젝트입니다.
  • INSTANCE_ID: 액세스를 부여하려는 인스턴스의 이름입니다.

  1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

    IAM으로 이동

  2. 추가를 클릭합니다.
  3. 새 구성원 입력 상자에 서비스 계정 이메일을 입력합니다.
  4. 역할 드롭다운 목록에서 Cloud SQL 클라이언트 역할을 선택합니다.
  5. 조건 추가를 클릭합니다.
  6. 제목과 설명을 입력합니다.
  7. 조건 편집기 탭을 선택합니다.
  8. 조건 작성 도구 섹션에서 다음을 수행합니다.
    • 조건 유형 - 리소스 - 이름에 대해projects/PROJECT_ID/instances/INSTANCE_ID를 입력합니다.
    • AND 조건부가 선택되었는지 확인합니다.
    • 조건 유형 - 리소스 - 서비스에 대해 sqladmin.googleapis.com을 선택합니다.
  9. 저장을 클릭하여 조건을 저장합니다.
  10. 저장을 클릭하여 정책을 저장합니다.

gcloud

이 예시에서는 특정 서비스 계정에 하지만 특정 인스턴스에 대해서만 Cloud SQL 클라이언트 역할을 부여하도록 프로젝트에 대해 기존 IAM 정책 binding을 수정하는 방법을 보여줍니다.

이 예시에서는 다음 변수가 사용됩니다.

  • PROJECT_ID: Google Cloud 프로젝트입니다.
  • INSTANCE_ID: 액세스를 부여하려는 인스턴스의 이름입니다.
  • SERVICE_ACCOUNT_EMAIL: 액세스를 수정하려는 서비스 계정의 전체 이메일 주소입니다.

  1. 기존 IAM 정책 바인딩을 가져오고 이를 bindings.json 파일에 출력합니다.
  2. gcloud projects get-iam-policy PROJECT_ID --format=json > bindings.json
    
  3. bindings.json 파일에 다음 조건부 역할 결합을 추가합니다.
    {
      "bindings": [
        {
          "role": "roles/cloudsql.client",
          "members": [
            "serviceAccount:SERVICE_ACCOUNT_EMAIL"
          ],
          "condition": {
            "expression": "resource.name == 'projects/PROJECT_ID/instances/INSTANCE_ID'
              && resource.service == 'sqladmin.googleapis.com'"
          }
        }
      ],
      "etag": "BwWKmjvelug=",
      "version": 3
    }
    
  4. IAM 정책을 새 bindings.json 파일로 업데이트합니다.
    gcloud projects set-iam-policy PROJECT_ID bindings.json
    

Terraform

사용자가 특정 인스턴스에 연결하도록 허용하려면 Terraform google_iam_policy 데이터 리소스google_project_iam_policyTerraform 리소스를 사용합니다.

data "google_iam_policy" "sql_iam_policy" {
  binding {
    role = "roles/cloudsql.client"
    members = [
      "serviceAccount:${google_project_service_identity.gcp_sa_cloud_sql.email}",
    ]
    condition {
      expression  = "resource.name == 'projects/${data.google_project.project.project_id}/instances/${google_sql_database_instance.default.name}' && resource.type == 'sqladmin.googleapis.com/Instance'"
      title       = "created"
      description = "Cloud SQL instance creation"
    }
  }
}

resource "google_project_iam_policy" "project" {
  project     = data.google_project.project.project_id
  policy_data = data.google_iam_policy.sql_iam_policy.policy_data
}

변경사항 적용

Google Cloud 프로젝트에 Terraform 구성을 적용하려면 다음 섹션의 단계를 완료하세요.

Cloud Shell 준비

  1. Cloud Shell을 실행합니다.
  2. Terraform 구성을 적용할 기본 Google Cloud 프로젝트를 설정합니다.

    이 명령어는 프로젝트당 한 번만 실행하면 되며 어떤 디렉터리에서도 실행할 수 있습니다.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 구성 파일에서 명시적 값을 설정하면 환경 변수가 재정의됩니다.

디렉터리 준비

각 Terraform 구성 파일에는 자체 디렉터리(루트 모듈이라고도 함)가 있어야 합니다.

  1. Cloud Shell에서 디렉터리를 만들고 해당 디렉터리 내에 새 파일을 만드세요. 파일 이름에는 .tf 확장자가 있어야 합니다(예: main.tf). 이 튜토리얼에서는 파일을 main.tf라고 합니다.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 튜토리얼을 따라 하는 경우 각 섹션이나 단계에서 샘플 코드를 복사할 수 있습니다.

    샘플 코드를 새로 만든 main.tf에 복사합니다.

    필요한 경우 GitHub에서 코드를 복사합니다. 이는 Terraform 스니펫이 엔드 투 엔드 솔루션의 일부인 경우에 권장됩니다.

  3. 환경에 적용할 샘플 매개변수를 검토하고 수정합니다.
  4. 변경사항을 저장합니다.
  5. Terraform을 초기화합니다. 이 작업은 디렉터리당 한 번만 수행하면 됩니다.
    terraform init

    원하는 경우 최신 Google 공급업체 버전을 사용하려면 -upgrade 옵션을 포함합니다.

    terraform init -upgrade

변경사항 적용

  1. 구성을 검토하고 Terraform에서 만들거나 업데이트할 리소스가 예상과 일치하는지 확인합니다.
    terraform plan

    필요에 따라 구성을 수정합니다.

  2. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 Terraform 구성을 적용합니다.
    terraform apply

    Terraform에 '적용 완료' 메시지가 표시될 때까지 기다립니다.

  3. 결과를 보려면 Google Cloud 프로젝트를 엽니다. Google Cloud 콘솔에서 UI의 리소스로 이동하여 Terraform이 리소스를 만들었거나 업데이트했는지 확인합니다.

변경사항 삭제

변경사항을 삭제하려면 다음 단계를 따르세요.

  1. Terraform 구성 파일에서 삭제 보호를 사용 중지하려면 deletion_protection 인수를 false로 설정합니다.
    deletion_protection =  "false"
  2. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 업데이트된 Terraform 구성을 적용합니다.
    terraform apply
  1. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 이전에 Terraform 구성에 적용된 리소스를 삭제합니다.

    terraform destroy

테스트 인스턴스의 백업 작업에 대한 액세스 제한

모든 테스트 인스턴스가 test 프리픽스(예: test-instance-1)를 가지고 모든 프로덕션 인스턴스가 prod 프리픽스(예: prod-instance-1)를 가지도록 서비스의 토폴로지가 구성되었다고 가정해 보겠습니다.

백업 작업에 대한 액세스를 사용자 또는 서비스 계정의 테스트 인스턴스로 제한할 수 있습니다. 액세스 제한에는 CREATE, GET, LIST 또는 DELETE 작업을 테스트 인스턴스의 백업으로 제한하는 것이 포함됩니다.

콘솔

  1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

    IAM으로 이동

  2. 기본 탭을 클릭합니다.
  3. 액세스를 제한하려는 사용자의 이메일 주소 또는 서비스 계정(주 구성원)을 찾습니다.
  4. 주 구성원 오른쪽의 주 구성원 수정 아이콘을 클릭합니다. 이 아이콘은 연필 모양입니다.
  5. 권한 수정 대화상자에서 다른 역할 추가를 클릭합니다.
  6. 후속 대화상자의 필터 필드에 Cloud SQL Admin을 입력합니다. 그런 다음 표시되는 Cloud SQL 관리자 역할을 선택합니다.

    권한 수정 대화상자가 활성화되었으며 이제 Cloud SQL 관리자 역할이 대화상자에 표시됩니다.

  7. Cloud SQL 관리자 역할 오른쪽에서 조건 추가 링크를 클릭합니다.
  8. 조건 수정 대화상자에서 다음 정보를 입력합니다.
    1. 제목 필드에 테스트 인스턴스의 백업 작업에 대한 액세스를 제한하기 위해 추가할 조건의 이름을 입력합니다. 예를 들어 Limit access to backup operations를 입력할 수 있습니다.
    2. 조건 편집기 탭을 클릭한 후 다음 조건을 추가합니다.

      resource.type == "sqladmin.googleapis.com/BackupRun" && 
      resource.name.startsWith("projects/PROJECT_ID/instances/test")
          

  9. 저장을 클릭합니다.
  10. 권한 수정 대화상자에서 저장을 클릭합니다.

gcloud

이 예시에서는 다음 변수가 사용됩니다.

  • PROJECT_ID: Google Cloud 프로젝트입니다.
  • USER_EMAIL: 사용자의 이메일 주소입니다.
  • SERVICE_ACCOUNT_EMAIL: 액세스를 제한하려는 서비스 계정의 전체 이메일 주소입니다.

  1. 이메일 주소가 USER_EMAIL인 사용자를 위한 cloudsql.admin 역할 범위를 제한합니다.

    역할 범위는 projects/PROJECT_ID/instances/test로 시작하는 리소스 이름이 있는 리소스로 제한됩니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \ --member=user:USER_EMAIL \
    --role=roles/cloudsql.admin \
    --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
        
  2. 또는

  3. cloudsql.admin 역할 범위를 SERVICE_ACCOUNT_EMAIL의 서비스 계정으로 로그인한 사용자로 제한합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
    --role=roles/cloudsql.admin \
    --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
        

사용자가 테스트 인스턴스를 삭제할 수 있지만 프로덕션 인스턴스를 삭제할 수 없음

서비스 계정에서 테스트 인스턴스를 삭제하지만 프로덕션 인스턴스를 삭제하지 못하도록 허용한다고 가정해 보겠습니다. 태그를 사용하고 서비스 계정에 다음 두 가지 정책 binding을 추가하여 이를 수행할 수 있습니다.

  • 역할을 부여한 리소스와 하위 요소에 대한 Cloud SQL 편집자 역할. 프로젝트에 부여되면 역할은 프로젝트의 모든 인스턴스에 적용됩니다. Cloud SQL 편집자 역할에는 cloudsql.instances.delete 권한이 없습니다.
  • test 태그가 있는 인스턴스에 대한 Cloud SQL 관리자 역할

콘솔

  1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

    IAM으로 이동

  2. 추가를 클릭합니다.
  3. 새 구성원 필드에 서비스 계정 이메일을 입력합니다.
  4. 역할 드롭다운 목록을 클릭하고 Cloud SQL 편집자 역할을 선택합니다. 이 역할에 더 이상 아무 것도 추가하지 않습니다.
  5. 저장을 클릭하여 조건을 저장합니다.
  6. 동일한 계정의 역할 메뉴를 클릭하고 Cloud Cloud SQL 관리자 역할을 선택합니다.
  7. 조건 추가를 클릭합니다.
  8. 제목과 설명을 입력합니다.
  9. 조건 편집기 탭을 선택합니다.
  10. 조건 작성 도구 섹션에서 다음을 수행합니다.
    • 조건 유형 - 리소스 - 이름에 조건 이름을 입력합니다.
    • 조건 유형 - 리소스 - 서비스에 대해 sqladmin.googleapis.com을 선택합니다.
    • 조건 유형 - 리소스 - 태그에 태그 키 네임스페이스 이름을 입력합니다. 이 예시에서 연산자matches이고 값은 815471563813/env/test입니다.
  11. 저장을 클릭하여 조건을 저장합니다.
  12. 저장을 클릭하여 정책을 저장합니다.

gcloud

이 예시에서는 다음 변수가 사용됩니다.

  • PROJECT_ID: Google Cloud 프로젝트입니다.
  • INSTANCE_ID: Cloud SQL 인스턴스입니다.
  • REGION: Cloud SQL 인스턴스가 있는 리전입니다.
  • ORGANIZATION_ID: 이 태그 키의 상위 리소스가 될 조직의 ID입니다(예: 12345678901). 조직 ID를 가져오는 방법은 조직 만들기 및 관리를 참조하세요.
  • SERVICE_ACCOUNT_EMAIL: 액세스를 수정하려는 서비스 계정의 전체 이메일 주소입니다.

  1. `prod` 및 `test` 태그 값으로 `env`라는 태그 키를 만듭니다. 자세한 내용은 새 태그 만들기 및 정의를 참조하세요.
    gcloud alpha resource-manager tags keys create env \
    --parent=organizations/ORGANIZATION_ID
    gcloud alpha resource-manager tags values create prod \
    --parent=env
    gcloud alpha resource-manager tags values create test \
    --parent=env
        
  2. 값이 `test`인 `env` 태그를 테스트 환경 Cloud SQL 인스턴스에 연결합니다. 자세한 내용은 Cloud SQL 태그 페이지를 참조하세요.
  3. gcloud alpha resource-manager tags bindings create \
    --tag-value=test \
    --parent=//sqladmin.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID \
    --location=REGION
      
  4. 기존 IAM 정책 바인딩을 가져오고 이를 bindings.json 파일에 출력합니다.
    gcloud projects get-iam-policy PROJECT_ID --format=json >> bindings.json
    
  5. bindings.json 파일에 다음 조건부 binding을 추가합니다.
    {
      "bindings": [
        {
          "role": "roles/cloudsql.editor",
          "members": [
              "serviceAccount:SERVICE_ACCOUNT_EMAIL"
            ]
        },
        {
          "role": "roles/cloudsql.admin",
          "members": [
              "serviceAccount:SERVICE_ACCOUNT_EMAIL"
            ],
          "condition": {
            "expression": "resource.matchTag('ORGANIZATION_ID/env', 'test')"
          }
        }
      ],
      "etag": "BwWKmjvelug="
      "version": 3
    }
    
  6. IAM 정책 binding을 새 bindings.json 파일로 업데이트합니다.
    gcloud projects set-iam-policy PROJECT_ID bindings.json