Infograb logo
데이터베이스 접근 구성 참조

데이터베이스 서비스 구성

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

```yaml
db_service:
  # 데이터베이스 서비스 활성화.
  enabled: "yes"

  # "tctl create" 명령어로 생성된 데이터베이스 리소스나 
  # 검색 서비스에 대한 매처.
  resources:
    # 더 많은 데이터베이스 레이블에 대해 알아보려면 
    # "Database labels reference" (https://goteleport.com/docs/database-access/reference/labels/)를 참조하세요.
  - 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 계정에서 역할을 가정하기 위해 데이터베이스 서비스가 사용할 선택적 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 리전 이름.
    regions: ["eastus", "westus"]
    # 데이터베이스 등록을 위한 Azure 구독 ID. 유효한 옵션은:
    # '*' - 모든 구독에서 데이터베이스를 발견합니다 (기본값).
    subscriptions: ["11111111-2222-3333-4444-555555555555"]
    # 데이터베이스 등록을 위한 Azure 리소스 그룹. 유효한 옵션은:
    # '*' - 구성된 구독 내 모든 리소스 그룹 내에서 데이터베이스를 발견합니다 (기본값).
    resource_groups: ["group1", "group2"]
    # 데이터베이스 등록 시 일치시킬 Azure 리소스 태그.
    tags:
      "*": "*"

  # 이 에이전트에 의해 프록시된 정적으로 등록된 데이터베이스 목록.
  databases:
    # CLI에서 참조하는 데 사용되는 데이터베이스 프록시 인스턴스의 이름.
  - name: "prod"

    # 데이터베이스 프록시 인스턴스에 대한 자유 형식 설명.
    description: "생산 데이터베이스"

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

    # 데이터베이스 서비스에서 접근할 수 있어야 하는 데이터베이스 연결 엔드포인트.
    uri: "postgres.example.com: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_file: /path/to/pem
      # Teleport가 호스트 시스템에서 사용 가능한 인증서 기관을 신뢰하도록 허용하는 선택적 구성. 설정하지 않으면 (기본값),
      # Teleport는 Teleport의 데이터베이스 서버 CA 또는 이 TLS 설정에서 지정한 ca_cert_file로 서명된 자체 서명된 데이터베이스만 신뢰합니다. 
      # 클라우드 호스팅 데이터베이스의 경우, Teleport는 검증을 위한 해당 필수 CA를 다운로드합니다.
      trust_system_cert_pool: false

    # MySQL 전용 옵션.
    mysql:
      # Teleport 프록시에서 보고된 기본 MySQL 서버 버전.
      # 이 옵션이 설정되면 데이터베이스 에이전트는 MySQL 서버 버전을 확인하지 않습니다.
      server_version: 8.0.28

    # 자동 사용자 프로비저닝을 위한 선택적 관리자 사용자 구성.
    admin_user:
      # 관리자 사용자의 이름.
      name: "teleport-admin"
      # 관리자 사용자가 로그인을 하는 선택적 기본 데이터베이스. 기본값에 대한 개별 
      # 가이드를 참조하세요.
      default_database: "teleport"

    # AWS 호스팅 데이터베이스를 위한 AWS의 선택적 구성. 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"
      # 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(고가용성) 모드의 모든 데이터베이스 서비스에서도 일관되어야 합니다.
      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"

    # Cloud SQL 및 Spanner 데이터베이스를 위한 GCP 전용 구성.
    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

    # Azure 호스팅 데이터베이스를 위한 선택적 구성.
    azure:
      # Azure 유연 서버를 사용 when 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: "예"
  # 데이터베이스 프록시는 일반 웹 프록시 포트에서 수신 대기합니다.
  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"
  # PostgreSQL 프록시 수신 주소. 제공된 경우, 프록시는 web_listener_addr에서 PostgreSQL 프로토콜을 멀티플렉싱하는 대신 별도의 수신기를 사용합니다.
  # postgres_listen_addr: "0.0.0.0:5432"
  # Mongo 프록시 수신 주소. 제공된 경우, 프록시는 web_listener_addr에서 Mongo 프로토콜을 멀티플렉싱하는 대신 별도의 수신기를 사용합니다.
  # mongo_listen_addr: "0.0.0.0:27017"
  # 기본적으로 데이터베이스 클라이언트는 이 호스트 이름을 통해 프록시에 연결합니다.
  # 특정 데이터베이스 프로토콜에 대한 공용 주소를 재정의하려면 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: "예"
  # 데이터베이스 프록시는 일반 웹 프록시 포트에서 수신 대기합니다.
  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 이름을 재정의합니다.
    # 'verify-full' 모드에서만 사용하십시오.
    server_name: db.example.com
    # 데이터베이스 인증서를 검증하기 위한 선택적 CA.
    ca_cert: |
      -----BEGIN CERTIFICATE-----
      ...
      -----END CERTIFICATE-----
    # Teleport가 호스트 시스템에서 사용 가능한 인증서를 신뢰하도록 허용하는 선택적 구성.
    # 설정되지 않으면(기본값), Teleport는 Teleport의 데이터베이스 서버 CA 또는 이 TLS 설정에 지정된 ca_cert로 서명된 
    # 자체 서명된 데이터베이스만 신뢰합니다. 클라우드 호스팅 데이터베이스의 경우, Teleport는 검증을 위해 필요한 
    # 해당 CA를 다운로드합니다.
    trust_system_cert_pool: false

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

  # MySQL 전용 옵션.
  mysql:
    # Teleport 프록시 서비스에 의해 보고된 MySQL 서버 버전.
    # Teleport는 이 문자열을 사용하여 클라이언트에 서버 버전을 보고합니다.
    #
    # 이 옵션이 설정되지 않으면 데이터베이스 서비스는 시작 시 MySQL 인스턴스에 연결하여 서버 버전을 가져오려고 합니다.
    # 그렇지 않으면 데이터베이스에 연결하지 않고 제공된 값을 사용할 것입니다.
    #
    # 두 경우 모두 클라이언트에 보고되는 MySQL 서버 버전은 사용자의 첫 성공적인 연결 시 업데이트됩니다.
    # Teleport는 연결된 클라이언트에 서버 버전을 보고할 때 기본 '8.0.0-Teleport' 버전 대신 해당 문자열을 사용합니다.
    # 이 옵션이 설정되지 않으면 데이터베이스 서비스는 시작 시 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를 사용하는 다음 명령을 실행하여 생성할 수 있습니다:

로컬 머신에서 tctl을 사용하기 위해 클러스터에 tsh로 로그인합니다.

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

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

리소스 생성

tctl create -f db.yaml

로컬 머신에서 tctl을 사용하기 위해 Teleport 클러스터에 로그인합니다.

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

리소스 생성

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