Teleport는 데이터베이스에 사용자를 자동으로 생성하므로, 개별 사용자 계정을 미리 만들거나 모든 사용자가 동일한 공유 계정 세트를 사용하는 작업을 수행할 필요가 없습니다.
- Teleport 클러스터 v14.3 이상.
- Teleport 클러스터에 등록된 자체 호스팅 MongoDB 데이터베이스. 다음의 Teleport 문서를 따라 데이터베이스를 등록하는 방법을 알아보세요.
- 대상 데이터베이스에서 사용자 계정을 연결하고 생성할 수 있는 능력.
자동 사용자 프로비저닝은 MongoDB Atlas와 호환되지 않습니다.
1단계/3. 데이터베이스 관리자를 구성합니다.
Teleport는 관리자로 연결할 때 일반 사용자 연결과 동일한 인증 메커니즘(X.509)을 사용합니다.
관리자는 사용자 및 권한을 생성할 수 있는 데이터베이스 내의 권한을 가져야 합니다. 관리자는 또한 사용자 연결을 모니터링할 수 있는 권한을 가져야 합니다.
먼저 admin
데이터베이스에서 다음 권한으로 역할을 생성합니다:
db.getSiblingDB("admin").runCommand({
createRole: "teleport-admin-role",
privileges: [
{ resource: { cluster: true }, actions: [ "inprog" ] },
{ resource: { db: "", collection: "" }, actions: [ "grantRole", "revokeRole" ] },
{ resource: { db: "$external", "collection": "" }, actions: [ "createUser", "updateUser", "dropUser", "viewUser", "setAuthenticationRestriction", "changeCustomData"] },
],
roles: [],
})
위 예제에서는 grantRole
권한이 모든 데이터베이스에 대해 관리 사용자에게 부여되어, 관리 사용자가 admin
데이터베이스를 포함한 모든 데이터베이스의 역할을 할당할 수 있습니다.
최소 권한 원칙을 적용하기 위해, grantRole
을 자동 프로비저닝된 사용자에게 할당할 역할이 있는 데이터베이스로만 제한할 수 있습니다:
db.getSiblingDB("admin").runCommand({
createRole: "teleport-admin-role",
privileges: [
{ resource: { cluster: true }, actions: [ "inprog" ] },
{ resource: { db: "", collection: "" }, actions: [ "revokeRole" ] },
{ resource: { db: "$external", "collection": "" }, actions: [ "createUser", "updateUser", "dropUser", "viewUser", "setAuthenticationRestriction", "changeCustomData"] },
{ resource: { db: "<db1>", collection: "" }, actions: [ "grantRole" ] },
{ resource: { db: "<db2>", collection: "" }, actions: [ "grantRole" ] },
...
],
roles: [],
})
이제 이 역할로 관리 사용자를 생성합니다:
db.getSiblingDB("$external").runCommand({
createUser: "CN=teleport-admin",
roles: [ { role: 'teleport-admin-role', db: 'admin' } ],
})
그런 다음 텔레포트 데이터베이스 구성에서 데이터베이스 관리 사용자를 구성합니다:
db_service:
enabled: "yes"
databases:
- name: "example"
protocol: "mongodb"
uri: "localhost:27017"
admin_user:
name: "teleport-admin"
kind: db
version: v3
metadata:
name: example
spec:
protocol: "mongodb"
uri: "localhost:27017"
admin_user:
name: "teleport-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:
- "readAnyDatabase@admin"
- "readWrite@db1"
- "myCustomRole@db2"
- "{{internal.db_roles}}"
- "{{external.db_roles}}"
자동 사용자 프로비저닝을 통해 사용자는 항상 자신의 Teleport 사용자 이름으로 데이터베이스에 연결하므로, 데이터베이스 사용자 프로비저닝이 활성화된 역할에 대해서는 db_users
역할 필드가 무시됩니다.
사용 가능한 프로비저닝 모드는 다음과 같습니다:
-
off
: 사용자 프로비저닝을 비활성화합니다. -
keep
: 사용자 프로비저닝을 활성화하고 세션 종료 시 사용자를 비활성화합니다. 사용자는 모든 역할이 제거되고 사용자 계정은 잠깁니다. -
best_effort_drop
: 사용자 프로비저닝을 활성화하고, 세션 종료 시 해당 사용자에게 의존하는 리소스가 없으면 사용자를 삭제합니다. 사용자가 의존하는 리소스가 있는 경우,keep
모드의 동작을 따라 사용자를 비활성화합니다.
데이터베이스 내에서 생성된 사용자들은:
- 인증된 Teleport 사용자와 동일한 사용자 이름을 가집니다.
- 사용자
customData
에teleport-auto-user
가true
로 설정됩니다. - 데이터베이스와 일치하는 Teleport 사용자의 역할 세트에서 모든 역할이 할당됩니다. 역할 이름은 유효해야 하며 데이터베이스에 존재해야 합니다.
3단계/3. 데이터베이스에 연결하기
이제 Teleport 클러스터에 로그인하고 데이터베이스에 연결하세요:
tsh login --proxy=teleport.example.comtsh db connect --db-name <database> example
사용자 프로비저닝이 활성화된 데이터베이스에 연결할 때, 데이터베이스 서비스는 Teleport 사용자 이름을 데이터베이스 사용자 이름으로 사용할 것으로 예상합니다.
MongoDB Compass 와 같은 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 myCustomRole@db2 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].
다음 단계
- MongoDB의 내장 역할 및 사용자 정의 역할에 대해 더 알아보세요.
- GUI 데이터베이스 클라이언트를 사용하여 연결하세요.
- 역할 템플릿에 대해 알아보세요.
- 자동 사용자 프로비저닝 RFD를 읽어보세요.