Teleport는 데이터베이스에 대한 접근을 보호하고 제어합니다. 머신 ID는 이러한 데이터베이스에 안전하고 짧은 시간 동안 접근할 수 있도록 기계를 부여하는 데 사용할 수 있습니다.
이 가이드에서는 tbot
을 구성하여 Teleport에 구성된 데이터베이스에 접근하기 위해 사용할 수 있는 자격 증명을 생성할 것입니다.
전제조건
-
실행 중인 Teleport 클러스터 버전 이상. Teleport를 시작하려면, 가입하기 위해 무료 평가판에 등록하거나 데모 환경 설정하기를 참조하세요.
-
tctl
관리 도구와tsh
클라이언트 도구.tctl
과tsh
다운로드에 대한 지침은 설치를 방문하세요.
- 아직 Teleport 데이터베이스 서비스 뒤에 데이터베이스를 두지 않았다면, 데이터베이스 접근 시작 가이드를 따르세요. Teleport 데이터베이스 서비스는 PostgreSQL, MongoDB, Redis 등과 같은 데이터베이스를 지원합니다. 전체 목록을 보려면 데이터베이스 접근 가이드를 참조하세요.
- 당신의 Teleport 클러스터에 연결할 수 있는지 확인하려면,
tsh login
으로 로그인한 다음 현재 자격 증명을 사용하여tctl
명령어를 실행할 수 있는지 확인하십시오. 예를 들어:클러스터에 연결하고tsh login --proxy=teleport.example.com --user=email@example.comtctl 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를 제공합니다. 이는 대부분의 클라이언트와 호환됩니다. |
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 를 제공합니다. |
출력은 목적지가 있는 구성으로 해야 합니다. 이 예제에서는 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-proxysudo systemctl start tbot-db-proxysudo 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 접근 제어로 제어됩니다.
다음 단계
- 사용 가능한 모든 구성 옵션을 탐색하려면 구성 참조를 읽으십시오.