Infograb logo
MariaDB 자동 사용자 프로비저닝

Teleport는 데이터베이스에 사용자를 자동으로 생성하므로, 개별 사용자 계정을 미리 만들거나 모든 사용자가 동일한 공유 계정 세트를 사용하는 작업을 수행할 필요가 없습니다.

전제 조건

  • 구성된 셀프 호스팅 MariaDB 또는 RDS MariaDB 데이터베이스가 있는 Teleport 클러스터 v14.1.3 이상.
  • 대상 데이터베이스에 연결하고 사용자 계정을 생성할 수 있는 능력.
지원되는 버전

자동 사용자 프로비저닝은 MariaDB 버전 10.3.3 미만 또는 10.2.11과 호환되지 않습니다.

1단계/3. 데이터베이스 관리자를 구성합니다.

텔레포트는 다음을 생성할 수 있는 사용자로서 데이터베이스에 연결할 수 있어야 합니다 다른 사용자를 지정하고 역할을 할당합니다. 별도의 사용자를 생성하는 것이 좋습니다 텔레포트 자동 사용자 프로비저닝을 위해 특별히 지정되었습니다 teleport 관리자.

Teleport는 관리자로 연결할 때 일반 사용자 연결과 동일한 인증 메커니즘을 사용합니다: 셀프 호스팅 데이터베이스의 경우 X.509 및 RDS의 경우 AWS IAM.

관리자 사용자는 사용자를 생성하고 권한을 부여할 수 있는 권한이 있어야 합니다. 관리자 사용자 또한 사용자 프로세스 및 역할 할당을 모니터링할 수 있는 권한이 있어야 합니다.

또한 기본적으로 관리자 사용자가 로그인할 수 있는 스키마가 필요합니다. 이 스키마는 사용자 정의 사용자 속성 및 저장 프로시저를 저장하는 데에도 사용됩니다.

RDS MariaDB 관리자 사용자는 IAM 인증을 허용하기 위해 AWSAuthenticationPlugin을 사용해야 합니다:

CREATE USER 'teleport-admin' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
GRANT PROCESS, CREATE USER ON *.* TO 'teleport-admin';
GRANT SELECT ON mysql.roles_mapping TO 'teleport-admin';
GRANT UPDATE ON mysql.* TO 'teleport-admin'; -- SET DEFAULT ROLE FOR
GRANT SELECT ON *.* TO 'teleport-admin'; -- 사용자 소유 리소스를 삭제하기 전에 확인하기 위해 best_effort_drop 모드 사용 시 필수

CREATE DATABASE IF NOT EXISTS `teleport`;
GRANT ALL ON `teleport`.* TO 'teleport-admin' WITH GRANT OPTION;

Teleport는 기본 스키마 이름으로 teleport를 사용하지만 이 이름은 Teleport 데이터베이스 정의에서 구성 가능하다는 점에 유의하십시오. 다른 데이터베이스 이름을 사용하려면 마지막 두 줄에서 데이터베이스 이름을 변경하십시오.

역할 관리자

관리자 사용자가 데이터베이스 사용자에게 역할을 부여하게 하려면, 그들은 역할의 "관리자"가 되어야 합니다.

이를 달성하는 한 가지 방법은 관리자로서 역할을 생성하는 것입니다. 그러면 관리자가 해당 역할의 "관리자"로 자동 지정됩니다.

대신, 기존 역할의 "관리자"로 관리자를 할당할 수 있습니다:

UPDATE mysql.roles_mapping SET User ='teleport-admin' WHERE Admin_option='Y' AND Role='role1';
FLUSH PRIVILEGES;

role1을 자동 프로비저닝된 사용자에게 부여될 역할의 이름으로 교체하십시오.

셀프 호스팅 MariaDB 관리자 사용자는 X.509 인증이 구성되어 있어야 합니다:

CREATE USER 'teleport-admin' REQUIRE SUBJECT '/CN=teleport-admin';
GRANT PROCESS, CREATE USER ON *.* TO 'teleport-admin';
GRANT SELECT ON mysql.roles_mapping TO 'teleport-admin';
GRANT UPDATE ON mysql.* TO 'teleport-admin'; -- SET DEFAULT ROLE FOR
GRANT SELECT ON *.* TO 'teleport-admin'; -- 사용자 소유 리소스를 삭제하기 전에 확인하기 위해 best_effort_drop 모드 사용 시 필수

CREATE DATABASE IF NOT EXISTS `teleport`;
GRANT ALL ON `teleport`.* TO 'teleport-admin' WITH GRANT OPTION;

Teleport는 기본 스키마 이름으로 teleport를 사용하지만 이 이름은 Teleport 데이터베이스 정의에서 구성 가능하다는 점에 유의하십시오. 다른 데이터베이스 이름을 사용하려면 마지막 두 줄에서 데이터베이스 이름을 변경하십시오.

역할 관리자

관리자 사용자가 데이터베이스 사용자에게 역할을 부여하게 하려면, 그들은 역할의 "관리자"가 되어야 합니다.

이를 달성하는 한 가지 방법은 역할을 생성할 때 WITH ADMIN 옵션을 사용하는 것입니다:

CREATE ROLE role1 WITH ADMIN 'teleport-admin';

대신, 기존 역할의 "관리자"로 관리자를 할당할 수 있습니다:

UPDATE mysql.roles_mapping SET User ='teleport-admin' WHERE Admin_option='Y' AND Role='role1';
FLUSH PRIVILEGES;

