Teleport는 데이터베이스에 사용자를 자동으로 생성하므로, 개별 사용자 계정을 미리 만들거나 모든 사용자가 동일한 공유 계정 세트를 사용하는 작업을 수행할 필요가 없습니다.
전제 조건
- 구성된 아마존 레드쉬프트 데이터베이스가 있는 텔레포트 클러스터 v14.1.3 이상.
- 대상 데이터베이스에서 사용자 계정을 연결하고 생성할 수 있는 능력.
자동 사용자 프로비저닝은 레드쉬프트 서버리스와 호환되지 않습니다.
1단계/3. 데이터베이스 관리자가 구성됨
텔레포트는 관리자가 사용자로 연결할 때와 같은 인증 메커니즘(IAM 인증)을 사용합니다.
관리자 사용자는 사용자 생성 및 권한 부여를 위해 데이터베이스 내에서 권한이 있어야 합니다. 관리자 사용자 또한 사용자 프로세스 및 역할 할당을 모니터링할 수 있는 권한이 있어야 합니다:
CREATE USER "teleport-admin" WITH PASSWORD DISABLE;
GRANT ROLE "sys:superuser" TO "teleport-admin";
텔레포트에 의해 생성된 사용자는 데이터베이스에서 teleport-auto-user
역할이 할당되며, 해당 역할이 존재하지 않는 경우 자동으로 생성됩니다.
그런 다음 텔레포트 데이터베이스 구성에서 데이터베이스 관리 사용자를 구성합니다:
db_service:
enabled: "yes"
databases:
- name: "example"
protocol: "postgres"
uri: "redshift-cluster-1.abcdefghijklm.us-east-1.redshift.amazonaws.com:5439"
admin_user:
name: "teleport-admin"
kind: db
version: v3
metadata:
name: example
spec:
protocol: "postgres"
uri: "redshift-cluster-1.abcdefghijklm.us-east-1.redshift.amazonaws.com:5439"
admin_user:
name: "teleport-admin"
자동 검색된 클라우드 데이터베이스의 경우 관리 사용자의 이름은 다음에서 가져옵니다
teleport.dev/db-admin
라벨.
2단계/3. 텔레포트 역할 구성
데이터베이스 내에서 사용자에게 할당해야 하는 데이터베이스 역할을 지정하려면,
db_roles
역할 옵션을 사용합니다:
kind: role
version: v7
metadata:
name: auto-db-users
spec:
options:
# create_db_user_mode enables automatic user provisioning for matching databases
create_db_user_mode: keep
allow:
db_labels:
"*": "*"
db_names:
- "*"
# db_roles is a list of roles the database user will be assigned
db_roles:
- reader
- "{{internal.db_roles}}"
- "{{external.db_roles}}"
자동 사용자 프로비저닝을 통해 사용자는 항상 자신의 Teleport 사용자 이름으로 데이터베이스에 연결하므로, 데이터베이스 사용자 프로비저닝이 활성화된 역할에 대해서는 db_users
역할 필드가 무시됩니다.
사용 가능한 프로비저닝 모드는 다음과 같습니다:
-
off
: 사용자 프로비저닝을 비활성화합니다. -
keep
: 사용자 프로비저닝을 활성화하고 세션 종료 시 사용자를 비활성화합니다. 사용자는 모든 역할이 제거되고 사용자 계정은 잠깁니다. -
best_effort_drop
: 사용자 프로비저닝을 활성화하고, 세션 종료 시 해당 사용자에게 의존하는 리소스가 없으면 사용자를 삭제합니다. 사용자가 의존하는 리소스가 있는 경우,keep
모드의 동작을 따라 사용자를 비활성화합니다.
데이터베이스 내에서 생성된 사용자는:
- 인증된 텔레포트 사용자와 동일한 사용자 이름을 가집니다.
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
문제 해결
매핑된 원격 사용자 이름 오류 사용
다음은 원격 클러스터의 데이터베이스에 연결할 때 발생할 수 있는 오류에 대한 설명입니다: 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)를 찾습니다:
SELECT pid,starttime,duration,trim(user_name) AS user,trim(query) AS query FROM stv_recents WHERE status = 'Running';
다음으로, 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
을 최신 버전으로 업그레이드하세요.
다음 단계
- GUI 데이터베이스 클라이언트를 사용하여 연결합니다.
- 역할 템플릿화에 대해 알아봅니다.
- 자동 사용자 프로비저닝 RFD를 읽습니다.