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: 액세스를 부여하려는 인스턴스의 이름입니다.
- 
Google Cloud 콘솔에서 서비스 계정 페이지로 이동합니다. 
- 추가를 클릭합니다.
- 새 구성원 입력 상자에 서비스 계정 이메일을 입력합니다.
- 역할 드롭다운 목록에서 Cloud SQL 클라이언트 역할을 선택합니다.
- 조건 추가를 클릭합니다.
- 제목과 설명을 입력합니다.
- 조건 편집기 탭을 선택합니다.
- 조건 작성 도구 섹션에서 다음을 수행합니다.- 조건 유형 - 리소스 - 이름에 대해projects/PROJECT_ID/instances/INSTANCE_ID를 입력합니다.
- AND 조건부가 선택되었는지 확인합니다.
- 조건 유형 - 리소스 - 서비스에 대해 sqladmin.googleapis.com을 선택합니다.
 
- 조건 유형 - 리소스 - 이름에 대해
- 저장을 클릭하여 조건을 저장합니다.
- 저장을 클릭하여 정책을 저장합니다.
gcloud
이 예시에서는 특정 서비스 계정에 하지만 특정 인스턴스에 대해서만 Cloud SQL 클라이언트 역할을 부여하도록 프로젝트에 대해 기존 IAM 정책 binding을 수정하는 방법을 보여줍니다.
이 예시에서는 다음 변수가 사용됩니다.
- PROJECT_ID: 내 Google Cloud 프로젝트입니다.
- INSTANCE_ID: 액세스를 부여하려는 인스턴스의 이름입니다.
- SERVICE_ACCOUNT_EMAIL: 액세스를 수정하려는 서비스 계정의 전체 이메일 주소입니다.
- 기존 IAM 정책 바인딩을 가져오고 이를 bindings.json파일에 출력합니다.
- 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 } 
- IAM 정책을 새 bindings.json파일로 업데이트합니다.gcloud projects set-iam-policy PROJECT_ID bindings.json 
gcloud projects get-iam-policy PROJECT_ID --format=json > bindings.json
Terraform
사용자가 특정 인스턴스에 연결하도록 허용하려면 Terraform google_iam_policy 데이터 리소스 및 google_project_iam_policyTerraform 리소스를 사용합니다.
      
변경사항 적용
Google Cloud 프로젝트에 Terraform 구성을 적용하려면 다음 섹션의 단계를 완료하세요.
Cloud Shell 준비
- Cloud Shell을 실행합니다.
- 
    Terraform 구성을 적용할 기본 Google Cloud 프로젝트를 설정합니다. 이 명령어는 프로젝트당 한 번만 실행하면 되며 어떤 디렉터리에서도 실행할 수 있습니다. export GOOGLE_CLOUD_PROJECT=PROJECT_ID Terraform 구성 파일에서 명시적 값을 설정하면 환경 변수가 재정의됩니다. 
디렉터리 준비
각 Terraform 구성 파일에는 자체 디렉터리(루트 모듈이라고도 함)가 있어야 합니다.
- 
    Cloud Shell에서 디렉터리를 만들고 해당 디렉터리 내에 새 파일을 만드세요. 파일 이름에는 .tf확장자가 있어야 합니다(예:main.tf). 이 튜토리얼에서는 파일을main.tf라고 합니다.mkdir DIRECTORY && cd DIRECTORY && touch main.tf 
- 
    튜토리얼을 따라 하는 경우 각 섹션이나 단계에서 샘플 코드를 복사할 수 있습니다. 샘플 코드를 새로 만든 main.tf에 복사합니다.필요한 경우 GitHub에서 코드를 복사합니다. 이는 Terraform 스니펫이 엔드 투 엔드 솔루션의 일부인 경우에 권장됩니다. 
- 환경에 적용할 샘플 파라미터를 검토하고 수정합니다.
- 변경사항을 저장합니다.
- 
    Terraform을 초기화합니다. 이 작업은 디렉터리당 한 번만 수행하면 됩니다.
    terraform init 원하는 경우 최신 Google 공급업체 버전을 사용하려면 -upgrade옵션을 포함합니다.terraform init -upgrade 
변경사항 적용
- 
    구성을 검토하고 Terraform에서 만들거나 업데이트할 리소스가 예상과 일치하는지 확인합니다.
    terraform plan 필요에 따라 구성을 수정합니다. 
- 
    다음 명령어를 실행하고 프롬프트에 yes를 입력하여 Terraform 구성을 적용합니다.terraform apply Terraform에 '적용 완료' 메시지가 표시될 때까지 기다립니다. 
- 결과를 보려면 Google Cloud 프로젝트를 엽니다. Google Cloud 콘솔에서 UI의 리소스로 이동하여 Terraform이 리소스를 만들었거나 업데이트했는지 확인합니다.
변경사항 삭제
변경사항을 삭제하려면 다음 단계를 따르세요.
- Terraform 구성 파일에서 삭제 보호를 사용 중지하려면 deletion_protection인수를false로 설정합니다.deletion_protection = "false" 
- 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 업데이트된 Terraform 구성을 적용합니다.terraform apply 
- 
             다음 명령어를 실행하고 프롬프트에 yes를 입력하여 이전에 Terraform 구성에 적용된 리소스를 삭제합니다.terraform destroy 
