Infograb logo
데이터베이스 접근을 위한 머신 ID

Teleport는 데이터베이스에 대한 접근을 보호하고 제어합니다. 머신 ID는 이러한 데이터베이스에 안전하고 짧은 시간 동안 접근할 수 있도록 기계를 부여하는 데 사용할 수 있습니다.

이 가이드에서는 tbot을 구성하여 Teleport에 구성된 데이터베이스에 접근하기 위해 사용할 수 있는 자격 증명을 생성할 것입니다.

머신 ID 및 데이터베이스 접근 배포
머신 ID 및 데이터베이스 접근 배포

전제조건

  • 실행 중인 Teleport 클러스터 버전 이상. Teleport를 시작하려면, 가입하기 위해 무료 평가판에 등록하거나 데모 환경 설정하기를 참조하세요.

  • tctl 관리 도구와 tsh 클라이언트 도구.

    tctltsh 다운로드에 대한 지침은 설치를 방문하세요.

  • 아직 Teleport 데이터베이스 서비스 뒤에 데이터베이스를 두지 않았다면, 데이터베이스 접근 시작 가이드를 따르세요. Teleport 데이터베이스 서비스는 PostgreSQL, MongoDB, Redis 등과 같은 데이터베이스를 지원합니다. 전체 목록을 보려면 데이터베이스 접근 가이드를 참조하세요.
  • 당신의 Teleport 클러스터에 연결할 수 있는지 확인하려면, tsh login으로 로그인한 다음 현재 자격 증명을 사용하여 tctl 명령어를 실행할 수 있는지 확인하십시오. 예를 들어:
    tsh login --proxy=teleport.example.com --user=email@example.com
    tctl status

    클러스터 teleport.example.com

    버전 16.2.0

    CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678

    클러스터에 연결하고 tctl status 명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 작업대에서 후속 tctl 명령어를 실행할 수 있습니다. 자신의 Teleport 클러스터를 호스팅하는 경우, Teleport 인증 서비스를 호스팅하는 컴퓨터에서 전체 권한으로 tctl 명령어를 실행할 수도 있습니다.
  • 데이터베이스에 접근할 기계에는 tsh 이진 파일이 설치되어 있어야 합니다. tbot이 설치된 방법에 따라 이미 설치되어 있을 수 있습니다. 설치되어 있지 않다면, 설치에서 자세한 내용을 참조하세요.
  • 데이터베이스에 접근할 기계에 tbot이 이미 설치되고 구성되어 있어야 합니다. 자세한 내용은 배포 가이드를 참조하세요.

1단계/4단계. RBAC 구성

먼저, 자격 증명이 데이터베이스 서버와 데이터베이스에 접근할 수 있도록 Teleport를 구성해야 합니다. 이는 필요한 권한을 부여하는 역할을 생성하고 이 역할을 Bot에 할당함으로써 이루어집니다.

다음 내용을 가진 role.yaml 파일을 생성하세요:

kind: role
version: v6
metadata:
  name: example-role
spec:
  allow:
    db_labels:
      '*': '*'
    db_names: [example-db]
    db_users: [alice]
    rules:
      - resources: [db_server, db]
        verbs: [read, list]

다음을 교체하세요:

  • example-role을 귀하의 사용 사례와 관련된 설명적인 이름으로.
  • example-db를 bot이 접근하는 데 사용될 데이터베이스의 이름으로.
  • alice를 bot이 데이터베이스에 연결할 때 사용할 사용자 이름으로.

tctl create -f ./role.yaml을 사용하여 역할을 생성하세요.

이제 tctl bots update를 사용하여 Bot에 역할을 추가하세요. example을 배포 가이드에서 생성한 Bot의 이름으로, example-role을 방금 생성한 역할의 이름으로 교체하세요:

$ tctl bots update example --add-roles example-role

