인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
MongoDB 자동 사용자 프로비저닝
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를 읽어보세요.