InfoGrab DocsInfoGrab Docs

PostgreSQL 자동 사용자 프로비저닝

요약

Teleport는 데이터베이스에 사용자를 자동으로 생성할 수 있어, 개별 사용자 계정을 미리 만들거나 모든 사용자에게 동일한 공유 데이터베이스 계정 집합을 사용할 필요가 없습니다. 자동 사용자 프로비저닝은 RDS Aurora 리더 엔드포인트와 호환되지 않습니다.

Teleport는 데이터베이스에 사용자를 자동으로 생성할 수 있어, 개별 사용자 계정을 미리 만들거나 모든 사용자에게 동일한 공유 데이터베이스 계정 집합을 사용할 필요가 없습니다.

전제 조건#

  • 셀프 호스팅 PostgreSQL 또는 RDS PostgreSQL 데이터베이스가 구성된 Teleport 클러스터. 테이블과 같은 데이터베이스 객체에 대한 권한을 구성하려면 클러스터가 v15.2 이상이어야 합니다.
  • 대상 데이터베이스에 연결하고 사용자 계정을 생성할 수 있는 권한.
RDS 호환성

자동 사용자 프로비저닝은 RDS Aurora 리더 엔드포인트와 호환되지 않습니다.

1/3단계. 데이터베이스 관리자 구성#

Teleport는 다른 사용자를 생성하고 역할을 할당할 수 있는 사용자로 데이터베이스에 연결할 수 있어야 합니다. Teleport 자동 사용자 프로비저닝 전용으로 별도의 사용자를 생성하는 것을 권장합니다. 여기서는 이를 teleport-admin이라고 부르겠습니다.

Teleport는 관리자 사용자로 연결할 때 일반 사용자 연결과 동일한 인증 메커니즘을 사용합니다: 셀프 호스팅 데이터베이스의 경우 X.509, RDS의 경우 AWS IAM. 관리자 사용자는 역할이나 구체적인 데이터베이스 객체에 대해 사용자를 생성하고 권한을 부여할 수 있는 권한이 데이터베이스 내에 있어야 합니다.

RDS PostgreSQL 관리자 사용자는 IAM 인증을 허용하기 위해 rds_iam 역할이 연결되어 있어야 합니다:

CREATE USER "teleport-admin" login createrole;
GRANT rds_iam TO "teleport-admin" WITH ADMIN OPTION;

RDS 데이터베이스에서 IAM 인증이 활성화되어 있어야 합니다.

rds_iam 역할을 올바르게 사용하고 있는지 확인하려면 AWS 문서를 참조하세요.

관리자 사용자가 자동 프로비저닝된 사용자에게 rds_superuser 역할을 부여해야 하는 경우, 관리자 사용자도 rds_superuser여야 합니다:

GRANT rds_superuser TO "teleport-admin";

PostgreSQL 16+의 경우, Teleport가 Teleport 사용자에게 할당할 각 PostgreSQL 역할에 대해 관리자 사용자에게 ADMIN 옵션을 부여해야 합니다. 예를 들어, 관리자 사용자가 reader 역할을 부여하고 취소할 수 있도록 하려면:

GRANT reader TO "teleport-admin" WITH ADMIN OPTION;

셀프 호스팅 PostgreSQL 관리자 사용자는 X.509 인증이 구성되어 있어야 합니다.

CREATE USER "teleport-admin" login createrole;

PostgreSQL 16+의 경우, Teleport가 Teleport 사용자에게 할당할 각 PostgreSQL 역할에 대해 관리자 사용자에게 ADMIN 옵션을 부여해야 합니다. 예를 들어, 관리자 사용자가 reader 역할을 부여하고 취소할 수 있도록 하려면:

GRANT reader TO "teleport-admin" WITH ADMIN OPTION;

데이터베이스는 pg_hba.conf에 다음 항목을 추가하여 관리자 사용자에 대한 클라이언트 인증서 인증을 수락하도록 구성되어야 합니다:

hostssl all             all             ::/0                    cert
hostssl all             all             0.0.0.0/0               cert

구성이 올바른지 확인하려면 셀프 호스팅 PostgreSQL 가이드를 참조하세요.

`teleport-admin`에 대한 데이터베이스 접근 제어

데이터베이스 접근 제어 기능을 사용하는 경우, teleport-admin은 관련 데이터베이스 객체에 대한 권한이 있어야 합니다. 셀프 호스팅 데이터베이스의 경우 teleport-admin에게 SUPERUSER 옵션을, RDS 데이터베이스의 경우 rds_superuser 역할을 부여할 수 있습니다.

최소 권한 원칙을 통한 보안 향상을 위해 특정 데이터베이스 객체에 직접 권한을 할당할 수도 있습니다. 예를 들어:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA schema1, schema2, schema3 TO "teleport-admin";

Teleport가 생성한 사용자는 데이터베이스에서 teleport-auto-user 그룹에 배치되며, 해당 그룹이 존재하지 않으면 자동으로 생성됩니다.

다음으로, Teleport 데이터베이스 구성에서 데이터베이스 관리자 사용자를 구성합니다:

