IAM 인증으로 사용자 관리

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

이 페이지에서는 IAM 데이터베이스 인증을 사용하는 사용자 또는 서비스 계정을 데이터베이스에 추가하고 이러한 사용자 및 서비스 계정을 관리하는 방법을 설명합니다. IAM 통합에 대한 자세한 내용은 IAM 데이터베이스 인증 개요를 참조하세요.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Google Cloud CLI를 설치하고 초기화합니다.
  5. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  6. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  7. Google Cloud CLI를 설치하고 초기화합니다.
  8. Cloud Key Management Service API 사용 설정

    API 사용 설정

  9. 사용자 계정에 Cloud SQL 관리자 역할이 있는지 확인합니다.

    IAM 페이지로 이동

  10. Cloud SQL 인스턴스에서 IAM 데이터베이스 인증을 사용 설정합니다.
  11. 사용자가 액세스해야 하는 데이터베이스가 포함된 각 프로젝트에 대해 필요한 사용자에게 IAM 액세스 권한을 부여해야 합니다. 리소스에 대한 액세스 권한 부여, 변경, 취소를 참조하세요.
  12. 프로젝트의 데이터베이스에 대해 액세스가 필요한 각 서비스에 대해 서비스 계정을 추가했는지 확인합니다.

데이터베이스에 IAM 사용자 또는 서비스 계정 추가

데이터베이스 인스턴스에 액세스하려는 각 IAM 사용자에 대해 새 데이터베이스 사용자를 만들어야 합니다. 데이터베이스 사용자 이름은 IAM 사용자의 이메일 주소(예: test-user@gmail.com)여야 합니다.

REST 명령어를 사용할 때 특수문자(@.)가 포함되어 있으므로 사용자 이름에 따옴표를 사용해야 합니다.

서비스 계정에는 service-account-name@project-id.iam.gserviceaccount.com 형식이 사용됩니다.

IAM 사용자 또는 서비스 계정을 추가하려면 새 데이터베이스 사용자를 추가하고 IAM을 인증 방법으로 선택합니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.

    Cloud SQL 인스턴스로 이동

  2. 인스턴스의 개요 페이지를 열려면 인스턴스 이름을 클릭합니다.
  3. SQL 탐색 메뉴에서 사용자를 선택합니다.
  4. 사용자 계정 추가를 클릭합니다. instance_name인스턴스에 사용자 계정 추가 탭이 열립니다.
  5. Cloud IAM 라디오 버튼을 클릭합니다.
  6. 주 구성원 필드에 추가하려는 사용자나 서비스 계정의 이메일 주소를 추가합니다.
  7. 추가를 클릭합니다. 이제 사용자가 사용자 목록에 추가되었습니다.
  8. 사용자가 Cloud SQL 인스턴스 사용자 역할에 할당되지 않은 경우 사용자 이름 왼쪽에 triangle 아이콘이 표시됩니다.

    사용자에게 로그인 권한을 부여하려면 아이콘을 클릭한 후 IAM 역할 추가를 선택합니다. 아이콘이 더 이상 표시되지 않습니다. 이제 사용자가 역할의 구성원입니다.

gcloud

사용자 계정 만들기

test-user@gmail.com과 같은 이메일을 사용하여 사용자를 식별합니다.

다음을 바꿉니다.

  • USERNAME: 사용자의 이메일 주소입니다.
  • INSTANCE_NAME: 사용자에게 액세스를 승인하려는 인스턴스의 이름입니다.
gcloud sql users create USERNAME \
--instance=INSTANCE_NAME \
--type=cloud_iam_user

서비스 계정 만들기

다음을 바꿉니다.

  • SERVICE_ACCT: 서비스 계정의 이메일 주소입니다.
  • INSTANCE_NAME: 서비스 계정이 액세스하도록 승인할 인스턴스의 이름입니다.
gcloud sql users create SERVICE_ACCT \
--instance=INSTANCE_NAME \
--type=cloud_iam_service_account

REST v1

사용자 계정 만들기

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: 프로젝트 ID
  • instance-id: 사용자를 추가할 인스턴스의 인스턴스 ID
  • username: 사용자의 이메일 주소
  • operation-id: 작업의 ID

HTTP 메서드 및 URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/users

JSON 요청 본문:

{
  "name": "username",
  "type": "CLOUD_IAM_USER"
  }

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

서비스 계정 만들기

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • service-acct: 서비스 계정 이메일
  • project-id: 프로젝트 ID
  • instance-id: 서비스 계정을 추가할 인스턴스의 인스턴스 ID
  • operation-id: 작업의 ID

