인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
Amazon Redshift 자동 사용자 프로비저닝
Teleport는 데이터베이스에서 사용자를 자동으로 생성할 수 있어, 개별 사용자 계정을 미리 만들거나 모든 사용자에게 동일한 공유 데이터베이스 계정을 사용하는 필요성을 제거합니다.
전제 조건
- 구성된 Amazon Redshift 데이터베이스를 가진 Teleport 클러스터 v14.1.3 이상.
- 대상 데이터베이스에 연결하고 사용자 계정을 생성할 수 있는 능력.
지원되는 서비스
자동 사용자 프로비저닝은 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 데이터베이스 서비스 구성을 사용하여 데이터베이스를 설정한 경우, 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는 일치하는 데이터베이스에 대한 자동 사용자 프로비저닝을 활성화합니다.
create_db_user_mode: keep
allow:
db_labels:
"*": "*"
db_names:
- "*"
# db_roles는 데이터베이스 사용자에게 할당될 역할 목록입니다.
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.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
문제 해결
매핑된 원격 사용자 이름 오류 사용
다음 오류가 원격 클러스터의 데이터베이스에 연결할 때 발생할 수 있습니다:
> tsh db connect --db-name <database> exampleERROR: 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 라우팅을 활성화하면 tsh db connect
가 자동으로 각 연결에 대해 로컬 프록시를 시작합니다.
또는 로컬 프록시를 사용하는
Teleport Connect를 통해 연결할 수 있습니다.
그렇지 않으면, tsh proxy db
를 사용하여 로컬 프록시를 수동으로 시작하고 로컬 프록시를 통해 연결해야 합니다.
이미 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 오류
로컬 psql
이 최신 버전의 OpenSSL과 호환되지 않을 때 다음 오류가 발생할 수 있습니다:
tsh db connect --db-user postgres --db-name postgres postgrespsql: 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를 읽으십시오.