MongoDB 자동 사용자 프로비저닝
Teleport v18.9Teleport는 데이터베이스에 사용자를 자동으로 생성할 수 있어, 개별 사용자 계정을 미리 만들거나 모든 사용자에게 동일한 공유 데이터베이스 계정 집합을 사용할 필요가 없습니다. 자동 사용자 프로비저닝은 MongoDB Atlas와 호환되지 않습니다.
Teleport는 데이터베이스에 사용자를 자동으로 생성할 수 있어, 개별 사용자 계정을 미리 만들거나 모든 사용자에게 동일한 공유 데이터베이스 계정 집합을 사용할 필요가 없습니다.
전제 조건#
- Teleport 클러스터.
- Teleport 클러스터에 등록된 셀프 호스팅 MongoDB 데이터베이스. 데이터베이스를 등록하는 방법은
Teleport 문서를 참조하세요.
MongoDB 데이터베이스는 구성 파일에서
security.authorization을enabled로 설정하여 역할 기반 접근 제어(RBAC)가 활성화되어 있어야 합니다. - 대상 데이터베이스에 연결하고 사용자 계정을 생성할 수 있는 권한.
자동 사용자 프로비저닝은 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 액션을 특정 데이터베이스로 제한
위 예시에서 `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' } ],
})
다음으로, Teleport 데이터베이스 설정에서 데이터베이스 관리자 사용자를 구성합니다:
kind: db
version: v3
metadata:
name: example
spec:
protocol: "mongodb"
uri: "localhost:27017"
admin_user:
name: "teleport-admin"
이 예시는 데이터베이스를 동적 리소스로 구성했다고 가정합니다. 정적 Teleport
Database Service 설정을 사용하여 데이터베이스를 구성한 경우, db_service.databases
설정의 항목을
편집하십시오.
2/3단계. Teleport 역할 구성#
사용자가 데이터베이스 내에서 할당받아야 할 데이터베이스 역할을 지정하려면
db_roles 역할 옵션을 사용합니다. 아래 역할을 생성하려면 db-user-creator.yaml이라는
파일을 엽니다:
kind: role
version: v7
metadata:
name: db-user-creator
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}}"
변경 사항을 적용합니다:
$ tctl create -f db-user-creator.yaml
자동 사용자 프로비저닝에서는 사용자가 항상 자신의 Teleport 사용자 이름으로
데이터베이스에 연결하므로, 데이터베이스 사용자 프로비저닝이 활성화된 역할에서는
db_users 역할 필드가 무시됩니다.
사용 가능한 프로비저닝 모드는 다음과 같습니다:
-
off: 사용자 프로비저닝을 비활성화합니다. -
keep: 사용자 프로비저닝을 활성화하고 세션이 종료될 때 사용자를 비활성화합니다. 사용자는 모든 역할이 제거되고 사용자 계정이 잠깁니다. -
best_effort_drop: 사용자 프로비저닝을 활성화하며, 세션이 종료될 때 사용자에 의존하는 리소스가 없으면 사용자를 삭제합니다. 사용자에 의존하는 리소스가 있는 경우에는keep모드의 동작을 따라 사용자를 비활성화하는 방식으로 대체됩니다.
데이터베이스 내에서 생성된 사용자는 다음과 같이 설정됩니다:
- 인증된 Teleport 사용자와 동일한 사용자 이름을 갖습니다.
- 사용자의
customData에teleport-auto-user가true로 설정됩니다. - 데이터베이스와 일치하는 Teleport 사용자의 역할 집합에서 모든 역할이 할당됩니다. 역할 이름은 유효하고 데이터베이스에 존재해야 합니다.
3/3단계. 데이터베이스에 연결#
이제 Teleport 클러스터에 로그인하고 데이터베이스에 연결합니다:
$ tsh login --proxy=teleport.example.com
$ tsh db connect --db-name <database> example
사용자 프로비저닝이 활성화된 데이터베이스에 연결할 때, Database Service는 Teleport 사용자 이름이 데이터베이스 사용자 이름으로 사용될 것으로 예상합니다.
MongoDB Compass와 같은 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 myCustomRole@db2 example
문제 해결#
매핑된 원격 사용자 이름 오류 사용#
원격 클러스터의 데이터베이스에 연결할 때 다음과 같은 오류가 발생할 수 있습니다:
> 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 클라이언트를 통해 연결할 때는 오류 메시지에 표시된 사용자 이름을 데이터베이스
사용자 이름으로 사용하십시오.
다음 단계#
- MongoDB 내장 역할 및 사용자 정의 역할에 대해 자세히 알아봅니다.
- GUI 데이터베이스 클라이언트를 사용하여 연결합니다.
- 역할 템플릿에 대해 알아봅니다.
- 자동 사용자 프로비저닝 RFD를 읽어봅니다.