Teleport는 데이터베이스에 사용자를 자동으로 생성하므로, 개별 사용자 계정을 미리 만들거나 모든 사용자가 동일한 공유 계정 세트를 사용하는 작업을 수행할 필요가 없습니다.
필수 조건
- 구성된 자체 호스팅 PostgreSQL 또는 RDS PostgreSQL 데이터베이스가 있는 Teleport 클러스터 v13.1 이상.
- 대상 데이터베이스에 연결하고 사용자 계정을 생성할 수 있는 능력.
자동 사용자 프로비저닝은 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
은 관련 데이터베이스 객체에 대한 권한을 가져야 합니다. 예:
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
자동으로 발견된 클라우드 데이터베이스의 경우, 관리자 사용자 이름은 teleport.dev/db-admin
레이블에서 가져오고, 기본 데이터베이스는 teleport.dev/db-admin-default-database
레이블에서 가져옵니다.
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.comtsh 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.comtsh 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
스키마에 대해 USAGE
및 CREATE
권한이 부여되었는지 확인하십시오:
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_backend
및 pg_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 액세스 제어 참조를 참조하십시오.