Infograb logo
PostgreSQL 자동 사용자 프로비저닝

Teleport는 데이터베이스에 사용자를 자동으로 생성하므로, 개별 사용자 계정을 미리 만들거나 모든 사용자가 동일한 공유 계정 세트를 사용하는 작업을 수행할 필요가 없습니다.

필수 조건

  • 구성된 자체 호스팅 PostgreSQL 또는 RDS PostgreSQL 데이터베이스가 있는 Teleport 클러스터 v13.1 이상.
  • 대상 데이터베이스에 연결하고 사용자 계정을 생성할 수 있는 능력.
RDS 호환성

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

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

텔레포트는 다음을 생성할 수 있는 사용자로서 데이터베이스에 연결할 수 있어야 합니다 다른 사용자를 지정하고 역할을 할당합니다. 별도의 사용자를 생성하는 것이 좋습니다 텔레포트 자동 사용자 프로비저닝을 위해 특별히 지정되었습니다 teleport 관리자.

Teleport는 관리자 사용자로 연결할 때 일반 사용자 연결과 동일한 인증 메커니즘(X.509는 자체 호스팅 데이터베이스용, AWS IAM은 RDS용)을 사용합니다. 관리자 사용자는 데이터베이스 내에서 사용자 생성 및 권한 부여를 위한 권한이 있어야 합니다.

RDS PostgreSQL 관리자 사용자에게 IAM 인증을 허용하려면 rds_iam 역할이 첨부되어 있어야 합니다:

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

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

정확한 사용을 위해 AWS 문서를 참조하십시오.

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

CREATE USER "teleport-admin" login createrole;

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

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

구성이 올바른지 확인하려면 자체 호스팅 PostgreSQL 가이드를 참조하십시오.

`teleport-admin`에 대한 데이터베이스 액세스 제어

데이터베이스 액세스 제어 기능이 사용되는 경우 teleport-admin은 관련 데이터베이스 객체에 대한 권한을 가져야 합니다. 예:

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

Teleport로 생성된 사용자들은 데이터베이스 내 teleport-auto-user 그룹에 배치되며, 그룹이 존재하지 않으면 자동으로 생성됩니다.

다음으로, Teleport 데이터베이스 구성에서 데이터베이스 관리자 사용자를 설정하세요:

db_service:
  enabled: "yes"
  databases:
  - name: "example"
    protocol: "postgres"
    uri: "localhost:5432"
    admin_user:
      name: "teleport-admin"
      # Optional default database the admin user logs into. Default is
      # 사용자가 액세스하는 동일한 데이터베이스, if not specified.
      # default_database: 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
    # 사용자가 액세스하는 동일한 데이터베이스, if not specified.
    # default_database: teleport
Auto-discovered databases

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

PostgreSQL 15+의 프로시저 권한

PostgreSQL 15에서는 데이터베이스 소유자를 제외한 모든 사용자로부터 공용(또는 기본) 스키마의 CREATE 권한이 철회되었습니다. 관리자 사용자에게 CREATE 권한을 부여하여 절차를 생성할 수 있도록 하려면 다음 SQL 명령어를 사용하세요:

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

admin_user.default_database가 지정된 경우, CREATE 권한은 지정된 default_database에 대해서만 필요합니다. 그렇지 않으면 Teleport가 액세스할 모든 데이터베이스에 대해 권한 부여를 반복해야 합니다.

2단계/3. Teleport 역할 구성

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

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

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

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

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

  • best_effort_drop: 사용자 프로비저닝을 활성화하고, 세션 종료 시 해당 사용자에게 의존하는 리소스가 없으면 사용자를 삭제합니다. 사용자가 의존하는 리소스가 있는 경우, keep 모드의 동작을 따라 사용자를 비활성화합니다.

사용자가 데이터베이스 내에서 할당되어야 하는 데이터베이스 역할을 지정하려면 db_roles 역할 옵션을 사용합니다:

kind: role
version: v7
metadata:
  name: auto-db-users
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}}"

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

필수 Teleport 버전: v15.2 이상입니다.

사용자 역할에서 spec.allow.db_permissions 섹션을 사용하여 사용자가 가져야 하는 객체 권한을 지정합니다.

kind: role
metadata:
  name: read_all_tables
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

