Teleport 감사 이벤트를 Elastic Stack으로 내보내기
Teleport의 Event Handler 플러그인은 Teleport Auth Service에서 감사 이벤트를 수신하여 로그 관리 솔루션으로 전달하므로, 기록 분석, 비정상적인 동작 감지, Teleport 클러스터와 사용자가 상호 작용하는 방식에 대한 더 나은 이...
Teleport의 Event Handler 플러그인은 Teleport Auth Service에서 감사 이벤트를 수신하여 로그 관리 솔루션으로 전달하므로, 기록 분석, 비정상적인 동작 감지, Teleport 클러스터와 사용자가 상호 작용하는 방식에 대한 더 나은 이해를 얻을 수 있습니다.
이 가이드에서는 Teleport 감사 이벤트를 Elastic Stack으로 전송하도록 Teleport의 Event Handler 플러그인을 구성하는 방법을 보여줍니다.
작동 방식#
Teleport Event Handler는 Teleport Auth Service에 인증하여 gRPC 스트림을 통해 감사 이벤트를 수신한 후, 해당 이벤트를 Logstash로 전송합니다. Logstash는 Kibana에서 시각화 및 알림을 위해 Elasticsearch에 저장합니다.
사전 요구사항#
-
Linux 호스트에서 실행되는 Logstash 버전 8.4.1 이상. 이 가이드에서는 이 호스트에서 Event Handler 플러그인도 실행합니다.
-
Elastic Cloud 계정 또는 자체 인프라에서 실행되는 Elasticsearch 및 Kibana 버전 8.4.1 이상. Elasticsearch에서 사용자를 생성하고 관리할 권한이 필요합니다.
이 가이드는 Elastic Stack 버전 8.4.1에서 테스트되었습니다.
-
Teleport Event Handler 플러그인을 실행할 서버, 가상 머신, Kubernetes 클러스터 또는 Docker 환경.
이 가이드는 Event Handler 설정 가이드 중 하나를 완료했다고 가정합니다:
아래 지침은 워크스테이션에서 Event Handler 플러그인을 로컬로 테스트하는 방법을 보여줍니다. 다른 환경에서는 경로, 포트 및 도메인을 조정해야 합니다.
1/3단계. Logstash 파이프라인 구성#
Event Handler 플러그인은 사용자 구성 엔드포인트로 HTTP 요청을 전송하여 Teleport에서 감사 로그를 전달합니다. 이러한 요청을 처리하고, 로그를 추출하고, Elasticsearch로 전송하는 Logstash 파이프라인을 정의합니다.
Event Handler 플러그인을 위한 역할 생성#
Logstash 파이프라인은 Elasticsearch 인덱스 및 인덱스 수명 주기 관리 정책을 생성 및 관리하는 권한과 Elasticsearch 배포 정보를 가져오는 권한이 필요합니다. Event Handler를 위해 생성할 Elasticsearch 사용자에게 나중에 할당할 수 있도록 이러한 권한이 있는 역할을 만듭니다.
Kibana에서 "Management" > "Roles"로 이동하여 "Create role"을 클릭합니다. 새 역할의 이름으로 teleport-plugin을 입력합니다. "Elasticsearch" 섹션의 "Cluster privileges" 아래에서 manage_index_templates, manage_ilm, monitor를 입력합니다.
"Index privileges" 아래에서 "Indices" 필드에 audit-events-*가 있는 항목을 정의하고 "Privileges" 필드에 write와 manage를 입력합니다. "Create role"을 클릭합니다.