kind: db
version: v3
metadata:
  name: example
spec:
  protocol: "postgres"
  uri: "localhost:5432"
  admin_user:
    name: "teleport-admin"
    # Optional default database the admin user logs into. Default is
    # the same database that the user is accessing, if not specified.
    # default_database: teleport

이 예제는 데이터베이스를 동적 리소스로 구성했다고 가정합니다. 정적 Teleport Database Service 구성을 사용하여 데이터베이스를 구성한 경우 db_service.databases 구성의 항목을 편집하세요.

자동으로 검색된 클라우드 데이터베이스의 경우 관리자 사용자의 이름은 teleport.dev/db-admin 레이블에서 가져오고, 기본 데이터베이스는 teleport.dev/db-admin-default-database 레이블에서 가져옵니다.

2/3단계. Teleport 역할 구성#

데이터베이스 권한은 Teleport 역할과 연관되어 있으며, 각 데이터베이스에서 구성된 미리 정의된 데이터베이스 역할을 할당하거나 특정 데이터베이스 객체 권한을 직접 정의할 수 있습니다. Teleport는 연결 기간 동안 이러한 권한을 부여합니다.

자동 사용자 프로비저닝에서는 사용자가 항상 자신의 Teleport 사용자 이름으로 데이터베이스에 연결하므로, 데이터베이스 사용자 프로비저닝이 활성화된 역할에서는 db_users 역할 필드가 무시됩니다.

사용 가능한 프로비저닝 모드는 다음과 같습니다:

  • off: 사용자 프로비저닝을 비활성화합니다.

  • keep: 사용자 프로비저닝을 활성화하고 세션이 종료될 때 사용자를 비활성화합니다. 사용자는 모든 역할이 제거되고 사용자 계정이 잠깁니다.

  • best_effort_drop: 사용자 프로비저닝을 활성화하며, 세션이 종료될 때 사용자에 의존하는 리소스가 없으면 사용자를 삭제합니다. 사용자에 의존하는 리소스가 있는 경우에는 keep 모드의 동작을 따라 사용자를 비활성화하는 방식으로 대체됩니다.

사용자가 데이터베이스 내에서 할당받아야 할 데이터베이스 역할을 지정하려면 db_roles 역할 옵션을 사용합니다. 아래 역할을 생성하려면 다음 내용으로 db-user-creator.yaml이라는 파일을 여세요:

kind: role
version: v7
metadata:
  name: db-user-creator
spec:
  options:
    # create_db_user_mode는 일치하는 데이터베이스에 대한 자동 사용자 프로비저닝을 활성화합니다
    create_db_user_mode: keep
  allow:
    db_labels:
      "*": "*"
    db_names:
    - "*"
    # db_roles는 데이터베이스 사용자에게 할당될 역할 목록입니다
    db_roles:
    - reader
    - "{{internal.db_roles}}"
    - "{{external.db_roles}}"

역할을 생성합니다:

$ tctl create -f db-user-creator.yaml

프로비저닝된 데이터베이스 사용자에게는 데이터베이스와 일치하는 Teleport 사용자의 역할 집합에서 모든 역할이 할당됩니다. 역할 이름은 유효하고 데이터베이스에 존재해야 합니다. 데이터베이스 역할을 생성하는 방법에 대한 정보는 PostgreSQL CREATE ROLE을 참조하세요.

필요한 Teleport 버전: v15.2 이상.

사용자 역할에서 spec.allow.db_permissions 섹션을 사용하여 해당 사용자가 가져야 할 객체 권한을 지정합니다. 아래 역할을 생성하려면 다음 내용으로 all-table-reader.yaml이라는 파일을 여세요:

kind: role
metadata:
  name: all-table-reader
spec:
  options:
    # create_db_user_mode는 일치하는 데이터베이스에 대한 자동 사용자 프로비저닝을 활성화합니다
    create_db_user_mode: keep
  allow:
    db_labels:
      '*': '*'
    db_names:
    - '*'
    db_permissions:
    # public 스키마의 모든 테이블에 `SELECT` 권한을 부여합니다.
    - match:
        # 매칭할 객체 레이블
        object_kind: table
        schema: public
      permissions:
      - SELECT
version: v7

역할을 생성합니다:

$ tctl create -f all-table-reader.yaml

데이터베이스 객체에 대한 사용자 정의 레이블을 정의하고 사용자 지정 가능한 가져오기 규칙을 기반으로 적용할 수 있습니다. owner 또는 environment와 같은 이러한 사용자 정의 레이블은 권한을 부여할 때 활용할 수 있습니다.

자세한 정보는 데이터베이스 접근 제어 페이지를 참조하세요.

데이터베이스 내에서 생성된 사용자는 다음과 같이 설정됩니다:

  • 인증된 Teleport 사용자와 동일한 사용자 이름을 갖습니다.
  • teleport-auto-user 역할의 일부가 됩니다.
  • 선택한 메커니즘에 따라 권한이 할당됩니다.