HTTP 메서드 및 URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/users

JSON 요청 본문:

{
    "name": "service-acct"
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

REST v1beta4

사용자 계정 만들기

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: 프로젝트 ID
  • instance-id: 사용자를 추가할 인스턴스의 인스턴스 ID
  • username: 사용자의 이메일 주소
  • operation-id: 작업의 ID

HTTP 메서드 및 URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

JSON 요청 본문:

{
  "name": "username",
  "type": "CLOUD_IAM_USER"
  }

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

서비스 계정 만들기

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • service-acct: 서비스 계정 이메일
  • project-id: 프로젝트 ID
  • instance-id: 서비스 계정을 추가할 인스턴스의 인스턴스 ID
  • operation-id: 작업의 ID

HTTP 메서드 및 URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

JSON 요청 본문:

{
    "name": "service-acct"
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "operationType": "CREATE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

IAM 사용자에게 데이터베이스 권한 부여

IAM 사용자가 데이터베이스 인스턴스에 추가되면 기본적으로 해당 새 사용자에게는 데이터베이스에 대한 권한이 부여되지 않습니다.

사용자 또는 서비스 계정이 데이터베이스에 연결되면 PUBLIC으로 액세스 권한이 부여된 모든 데이터베이스 객체에 대해 쿼리를 실행할 수 있습니다.

추가 액세스 권한이 필요한 경우 GRANT 문을 사용하여 추가 권한을 부여할 수 있습니다. 사용자 및 서비스 계정에 부여할 수 있는 전체 권한 목록은 GRANT 참조 페이지를 참조하세요. 명령줄에서 GRANT를 실행합니다.

다음을 바꿉니다.

  • USERNAME: 사용자의 이메일 주소입니다. 특수문자(@.)가 포함되어 있으므로 이메일을 따옴표로 묶어야 합니다.
  • TABLE_NAME: 사용자에게 액세스 권한을 부여할 테이블의 이름입니다.
    grant select on TABLE_NAME to "USERNAME";
    

데이터베이스에서 IAM 사용자 또는 사용자 계정 삭제

데이터베이스에서 사용자 또는 서비스 계정을 삭제하려면 인스턴스에서 계정을 삭제합니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.

    Cloud SQL 인스턴스로 이동

  2. 인스턴스의 개요 페이지를 열려면 인스턴스 이름을 클릭합니다.
  3. SQL 탐색 메뉴에서 사용자를 선택합니다.
  4. 삭제할 사용자에 대하여 를 클릭합니다.
  5. 삭제를 선택합니다. 이렇게 하면 이 인스턴스에 대한 액세스만 취소됩니다.

gcloud

사용자 취소하기

test-user@gmail.com과 같은 이메일을 사용하여 사용자를 식별합니다.

다음을 바꿉니다.

  • USERNAME: @도메인 이름이 없는 이메일 주소입니다.
  • INSTANCE_NAME: 사용자를 삭제할 인스턴스의 이름입니다.
gcloud sql users delete USERNAME \
--instance=INSTANCE_NAME

서비스 계정 삭제

다음을 바꿉니다.

  • SERVICE_ACCT: 서비스 계정의 이메일 주소입니다.
  • INSTANCE_NAME: 사용자를 삭제할 인스턴스의 이름.
gcloud sql users delete SERVICE_ACCT \
--instance=INSTANCE_NAME

REST v1beta4

아래 요청은 users:delete 메서드를 사용하여 지정된 사용자 계정을 삭제합니다.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: 프로젝트 ID
  • instance-id: 원하는 인스턴스 ID
  • username: 사용자 또는 서비스 계정의 이메일 주소

HTTP 메서드 및 URL:

DELETE https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users?host=&name=username

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:38:41.217Z",
  "startTime": "2020-02-07T22:38:41.217Z",
  "endTime": "2020-02-07T22:38:44.801Z",
  "operationType": "DELETE_USER",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

감사 로그에서 로그인 정보 보기

감사 로그를 사용 설정하여 데이터베이스에 대한 IAM 로그인을 캡처할 수 있습니다. 로그인 문제가 있으면 감사 로그를 사용해 문제를 진단할 수 있습니다.

참고: 감사 로깅을 사용하면 추가 비용이 발생합니다. 자세한 내용은 데이터 로깅 가격 책정을 참조하세요.

구성되면 로그 탐색기를 사용하여 성공한 로그인의 데이터 액세스 감사 로그를 볼 수 있습니다.

예를 들어 로그에 다음과 비슷한 정보가 포함될 수 있습니다.

{
 insertId: "..."
 logName: "projects/.../logs/cloudaudit.googleapis.com%2Fdata_access"
 protoPayload: {
  @type: "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {
   principalEmail: "..."
  }
  authorizationInfo: [
   0: {
    granted: true
    permission: "cloudsql.instances.login"
    resource: "instances/..."
    resourceAttributes: {
    }
   }
  ]
  methodName: "cloudsql.instances.login"
  request: {
   @type: "type.googleapis.com/google.cloud.sql.authorization.v1.InstancesLoginRequest"
   clientIpAddress: "..."
   database: "..."
   databaseSessionId: ...
   instance: "projects/.../locations/us-central1/instances/..."
   user: "..."
  }
  requestMetadata: {
   callerIp: "..."
   destinationAttributes: {
   }
   requestAttributes: {
    auth: {
    }
    time: "..."
   }
  }
  resourceName: "instances/..."
  serviceName: "cloudsql.googleapis.com"
  status: {
  }
 }
 receiveTimestamp: "..."
 resource: {
  labels: {
   database_id: "...:..."
   project_id: "..."
   region: "us-central"
  }
  type: "cloudsql_database"
 }
 severity: "INFO"
 timestamp: "..."
}

로그인 실패 문제 해결

로그인 시도가 실패하면 PostgreSQL이 보안을 위해 최소한의 오류 메시지를 반환합니다. 예를 들면 다음과 같습니다.

PGPASSWORD=not-a-password psql --host=... --username=... --dbname=...
psql: error: could not connect to server: FATAL:  Cloud SQL IAM user authentication failed for user "..."
FATAL:  pg_hba.conf rejects connection for host "...", user "...", database "...", SSL off

PostgreSQL 오류 로그에서 오류에 대한 세부정보를 검토할 수 있습니다. 자세한 내용은 로그 보기를 참조하세요.

예를 들어 이전 오류의 경우 다음 로그 항목에 문제 해결을 위해 수행할 수 있는 작업이 설명되어 있습니다.

F ... [152172]: [1-1] db=...,user=... FATAL:  Cloud SQL IAM user authentication failed for user "..."
I ... [152172]: [2-1] db=...,user=... DETAIL:  Request is missing required authentication credential. Expected OAuth 2 access token, log in cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.

표시된 오류 메시지를 확인합니다. 메시지에 사용자가 'Cloud SQL IAM 사용자 인증' 또는 'Cloud SQL IAM 서비스 계정 인증'을 사용한 것으로 표시되지 않으면 로그인에 사용된 데이터베이스 사용자 유형이 CLOUD_IAM_USER 또는 CLOUD_IAM_SERVICE_ACCOUNT인지 확인합니다. Google Cloud 콘솔 또는 gcloud sql users list 명령어를 사용하여 이를 확인할 수 있습니다. IAM 사용자의 경우 데이터베이스 사용자 이름이 IAM 사용자의 이메일인지 확인합니다.

IAM 데이터베이스 인증을 사용한 경우 오류 메시지의 세부정보를 확인합니다. 데이터베이스 오류 로그에서 오류 메시지를 찾을 수 있습니다. 비밀번호로 전송한 액세스 토큰(OAuth 2.0)이 잘못된 것으로 표시된 경우, gcloud auth application-default print-access-token gcloud 명령어를 사용하여 다음과 같이 토큰 세부정보를 찾을 수 있습니다.

curl -H "Content-Type: application/x-www-form-urlencoded" \
-d "access_token=$(gcloud auth application-default print-access-token)" \
https://www.googleapis.com/oauth2/v1/tokeninfo

토큰이 원하는 IAM 사용자 또는 서비스 계정을 위한 것이고 만료되지 않았는지 확인합니다.

세부정보에 권한이 없다고 표시되는 경우 인스턴스 프로젝트의 IAM 정책에서 사전 정의된 Cloud SQL Instance User 역할 또는 커스텀 역할을 사용하여 IAM 사용자 또는 서비스 계정에 cloudsql.instances.login 권한이 부여되었는지 확인합니다. 추가 도움이 필요하면 IAM 정책 문제 해결 도구를 사용하세요.

IAM 데이터베이스 인증을 사용할 수 없어서 로그인이 실패한 경우에는 기본 PostgreSQL 사용자 및 비밀번호를 사용하여 로그인할 수 있습니다. 이 로그인 방법을 사용해도 사용자가 전체 데이터베이스에 액세스할 수 있습니다. 연결이 보안 연결인지 확인합니다.

다음 단계