Infograb logo
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 사용자와 동일한 사용자 이름을 가집니다.
  • 사용자 customDatateleport-auto-usertrue로 설정됩니다.
  • 데이터베이스와 일치하는 Teleport 사용자의 역할 세트에서 모든 역할이 할당됩니다. 역할 이름은 유효해야 하며 데이터베이스에 존재해야 합니다.

3단계/3. 데이터베이스에 연결하기

이제 Teleport 클러스터에 로그인하고 데이터베이스에 연결하세요:

tsh login --proxy=teleport.example.com
tsh 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.com
tsh 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].

다음 단계

Teleport 원문 보기