Event Handler를 위한 Elasticsearch 사용자 생성#
Logstash가 Elasticsearch API에 요청할 때 인증하는 Elasticsearch 사용자를 만듭니다.
Kibana에서 왼쪽 상단의 햄버거 메뉴를 찾아 "Management"를 클릭한 다음 "Users" > "Create user"를 클릭합니다. "Username"에 teleport를 입력하고 안전한 비밀번호를 제공합니다.
이전에 정의한 teleport-plugin 역할을 사용자에게 할당합니다.
Logstash를 위한 TLS 자격 증명 준비#
이 가이드 뒷부분에서 Logstash 파이프라인은 HTTP 입력을 사용하여 Teleport Event Handler 플러그인에서 감사 이벤트를 수신합니다.
Logstash의 HTTP 입력은 암호화되지 않은 PKCS #8 형식을 사용하는 개인 키로만 인증서에 서명할 수 있습니다. teleport-event-handler configure를 실행했을 때 명령은 암호화된 RSA 키를 생성했습니다. 이 키를 PKCS #8로 변환합니다.
RSA 키를 복호화하려면 비밀번호가 필요합니다. 이를 검색하려면 teleport-event-handler configure를 실행한 디렉터리에서 다음 명령을 실행합니다:
$ cat fluent.conf | grep passphrase
private_key_passphrase "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
암호화된 RSA 키를 암호화되지 않은 PKCS #8 키로 변환합니다. 명령은 검색한 비밀번호를 입력하도록 요청합니다:
$ openssl pkcs8 -topk8 -in server.key -nocrypt -out pkcs8.key
Logstash가 새 키와 이전에 생성된 CA 및 인증서를 읽을 수 있도록 합니다:
$ chmod +r pkcs8.key ca.crt server.crt
인덱스 템플릿 정의#
Event Handler 플러그인이 감사 이벤트를 Logstash로 전송할 때, Logstash는 이러한 이벤트를 파싱하여 Elasticsearch로 전달하는 방법을 알아야 합니다. 이 로직은 인덱스 템플릿을 사용하여 정의할 수 있으며, Elasticsearch는 이를 사용하여 수신하는 데이터의 인덱스를 구성합니다.
다음 내용으로 audit-events.json 파일을 만듭니다:
{
"index_patterns": ["audit-events-*"],
"template": {
"settings": {},
"mappings": {
"dynamic":"true"
}
}
}
이 인덱스 템플릿은 audit-events-* 패턴이 있는 모든 인덱스를 수정합니다. "dynamic": "true" 설정이 포함되어 있으므로 Elasticsearch가 수신하는 이벤트를 기반으로 인덱스 필드를 동적으로 정의하도록 지시합니다. 이는 이벤트 유형에 따라 다양한 필드를 사용하는 Teleport 감사 이벤트에 유용합니다.
Logstash 파이프라인 정의#
Logstash를 실행하는 호스트에서 Logstash 파이프라인을 정의하는 구성 파일을 만듭니다. 이 파이프라인은 포트 9601에서 로그를 수신하여 Elasticsearch로 전달합니다.
Logstash를 실행하는 호스트에서 다음 내용으로 /etc/logstash/conf.d/teleport-audit.conf 파일을 만듭니다:
input {
http {
port => 9601
ssl => true
ssl_certificate => "/home/server.crt"
ssl_key => "/home/pkcs8.key"
ssl_certificate_authorities => [
"/home/ca.crt"
]
ssl_verify_mode => "force_peer"
}
}
output {
elasticsearch {
user => "teleport"
password => "ELASTICSEARCH_PASSPHRASE"
template_name => "audit-events"
template => "/home/audit-events.json"
index => "audit-events-%{+yyyy.MM.dd}"
template_overwrite => true
}
}
input.http 섹션에서 ssl_certificate와 ssl_certificate_authorities를 이전에 teleport-event-handler configure 명령이 생성한 서버 인증서 및 인증 기관 파일의 위치를 포함하도록 업데이트합니다.
Logstash는 CA 파일에 대해 클라이언트 인증서를 인증하고 Teleport Event Handler 플러그인에 서명된 인증서를 제공합니다.
ssl_key 필드를 이전에 생성한 pkcs8.key 파일 경로를 포함하도록 편집합니다.
output.elasticsearch 섹션에서 Elastic Cloud 또는 자체 Elastic Stack 배포를 사용하는지 여부에 따라 다음 필드를 편집합니다:
cloud_auth에 teleport:PASSWORD 형식의 문자열을 할당하고 PASSWORD를 이전에 teleport 사용자에게 할당한 비밀번호로 바꿉니다.
https://cloud.elastic.co/deployments를 방문하여 "Cloud ID" 필드를 찾아 내용을 복사하고 Logstash 파이프라인 구성의 cloud_id 값으로 추가합니다. elasticsearch 섹션은 다음과 유사해야 합니다:
elasticsearch {
cloud_id => "CLOUD_ID"
cloud_auth => "teleport:PASSWORD"
template_name => "audit-events"
template => "/home/audit-events.json"
index => "audit-events-%{+yyyy.MM.dd}"
template_overwrite => true
}
hosts에 Elasticsearch 호스트의 호스트명을 나타내는 문자열을 할당합니다.
user를 teleport로, password를 이전에 teleport 사용자를 위해 만든 암호로 할당합니다.
elasticsearch 섹션은 다음과 유사해야 합니다:
elasticsearch {
hosts => "elasticsearch.example.com"
user => "teleport"
password => "PASSWORD"
template_name => "audit-events"
template => "/home/audit-events.json"
index => "audit-events-%{+yyyy.MM.dd}"
template_overwrite => true
}
마지막으로, template를 이전에 만든 audit-events.json 파일 경로를 가리키도록 수정합니다.
이 파일로 만들 인덱스 템플릿이 audit-events-* 접두사가 있는 인덱스에 적용되고, Logstash 파이프라인이 "audit-events-%{+yyyy.MM.dd} 제목의 인덱스를 만들도록 구성했으므로, Elasticsearch는 Teleport 감사 이벤트의 필드를 자동으로 인덱싱합니다.
파이프라인에 대한 Elastic Common Schema 비활성화#
Elastic Common Schema(ECS)는 Elastic Stack이 데이터를 파싱하고 시각화하는 데 사용하는 표준 필드 집합입니다. Teleport 감사 로그의 모든 필드를 Elasticsearch가 동적으로 인덱싱하도록 구성하므로, Logstash 파이프라인에 대한 ECS를 비활성화합니다.
Logstash를 실행하는 호스트에서 /etc/logstash/pipelines.yml을 편집하여 다음 항목을 추가합니다:
- pipeline.id: teleport-audit-logs
path.config: "/etc/logstash/conf.d/teleport-audit.conf"
pipeline.ecs_compatibility: disabled
이렇게 하면 Teleport 감사 로그 파이프라인에 대한 ECS가 비활성화됩니다.
pipelines.yml 파일에서 teleport-audit.conf를 포함하는 기존 파이프라인이 있는 경우(예: path.config에 와일드카드 값을 사용하여), 기존 파이프라인 정의를 조정하여 teleport-audit.conf에 더 이상 적용되지 않도록 합니다.
Logstash 파이프라인 실행#
Logstash를 재시작합니다:
$ sudo systemctl restart logstash
다음 명령을 실행하여 Logstash 로그를 추적하면서 Logstash 파이프라인이 성공적으로 시작되었는지 확인합니다:
$ sudo journalctl -u logstash -f
Logstash 파이프라인이 http 입력을 초기화하고 실행되기 시작하면 다음과 유사한 로그가 표시됩니다:
Sep 15 18:27:13 myhost logstash[289107]: [2022-09-15T18:27:13,491][INFO ][logstash.inputs.http][main][33bdff0416b6a2b643e6f4ab3381a90c62b3aa05017770f4eb9416d797681024] Starting http input listener {:address=>"0.0.0.0:9601", :ssl=>"true"}
다음 로그는 Logstash 파이프라인이 Elasticsearch에 연결하고 새 인덱스 템플릿을 설치했음을 나타냅니다:
Sep 12 19:49:06 myhost logstash[33762]: [2022-09-12T19:49:06,309][INFO ][logstash.outputs.elasticsearch][main] Elasticsearch version determined (8.4.1) {:es_version=>8}
Sep 12 19:50:00 myhost logstash[33762]: [2022-09-12T19:50:00,993][INFO ][logstash.outputs.elasticsearch][main] Installing Elasticsearch template {:name=>"audit-events"}
파이프라인이 시작되지 않는 경우?
Logstash가 파이프라인 초기화에 실패하면 계속해서 Elasticsearch에 접속을 시도할 수 있습니다. 그 경우 아래와 같은 반복 로그가 표시됩니다:
Sep 12 19:43:04 myhost logstash[33762]: [2022-09-12T19:43:04,519][WARN ][logstash.outputs.elasticsearch][main] Attempted to resurrect connection to dead ES instance, but got an error {:url=>"http://teleport:xxxxxx@127.0.0.1:9200/", :exception=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :message=>"Elasticsearch Unreachable: [http://127.0.0.1:9200/][Manticore::ClientProtocolException] 127.0.0.1:9200 failed to respond"}
문제 진단#
Logstash 파이프라인 초기화 오류의 원인을 진단하려면, Logstash journalctl 로그에서 파이프라인이 시작되고 있음을 나타내는 다음 항목을 검색합니다. 관련 오류 로그는 이 이후에 나타납니다:
Sep 12 18:15:52 myhost logstash[27906]: [2022-09-12T18:15:52,146][INFO][logstash.javapipeline][main] Starting pipeline {:pipeline_id=>"main","pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50,"pipeline.max_inflight"=>250,"pipeline.sources"=>["/etc/logstash/conf.d/teleport-audit.conf"],:thread=>"#
다음 필드를 업데이트합니다.
Note이 섹션의 내용은 원문 문서를 참조하세요. (finish-event-handler-fields.mdx)
forward.fluentd.url을 이전에 Logstash http 입력에 대해 구성한 스킴, 호스트 및 포트인 https://localhost:9601로 변경합니다. forward.fluentd.session-url을 루트 URL 경로가 있는 동일한 값인 https://localhost:9601/로 변경합니다.
Event Handler 시작#
Note이 섹션의 내용은 원문 문서를 참조하세요. (start-event-handler.mdx)
3/3단계. Kibana에서 데이터 뷰 생성#
Kibana에서 Teleport 감사 이벤트를 탐색할 수 있도록 데이터 뷰를 만듭니다. Elastic Stack UI에서 화면 왼쪽 상단의 햄버거 메뉴를 찾아 "Management" > "Data Views"를 클릭합니다. "Create data view"를 클릭합니다.
"Name" 필드에 "Teleport Audit Events"를 사용합니다. "Index pattern"에서 audit-events-*를 사용하여 Logstash 파이프라인이 만든 모든 인덱스를 선택합니다. "Timestamp field"에서 Teleport가 감사 이벤트에 추가하는 time을 선택합니다.

데이터 뷰를 사용하려면 Elastic Stack UI 상단의 검색 상자를 찾아 "Discover"를 입력합니다. 화면 왼쪽 상단에서 드롭다운 메뉴를 클릭하고 "Teleport Audit Events"를 선택합니다. 이제 Teleport 감사 이벤트를 검색하고 필터링하여 사용자가 Teleport 클러스터와 상호 작용하는 방식을 더 잘 이해할 수 있습니다.

예를 들어, 왼쪽 사이드바에서 event 필드를 클릭하여 시간에 따른 Teleport 감사 이벤트 유형을 시각화할 수 있습니다:

연결 문제 해결#
Teleport Event Handler가 Teleport 클러스터에 연결하는 동안 오류 로그를 표시하는 경우 다음을 확인하세요:
- Teleport Event Handler가 Teleport 클러스터에 연결하는 데 사용하는 인증서가 만료 날짜를 지나지 않았는지 확인합니다. 이는
tctl auth sign 명령의 --ttl 플래그 값으로, 기본적으로 12시간입니다.
- Teleport Event Handler 구성 파일에서 Teleport Proxy Service에 대한 올바른 호스트 및 포트를 제공했는지 확인합니다.
다음 단계#
