데이터베이스 접근과 머신 및 워크로드 아이덴티티
Teleport v18.9Teleport는 데이터베이스에 대한 접근을 보호하고 제어합니다. 이 가이드에서는 Teleport에서 설정된 데이터베이스에 접근하는 데 사용할 수 있는 자격 증명을 생성하도록 tbot을 설정합니다. 실행 중인 Teleport 클러스터.
Teleport는 데이터베이스에 대한 접근을 보호하고 제어합니다. 머신 및 워크로드 아이덴티티를 사용하여 머신에 이러한 데이터베이스에 대한 안전하고 단기적인 접근을 허용할 수 있습니다.
이 가이드에서는 Teleport에서 설정된 데이터베이스에 접근하는 데 사용할 수 있는 자격 증명을 생성하도록 tbot을 설정합니다.
사전 요구 사항#
-
실행 중인 Teleport 클러스터. Teleport를 시작하려면 무료 체험판에 가입하거나 데모 환경을 구성하세요.
-
tctlandtshclients.Installing `tctl` and `tsh` clients
-
Teleport 클러스터의 버전을 확인합니다.
tctlandtshclients는 Teleport 클러스터 버전보다 최대 한 개의 메이저 버전까지만 뒤처질 수 있습니다. Proxy Service의/v1/webapi/find로 GET 요청을 보내고 JSON 쿼리 도구를 사용하여 클러스터 버전을 확인합니다.teleport.example.com:443를 Teleport Proxy Service의 웹 주소로 바꿉니다:$ TELEPORT_DOMAIN=teleport.example.com:443 $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')" -
사용 중인 플랫폼에 대한 지침에 따라
tctlandtshclients를 설치합니다:
-
Mac
`tctl` and `tsh` clients가 포함된, 서명된 Teleport macOS .pkg 설치 프로그램을 다운로드합니다:
```code
$ curl -O https://cdn.teleport.dev/teleport-${TELEPORT_VERSION?}.pkg
```
Finder에서 `pkg` 파일을 더블 클릭하여 설치를 시작합니다.
Homebrew를 사용하여 Teleport를 설치하는 것은 지원되지 않습니다. Homebrew의
Teleport 패키지는 Teleport에서 유지 관리하지 않으므로 신뢰성이나 보안을
보장할 수 없습니다.
Windows - Powershell
```code
$ curl.exe -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-windows-amd64-bin.zip
# Unzip the archive and move the `tctl` and `tsh` clients to your %PATH%
# NOTE: Do not place the `tctl` and `tsh` clients in the System32 directory, as this can cause issues when using WinSCP.
# Use %SystemRoot% (C:\Windows) or %USERPROFILE% (C:\Users\<username>) instead.
```
Linux
Linux 설치판의 모든 Teleport 바이너리에는 `tctl` and `tsh` clients가 포함되어 있습니다. RPM/DEB
패키지 및 i386/ARM/ARM64용 다운로드를 포함한 더 많은 옵션은
[설치 페이지](../installation/installation.mdx)를 참조하세요.
```code
$ curl -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
$ tar -xzf teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
$ cd teleport
$ sudo ./install
# Teleport binaries have been copied to /usr/local/bin
```
- 데이터베이스를 아직 Teleport 데이터베이스 서비스 뒤에 두지 않았다면 데이터베이스 접근 시작 가이드를 따르세요. Teleport 데이터베이스 서비스는 PostgreSQL, MongoDB, Redis 등 다양한 데이터베이스를 지원합니다. 전체 목록은 데이터베이스 접근 가이드를 참고하세요.
Teleport cluster에 연결할 수 있는지 확인하려면 tsh login으로 로그인한 다음,
현재 자격 증명으로 tctl 명령을 실행할 수 있는지 확인합니다.
예를 들어, teleport.example.com에 cluster 내 Teleport Proxy Service의
도메인 이름을, email@example.com에 Teleport 사용자 이름을 지정하여
다음 명령을 실행합니다:
$ tsh login --proxy=teleport.example.com --user=email@example.com
$ tctl status
# Cluster (=teleport.url=)
# Version (=teleport.version=)
# CA pin (=presets.ca_pin=)
cluster에 연결하여 tctl status 명령을 실행할 수 있다면, 현재 자격 증명을 사용하여
워크스테이션에서 이후의 tctl 명령을 실행할 수 있습니다.
자체 Teleport cluster를 호스팅하는 경우, 전체 권한을 얻기 위해 Teleport Auth Service를
호스팅하는 컴퓨터에서 tctl 명령을 실행할 수도 있습니다.
- 데이터베이스에 접근할 머신에는
tsh바이너리가 설치되어 있어야 합니다.tbot을 설치한 방식에 따라 이미 설치되어 있을 수 있습니다. 설치되어 있지 않다면 자세한 내용은 설치를 참고하세요. - 데이터베이스에 접근할 머신에는
tbot이 이미 설치되고 설정되어 있어야 합니다. 자세한 내용은 배포 가이드를 참고하세요. - 4단계에 포함된 예제 프로그램을 실행하려면 시스템에 Go가 설치되어 있어야 합니다.
1단계/4단계. RBAC 설정#
먼저, 봇이 생성한 자격 증명이 데이터베이스 서버와 데이터베이스에 접근할 수 있도록 Teleport를 설정해야 합니다. 이는 필요한 권한을 부여하는 역할을 생성한 다음 이 역할을 봇에 할당하는 방식으로 이루어집니다.
다음 내용으로 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를 봇이 접근하는 데 사용할 데이터베이스 이름으로 교체합니다.alice를 봇이 데이터베이스에 연결할 때 사용할 사용자 이름으로 교체합니다.
tctl create -f ./role.yaml을 사용하여 역할을 생성합니다.
Web UI를 사용하여 역할을 생성하고 편집할 수도 있습니다. Access -> Roles로 이동하여 Create New Role을 클릭하거나 편집할 기존 역할을 선택하십시오.
이제 tctl bots update를 사용하여 봇에 역할을 추가합니다. example은 배포
가이드에서 생성한 봇의 이름으로, example-role은 방금 생성한 역할의 이름으로
교체합니다:
$ tctl bots update example --add-roles example-role
이 규칙은 봇이 다음 두 가지 작업을 수행할 수 있도록 허용합니다:
- (
'*': '*'라벨 선택자로 인해) 어떤 데이터베이스 서버에서든 사용자alice로 데이터베이스example-db에 접근할 수 있습니다. - Teleport에서 데이터베이스 리소스에 대한 정보를 검색할 수 있습니다.
'*': '*' 라벨 선택자는 Teleport에 설정된 모든 데이터베이스 서버에 대한 접근을 허용합니다.
프로덕션 환경에서는 더 구체적인 라벨 선택자를 사용하여 봇의 접근을 제한하는 것을 고려하세요.
데이터베이스 관련 역할 옵션의 전체 참조는
데이터베이스 접근 RBAC 가이드를 참고하세요.
2단계/4단계. 데이터베이스 tbot 출력 서비스 설정#
이제 tbot에 데이터베이스 접근에 필요한 자격 증명을 생성할 출력 서비스를
설정해야 합니다. 이를 위해 database 출력 서비스 유형이 사용됩니다.
자격 증명을 생성할 데이터베이스는 database 서비스의 일부로 설정되며,
이는 다음 세 가지 필드로 제어됩니다:
service는 자격 증명이 접근을 허용할, Teleport 설정에 지정된 데이터베이스 서비스를 지정합니다.database는 자격 증명이 접근을 허용할, 데이터베이스 서비스 상의 데이터베이스를 지정합니다.username은 자격 증명이 접근을 허용할 데이터베이스상의 사용자를 지정합니다. 이 필드는 모든 유형의 데이터베이스에 대해 지정해야 하는 것은 아닙니다.
또한 데이터베이스 출력 서비스의 format 필드는 생성되는 자격 증명의 형식을
제어합니다. 이를 통해 특정 형식을 요구하는 클라이언트와의 호환성을 확보할 수
있습니다. 이 필드를 지정하지 않으면 대부분의 클라이언트와 호환되는 적절한
기본 옵션이 사용됩니다. 지원되는 format 옵션의 전체 목록은 다음과 같습니다:
| 클라이언트 | format |
설명 |
|---|---|---|
| 기본값 | 지정 안 됨 | tlscert에 인증서를, key에 개인 키를, teleport-database-ca.crt에 CA를 제공합니다. 대부분의 클라이언트와 호환됩니다. |
| MongoDB | mongo |
mongo.crt와 mongo.cas를 제공합니다. |
| CockroachDB | cockroach |
cockroach/node.key, cockroach/node.crt, cockroach/ca.crt를 제공합니다. |
| 일반 TLS | tls |
특정 파일 확장자를 요구하는 일반 클라이언트를 위해 tls.key, tls.crt, tls.cas를 제공합니다. |
출력 서비스는 대상(destination)과 함께 설정되어야 합니다. 이 예제에서는
directory 대상을 사용합니다. 이는 디스크의 지정된 디렉터리에 아티팩트를
기록합니다. 이 디렉터리는 tbot이 실행되는 리눅스 사용자가 쓸 수 있어야 하며,
애플리케이션에 접근할 리눅스 사용자가 읽을 수 있어야 합니다.
tbot 설정을 수정하여 database 서비스를 추가합니다:
services:
- type: database
destination:
type: directory
path: /opt/machine-id
# 연결하려는 데이터베이스의 세부 정보를 지정합니다.
service: example-server
database: example-db
username: alice
# 출력 자격 증명에 사용할 형식을 지정합니다. 대부분의 데이터베이스의 경우
# 이 설정 필드는 생략할 수 있습니다.
# format: mongo
이 섹션의 내용은 원문 문서를 참조하세요. (reload-tbot.mdx)
3단계/4단계. 로컬 데이터베이스 접근 프록시 설정#
tbot이 데이터베이스 접근 자격 증명을 생성했으므로, 이제 데이터베이스
클라이언트의 연결을 TLS 연결을 통해 Teleport 프록시 서비스로 전달할 로컬
프록시를 설정해야 합니다. TLS 연결을 통해 Teleport 프록시 서비스가 프로토콜과
의도된 수신자를 식별할 수 있으므로 이 과정이 필요합니다.
로컬 프록시는 클라이언트가 데이터베이스에 연결해야 하는 동안 또는 연결이 열려 있는 동안 계속 실행되어야 합니다. 이 로컬 프록시를 백그라운드에서 계속 실행하는 한 가지 방법은 systemd 서비스를 사용하는 것입니다. 이 단계의 나머지 부분에서는 이 방법을 설명하지만, 다른 서비스 관리자를 사용하거나 클라이언트가 실행되는 동안 로컬 프록시를 실행하는 다른 여러 기법을 사용할 수도 있습니다.
로컬 프록시는 로컬 루프백 인터페이스에서 지정된 포트를 엽니다. 클라이언트는 localhost의 이 포트에 연결하도록 설정해야 합니다. 포트가 로컬 루프백 인터페이스에서 열리므로, 로컬 프록시는 데이터베이스에 연결하려는 클라이언트와 동일한 호스트에서 실행되어야 합니다.
기본적으로 데이터베이스 클라이언트는 로컬 포트에 연결할 때 자격 증명을 사용하도록 설정되어야 합니다. 이를 통해 호스트의 다른 사용자가 로컬 포트를 통해 데이터베이스에 접근할 수 없게 되며, localhost를 통한 경우에도 데이터베이스 클라이언트와 서버 간의 연결이 암호화되지 않은 상태로 남지 않도록 보장합니다.
이를 위한 systemd 서비스를 생성하려면 /etc/systemd/system/tbot-db-proxy.service
경로에 유닛 파일을 생성합니다:
[Unit]
Description=Teleport Machine & Workload Identity Proxy Service
After=network.target
# If you have followed a previous guide and configured tbot itself as a systemd
# service, uncomment the following line to create a dependency between the two
# services.
# Requires=tbot.service
[Service]
Type=simple
# Ensure that the teleport user/group exists and has read access to the
# destination directory.
User=teleport
Group=teleport
Restart=always
RestartSec=5
# Adjust `12345` to any port of your choosing that is free on the local loopback
# interface. Adjust `example-server` to the name of the Database Service in
# 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
이렇게 하면 포트 12345에서 로컬 프록시가 시작되어 example-server
데이터베이스 서버에 연결하는 데 사용할 수 있습니다. 로컬 설정에 맞게 tbot
매개변수를 반드시 커스터마이즈하세요.
마지막으로, 다음 명령을 실행하여 로컬 프록시 서비스를 활성화하고 시작합니다:
$ sudo systemctl enable tbot-db-proxy
$ sudo systemctl start tbot-db-proxy
$ sudo systemctl status tbot-db-proxy
인증된 터널#
기본 동작은 클라이언트가 클라이언트 인증서 인증을 사용해야 하지만, **인증된 터널(authenticated tunnel)**을 설정하는 것도 가능합니다. 이렇게 하면 로컬 포트로 들어오는 모든 연결에 자격 증명이 자동으로 첨부됩니다. 이는 보안 수준이 낮아지지만, 사용하려는 클라이언트가 클라이언트 인증서 인증을 지원하지 않는 경우 필요할 수 있습니다.
인증된 터널 모드를 활성화하려면 tbot proxy db...와 함께 --tunnel 플래그를
사용합니다.
포그라운드에서 이를 실행하는 경우 --tunnel 플래그를 제공하세요. systemd
서비스를 사용하는 경우 machine-id-proxy.service의 ExecStart에 --tunnel을
추가한 다음 유닛을 다시 로드하세요.
이 기능이 활성화되면, 설정된 포트에 연결할 때 클라이언트에 비밀번호나 TLS 인증서 및 인증 기관을 지정할 필요가 없습니다.
4단계/4단계. 데이터베이스에 연결하도록 클라이언트 설정#
자격 증명이 생성되고 로컬 프록시가 실행 중이므로, 이제 클라이언트가 자격 증명과 함께 로컬 프록시를 사용하도록 설정할 수 있습니다.
- 다음 샘플 Go 프로그램 중 하나를 "connect.go"라는 파일에 복사하고, 명령에 표시된 대로 수정합니다:
<!-- INCLUDE:ENGLISH:docs/pages/includes/machine-id/postgresql/postgresql.go -->
// This example program demonstrates how to connect to a Postgres database
// using certificates issued by Teleport Machine & Workload Identity.
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/jackc/pgx/v4/stdlib"
)
func main() {
// Open connection to database.
db, err := sql.Open("pgx", fmt.Sprint(
"host=localhost ",
"port=1234 ",
"dbname=example ",
"user=alice ",
// The next four options should be omitted if the local proxy has been
// placed in "authenticated tunnel" mode.
"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("Failed to open database: %v.", err)
}
defer db.Close()
// Call "Ping" to test connectivity.
err = db.Ping()
if err != nil {
log.Fatalf("Failed to Ping database: %v.", err)
}
log.Printf("Successfully connected to PostgreSQL.")
}
<!-- /INCLUDE:ENGLISH -->
<!-- INCLUDE:ENGLISH:docs/pages/includes/machine-id/mongodb/mongodb.go -->
// This example program demonstrates how to connect to a MongoDB database
// using certificates issued by Teleport Machine & Workload Identity.
package main
import (
"context"
"fmt"
"log"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// Create client and connect to MongoDB. Make sure to modify the host,
// port, and certificate paths.
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("Failed to create database client: %v.", err)
}
err = client.Connect(ctx)
if err != nil {
log.Fatalf("Failed to connect to database: %v.", err)
}
defer client.Disconnect(ctx)
log.Printf("Successfully connected to MongoDB.")
// List databases to test connectivity.
databases, err := client.ListDatabaseNames(ctx, bson.M{})
if err != nil {
log.Fatalf("Failed to list databases: %v.", err)
}
log.Println(databases)
}
<!-- /INCLUDE:ENGLISH -->
-
프로그램을 실행합니다:
$ go run connect.go
이제 준비가 완료되었습니다. 애플리케이션에 머신 아이덴티티에 연결된 단기 인증서를 제공하여 데이터베이스에 접근하고, 회전(rotation)하고, 감사할 수 있으며, 이 모든 과정이 익숙한 Teleport 접근 제어로 관리됩니다.
다음 단계#
- 설정 참조를 읽고 사용 가능한 모든 설정 옵션을 살펴보세요.