Amazon Redshift 자동 사용자 프로비저닝
Teleport v18.9Teleport는 데이터베이스에 사용자를 자동으로 생성할 수 있어, 개별 사용자 계정을 미리 만들거나 모든 사용자에게 동일한 공유 데이터베이스 계정 집합을 사용할 필요가 없습니다. 자동 사용자 프로비저닝은 Redshift Serverless와 호환되지 않습니다.
Teleport는 데이터베이스에 사용자를 자동으로 생성할 수 있어, 개별 사용자 계정을 미리 만들거나 모든 사용자에게 동일한 공유 데이터베이스 계정 집합을 사용할 필요가 없습니다.
전제 조건#
- Amazon Redshift 데이터베이스가 구성된 Teleport 클러스터.
- 대상 데이터베이스에 연결하고 사용자 계정을 생성할 수 있는 권한.
자동 사용자 프로비저닝은 Redshift Serverless와 호환되지 않습니다.
1/3단계. 데이터베이스 관리자 구성#
Teleport는 관리자 사용자로 연결할 때 일반 사용자 연결과 동일한 인증 메커니즘(IAM 인증)을 사용합니다.
관리자 사용자는 데이터베이스 내에서 사용자를 생성하고 권한을 부여할 수 있는 권한이 있어야 합니다. 또한 사용자 프로세스 및 역할 할당을 모니터링할 수 있는 권한도 있어야 합니다:
CREATE USER "teleport-admin" WITH PASSWORD DISABLE;
GRANT ROLE "sys:superuser" TO "teleport-admin";
Teleport가 생성한 사용자는 데이터베이스에서 teleport-auto-user 역할이 할당되며, 해당 역할이 존재하지 않으면 자동으로 생성됩니다.
다음으로, Teleport 데이터베이스 구성에서 데이터베이스 관리자 사용자를 구성합니다:
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 Database
Service 구성을 사용하여 데이터베이스를 구성한 경우 db_service.databases 구성의
항목을 편집하세요.
자동으로 검색된 클라우드 데이터베이스의 경우 관리자 사용자의 이름은
teleport.dev/db-admin 레이블에서 가져옵니다.
2/3단계. Teleport 역할 구성#
데이터베이스 내에서 사용자에게 할당할 데이터베이스 역할을 지정하려면
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 사용자와 동일한 사용자 이름을 갖습니다.
teleport-auto-user역할이 할당됩니다.- 데이터베이스와 일치하는 Teleport 사용자의 역할 집합에서 모든 역할이 할당됩니다. 역할 이름은 유효하고 데이터베이스에 존재해야 합니다.
동일한 이름의 사용자가 이미 데이터베이스에 존재하고 Teleport에 의해 관리되지 않는
경우(즉, teleport-auto-user 역할이 할당되지 않은 경우)의 이름 충돌 상황에서는
연결이 중단된다는 점에 유의하십시오.
3/3단계. 데이터베이스에 연결#
이제 Teleport 클러스터에 로그인하고 데이터베이스에 연결합니다:
$ tsh login --proxy=teleport.example.com
$ tsh db connect --db-name <database> example
사용자 프로비저닝이 활성화된 데이터베이스에 연결할 때, 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
[Web UI를 사용하여 PostgreSQL 데이터베이스에 접근](../../connect-your-client/teleport-clients/web-ui.mdx#starting-a-database-session)할 수도 있습니다.
문제 해결#
매핑된 원격 사용자 이름 오류 사용#
원격 클러스터의 데이터베이스에 연결할 때 다음과 같은 오류가 발생할 수 있습니다:
> 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,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를 읽어봅니다.