동일한 이름의 사용자가 이미 데이터베이스에 존재하고 Teleport에 의해 관리되지 않는 경우(즉, teleport-auto-user 역할이 할당되지 않은 경우)의 이름 충돌 상황에서는 연결이 중단된다는 점에 유의하십시오.

3/3단계. 데이터베이스에 연결#

이제 Teleport 클러스터에 로그인하고 데이터베이스에 연결합니다:

$ tsh login --proxy=teleport.example.com
$ tsh db connect --db-name <database> example
Note

사용자 프로비저닝이 활성화된 데이터베이스에 연결할 때, Database Service는 Teleport 사용자 이름이 데이터베이스 사용자 이름으로 사용될 것으로 예상합니다.

pgAdmin와 같은 GUI 데이터베이스 클라이언트를 사용하는 경우, 반드시 Teleport 사용자 이름을 데이터베이스 사용자 이름으로 사용하십시오. tsh db connect는 사용자 프로비저닝이 활성화된 데이터베이스에 연결할 때 자동으로 Teleport 사용자 이름을 기본값으로 사용합니다.

사용자 프로비저닝이 활성화된 리프 클러스터 데이터베이스에 연결할 때, Database Service는 데이터베이스 사용자 이름이 remote-<your-teleport-username>-<root-cluster-name> 형식일 것으로 예상합니다.

각 데이터베이스에 대해 허용된 데이터베이스 역할 목록을 보려면 tsh db ls -v 명령을 사용할 수 있습니다. 기본적으로 모든 데이터베이스 역할이 자동 프로비저닝된 데이터베이스 사용자에게 할당됩니다. --db-roles를 사용하여 데이터베이스 역할의 하위 집합을 선택적으로 지정할 수 있습니다:

