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

Teleport는 Teleport 사용자가 데이터베이스에 연결할 때 MySQL 데이터베이스에 계정을 자동으로 생성할 수 있으며, 이를 통해 개별 사용자 계정을 미리 생성하거나 모든 사용자에 대해 동일한 공유 데이터베이스 계정을 사용하는 필요성이 제거됩니다. 이 가이드에서는 MySQL에 대한 자동 사용자 프로비저닝을 설정하는 방법을 보여줍니다.

작동 방식

Teleport로 MySQL 데이터베이스를 등록하기 전에 관리 사용자를 데이터베이스에 설정하여 사용자 관리 권한을 부여합니다. 그런 다음 admin 사용자의 이름이 포함된 구성 필드로 데이터베이스를 Teleport 클러스터에 등록합니다.

Teleport 사용자가 자동 사용자 프로비저닝을 활성화한 역할로 데이터베이스에 연결할 때, Teleport 데이터베이스 서비스는 먼저 admin 사용자로 데이터베이스에 연결하고, 데이터베이스에 임시 사용자를 생성한 후, 그 임시 데이터베이스 사용자로 Teleport 사용자에 대한 데이터베이스 세션을 시작합니다.

Teleport 사용자가 세션을 종료하면, Teleport 데이터베이스 서비스는 구성에 따라 데이터베이스 사용자를 제거하거나 비활성화하고 권한을 제거하여 임시 데이터베이스 사용자가 데이터베이스에 접근하는 것을 방지합니다.

필수 조건

  • 구성된 자체 호스팅 MySQL 또는 RDS MySQL 데이터베이스가 포함된 Teleport 클러스터 v14.1 이상.
  • 대상 데이터베이스에 연결하고 사용자 계정을 생성할 수 있는 권한.
  • 자동 사용자 프로비저닝은 MySQL 8.0 미만 버전과 호환되지 않습니다.
  • 자동 사용자 프로비저닝은 RDS Aurora 리더 엔드포인트와 호환되지 않습니다.

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

Teleport는 다른 사용자를 생성하고 그들에게 역할을 할당할 수 있는 사용자로 데이터베이스에 연결할 수 있어야 합니다. Teleport 자동 사용자 프로비저닝을 위해 특별히 지정된 별도의 사용자 생성을 권장합니다. 이를 teleport-admin 이라고 부릅시다.

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

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

또한, 관리 사용자가 기본적으로 로그인할 수 있는 스키마가 필요합니다. 저장 프로시저도 이 스키마에서 생성되고 실행됩니다.

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

CREATE USER 'teleport-admin' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
GRANT SELECT ON mysql.role_edges TO 'teleport-admin' ;
GRANT PROCESS, ROLE_ADMIN, CREATE USER ON *.* TO 'teleport-admin' ;

CREATE DATABASE IF NOT EXISTS `teleport` ;
GRANT ALTER ROUTINE, CREATE ROUTINE, EXECUTE ON `teleport` .\* TO 'teleport-admin' ;

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

CREATE USER "teleport-admin" REQUIRE SUBJECT "/CN=teleport-admin";
GRANT SELECT ON mysql.role_edges TO 'teleport-admin' ;
GRANT PROCESS, ROLE_ADMIN, CREATE USER ON *.* TO 'teleport-admin' ;

CREATE DATABASE IF NOT EXISTS `teleport` ;
GRANT ALTER ROUTINE, CREATE ROUTINE, EXECUTE ON `teleport` .* TO 'teleport-admin' ;

Teleport에 의해 생성된 사용자들은 데이터베이스 내에서 자동으로 생성되지 않는 경우 teleport-auto-user 역할이 할당됩니다.

다음으로 Teleport 데이터베이스 구성에서 데이터베이스 관리자를 설정하십시오:

kind: db
version: v3
metadata:
  name: example
spec:
  protocol: "mysql"
  uri: "localhost:3306"
  admin_user:
    name: "teleport-admin"

이 예제는 데이터베이스를 동적 리소스로 설정했다고 가정합니다. 정적 Teleport 데이터베이스 서비스 구성을 사용하여 데이터베이스를 설정한 경우, db_service.databases 구성에서 항목을 수정하십시오.

자동 검색된 클라우드 데이터베이스의 경우, 관리자의 이름은 teleport.dev/db-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:
    - reader
    - "{{internal.db_roles}}"
    - "{{external.db_roles}}"

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

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

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

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

  • best_effort_drop : 사용자 프로비저닝을 활성화하며, 세션이 종료되면 리소스가 사용자에 의존하지 않는 경우 사용자를 제거합니다. 어떤 리소스라도 사용자에 의존하는 경우, keep 모드의 동작을 따라 사용자를 비활성화합니다.

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

  • teleport-auto-user 역할이 부여됩니다.
  • 데이터베이스와 일치하는 Teleport 사용자 역할 세트의 모든 역할이 부여됩니다. 역할 이름은 유효하고 데이터베이스에 존재해야 합니다.

MySQL는 사용자 이름을 32자로 제한합니다. Teleport 사용자 이름이 이 제한 내에 있으면 데이터베이스 내에서 생성된 사용자는 Teleport 사용자 이름과 동일한 이름을 가집니다. Teleport 사용자 이름이 32자 제한을 초과하는 경우, 데이터베이스 내에서 생성된 사용자는 tp-<base64-sha1-teleport-username> 형식의 이름을 가집니다.

원래의 Teleport 사용자 이름은 데이터베이스 내 사용자 속성으로 저장됩니다.

사용자는 자동 프로비저닝된 데이터베이스 세션에서 자신의 속성을 찾을 수 있습니다:

SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES WHERE CONCAT(USER, '@', HOST) = current_user();

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

SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES WHERE ATTRIBUTE->"$.user" = "teleport-user-name";

또한, Teleport 사용자 이름이 32자를 초과할 경우 "hashed" 데이터베이스 내 이름은 Teleport 감사 로그에서 데이터베이스 쿼리를 위해 db_user 로 기록됩니다.

이름 충돌이 발생하여 데이터베이스에 동일한 이름을 가진 사용자가 이미 존재하고 해당 사용자가 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

문제 해결

데이터베이스 접근 거부 오류

기본적으로 새로 생성된 사용자는 특정 데이터베이스에 접근할 수 있는 권한이 없습니다. 이러한 권한은 reader 와 같은 데이터베이스 전용 역할을 통해 부여되어야 합니다.

그렇지 않으면 다음과 같은 오류를 볼 수 있습니다:

tsh db connect --db-name <database> example
ERROR 1105 (HY000): ERROR 1044 (42000): Access denied for user '<your-teleport-username>'@'%' to database '<database>'

테이블이 읽기 전용 오류

Amazon RDS Aurora 리더 엔드포인트에 연결할 때 다음과 같은 오류가 발생할 수 있습니다:

tsh db connect --db-name <database> example
ERROR 3501 (HY000): The ACL operation failed due to the following error from SE: errcode 165 - Table is read only

데이터베이스 자동 사용자 프로비저닝은 RDS Aurora 리더 엔드포인트와 호환되지 않습니다. 기본 엔드포인트에서 자동 사용자 프로비저닝을 사용하십시오.

매핑된 원격 사용자 이름 사용 오류

다음 오류가 원격 클러스터의 데이터베이스에 연결할 때 발생할 수 있습니다:

> tsh db connect --db-name <database> exampleERROR: 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 클라이언트를 통해 연결해 주시기 바랍니다.

다음 단계

Teleport 원문 보기