테스트 인스턴스의 백업 작업에 대한 액세스 제한
모든 테스트 인스턴스가 test 프리픽스(예: test-instance-1)를 가지고 모든 프로덕션 인스턴스가 prod 프리픽스(예: prod-instance-1)를 가지도록 서비스의 토폴로지가 구성되었다고 가정해 보겠습니다.
백업 작업에 대한 액세스를 사용자 또는 서비스 계정의 테스트 인스턴스로 제한할 수 있습니다. 액세스 제한에는 CREATE, GET, LIST 또는 DELETE 작업을 테스트 인스턴스의 백업으로 제한하는 것이 포함됩니다.
콘솔
- 
Google Cloud 콘솔에서 서비스 계정 페이지로 이동합니다. 
- 기본 탭을 클릭합니다.
- 액세스를 제한하려는 사용자의 이메일 주소 또는 서비스 계정(주 구성원)을 찾습니다.
- 주 구성원 오른쪽의 주 구성원 수정 아이콘을 클릭합니다. 이 아이콘은 연필 모양입니다.
- 권한 수정 대화상자에서 다른 역할 추가를 클릭합니다.
- 후속 대화상자의 필터 필드에 - Cloud SQL Admin을 입력합니다. 그런 다음 표시되는 Cloud SQL 관리자 역할을 선택합니다.- 권한 수정 대화상자가 활성화되었으며 이제 Cloud SQL 관리자 역할이 대화상자에 표시됩니다. 
- Cloud SQL 관리자 역할 오른쪽에서 조건 추가 링크를 클릭합니다.
- 조건 수정 대화상자에서 다음 정보를 입력합니다.- 제목 필드에 테스트 인스턴스의 백업 작업에 대한 액세스를 제한하기 위해 추가할 조건의 이름을 입력합니다. 예를 들어 Limit access to backup operations를 입력할 수 있습니다.
- 조건 편집기 탭을 클릭한 후 다음 조건을 추가합니다. - resource.type == "sqladmin.googleapis.com/BackupRun" && resource.name.startsWith("projects/PROJECT_ID/instances/test") 
 
- 제목 필드에 테스트 인스턴스의 백업 작업에 대한 액세스를 제한하기 위해 추가할 조건의 이름을 입력합니다. 예를 들어 
- 저장을 클릭합니다.
- 권한 수정 대화상자에서 저장을 클릭합니다.
gcloud
이 예시에서는 다음 변수가 사용됩니다.
- PROJECT_ID: 내 Google Cloud 프로젝트입니다.
- USER_EMAIL: 사용자의 이메일 주소입니다.
- SERVICE_ACCOUNT_EMAIL: 액세스를 제한하려는 서비스 계정의 전체 이메일 주소입니다.
- 
      이메일 주소가 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" 
- 
      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 관리자 역할
콘솔
- 
Google Cloud 콘솔에서 서비스 계정 페이지로 이동합니다. 
- 추가를 클릭합니다.
- 새 구성원 필드에 서비스 계정 이메일을 입력합니다.
- 역할 드롭다운 목록을 클릭하고 Cloud SQL 편집자 역할을 선택합니다. 이 역할에 더 이상 아무 것도 추가하지 않습니다.
- 저장을 클릭하여 조건을 저장합니다.
- 동일한 계정의 역할 메뉴를 클릭하고 Cloud Cloud SQL 관리자 역할을 선택합니다.
- 조건 추가를 클릭합니다.
- 제목과 설명을 입력합니다.
- 조건 편집기 탭을 선택합니다.
- 조건 작성 도구 섹션에서 다음을 수행합니다.- 조건 유형 - 리소스 - 이름에 조건 이름을 입력합니다.
- 조건 유형 - 리소스 - 서비스에 대해 sqladmin.googleapis.com을 선택합니다.
- 조건 유형 - 리소스 - 태그에 태그 키 네임스페이스 이름을 입력합니다. 이 예시에서 연산자는 matches이고 값은815471563813/env/test입니다.
 
- 저장을 클릭하여 조건을 저장합니다.
- 저장을 클릭하여 정책을 저장합니다.
gcloud
이 예시에서는 다음 변수가 사용됩니다.
- PROJECT_ID: 내 Google Cloud 프로젝트입니다.
- INSTANCE_ID: Cloud SQL 인스턴스입니다.
- REGION: Cloud SQL 인스턴스가 있는 리전입니다.
- ORGANIZATION_ID: 이 태그 키의 상위 리소스가 될 조직의 ID입니다(예: 12345678901). 조직 ID를 가져오는 방법은 조직 만들기 및 관리를 참조하세요.
- SERVICE_ACCOUNT_EMAIL: 액세스를 수정하려는 서비스 계정의 전체 이메일 주소입니다.
- `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 
- 값이 `test`인 `env` 태그를 테스트 환경 Cloud SQL 인스턴스에 연결합니다. 자세한 내용은 Cloud SQL 태그 페이지를 참조하세요.
- 기존 IAM 정책 바인딩을 가져오고 이를 bindings.json파일에 출력합니다.gcloud projects get-iam-policy PROJECT_ID --format=json >> bindings.json 
- 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 } 
- IAM 정책 binding을 새 bindings.json파일로 업데이트합니다.gcloud projects set-iam-policy PROJECT_ID bindings.json 
gcloud alpha resource-manager tags bindings create \ --tag-value=test \ --parent=//sqladmin.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID \ --location=REGION