$ tsh db connect --db-name <database> --db-roles reader example
Tip
[Web UI를 사용하여 PostgreSQL 데이터베이스에 접근](../../connect-your-client/teleport-clients/web-ui.mdx#starting-a-database-session)할 수도 있습니다.

문제 해결#

사용자가 CONNECT 권한을 가지고 있지 않음 오류#

관리자 사용자 또는 자동 프로비저닝된 사용자에게 할당된 역할이 대상 데이터베이스에 연결할 권한이 없는 경우 다음 오류가 발생할 수 있습니다:

$ tsh db connect --db-name <database> example
...
FATAL: permission denied for database "<database>"
DETAIL: User does not have CONNECT privilege.

관리자 사용자와 해당 역할에 CONNECT가 부여되어 있는지 확인하세요:

GRANT CONNECT ON DATABASE <database> to "teleport-admin";
GRANT CONNECT ON DATABASE <database> to "reader";

읽기 전용 트랜잭션에서 실행할 수 없음 오류#

Amazon RDS Aurora 리더 엔드포인트에 연결할 때 다음과 같은 오류가 발생할 수 있습니다:

$ tsh db connect --db-name <database> example
psql: error: connection to server at "localhost" (::1), port 12345 failed: Connection refused
...
ERROR: cannot execute CREATE ROLE in a read-only transaction (SQLSTATE 25006)

데이터베이스 자동 사용자 프로비저닝은 RDS Aurora 리더 엔드포인트와 호환되지 않습니다. 기본 엔드포인트에서 자동 사용자 프로비저닝을 사용하세요.

스키마가 선택되지 않음 오류#

관리자 사용자가 스키마에 대한 USAGE 권한이 없는 경우 연결 시 다음 오류가 발생할 수 있습니다:

$ tsh db connect --db-name <database> example
psql: error: connection to server at "localhost" (::1), port 12345 failed: Connection refused
...
ERROR: no schema has been selected to create in (SQLSTATE 3F000)

이 문제를 해결하려면 관리자 사용자가 대상 데이터베이스의 public 스키마에 대한 USAGECREATE 권한이 부여되어 있는지 확인하세요:

GRANT USAGE ON SCHEMA public TO "teleport-admin";
GRANT CREATE ON SCHEMA public TO "teleport-admin";

"rds_iam" 역할 부여 권한 거부#

RDS 데이터베이스에 연결할 때 다음과 같은 오류가 발생할 수 있습니다:

$ tsh db connect --db-name <database> example
psql: error: connection to server at "localhost" (::1), port 12345 failed: Connection refused
...
ERROR: permission denied to grant role "rds_iam" (SQLSTATE 42501)

이는 관리자 사용자가 다른 사용자에게 "rds_iam" 역할을 부여할 권한이 없을 때 발생합니다. 이 문제를 해결하려면 관리자 사용자에게 ADMIN 옵션과 함께 "rds_iam" 역할을 부여하세요:

GRANT rds_iam TO "teleport-admin" WITH ADMIN OPTION;

매핑된 원격 사용자 이름 오류 사용#

원격 클러스터의 데이터베이스에 연결할 때 다음과 같은 오류가 발생할 수 있습니다:

> tsh db connect --db-name <database> example
ERROR: please use your mapped remote username ("remote-<your-teleport-username>-<root-cluster-name>") to connect instead of "<database-user>"

원격 클러스터의 리소스에 액세스하면 원격 클러스터는 로컬 클러스터로부터 remote-<your-teleport-username>-<root-cluster-name>라는 이름을 받습니다. 이는 원격 클러스터의 사용자와 이름이 충돌하는 것을 방지하기 위함입니다. tsh 또는 GUI 클라이언트를 통해 연결할 때는 오류 메시지에 표시된 사용자 이름을 데이터베이스 사용자 이름으로 사용하십시오.

쿼리를 취소할 수 없음#

psql과 같은 PostgreSQL CLI 클라이언트를 사용하여 Ctrl+C로 쿼리를 취소하려고 했으나 쿼리가 취소되지 않는다면, 대신 tsh 로컬 프록시를 사용하여 연결해야 합니다. psql이 쿼리를 취소할 때는 TLS 인증서 없이 새 연결을 설정하지만, Teleport는 인증 뿐만 아니라 데이터베이스 연결을 라우팅하는 데에도 TLS 인증서를 필요로 합니다.

Teleport에서 TLS Routing을 활성화 하면 tsh db connect가 모든 연결에 대해 로컬 프록시를 자동으로 시작합니다. 또는 마찬가지로 로컬 프록시를 사용하는 Teleport Connect를 통해 연결할 수도 있습니다. 그 외의 경우에는 tsh proxy db를 사용하여 tsh 로컬 프록시를 수동으로 시작하고 로컬 프록시를 통해 연결해야 합니다.

Ctrl+C로 취소할 수 없는 장기 실행 쿼리를 psql 세션에서 이미 시작한 경우, 새 클라이언트 세션을 시작하여 해당 쿼리를 수동으로 취소할 수 있습니다:

먼저 쿼리의 프로세스 식별자(PID)를 찾습니다:

SELECT pid,usename,backend_start,query FROM pg_stat_activity WHERE state = 'active';

다음으로, PID를 사용하여 쿼리를 정상적으로 취소합니다. 이는 해당 쿼리의 postgres 백엔드 프로세스에 SIGINT 시그널을 보냅니다:

SELECT pg_cancel_backend(<PID>);

항상 먼저 쿼리를 정상적으로 종료하려고 시도해야 하지만, 정상적인 취소가 너무 오래 걸린다면 대신 쿼리를 강제로 종료할 수 있습니다. 이는 해당 쿼리의 postgres 백엔드 프로세스에 SIGTERM 시그널을 보냅니다:

SELECT pg_terminate_backend(<PID>);

pg_cancel_backendpg_terminate_backend 함수에 대한 자세한 내용은 PostgreSQL 문서의 관리 함수를 참조하십시오.

SSL SYSCALL error#

로컬 psql이 최신 버전의 OpenSSL과 호환되지 않는 경우 다음과 같은 오류가 발생할 수 있습니다:

$ tsh db connect --db-user postgres --db-name postgres postgres
psql: error: connection to server at "localhost" (::1), port 12345 failed: Connection refused
    Is the server running on that host and accepting TCP/IP connections?
connection to server at "localhost" (127.0.0.1), port 12345 failed: SSL SYSCALL error: Undefined error: 0

로컬 psql을 최신 버전으로 업그레이드하십시오.

Amazon RDS Blue/Green 배포가 "복제 저하" 상태로 진입#

자동 사용자 프로비저닝을 사용하여 데이터베이스에 연결할 때 Amazon RDS Blue/Green 배포가 "복제 저하" 상태로 진입할 수 있습니다.

이는 Blue/Green 배포에 대한 PostgreSQL 논리적 복제의 제한으로 인해 발생합니다. DDL(데이터 정의 언어) 문은 복제할 수 없기 때문입니다. 결과적으로 DDL 변경이 감지되면 Amazon RDS는 "복제 저하" 상태로 진입합니다.

Blue/Green 배포를 시작하기 전에 데이터베이스 자동 사용자 프로비저닝을 비활성화하는 것이 권장됩니다.

데이터베이스가 Teleport에 의해 자동 검색되는 경우, teleport.dev/db-admin AWS 리소스 태그를 일시적으로 제거할 수 있습니다. 정적 구성 또는 동적 db 리소스를 사용하여 등록된 데이터베이스의 경우, admin_user 설정을 일시적으로 제거할 수 있습니다.

자동 사용자 프로비저닝이 비활성화된 후에도 Teleport를 통해 데이터베이스 관리자 사용자로 연결할 수 있습니다.

다음 단계#

  • GUI 데이터베이스 클라이언트를 사용하여 연결합니다.
  • 역할 템플릿에 대해 알아봅니다.
  • 자동 사용자 프로비저닝 RFD를 읽어봅니다.
  • 데이터베이스 권한 관리 RFD를 읽어봅니다.
  • 이 가이드에서 설명한 internal.db_roles 특성은 Teleport 로컬 사용자 데이터베이스의 값으로 대체됩니다. Teleport 역할에서 변수 확장이 작동하는 방식에 대한 자세한 내용은 Teleport 접근 제어 참조를 참조하세요.

PostgreSQL 자동 사용자 프로비저닝

Teleport v18.9
원문 보기
요약

Teleport는 데이터베이스에 사용자를 자동으로 생성할 수 있어, 개별 사용자 계정을 미리 만들거나 모든 사용자에게 동일한 공유 데이터베이스 계정 집합을 사용할 필요가 없습니다. 자동 사용자 프로비저닝은 RDS Aurora 리더 엔드포인트와 호환되지 않습니다.

Teleport는 데이터베이스에 사용자를 자동으로 생성할 수 있어, 개별 사용자 계정을 미리 만들거나 모든 사용자에게 동일한 공유 데이터베이스 계정 집합을 사용할 필요가 없습니다.

전제 조건#

  • 셀프 호스팅 PostgreSQL 또는 RDS PostgreSQL 데이터베이스가 구성된 Teleport 클러스터. 테이블과 같은 데이터베이스 객체에 대한 권한을 구성하려면 클러스터가 v15.2 이상이어야 합니다.
  • 대상 데이터베이스에 연결하고 사용자 계정을 생성할 수 있는 권한.
RDS 호환성

자동 사용자 프로비저닝은 RDS Aurora 리더 엔드포인트와 호환되지 않습니다.

1/3단계. 데이터베이스 관리자 구성#

Teleport는 다른 사용자를 생성하고 역할을 할당할 수 있는 사용자로 데이터베이스에 연결할 수 있어야 합니다. Teleport 자동 사용자 프로비저닝 전용으로 별도의 사용자를 생성하는 것을 권장합니다. 여기서는 이를 teleport-admin이라고 부르겠습니다.

Teleport는 관리자 사용자로 연결할 때 일반 사용자 연결과 동일한 인증 메커니즘을 사용합니다: 셀프 호스팅 데이터베이스의 경우 X.509, RDS의 경우 AWS IAM. 관리자 사용자는 역할이나 구체적인 데이터베이스 객체에 대해 사용자를 생성하고 권한을 부여할 수 있는 권한이 데이터베이스 내에 있어야 합니다.

RDS PostgreSQL 관리자 사용자는 IAM 인증을 허용하기 위해 rds_iam 역할이 연결되어 있어야 합니다:

CREATE USER "teleport-admin" login createrole;
GRANT rds_iam TO "teleport-admin" WITH ADMIN OPTION;

RDS 데이터베이스에서 IAM 인증이 활성화되어 있어야 합니다.

rds_iam 역할을 올바르게 사용하고 있는지 확인하려면 AWS 문서를 참조하세요.

관리자 사용자가 자동 프로비저닝된 사용자에게 rds_superuser 역할을 부여해야 하는 경우, 관리자 사용자도 rds_superuser여야 합니다:

GRANT rds_superuser TO "teleport-admin";

PostgreSQL 16+의 경우, Teleport가 Teleport 사용자에게 할당할 각 PostgreSQL 역할에 대해 관리자 사용자에게 ADMIN 옵션을 부여해야 합니다. 예를 들어, 관리자 사용자가 reader 역할을 부여하고 취소할 수 있도록 하려면:

GRANT reader TO "teleport-admin" WITH ADMIN OPTION;

셀프 호스팅 PostgreSQL 관리자 사용자는 X.509 인증이 구성되어 있어야 합니다.

CREATE USER "teleport-admin" login createrole;

PostgreSQL 16+의 경우, Teleport가 Teleport 사용자에게 할당할 각 PostgreSQL 역할에 대해 관리자 사용자에게 ADMIN 옵션을 부여해야 합니다. 예를 들어, 관리자 사용자가 reader 역할을 부여하고 취소할 수 있도록 하려면:

GRANT reader TO "teleport-admin" WITH ADMIN OPTION;

데이터베이스는 pg_hba.conf에 다음 항목을 추가하여 관리자 사용자에 대한 클라이언트 인증서 인증을 수락하도록 구성되어야 합니다:

hostssl all             all             ::/0                    cert
hostssl all             all             0.0.0.0/0               cert

구성이 올바른지 확인하려면 셀프 호스팅 PostgreSQL 가이드를 참조하세요.

`teleport-admin`에 대한 데이터베이스 접근 제어

데이터베이스 접근 제어 기능을 사용하는 경우, teleport-admin은 관련 데이터베이스 객체에 대한 권한이 있어야 합니다. 셀프 호스팅 데이터베이스의 경우 teleport-admin에게 SUPERUSER 옵션을, RDS 데이터베이스의 경우 rds_superuser 역할을 부여할 수 있습니다.

최소 권한 원칙을 통한 보안 향상을 위해 특정 데이터베이스 객체에 직접 권한을 할당할 수도 있습니다. 예를 들어:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA schema1, schema2, schema3 TO "teleport-admin";

Teleport가 생성한 사용자는 데이터베이스에서 teleport-auto-user 그룹에 배치되며, 해당 그룹이 존재하지 않으면 자동으로 생성됩니다.

다음으로, Teleport 데이터베이스 구성에서 데이터베이스 관리자 사용자를 구성합니다:

kind: db
version: v3
metadata:
  name: example
spec:
  protocol: "postgres"
  uri: "localhost:5432"
  admin_user:
    name: "teleport-admin"
    # Optional default database the admin user logs into. Default is
    # the same database that the user is accessing, if not specified.
    # default_database: teleport

이 예제는 데이터베이스를 동적 리소스로 구성했다고 가정합니다. 정적 Teleport Database Service 구성을 사용하여 데이터베이스를 구성한 경우 db_service.databases 구성의 항목을 편집하세요.

자동으로 검색된 클라우드 데이터베이스의 경우 관리자 사용자의 이름은 teleport.dev/db-admin 레이블에서 가져오고, 기본 데이터베이스는 teleport.dev/db-admin-default-database 레이블에서 가져옵니다.

2/3단계. Teleport 역할 구성#

데이터베이스 권한은 Teleport 역할과 연관되어 있으며, 각 데이터베이스에서 구성된 미리 정의된 데이터베이스 역할을 할당하거나 특정 데이터베이스 객체 권한을 직접 정의할 수 있습니다. Teleport는 연결 기간 동안 이러한 권한을 부여합니다.

자동 사용자 프로비저닝에서는 사용자가 항상 자신의 Teleport 사용자 이름으로 데이터베이스에 연결하므로, 데이터베이스 사용자 프로비저닝이 활성화된 역할에서는 db_users 역할 필드가 무시됩니다.

사용 가능한 프로비저닝 모드는 다음과 같습니다:

  • off: 사용자 프로비저닝을 비활성화합니다.

  • keep: 사용자 프로비저닝을 활성화하고 세션이 종료될 때 사용자를 비활성화합니다. 사용자는 모든 역할이 제거되고 사용자 계정이 잠깁니다.

  • best_effort_drop: 사용자 프로비저닝을 활성화하며, 세션이 종료될 때 사용자에 의존하는 리소스가 없으면 사용자를 삭제합니다. 사용자에 의존하는 리소스가 있는 경우에는 keep 모드의 동작을 따라 사용자를 비활성화하는 방식으로 대체됩니다.

사용자가 데이터베이스 내에서 할당받아야 할 데이터베이스 역할을 지정하려면 db_roles 역할 옵션을 사용합니다. 아래 역할을 생성하려면 다음 내용으로 db-user-creator.yaml이라는 파일을 여세요:

kind: role
version: v7
metadata:
  name: db-user-creator
spec:
  options:
    # create_db_user_mode는 일치하는 데이터베이스에 대한 자동 사용자 프로비저닝을 활성화합니다
    create_db_user_mode: keep
  allow:
    db_labels:
      "*": "*"
    db_names:
    - "*"
    # db_roles는 데이터베이스 사용자에게 할당될 역할 목록입니다
    db_roles:
    - reader
    - "{{internal.db_roles}}"
    - "{{external.db_roles}}"

역할을 생성합니다:

$ tctl create -f db-user-creator.yaml

프로비저닝된 데이터베이스 사용자에게는 데이터베이스와 일치하는 Teleport 사용자의 역할 집합에서 모든 역할이 할당됩니다. 역할 이름은 유효하고 데이터베이스에 존재해야 합니다. 데이터베이스 역할을 생성하는 방법에 대한 정보는 PostgreSQL CREATE ROLE을 참조하세요.

필요한 Teleport 버전: v15.2 이상.

사용자 역할에서 spec.allow.db_permissions 섹션을 사용하여 해당 사용자가 가져야 할 객체 권한을 지정합니다. 아래 역할을 생성하려면 다음 내용으로 all-table-reader.yaml이라는 파일을 여세요:

kind: role
metadata:
  name: all-table-reader
spec:
  options:
    # create_db_user_mode는 일치하는 데이터베이스에 대한 자동 사용자 프로비저닝을 활성화합니다
    create_db_user_mode: keep
  allow:
    db_labels:
      '*': '*'
    db_names:
    - '*'
    db_permissions:
    # public 스키마의 모든 테이블에 `SELECT` 권한을 부여합니다.
    - match:
        # 매칭할 객체 레이블
        object_kind: table
        schema: public
      permissions:
      - SELECT
version: v7

역할을 생성합니다:

$ tctl create -f all-table-reader.yaml

데이터베이스 객체에 대한 사용자 정의 레이블을 정의하고 사용자 지정 가능한 가져오기 규칙을 기반으로 적용할 수 있습니다. owner 또는 environment와 같은 이러한 사용자 정의 레이블은 권한을 부여할 때 활용할 수 있습니다.

자세한 정보는 데이터베이스 접근 제어 페이지를 참조하세요.

데이터베이스 내에서 생성된 사용자는 다음과 같이 설정됩니다:

  • 인증된 Teleport 사용자와 동일한 사용자 이름을 갖습니다.
  • teleport-auto-user 역할의 일부가 됩니다.
  • 선택한 메커니즘에 따라 권한이 할당됩니다.

동일한 이름의 사용자가 이미 데이터베이스에 존재하고 Teleport에 의해 관리되지 않는 경우(즉, teleport-auto-user 역할이 할당되지 않은 경우)의 이름 충돌 상황에서는 연결이 중단된다는 점에 유의하십시오.

3/3단계. 데이터베이스에 연결#

이제 Teleport 클러스터에 로그인하고 데이터베이스에 연결합니다:

$ tsh login --proxy=teleport.example.com
$ tsh db connect --db-name <database> example
Note

사용자 프로비저닝이 활성화된 데이터베이스에 연결할 때, Database Service는 Teleport 사용자 이름이 데이터베이스 사용자 이름으로 사용될 것으로 예상합니다.

pgAdmin와 같은 GUI 데이터베이스 클라이언트를 사용하는 경우, 반드시 Teleport 사용자 이름을 데이터베이스 사용자 이름으로 사용하십시오. tsh db connect는 사용자 프로비저닝이 활성화된 데이터베이스에 연결할 때 자동으로 Teleport 사용자 이름을 기본값으로 사용합니다.

사용자 프로비저닝이 활성화된 리프 클러스터 데이터베이스에 연결할 때, Database Service는 데이터베이스 사용자 이름이 remote-<your-teleport-username>-<root-cluster-name> 형식일 것으로 예상합니다.

각 데이터베이스에 대해 허용된 데이터베이스 역할 목록을 보려면 tsh db ls -v 명령을 사용할 수 있습니다. 기본적으로 모든 데이터베이스 역할이 자동 프로비저닝된 데이터베이스 사용자에게 할당됩니다. --db-roles를 사용하여 데이터베이스 역할의 하위 집합을 선택적으로 지정할 수 있습니다:

$ tsh db connect --db-name <database> --db-roles reader example
Tip
[Web UI를 사용하여 PostgreSQL 데이터베이스에 접근](../../connect-your-client/teleport-clients/web-ui.mdx#starting-a-database-session)할 수도 있습니다.

문제 해결#

사용자가 CONNECT 권한을 가지고 있지 않음 오류#

관리자 사용자 또는 자동 프로비저닝된 사용자에게 할당된 역할이 대상 데이터베이스에 연결할 권한이 없는 경우 다음 오류가 발생할 수 있습니다:

$ tsh db connect --db-name <database> example
...
FATAL: permission denied for database "<database>"
DETAIL: User does not have CONNECT privilege.

관리자 사용자와 해당 역할에 CONNECT가 부여되어 있는지 확인하세요:

GRANT CONNECT ON DATABASE <database> to "teleport-admin";
GRANT CONNECT ON DATABASE <database> to "reader";

읽기 전용 트랜잭션에서 실행할 수 없음 오류#

Amazon RDS Aurora 리더 엔드포인트에 연결할 때 다음과 같은 오류가 발생할 수 있습니다:

$ tsh db connect --db-name <database> example
psql: error: connection to server at "localhost" (::1), port 12345 failed: Connection refused
...
ERROR: cannot execute CREATE ROLE in a read-only transaction (SQLSTATE 25006)

데이터베이스 자동 사용자 프로비저닝은 RDS Aurora 리더 엔드포인트와 호환되지 않습니다. 기본 엔드포인트에서 자동 사용자 프로비저닝을 사용하세요.

스키마가 선택되지 않음 오류#

관리자 사용자가 스키마에 대한 USAGE 권한이 없는 경우 연결 시 다음 오류가 발생할 수 있습니다:

$ tsh db connect --db-name <database> example
psql: error: connection to server at "localhost" (::1), port 12345 failed: Connection refused
...
ERROR: no schema has been selected to create in (SQLSTATE 3F000)

이 문제를 해결하려면 관리자 사용자가 대상 데이터베이스의 public 스키마에 대한 USAGECREATE 권한이 부여되어 있는지 확인하세요:

GRANT USAGE ON SCHEMA public TO "teleport-admin";
GRANT CREATE ON SCHEMA public TO "teleport-admin";

"rds_iam" 역할 부여 권한 거부#

RDS 데이터베이스에 연결할 때 다음과 같은 오류가 발생할 수 있습니다:

$ tsh db connect --db-name <database> example
psql: error: connection to server at "localhost" (::1), port 12345 failed: Connection refused
...
ERROR: permission denied to grant role "rds_iam" (SQLSTATE 42501)

이는 관리자 사용자가 다른 사용자에게 "rds_iam" 역할을 부여할 권한이 없을 때 발생합니다. 이 문제를 해결하려면 관리자 사용자에게 ADMIN 옵션과 함께 "rds_iam" 역할을 부여하세요:

GRANT rds_iam TO "teleport-admin" WITH ADMIN OPTION;

매핑된 원격 사용자 이름 오류 사용#

원격 클러스터의 데이터베이스에 연결할 때 다음과 같은 오류가 발생할 수 있습니다:

> tsh db connect --db-name <database> example
ERROR: please use your mapped remote username ("remote-<your-teleport-username>-<root-cluster-name>") to connect instead of "<database-user>"

원격 클러스터의 리소스에 액세스하면 원격 클러스터는 로컬 클러스터로부터 remote-<your-teleport-username>-<root-cluster-name>라는 이름을 받습니다. 이는 원격 클러스터의 사용자와 이름이 충돌하는 것을 방지하기 위함입니다. tsh 또는 GUI 클라이언트를 통해 연결할 때는 오류 메시지에 표시된 사용자 이름을 데이터베이스 사용자 이름으로 사용하십시오.

쿼리를 취소할 수 없음#

psql과 같은 PostgreSQL CLI 클라이언트를 사용하여 Ctrl+C로 쿼리를 취소하려고 했으나 쿼리가 취소되지 않는다면, 대신 tsh 로컬 프록시를 사용하여 연결해야 합니다. psql이 쿼리를 취소할 때는 TLS 인증서 없이 새 연결을 설정하지만, Teleport는 인증 뿐만 아니라 데이터베이스 연결을 라우팅하는 데에도 TLS 인증서를 필요로 합니다.

Teleport에서 TLS Routing을 활성화 하면 tsh db connect가 모든 연결에 대해 로컬 프록시를 자동으로 시작합니다. 또는 마찬가지로 로컬 프록시를 사용하는 Teleport Connect를 통해 연결할 수도 있습니다. 그 외의 경우에는 tsh proxy db를 사용하여 tsh 로컬 프록시를 수동으로 시작하고 로컬 프록시를 통해 연결해야 합니다.

Ctrl+C로 취소할 수 없는 장기 실행 쿼리를 psql 세션에서 이미 시작한 경우, 새 클라이언트 세션을 시작하여 해당 쿼리를 수동으로 취소할 수 있습니다:

먼저 쿼리의 프로세스 식별자(PID)를 찾습니다:

SELECT pid,usename,backend_start,query FROM pg_stat_activity WHERE state = 'active';

다음으로, PID를 사용하여 쿼리를 정상적으로 취소합니다. 이는 해당 쿼리의 postgres 백엔드 프로세스에 SIGINT 시그널을 보냅니다:

SELECT pg_cancel_backend(<PID>);

항상 먼저 쿼리를 정상적으로 종료하려고 시도해야 하지만, 정상적인 취소가 너무 오래 걸린다면 대신 쿼리를 강제로 종료할 수 있습니다. 이는 해당 쿼리의 postgres 백엔드 프로세스에 SIGTERM 시그널을 보냅니다:

SELECT pg_terminate_backend(<PID>);

pg_cancel_backendpg_terminate_backend 함수에 대한 자세한 내용은 PostgreSQL 문서의 관리 함수를 참조하십시오.

SSL SYSCALL error#

로컬 psql이 최신 버전의 OpenSSL과 호환되지 않는 경우 다음과 같은 오류가 발생할 수 있습니다:

$ tsh db connect --db-user postgres --db-name postgres postgres
psql: error: connection to server at "localhost" (::1), port 12345 failed: Connection refused
    Is the server running on that host and accepting TCP/IP connections?
connection to server at "localhost" (127.0.0.1), port 12345 failed: SSL SYSCALL error: Undefined error: 0

로컬 psql을 최신 버전으로 업그레이드하십시오.

Amazon RDS Blue/Green 배포가 "복제 저하" 상태로 진입#

자동 사용자 프로비저닝을 사용하여 데이터베이스에 연결할 때 Amazon RDS Blue/Green 배포가 "복제 저하" 상태로 진입할 수 있습니다.

이는 Blue/Green 배포에 대한 PostgreSQL 논리적 복제의 제한으로 인해 발생합니다. DDL(데이터 정의 언어) 문은 복제할 수 없기 때문입니다. 결과적으로 DDL 변경이 감지되면 Amazon RDS는 "복제 저하" 상태로 진입합니다.

Blue/Green 배포를 시작하기 전에 데이터베이스 자동 사용자 프로비저닝을 비활성화하는 것이 권장됩니다.

데이터베이스가 Teleport에 의해 자동 검색되는 경우, teleport.dev/db-admin AWS 리소스 태그를 일시적으로 제거할 수 있습니다. 정적 구성 또는 동적 db 리소스를 사용하여 등록된 데이터베이스의 경우, admin_user 설정을 일시적으로 제거할 수 있습니다.

자동 사용자 프로비저닝이 비활성화된 후에도 Teleport를 통해 데이터베이스 관리자 사용자로 연결할 수 있습니다.

다음 단계#

  • GUI 데이터베이스 클라이언트를 사용하여 연결합니다.
  • 역할 템플릿에 대해 알아봅니다.
  • 자동 사용자 프로비저닝 RFD를 읽어봅니다.
  • 데이터베이스 권한 관리 RFD를 읽어봅니다.
  • 이 가이드에서 설명한 internal.db_roles 특성은 Teleport 로컬 사용자 데이터베이스의 값으로 대체됩니다. Teleport 역할에서 변수 확장이 작동하는 방식에 대한 자세한 내용은 Teleport 접근 제어 참조를 참조하세요.