role1을 자동 프로비저닝된 사용자에게 부여될 역할의 이름으로 교체하십시오.

Teleport에 의해 생성된 사용자는 데이터베이스에서 teleport-auto-user 역할이 부여되며, 이 역할은 존재하지 않을 경우 자동으로 생성됩니다.

MariaDB 세션 동안 활성화된 역할은 한 번에 하나만 허용됩니다. Teleport는 생성된 사용자에게 tp-role-<user>라는 올인원 역할을 생성하고, 이 역할에 진정한 역할이 할당됩니다. 그 후 올인원 역할이 기본 역할로 설정됩니다.

다음으로, Teleport 데이터베이스 구성에서 데이터베이스 관리자 사용자를 설정하세요:

db_service:
  enabled: "yes"
  databases:
  - name: "example"
    protocol: "mysql"
    uri: "localhost:3306"
    admin_user:
      name: "teleport-admin"
      # Optional default database the admin user logs into. Default is
      # 'teleport', if not specified.
      # default_database: teleport
kind: db
version: v3
metadata:
  name: example
spec:
  protocol: "mysql"
  uri: "localhost:3306"
  admin_user:
    name: "teleport-admin"
    # Optional default database the admin user logs into. Default is
    # 'teleport', if not specified.
    # default_database: teleport
Auto-discovered databases

자동으로 발견된 클라우드 데이터베이스의 경우, 관리자 사용자 이름은 teleport.dev/db-admin 레이블에서 가져오고, 기본 데이터베이스는 teleport.dev/db-admin-default-database 레이블에서 가져옵니다.

2단계/3. Teleport 역할 구성하기

데이터베이스 내에서 사용자에게 할당해야 하는 데이터베이스 역할을 지정하려면, db_roles 역할 옵션을 사용합니다:

kind: role
version: v7
metadata:
  name: auto-db-users
spec:
  options:
    # create_db_user_mode enables automatic user provisioning for matching databases
    create_db_user_mode: keep
  allow:
    db_labels:
      "*": "*"
    db_names:
    - "*"
    # db_roles is a list of roles the database user will be assigned
    db_roles:
    - reader
    - "{{internal.db_roles}}"
    - "{{external.db_roles}}"

자동 사용자 프로비저닝을 통해 사용자는 항상 자신의 Teleport 사용자 이름으로 데이터베이스에 연결하므로, 데이터베이스 사용자 프로비저닝이 활성화된 역할에 대해서는 db_users 역할 필드가 무시됩니다.

사용 가능한 프로비저닝 모드는 다음과 같습니다:

  • off: 사용자 프로비저닝을 비활성화합니다.

  • keep: 사용자 프로비저닝을 활성화하고 세션 종료 시 사용자를 비활성화합니다. 사용자는 모든 역할이 제거되고 사용자 계정은 잠깁니다.

  • best_effort_drop: 사용자 프로비저닝을 활성화하고, 세션 종료 시 해당 사용자에게 의존하는 리소스가 없으면 사용자를 삭제합니다. 사용자가 의존하는 리소스가 있는 경우, keep 모드의 동작을 따라 사용자를 비활성화합니다.

데이터베이스 내에서 생성된 사용자는:

  • teleport-auto-user 역할이 부여됩니다.
  • 데이터베이스와 일치하는 Teleport 사용자의 역할 집합에서 모든 역할이 부여됩니다. 역할 이름은 유효해야 하며 데이터베이스에 존재해야 합니다. 관리자 사용자는 이러한 역할의 "관리자"여야 합니다. 자세한 내용은 위의 "역할 관리자" 섹션을 참조하세요.

데이터베이스는 사용자 이름을 80자로 제한합니다. Teleport 사용자 이름이 이 제한 내에 있을 경우, 데이터베이스 내에 생성되는 사용자는 Teleport 사용자 이름과 동일한 이름을 갖게 됩니다. Teleport 사용자 이름이 80자 제한을 초과할 경우, 데이터베이스 내에 생성되는 사용자는 tp-<base64-sha1-teleport-username> 형식의 이름을 갖게 됩니다.

원래 Teleport 사용자 이름은 기본 데이터베이스의 user_attributes 테이블에 사용자 속성으로 저장됩니다.

데이터베이스 관리자는 특정 Teleport 사용자 이름을 검색할 수 있습니다:

SELECT * FROM teleport.user_attributes WHERE JSON_VALUE(Attributes,"$.user") = "teleport-user-name";

또한, "해시된" 데이터베이스 내 이름은 Teleport 감사 로그의 데이터베이스 쿼리에서 db_user로 설정됩니다. Teleport 사용자 이름이 80자를 초과할 때 적용됩니다.

데이터베이스에 동일한 이름을 가진 사용자가 이미 존재하고 그 사용자가 Teleport에 의해 관리되지 않는 경우(즉, teleport-auto-user 역할이 할당되지 않은 경우), 연결이 중단될 수 있습니다.

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

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

tsh login --proxy=teleport.example.com
tsh db connect --db-name <database> example
데이터베이스 사용자 이름

사용자 프로비저닝이 활성화된 데이터베이스에 연결할 때, 데이터베이스 서비스는 Teleport 사용자 이름을 데이터베이스 사용자 이름으로 사용할 것으로 예상합니다.

MySQL Workbench 와 같은 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

이제 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 원문 보기