이 규칙은 bot이 두 가지 작업을 수행할 수 있도록 허용합니다:

  • 사용자 alice로서 모든 데이터베이스 서버에서 데이터베이스 example에 접근합니다 (due to the '*': '*' label selector).
  • Teleport에서 데이터베이스 리소스에 대한 정보를 검색합니다.

'*': '*' label selector는 Teleport에 구성된 모든 데이터베이스 서버에 대한 접근을 허용합니다. 프로덕션 환경에서는 보다 구체적인 label selector를 사용하여 bot의 접근을 제한하는 것이 좋습니다; 데이터베이스 관련 역할 옵션에 대한 전체 참조는 Database Access RBAC guide를 참조하세요.

2단계/4단계. 데이터베이스 tbot 출력 구성

이제 tbot은 데이터베이스 접근에 필요한 자격 증명을 생성하는 출력을 구성해야 합니다. 이를 위해 database 출력 유형이 사용됩니다.

자격 증명을 생성할 데이터베이스는 database 출력의 일부로 구성됩니다. 이는 다음 세 가지 필드를 사용하여 제어됩니다:

  • service는 자격 증명이 접근을 부여할 Teleport 구성에서 명명된 데이터베이스 서비스를 지정합니다.
  • database는 자격 증명이 접근을 부여할 데이터베이스를 지정합니다.
  • username은 자격 증명이 접근을 부여할 데이터베이스의 사용자 이름을 지정합니다. 이 필드는 모든 종류의 데이터베이스에 대해 반드시 지정할 필요는 없습니다.

또한, 데이터베이스 출력의 format 필드는 생성된 자격 증명의 형식을 제어합니다. 이는 특정 형식을 기대하는 클라이언트와의 호환성을 허용합니다. 이 필드가 지정되지 않은 경우, 대부분의 클라이언트와 호환되는 합리적인 기본 옵션이 사용됩니다. 지원되는 모든 format 옵션의 전체 목록은 다음과 같습니다:

클라이언트format설명
기본지정되지 않음tlscert에 인증서를 제공하고, key에 개인 키를 제공하며, teleport-database-ca.crt에 CA를 제공합니다. 이는 대부분의 클라이언트와 호환됩니다.
MongoDBmongomongo.crtmongo.cas를 제공합니다.
CockroachDBcockroachcockroach/node.key, cockroach/node.crt, 및 cockroach/ca.crt를 제공합니다.
일반 TLStls특정 파일 확장자가 필요한 일반 클라이언트를 위해 tls.key, tls.crt, 및 tls.cas를 제공합니다.

출력은 목적지가 있는 구성으로 해야 합니다. 이 예제에서는 directory 목적지를 사용합니다. 이는 디스크의 지정된 디렉토리에 산출물을 기록합니다. 이 디렉토리는 tbot이 실행되는 리눅스 사용자가 쓰기 가능해야 하며, 애플리케이션에 접근할 리눅스 사용자가 읽을 수 있어야 합니다.

tbot 구성에서 database 출력을 추가하도록 수정하세요:

outputs:
- type: database
  destination:
    type: directory
    path: /opt/machine-id
  # 연결할 데이터베이스의 세부 정보를 지정하십시오.
  service: example-server
  database: example
  username: alice
  # 출력 자격 증명의 형식을 지정하십시오. 대부분의 데이터베이스의 경우,
  # 이 구성 필드는 생략할 수 있습니다.
  # format: mongo

tbot을 백그라운드 서비스로 운영하는 경우, 다시 시작하세요. tbot을 원샷 모드로 실행하는 경우, Ansible 플레이북을 실행하기 전에 실행해야 합니다.

3단계/4단계. 로컬 데이터베이스 접근 프록시 구성

이제 tbot이 데이터베이스 접근 자격 증명을 생성했으므로, 로컬 프록시를 설정하여 데이터베이스 클라이언트의 데이터베이스 연결을 Teleport 프록시 서비스에 TLS 연결을 통해 전달해야 합니다. 이는 TLS 연결로 Teleport 프록시 서비스가 프로토콜과 의도된 수신자를 식별할 수 있도록 하므로 필요합니다.