데이터베이스 객체에 대해 사용자 정의 레이블을 정의할 수 있으며, 이를 사용자 정의 가져오기 규칙을 기반으로 적용할 수 있습니다. 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
데이터베이스 사용자 이름

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

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

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

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

tsh db connect --db-name <database> --db-roles reader example

이제 Teleport 클러스터에 로그인하고 데이터베이스에 연결하세요:

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

문제 해결

스키마 공개에 대한 권한 거부 오류

PostgreSQL 15에서는 데이터베이스 소유자를 제외한 모든 사용자로부터 공용(또는 기본) 스키마의 CREATE 권한이 철회되었습니다. 관리자 사용자에게 CREATE 권한을 부여하여 절차를 생성할 수 있도록 하려면 다음 SQL 명령어를 사용하세요:

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

admin_user.default_database가 지정된 경우, CREATE 권한은 지정된 default_database에 대해서만 필요합니다. 그렇지 않으면 Teleport가 액세스할 모든 데이터베이스에 대해 권한 부여를 반복해야 합니다.

사용자에게 연결 권한이 없음 오류

관리자 사용자나 자동으로 프로비저닝된 사용자에게 할당된 역할이 대상 데이터베이스에 연결할 권한이 없을 때 다음과 같은 오류가 발생할 수 있습니다:

$ tsh db connect --db-name <database> example
...
FATAL: <database> 데이터베이스에 대한 권한 거부
DETAIL: 사용자에게 연결 권한이 없습니다.

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: 읽기 전용 트랜잭션에서 CREATE ROLE을 실행할 수 없습니다 (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: 생성할 스키마가 선택되지 않았습니다 (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: 다른 사용자에 대한 "rds_iam" 역할을 부여할 권한이 없음 (SQLSTATE 42501)

이는 관리자 사용자에게 다른 사용자에게 "rds_iam" 역할을 부여할 권한이 없을 때 발생합니다. 이를 해결하려면 관리자 사용자에게 "rds_iam" 역할을 ADMIN 옵션으로 부여하십시오:

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

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

다음은 원격 클러스터의 데이터베이스에 연결할 때 발생할 수 있는 오류에 대한 설명입니다: cluster:

> 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 클라이언트를 통해 연결할 때 오류 메시지에 표시된 사용자 이름을 데이터베이스 사용자 이름으로 사용해야 합니다[2][3].

쿼리를 취소할 수 없습니다

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

만약 당신이 Teleport에서 TLS 라우팅을 활성화하면 tsh db connect는 모든 연결에 대해 자동으로 로컬 프록시를 시작합니다. 대안으로, 로컬 프록시를 사용하는 Teleport Connect를 통해 연결할 수 있습니다. 그렇지 않으면 tsh proxy db를 사용하여 수동으로 tsh 로컬 프록시를 시작하고 로컬 프록시를 통해 연결해야 합니다.

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

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

{{ PIDQuery }}

다음으로, 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 블루/그린 배포가 "복제 손상" 상태로 들어감

자동 사용자 프로비저닝을 사용하여 데이터베이스에 연결할 때 Amazon RDS 블루/그린 배포가 "복제 손상" 상태로 들어갈 수 있습니다.

이는 PostgreSQL 논리 복제의 제한으로 인해 데이터 정의 언어(DDL) 문이 복제될 수 없기 때문입니다. 결과적으로, DDL 변경이 감지되면 Amazon RDS는 "복제 손상" 상태에 들어갑니다.

블루/그린 배포를 시작하기 전에 데이터베이스 자동 사용자 프로비저닝을 비활성화하는 것이 좋습니다.

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

자동 사용자 프로비저닝이 비활성화되면, 여전히 Teleport를 통해 데이터베이스 관리자 사용자로 연결할 수 있습니다.

다음 단계

  • GUI 데이터베이스 클라이언트를 사용하여 연결합니다.
  • 역할 템플릿화에 대해 알아봅니다.
  • 자동 사용자 프로비저닝 RFD를 읽습니다.
  • 데이터베이스 권한 관리 RFD를 읽습니다.
  • 본 가이드에서 설명한 internal.db_roles 특성은 Teleport 로컬 사용자 데이터베이스의 값으로 대체됩니다. Teleport 역할에서 변수 확장이 작동하는 방법에 대한 전체 세부 정보는 Teleport 액세스 제어 참조를 참조하십시오.
Teleport 원문 보기