Infograb logo
데이터베이스 액세스 구성 참조

이 가이드는 Teleport 데이터베이스 서비스의 구성 옵션에 대해 설명합니다.
이 서비스는 Teleport 사용자와 보호된 데이터베이스 간의 사용자 트래픽을 프록시합니다.

데이터베이스 서비스 구성

다음 스니펫은 teleport.yaml 구성 파일에 나타나는 데이터베이스 서비스의 전체 YAML 구성을 보여줍니다:

db_service:
  # 데이터베이스 서비스를 활성화합니다.
  enabled: "yes"

  # "tctl create" 명령이나 디스커버리 서비스를 통해 생성된 데이터베이스 리소스에 대한 매처입니다.
  resources:
  - labels:
      "*": "*"
    # 데이터베이스에 접근하기 위해 데이터베이스 서비스가 사용할 AWS 역할 (선택 사항).
    aws:
      assume_role_arn: "arn:aws:iam::123456789012:role/example-role-name"
      external_id: "example-external-id"

  # AWS에 호스팅된 데이터베이스를 등록하기 위한 매처입니다.
  aws:
    # 데이터베이스 유형. 유효한 옵션은 다음과 같습니다:
    # 'rds' - Amazon RDS 및 Aurora 데이터베이스를 검색하고 등록합니다.
    # 'rdsproxy' - Amazon RDS Proxy 데이터베이스를 검색하고 등록합니다.
    # 'redshift' - Amazon Redshift 데이터베이스를 검색하고 등록합니다.
    # 'redshift-serverless' - Amazon Redshift Serverless 데이터베이스를 검색하고 등록합니다.
    # 'elasticache' - Amazon ElastiCache Redis 데이터베이스를 검색하고 등록합니다.
    # 'memorydb' - Amazon MemoryDB Redis 데이터베이스를 검색하고 등록합니다.
    # 'opensearch' - Amazon OpenSearch 데이터베이스를 검색하고 등록합니다.
    # 'docdb' - Amazon DocumentDB 데이터베이스를 검색하고 등록합니다.
  - types: ["rds", "rdsproxy", "redshift", "redshift-serverless", "elasticache", "memorydb", "opensearch"]
    # 데이터베이스를 등록할 AWS 지역입니다.
    regions: ["us-west-1", "us-east-2"]
    # AWS에 호스팅된 데이터베이스를 검색 및 등록하기 위해 데이터베이스 서비스가 사용할 AWS 역할 (선택 사항).
    # 발견된 데이터베이스는 이 역할을 통해서도 데이터베이스 서비스가 접근합니다.
    assume_role_arn: "arn:aws:iam::123456789012:role/example-role-name"
    # 외부 AWS 계정에서 역할을 맡기 위해 데이터베이스 서비스가 사용할 외부 ID (선택 사항).
    external_id: "example-external-id"
    # 데이터베이스를 등록할 때 일치시킬 AWS 리소스 태그입니다.
    tags:
      "*": "*"

  # Azure에 호스팅된 데이터베이스를 등록하기 위한 매처입니다.
  azure:
    # 데이터베이스 유형. 유효한 옵션은 다음과 같습니다:
    # 'mysql' - Azure MySQL 데이터베이스를 검색하고 등록합니다.
    # 'postgres' - Azure PostgreSQL 데이터베이스를 검색하고 등록합니다.
    # 'redis' - Azure Cache for Redis 데이터베이스를 검색하고 등록합니다.
    # 'sqlserver' - Azure SQL Server 데이터베이스를 검색하고 등록합니다.
  - types: ["mysql", "postgres", "redis", "sqlserver"]
    # Azure 지역에서 데이터를 등록할 지역. 유효한 옵션은 다음과 같습니다:
    # '*' - 모든 지역에서 데이터를 검색 (기본값).
    # 유효한 Azure 지역 이름. Azure CLI에서 모든 유효한 지역을 나열할 수 있습니다: `az account list-locations -o table`
    regions: ["eastus", "westus"]
    # Azure 구독 ID에서 데이터를 등록할 구독 ID. 유효한 옵션은 다음과 같습니다:
    # '*' - 모든 구독에서 데이터를 검색 (기본값).
    subscriptions: ["11111111-2222-3333-4444-555555555555"]
    # Azure 리소스 그룹에서 데이터를 등록할 리소스 그룹. 유효한 옵션은 다음과 같습니다:
    # '*' - 구성된 구독 내 모든 리소스 그룹에서 데이터를 검색 (기본값).
    resource_groups: ["group1", "group2"]
    # Azure 리소스를 등록할 때 일치시킬 태그입니다.
    tags:
      "*": "*"

  # 이 에이전트가 프록시하는 정적으로 등록된 데이터베이스 목록입니다.
  databases:
    # CLI에서 참조할 수 있는 데이터베이스 프록시 인스턴스 이름입니다.
  - name: "prod"

    # 데이터베이스 프록시 인스턴스에 대한 자유 형식 설명입니다.
    description: "Production database"

    # 데이터베이스 프로토콜. 유효한 옵션은 다음과 같습니다:
    # "cassandra"
    # "clickhouse"
    # "clickhouse-http"
    # "cockroachdb"
    # "dynamodb"
    # "elasticsearch"
    # "mongodb"
    # "mysql"
    # "oracle"
    # "postgres"
    # "redis"
    # "snowflake"
    # "spanner"
    # "sqlserver"
    protocol: "postgres"

    # 데이터베이스 연결 엔드포인트. Database Service에서 접근 가능해야 합니다.
    uri: "postgres.example.com:5432"

    # 선택적 TLS 구성입니다.
    tls:
      # TLS 검증 모드. 유효한 옵션은 다음과 같습니다:
      # 'verify-full' - 전체 인증서 검증 수행 (기본값).
      # 'verify-ca' - `verify-full`과 동일하지만 서버 이름 검증을 생략합니다.
      # 'insecure' - 제공된 모든 인증서를 허용 (권장하지 않음).
      mode: verify-full
      # 선택적 데이터베이스 DNS 서버 이름. 연결 시 클라이언트 인증서의 DNS 이름을 재정의할 수 있습니다.
      server_name: db.example.com
      ca_cert_file: /path/to/pem
      trust_system_cert_pool: false

		# MySQL 전용 옵션.
		mysql:
		  # Teleport Proxy에서 보고하는 기본 MySQL 서버 버전.
		  # 이 옵션이 설정되면 Database Agent는 MySQL 서버 버전을 확인하려고 시도하지 않습니다.
		  server_version: 8.0.28
		
		# 자동 사용자 프로비저닝을 위한 선택적 관리자 사용자 구성.
		admin_user:
		  # 관리자 사용자 이름.
		  name: "teleport-admin"
		  # 관리자 사용자가 로그인하는 기본 데이터베이스 (선택 사항). 기본값은 개별 가이드를 참조하세요.
		  default_database: "teleport"
		
		# AWS에 호스팅된 데이터베이스를 위한 선택적 AWS 구성. AWS 지역 및 서비스별 구성은 보통 엔드포인트에서 자동으로 감지됩니다.
		aws:
		  # 데이터베이스가 배포된 지역.
		  region: "us-east-1"
		  # 이 데이터베이스에 접근하기 위해 Database Service가 사용할 선택적 AWS 역할.
		  assume_role_arn: "arn:aws:iam::123456789012:role/example-role-name"
		  # 외부 AWS 계정에서 역할을 맡기 위해 Database Service가 사용할 선택적 외부 ID.
		  external_id: "example-external-id"
		
		  # Redshift 전용 구성.
		  redshift:
		    # Redshift 클러스터 식별자.
		    cluster_id: "redshift-cluster-1"
		
		  # RDS 전용 구성.
		  rds:
		    # RDS 인스턴스 식별자.
		    instance_id: "rds-instance-1"
		    # RDS Aurora 클러스터 식별자.
		    cluster_id: "aurora-cluster-1"
		
		  # ElastiCache 전용 구성.
		  elasticache:
		    # ElastiCache 복제 그룹 식별자.
		    replication_group_id: "elasticache-replication-group-1"
		
		  # MemoryDB 전용 구성.
		  memorydb:
		    # MemoryDB 클러스터 이름.
		    cluster_name: "memorydb-cluster-1"
		
		  # ElastiCache 또는 MemoryDB 사용자를 관리하기 위한 선택적 AWS Secrets Manager 구성.
		  #
		  # 중요: 동일한 Teleport 관리 사용자를 공유하는 데이터베이스는 동일한 secret_store 구성을 가져야 합니다. 
		  # 이 구성은 고가용성(HA) 모드의 모든 Database Service에서도 일관성이 있어야 합니다.
		  secret_store:
		    # 서비스에서 생성된 모든 비밀의 접두사. 기본값은 'teleport/'입니다.
		    key_prefix: "teleport/"
		    # 비밀 암호화 및 설명에 사용되는 KMS 키 ID. 지정하지 않으면 Secrets Manager는 기본적으로 AWS 관리 키 'aws/secretsmanager'를 사용합니다.
		    kms_key_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
		
		  # DynamoDB 액세스를 위한 IAM 역할을 맡을 때 사용되는 선택적 세션 태그.
		  session_tags:
		    dynamodb_table_name: "table-a"
		
		# GCP Cloud SQL 및 Spanner 데이터베이스를 위한 GCP 전용 구성.
		gcp:
		  # GCP 프로젝트 ID.
		  project_id: "xxx-1234"
		  # Cloud SQL 인스턴스 ID.
		  instance_id: "example"
		
		# 예를 들어 SQL Server를 위한 Active Directory 인증에 특정한 설정입니다.
		ad:
		  # Kerberos keytab 파일 경로.
		  keytab_file: /path/to/keytab
		  # Active Directory 도메인 이름.
		  domain: EXAMPLE.COM
		  # Kerberos 티켓을 얻기 위한 Service Principal Name(SPN).
		  spn: MSSQLSvc/ec2amaz-4kn05du.dbadir.teleportdemo.net:1433
		  # Kerberos 구성 파일의 선택적 경로. 기본값은 /etc/krb5.conf입니다.
		  krb5_file: /etc/krb5.conf
		
		# Azure에 호스팅된 데이터베이스를 위한 선택적 구성입니다.
		azure:
		  # Azure 유연 서버를 사용하는 경우 is_flexi_server를 true로 설정합니다.
		  is_flexi_server: false
		  # Azure에서 데이터베이스의 리소스 ID. 이 필드는 Azure Cache for Redis 데이터베이스에 필요합니다.
		  resource_id: "/subscriptions/00000000-1111-2222-3333-444444444444/resourceGroups/example-group/providers/Microsoft.Cache/Redis/example-db-name"
		
		# 데이터베이스에 할당할 정적 레이블입니다. RBAC에서 사용됩니다.
		static_labels:
		  env: "prod"
		
		# 동적 레이블("명령"). RBAC에서 사용됩니다.
		dynamic_labels:
		- name: "hostname"
		  command: ["hostname"]
		  period: 1m0s