로컬 프록시는 클라이언트가 데이터베이스에 연결하는 동안 또는 연결이 여전히 열려 있는 동안 실행되고 있어야 합니다. 로컬 프록시를 백그라운드에서 계속 실행하는 한 가지 방법은 systemd 서비스를 사용하는 것입니다. 이 단계의 나머지 부분에서 시연되지만, 다른 서비스 관리자를 사용하거나 클라이언트가 실행되는 동안 로컬 프록시를 실행하기 위해 여러 가지 다른 기술을 사용할 수 있습니다.

로컬 프록시는 로컬 루프백 인터페이스에서 지정된 포트를 엽니다. 그런 다음 클라이언트는 localhost의 이 포트에 연결하도록 구성되어야 합니다. 포트가 로컬 루프백 인터페이스에서 열리므로 로컬 프록시는 데이터베이스에 연결하고자 하는 클라이언트와 동일한 호스트에서 실행되어야 합니다.

기본적으로 데이터베이스 클라이언트는 로컬 포트에 연결할 때 자격 증명을 사용하도록 구성되어야 합니다. 이는 호스트의 다른 사용자가 로컬 포트를 통해 데이터베이스에 접근할 수 없도록 하고, 데이터베이스 클라이언트와 서버 간의 연결이 로컬호스트를 통해서라도 암호화되지 않도록 보장합니다.

이 목적을 위해 systemd 서비스를 만들려면 /etc/systemd/system/tbot-db-proxy.service에 단위 파일을 생성하세요:

[Unit]
Description=Teleport Machine ID Proxy Service
After=network.target
# 이전 가이드를 따르고 tbot 자체를 systemd 서비스로 구성했다면, 두 서비스 간의 의존성을 생성하려면 다음 행의 주석을 제거하십시오.
# Requires=tbot.service

[Service]
Type=simple
# teleport 사용자/그룹이 존재하고 목적지 디렉토리에 대한 읽기 접근 권한이 있는지 확인하십시오.
User=teleport
Group=teleport
Restart=always
RestartSec=5
# 로컬 루프백 인터페이스에서 비어 있는 포트 중 하나로 `12345`를 조정하십시오. `example-server`를 teleport에서의 데이터베이스 서비스 이름에 조정하십시오.
ExecStart=/usr/local/bin/tbot -c /etc/tbot.yaml proxy --proxy=proxy.example.com:3080 --destination-dir=/opt/machine-id db --port=12345 example-server
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/run/tbot-db-proxy.pid
LimitNOFILE=8192

[Install]
WantedBy=multi-user.target

이렇게 하면 example-server 데이터베이스 서버에 연결하는 데 사용할 수 있는 포트 12345에서 로컬 프록시를 시작합니다. 로컬 설정에 따라 tbot 매개변수를 필요에 따라 사용자 지정하세요.

마지막으로 다음 명령을 실행하여 로컬 프록시 서비스를 활성화하고 시작하세요:

sudo systemctl enable tbot-db-proxy
sudo systemctl start tbot-db-proxy
sudo systemctl status tbot-db-proxy

인증된 터널

기본 동작은 클라이언트가 클라이언트 인증서를 사용하여 인증할 것을 요구하지만, 인증된 터널을 구성할 수 있습니다. 이렇게 하면 로컬 포트에 수신 설정인 모든 연결에 자격 증명이 자동으로 첨부됩니다. 이는 클라이언트가 클라이언트 인증서를 지원하지 않는 경우 필요할 수 있습니다.

인증된 터널 모드를 활성화하려면 --tunnel 플래그를 tbot proxy db...와 함께 사용합니다.

