인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
데이터베이스 액세스 구성 참조
이 가이드는 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