프록시 구성

다음 프록시 서비스 구성은 데이터베이스 액세스와 관련이 있습니다:

데이터베이스 연결을 위한 TLS

--insecure-no-tls tsh 플래그는 MySQL/MariaDB 및 PostgreSQL 연결에 대해 고유 포트를 사용하며, 이 포트는 mysql_public_addr 또는 postgres_public_addr 로 지정되어야만 지원됩니다.

proxy_service:
  enabled: "yes"
  # 데이터베이스 프록시는 일반 웹 프록시 포트에서 수신합니다.
  web_listen_addr: "0.0.0.0:443"
  # MySQL 프록시는 별도의 포트에서 수신하며, 프록시 서버에서 활성화되어야 합니다.
  mysql_listen_addr: "0.0.0.0:3036"
  # MySQL 서버 버전은 기본 Teleport 프록시 서비스 MySQL 버전(8.0.0-Teleport)을 덮어쓸 수 있도록 합니다.
  # MySQL 클라이언트 연결이 TLS 라우팅을 사용하는 경우, 동적 MySQL 서버 버전이 mysql_server_version 프록시 설정보다 우선합니다.
  # mysql_server_version: "8.0.4"
  # Postgres 프록시 수신 주소. 제공될 경우, 프록시는 web_listener_addr에서 Postgres 프로토콜을 다중화하는 대신 별도의 리스너를 사용합니다.
  # postgres_listen_addr: "0.0.0.0:5432"
  # Mongo 프록시 수신 주소. 제공될 경우, 프록시는 web_listener_addr에서 Mongo 프로토콜을 다중화하는 대신 별도의 리스너를 사용합니다.
  # mongo_listen_addr: "0.0.0.0:27017"
  # 기본적으로 데이터베이스 클라이언트는 이 호스트 이름을 통해 Proxy에 연결합니다. 특정 데이터베이스 프로토콜에 대한 공용 주소를 재정의하려면 postgres_public_addr 및 mysql_public_addr를 사용합니다.
  public_addr: "teleport.example.com:443"
  # MySQL 클라이언트에 광고되는 주소. 설정하지 않으면 public_addr가 사용됩니다.
  mysql_public_addr: "mysql.teleport.example.com:3306"
  # PostgreSQL 클라이언트에 광고되는 주소. 설정하지 않으면 public_addr가 사용됩니다.
  postgres_public_addr: "postgres.teleport.example.com:443"
  # Mongo 클라이언트에 광고되는 주소. 설정하지 않으면 public_addr가 사용됩니다.
  mongo_public_addr: "mongo.teleport.example.com:443"