이 과정을 포그라운드에서 실행하는 경우 --tunnel 플래그를 제공합니다. systemd 서비스를 사용하는 경우 machine-id-proxy.service에서 ExecStart--tunnel을 추가하고 단위를 다시 로드하십시오.

이것이 활성화되면, 구성된 포트에 연결할 때 클라이언트에 암호 또는 TLS 인증서 및 인증 기관을 지정할 필요가 없습니다.

4단계/4단계. 데이터베이스에 연결할 클라이언트 구성

자격 증명이 생성되고 로컬 프록시가 실행 중이면, 이제 클라이언트를 자격 증명을 사용하여 로컬 프록시를 사용하도록 구성할 수 있습니다.

자격 증명을 사용하는 샘플 Go 프로그램을 참조하십시오:

// 이 예제 프로그램은 Teleport Machine ID에서 발급한 인증서를 사용하여 
// Postgres 데이터베이스에 연결하는 방법을 보여줍니다.

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/jackc/pgx/v4/stdlib"
)

func main() {
	// 데이터베이스에 연결을 엽니다.
	db, err := sql.Open("pgx", fmt.Sprint(
		"host=localhost ",
		"port=1234 ",
		"dbname=example ",
		"user=alice ",
		// 다음 네 가지 옵션은 로컬 프록시가
		// "인증된 터널" 모드에 놓인 경우 생략해야 합니다.
		"sslmode=verify-full ",
		"sslrootcert=/opt/machine-id/teleport-host-ca.crt ",
		"sslkey=/opt/machine-id/key ",
		"sslcert=/opt/machine-id/tlscert ",
	))
	if err != nil {
		log.Fatalf("데이터베이스 열기에 실패했습니다: %v.", err)
	}

	defer db.Close()

	// "Ping"을 호출하여 연결성을 테스트합니다.
	err = db.Ping()
	if err != nil {
		log.Fatalf("데이터베이스에 Ping하기 실패했습니다: %v.", err)
	}

	log.Printf("PostgreSQL에 성공적으로 연결되었습니다.")
}

데이터 입력: // 이 예제 프로그램은 Teleport 기계 ID에서 발급한 인증서를 사용하여
// MongoDB 데이터베이스에 연결하는 방법을 보여줍니다.

패키지 메인

가져오기 (
	"context"
	"fmt"
	"log"
	"time"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

기능 main() {
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	// 클라이언트를 생성하고 MongoDB에 연결합니다. 호스트,
	// 포트 및 인증서 경로를 수정해야 합니다.
	uri := fmt.Sprintf(
		"mongodb://localhost:1234/?tlsCAFile=%s&tlsCertificateKeyFile=%s",
		"/opt/machine-id/mongo.cas",
		"/opt/machine-id/mongo.crt",
	)
	client, err := mongo.NewClient(options.Client().ApplyURI(uri))
	if err != nil {
		log.Fatalf("데이터베이스 클라이언트를 생성하지 못했습니다: %v.", err)
	}
	err = client.Connect(ctx)
	if err != nil {
		log.Fatalf("데이터베이스에 연결하지 못했습니다: %v.", err)
	}

	defer client.Disconnect(ctx)

	log.Printf("MongoDB에 성공적으로 연결되었습니다.")

	// 연결 테스트를 위해 데이터베이스 목록을 나열합니다.
	databases, err := client.ListDatabaseNames(ctx, bson.M{})
	if err != nil {
		log.Fatalf("데이터베이스 목록을 가져오지 못했습니다: %v.", err)
	}
	log.Println(databases)

}

모든 준비가 완료되었습니다. 머신 ID와 연결된 짧은 기간 자격 증명을 애플리케이션에 제공하여 데이터베이스에 접근하게 하고, 이 자격 증명은 회전 및 감사가 가능하며, 모든 친숙한 Teleport 접근 제어로 제어됩니다.

다음 단계

  • 사용 가능한 모든 구성 옵션을 탐색하려면 구성 참조를 읽으십시오.
Teleport 원문 보기