Teleport Enterprise Cloud는 데이터베이스 액세스와 관련된 다음 설정으로 Teleport 프록시 서비스를 자동으로 구성합니다. 이 참조 구성에서는 Teleport Enterprise Cloud 임대 주소 대신 example.teleport.sh 를 사용합니다:

proxy_service:
  enabled: "yes"
  # 데이터베이스 프록시는 일반 웹 프록시 포트에서 수신합니다.
  web_listen_addr: "0.0.0.0:3080"
  # MySQL 프록시는 별도의 포트에서 수신합니다.
  mysql_listen_addr: "0.0.0.0:3036"
  # 데이터베이스 클라이언트는 이 호스트 이름을 통해 프록시 서비스에 연결합니다.
  public_addr: "mytenant.teleport.sh:443"
  # MySQL 클라이언트에 광고되는 주소.
  mysql_public_addr: "mytenant.teleport.sh:3036"
  # PostgreSQL 클라이언트에 광고되는 주소.
  postgres_public_addr: "mytenant.teleport.sh:443"
  # Mongo 클라이언트에 광고되는 주소. 설정하지 않으면 public_addr가 사용됩니다.
  mongo_public_addr: "mongo.teleport.example.com:443

데이터베이스 리소스

tctl 리소스 명령으로 관리되는 데이터베이스 리소스의 전체 YAML 사양:

kind: db
version: v3
metadata:
  # 데이터베이스 리소스 이름.
  name: example

  # 데이터베이스 리소스 설명.
  description: "예제 데이터베이스"

  # 데이터베이스 리소스 정적 레이블.
  labels:
    env: example

spec:
  # 데이터베이스 프로토콜. 유효한 옵션은 다음과 같습니다:
  # "cassandra"
  # "clickhouse"
  # "clickhouse-http"
  # "cockroachdb"
  # "dynamodb"
  # "elasticsearch"
  # "mongodb"
  # "mysql"
  # "oracle"
  # "postgres"
  # "redis"
  # "snowflake"
  # "spanner"
  # "sqlserver"
  protocol: "postgres"

  # 데이터베이스 연결 엔드포인트.
  uri: "localhost:5432"

  # 선택적 TLS 구성.
  tls:
    # TLS 검증 모드. 유효한 옵션은 다음과 같습니다:
    # 'verify-full' - 전체 인증서 검증 수행 (기본값).
    # 'verify-ca' - `verify-full` 과 동일하지만 서버 이름 검증 건너뜀.
    # 'insecure' - 데이터베이스에서 제공하는 모든 인증서 수용 (권장하지 않음).
    mode: verify-full
    # 선택적 데이터베이스 DNS 서버 이름. 데이터베이스에 연결할 때
    # 클라이언트 인증서에서 DNS 이름을 재정의할 수 있습니다.
    # 'verify-full' 모드에서만 사용하십시오.
    server_name: db.example.com
    # 데이터베이스 인증서를 검증하는 선택적 CA.
    ca_cert: |
      -----BEGIN CERTIFICATE-----
      ...
      -----END CERTIFICATE-----
    # Teleport가 호스트 시스템에서 사용 가능한 인증서
    # 기관을 신뢰할 수 있는 옵션 구성. 설정하지 않을 경우 (기본값),
    # Teleport는 TLS 인증서가 Teleport의 데이터베이스 서버 CA에 의해 서명된
    # 자체 서명된 데이터베이스만 신뢰합니다 또는 이 TLS 설정에 지정된 ca_cert.
    # 클라우드에서 호스팅되는 데이터베이스의 경우, Teleport는 검증에 필요한
    # 해당 CA를 다운로드합니다.
    trust_system_cert_pool: false

  # 자동 사용자 프로비저닝을 위한 데이터베이스 관리자 사용자.
  admin_user:
    # 데이터베이스 관리자 사용자 이름.
    name: "teleport-admin"

  # MySQL 전용 옵션.
  mysql:
    # Teleport Proxy Service에 의해 보고된 MySQL 서버 버전.
    # Teleport는 이 문자열을 사용하여 연결하는 클라이언트에게 서버 버전을 보고합니다.
    #
    # 이 옵션이 설정되지 않으면 데이터베이스 서비스는
    # 시작 시 MySQL 인스턴스에 연결하고 서버 버전을 가져오려고 시도합니다. 그 외에는
    # 데이터베이스에 연결하지 않고 제공된 값을 사용합니다.
    #
    # 두 경우 모두, 클라이언트에게 보고되는 MySQL 서버 버전은
    # 사용자가 수행한 첫 번째 성공적인 연결에서 업데이트됩니다.
    # Teleport는 연결하는 클라이언트에게 서버 버전을 보고할 때
    # 기본 '8.0.0-Teleport' 버전 대신 해당 문자열을 사용합니다. 이 옵션이 설정되지 않으면 데이터베이스 서비스는
    # 시작 시 MySQL 인스턴스에 연결하고 서버 버전을 가져오려고 시도합니다.
    # 그렇지 않으면 데이터베이스에 연결하지 않고 제공된 값을 사용합니다.
    # 두 경우 모두 클라이언트에게 보고되는 MySQL 서버 버전은 사용자가 수행한 첫 번째 성공적인
    # 연결에서 업데이트됩니다.
    server_version: 8.0.28

  # RDS/Aurora/Redshift에 대한 선택적 AWS 구성. 엔드포인트에서 자동으로 감지할 수 있습니다.
  aws:
    # 데이터베이스가 배포된 리전.
    region: "us-east-1"
    # 데이터베이스 서비스가 이 데이터베이스에 접근하기 위해
    # 맡을 선택적 AWS 역할.
    assume_role_arn: "arn:aws:iam::123456789012:role/example-role-name"
    # 데이터베이스 서비스가 외부 AWS 계정에서 역할을 맡기 위해 사용할
    # 선택적 AWS 외부 ID.
    external_id: "example-external-id"
    # Redshift 특정 구성.
    redshift:
      # Redshift 클러스터 식별자.
      cluster_id: "redshift-cluster-1"

  # GCP 구성 (Cloud SQL 및 Spanner 데이터베이스에 필요).
  gcp:
    # GCP 프로젝트 ID.
    project_id: "xxx-1234"
    # Cloud SQL 인스턴스 ID.
    instance_id: "example"

  # SQL Server와 같은 Active Directory 인증에 특정한 설정.
  ad:
    # Kerberos 키탭 파일의 경로.
    keytab_file: /path/to/keytab
    # Active Directory 도메인 이름.
    domain: EXAMPLE.COM
    # Kerberos 티켓을 얻기 위한 서비스 주체 이름.
    spn: MSSQLSvc/ec2amaz-4kn05du.dbadir.teleportdemo.net:1433
    # 선택적 Kerberos 구성 파일 경로. 기본값은 /etc/krb5.conf.
    krb5_file: /etc/krb5.conf

  # 선택적 동적 레이블.
  dynamic_labels:
    - name: "hostname"
      command: ["hostname"]
      period: 1m0s

다음 명령을 실행하여 새로운 db 리소스를 생성할 수 있으며, 이는 db.yaml 이라는 YAML 파일을 만든 것으로 가정합니다. 이 파일에는 구성 정보가 포함되어 있습니다:

tctl을 로컬 머신에서 사용할 수 있도록 클러스터에 로그인합니다.

"tsh login"을 먼저 실행하지 않고도 Auth Service 호스트에서 tctl을 실행할 수 있습니다.

tsh login --proxy=teleport.example.com --user=myuser

리소스 생성

tctl create -f db.yaml

Teleport 클러스터에 로그인하여 로컬 머신에서 tctl을 사용할 수 있습니다.

tsh login --proxy=mytenant.teleport.sh --user=myuser

리소스 생성

tctl create -f db.yaml
Teleport 원문 보기