Infograb logo
Teleport 감사 이벤트를 Splunk로 내보내기

Teleport의 Event Handler 플러그인은 Teleport Auth 서비스로부터 감사 로그를 수신하고 이를 로그 관리 솔루션으로 전달하여, 역사적 분석을 수행하고 비정상적인 행동을 감지하며 사용자가 Teleport 클러스터와 상호작용하는 방식을 더 잘 이해할 수 있도록 합니다.

이 가이드에서는 Teleport Event Handler 플러그인을 구성하여 Teleport 감사 로그를 Splunk로 보내는 방법을 보여줍니다. 이 설정에서는 Teleport Event Handler 플러그인이 Teleport로부터 Splunk의 Universal Forwarder로 감사 로그를 전달하며, 이는 Splunk Cloud Platform 또는 Splunk Enterprise에 저장되어 시각화 및 경고를 위해 사용됩니다.

전제 조건

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

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

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

권장 사항: 짧은 수명의 Teleport 자격 증명을 플러그인에 제공하기 위해 머신 ID를 구성하십시오. 이 가이드를 따르기 전에 tbot 바이너리를 귀하의 인프라에서 실행하기 위해 머신 ID 배포 가이드를 따르십시오.

  • Splunk Cloud Platform 또는 Splunk Enterprise v9.0.1 이상.

  • Teleport Event Handler 플러그인과 Splunk Universal Forwarder를 실행할 Linux 호스트. Universal Forwarder는 호스트에 설치되어 있어야 합니다.

    Teleport Event Handler와 Universal Forwarder를 동일한 호스트에서 실행할 경우, 로그 수집을 위해 호스트에서 포트를 열 필요가 없습니다. 그러나 Universal Forwarder를 Teleport Event Handler와 다른 호스트에서 실행하는 경우, Teleport Event Handler로부터의 트래픽을 위해 Universal Forwarder 호스트에서 포트를 열어야 합니다. 이 가이드는 Universal Forwarder가 포트 9061에서 수신 대기한다고 가정합니다.

  • Splunk Enterprise에서는 Teleport Event Handler와 Universal Forwarder를 실행하는 호스트로부터의 트래픽에 대해 포트 8088이 열려 있어야 합니다.

  • 당신의 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 명령어를 실행할 수도 있습니다.

1단계/4. Teleport Event Handler 플러그인 설정

Event Handler 플러그인은 Teleport 클러스터와 독립적으로 실행되는 이진 파일입니다. 이는 상호 TLS를 사용하여 Teleport 클러스터와 Splunk Universal Forwarder에 인증합니다. 이 섹션에서는 Universal Forwarder를 실행하는 Linux 호스트에 Teleport Event Handler 플러그인을 설치하고 플러그인이 인증에 사용할 자격 증명을 생성합니다.

Teleport Event Handler 플러그인 설치

환경에 맞는 지침을 따라 Universal Forwarder 호스트에 Teleport Event Handler 플러그인을 설치합니다:

Event Handler 플러그인은 amd64arm64 바이너리로 제공됩니다. 필요한 버전으로 ARCH를 교체하세요.

curl -L -O https://cdn.teleport.dev/teleport-event-handler-v16.2.0-linux-ARCH-bin.tar.gz
tar -zxvf teleport-event-handler-v16.2.0-linux-ARCH-bin.tar.gz
sudo ./teleport-event-handler/install

Event Handler 플러그인은 amd64arm64 바이너리로 제공됩니다. 필요한 버전으로 ARCH를 교체하세요.

curl -L -O https://cdn.teleport.dev/teleport-event-handler-v16.2.0-darwin-ARCH-bin.tar.gz
tar -zxvf teleport-event-handler-v16.2.0-darwin-ARCH-bin.tar.gz
sudo ./teleport-event-handler/install

Docker가 설치되고 실행 중인지를 확인하세요.

docker pull public.ecr.aws/gravitational/teleport-plugin-event-handler:16.2.0

Helm이 Teleport Helm 리포지토리에 호스팅되는 차트를 설치할 수 있도록 하려면 helm repo add를 사용하세요:

helm repo add teleport https://charts.releases.teleport.dev

원격 리포지토리의 차트 캐시를 업데이트하려면 helm repo update를 실행하세요:

helm repo update

Go >= 1.22가 설치되어 있어야 합니다.

Universal Forwarder 호스트에서 다음 명령을 실행하세요:

git clone https://github.com/gravitational/teleport.git --depth 1 -b branch/v16
cd teleport/integrations/event-handler
make build

결과 실행 파일의 이름은 event-handler입니다. 이 가이드를 따르려면 이 파일의 이름을 teleport-event-handler로 변경하고 /usr/local/bin으로 이동하세요.

시작 구성 파일 생성

Teleport Event Handler 플러그인에 대한 자리 표시자 값을 포함하는 구성 파일을 생성하십시오. 이후 이 가이드에서는 귀하의 환경에 맞게 구성 파일을 수정할 것입니다.

configure 명령어를 실행하여 샘플 구성을 생성합니다. mytenant.teleport.sh를 Teleport Enterprise Cloud 테넌트의 DNS 이름으로 교체합니다:

teleport-event-handler configure . mytenant.teleport.sh:443

configure 명령어를 실행하여 샘플 구성을 생성합니다. teleport.example.com:443을 Teleport의 프록시 서비스의 DNS 이름과 HTTPS 포트로 교체합니다:

teleport-event-handler configure . teleport.example.com:443

configure 명령어를 실행하여 샘플 구성을 생성합니다. TELEPORT_CLUSTER_ADDRESS를 Teleport 인증 서비스 또는 프록시 서비스의 DNS 이름과 포트로 할당합니다:

TELEPORT_CLUSTER_ADDRESS=mytenant.teleport.sh:443
docker run -v `pwd`:/opt/teleport-plugin -w /opt/teleport-plugin public.ecr.aws/gravitational/teleport-plugin-event-handler:16.2.0 configure . ${TELEPORT_CLUSTER_ADDRESS?}

감사를 내보내기 위해서는 루트 인증서와 클라이언트 자격 증명이 비밀로 제공되어야 합니다. 다음 명령어를 사용하여 Kubernetes에서 해당 비밀을 생성하세요:

kubectl create secret generic teleport-event-handler-client-tls --from-file=ca.crt=ca.crt,client.crt=client.crt,client.key=client.key

이것은 ca.crt, client.crt, 및 client.key의 내용을 비밀로 패킹하여 Helm 차트가 적절한 경로에 쉽게 장착할 수 있도록 합니다.

configure 명령어를 실행하여 샘플 구성을 생성합니다:

docker run -v `pwd`:/opt/teleport-plugin -w /opt/teleport-plugin public.ecr.aws/gravitational/teleport-plugin-event-handler:16.2.0 configure .

다음 출력을 볼 수 있습니다:

Teleport event handler 16.2.0

[1] mTLS Fluentd 인증서가 생성되어 ca.crt, ca.key, server.crt, server.key, client.crt, client.key에 저장되었습니다.
[2] 샘플 teleport-event-handler 역할 및 사용자 파일 teleport-event-handler-role.yaml이 생성되었습니다.
[3] 샘플 fluentd 구성 파일 fluent.conf가 생성되었습니다.
[4] 플러그인 구성 파일 teleport-event-handler.toml이 생성되었습니다.

플러그인은 여러 설정 파일을 생성합니다:

ls -l

-rw------- 1 bob bob 1038 Jul 1 11:14 ca.crt

-rw------- 1 bob bob 1679 Jul 1 11:14 ca.key

-rw------- 1 bob bob 1042 Jul 1 11:14 client.crt

-rw------- 1 bob bob 1679 Jul 1 11:14 client.key

-rw------- 1 bob bob 541 Jul 1 11:14 fluent.conf

-rw------- 1 bob bob 1078 Jul 1 11:14 server.crt

-rw------- 1 bob bob 1766 Jul 1 11:14 server.key

-rw------- 1 bob bob 260 Jul 1 11:14 teleport-event-handler-role.yaml

-rw------- 1 bob bob 343 Jul 1 11:14 teleport-event-handler.toml

파일목적
ca.crtca.keyFluentd를 위한 자체 서명된 CA 인증서 및 개인 키
server.crtserver.keyFluentd 서버 인증서 및 키
client.crtclient.keyFluentd 클라이언트 인증서 및 키, 모두 생성된 CA에 의해 서명됨
teleport-event-handler-role.yamlTeleport의 이벤트 핸들러를 위한 사용자역할 자원 정의
fluent.confFluentd 플러그인 구성

이 가이드는 이벤트 핸들러가 로그 포워더와 동일한 호스트 또는 Kubernetes 포드에서 실행되고 있다고 가정합니다. 만약 그렇지 않다면, 이벤트 핸들러가 localhost 이외의 주체를 위한 mTLS 인증서를 생성하도록 지시해야 합니다. 이를 위해 teleport-event-handler 구성 명령의 --cn--dns-names 플래그를 사용하십시오.

예를 들어, 로그 포워더가 forwarder.example.com에서 접근 가능하고 이벤트 핸들러가 handler.example.com일 경우, 다음 configure 명령어를 실행하면 됩니다:

teleport-event-handler configure --cn=handler.example.com --dns-names=forwarder.example.com

이 명령어는 주체가 --cn의 값으로 설정된 클라이언트 및 서버 인증서를 생성합니다.

--dns-names 플래그는 쉼표로 구분된 DNS 이름 목록을 허용합니다. 목록의 각 DNS 이름에 대해 서버 인증서(로그 포워더에 제공할 인증서)의 주체 대체 이름(SAN)을 추가합니다. 이벤트 핸들러는 각 DNS 이름을 조회하여 SAN 추가 전에 확인하고, 조회 실패 시 오류와 함께 종료합니다.

생성된 파일을 Universal Forwarder 구성에서 Fluentd에 재사용할 것입니다.

RBAC 리소스 정의

teleport-event-handler configure 명령어는 teleport-event-handler-role.yaml이라는 파일을 생성했습니다. 이 파일은 teleport-event-handler 역할과 event API에 대한 읽기 전용 접근 권한을 가진 사용자를 정의합니다:

kind: role
metadata:
  name: teleport-event-handler
spec:
  allow:
    rules:
      - resources: ['event', 'session']
        verbs: ['list','read']
version: v5
---
kind: user
metadata:
  name: teleport-event-handler
spec:
  roles: ['teleport-event-handler']
version: v2

이 파일을 작업 공간으로 이동시키거나 (위의 스니펫을 붙여넣어) 재생성하고, 작업 공간에서 tctl을 사용하여 역할과 사용자를 생성하세요:

tctl create -f teleport-event-handler-role.yaml

사용자 "teleport-event-handler"가 생성되었습니다

역할 'teleport-event-handler'가 생성되었습니다

Event Handler 역할에 대한 인증서 발급 활성화

역할이 생성되었으므로 이제 Machine ID 봇이 이 역할에 대한 자격 증명을 생성할 수 있도록 허용해야 합니다.

이는 tctl로 수행할 수 있으며, my-bot을 당신의 봇 이름으로 교체합니다:

tctl bots update my-bot --add-roles teleport-event-handler

이벤트 핸들러 플러그인이 Teleport 클러스터에서 이벤트를 전달하기 위해서는 클러스터의 인증 기관에서 서명된 자격 증명이 필요합니다.
teleport-event-handler 사용자는 스스로 이러한 자격 증명을 요청할 수 없으며, 자격 증명을 요청하기 위해 다른 사용자가 이 계정을 임시로 사용해야 합니다.

teleport-event-handler 사용자를 임시로 사용할 수 있는 역할을 생성하십시오. 먼저, 아래의 YAML 문서를 teleport-event-handler-impersonator.yaml이라는 파일에 붙여넣습니다:

kind: role
version: v5
metadata:
  name: teleport-event-handler-impersonator
spec:
  options:
    # max_session_ttl은 이 역할을 가진 사용자에게 발급된 SSH 인증서의 TTL(유효 기간)을 정의합니다.
    max_session_ttl: 10h

  # 이 섹션은 이 역할의 사용자에게 허용되는 리소스/동작 조합 목록을 선언합니다.
  # 기본적으로 아무것도 허용되지 않습니다.
  allow:
    impersonate:
      users: ["teleport-event-handler"]
      roles: ["teleport-event-handler"]

다음으로, 역할을 생성하십시오:

tctl create teleport-event-handler-impersonator.yaml

이 역할을 이벤트 핸들러에 대한 서명된 자격 증명을 생성하는 사용자에게 추가하십시오:

teleport-event-handler-impersonator 역할을 Teleport 사용자에게 할당하려면 인증 제공자에 맞는 적절한 명령어를 실행하세요:

  1. 로컬 사용자의 역할을 콤마로 구분된 목록으로 가져옵니다:

    ROLES=$(tsh status -f json | jq -r '.active.roles | join(",")')
  2. 로컬 사용자를 편집하여 새로운 역할을 추가합니다:

    tctl users update $(tsh status -f json | jq -r '.active.username') \ --set-roles "${ROLES?},teleport-event-handler-impersonator"
  3. Teleport 클러스터에서 로그아웃한 후 새로운 역할을 asum 하기 위해 다시 로그인합니다.

  1. github 인증 커넥터를 가져옵니다:

    tctl get github/github --with-secrets > github.yaml

    --with-secrets 플래그는 spec.signing_key_pair.private_key의 값을 github.yaml 파일에 추가합니다. 이 키는 민감한 값을 포함하고 있기 때문에, 리소스를 업데이트한 후 즉시 github.yaml 파일을 제거해야 합니다.

  2. github.yaml을 편집하고 teams_to_roles 섹션에 teleport-event-handler-impersonator을 추가합니다.

    이 역할에 매핑할 팀은 귀하의 조직에서 어떻게 역할 기반 접근 제어(RBAC)를 설계했느냐에 따라 달라집니다. 하지만 팀에는 귀하의 사용자 계정이 포함되어야 하며, 조직 내에서 가능한 한 작은 팀이어야 합니다.

    여기에 예시가 있습니다:

      teams_to_roles:
        - organization: octocats
          team: admins
          roles:
            - access
    +       - teleport-event-handler-impersonator
    
  3. 변경 사항을 적용합니다:

    tctl create -f github.yaml
  4. Teleport 클러스터에서 로그아웃한 후 새로운 역할을 assum 하기 위해 다시 로그인합니다.

  1. saml 구성 리소스를 가져옵니다:

    tctl get --with-secrets saml/mysaml > saml.yaml

    --with-secrets 플래그는 spec.signing_key_pair.private_key의 값을 saml.yaml 파일에 추가합니다. 이 키는 민감한 값을 포함하고 있기 때문에, 리소스를 업데이트한 후 즉시 saml.yaml 파일을 제거해야 합니다.

  2. saml.yaml을 편집하고 attributes_to_roles 섹션에 teleport-event-handler-impersonator을 추가합니다.

    이 역할에 매핑할 속성은 귀하의 조직에서 어떻게 역할 기반 접근 제어(RBAC)를 설계했느냐에 따라 달라집니다. 그러나 그룹에는 귀하의 사용자 계정이 포함되어야 하며, 조직 내에서 가능한 한 작은 그룹이어야 합니다.

    여기에 예시가 있습니다:

      attributes_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - teleport-event-handler-impersonator
    
  3. 변경 사항을 적용합니다:

    tctl create -f saml.yaml
  4. Teleport 클러스터에서 로그아웃한 후 새로운 역할을 asum 하기 위해 다시 로그인합니다.

  1. oidc 구성 리소스를 가져옵니다:

    tctl get oidc/myoidc --with-secrets > oidc.yaml

    --with-secrets 플래그는 spec.signing_key_pair.private_key의 값을 oidc.yaml 파일에 추가합니다. 이 키는 민감한 값을 포함하고 있기 때문에, 리소스를 업데이트한 후 즉시 oidc.yaml 파일을 제거해야 합니다.

  2. oidc.yaml을 편집하고 claims_to_roles 섹션에 teleport-event-handler-impersonator을 추가합니다.

    이 역할에 매핑할 클레임은 귀하의 조직에서 어떻게 역할 기반 접근 제어(RBAC)를 설계했느냐에 따라 달라집니다. 그러나 그룹에는 귀하의 사용자 계정이 포함되어야 하며, 조직 내에서 가능한 한 작은 그룹이어야 합니다.

    여기에 예시가 있습니다:

      claims_to_roles:
        - name: "groups"
          value: "my-group"
          roles:
            - access
    +       - teleport-event-handler-impersonator
    
  3. 변경 사항을 적용합니다:

    tctl create -f oidc.yaml
  4. Teleport 클러스터에서 로그아웃한 후 새로운 역할을 asum 하기 위해 다시 로그인합니다.

플러그인 ID 내보내기

플러그인에 Teleport 신원 파일에 대한 액세스를 부여합니다. 유출될 경우 더 안전한 단기 신원 파일을 생성하기 위해 Machine ID 사용을 권장하지만, 데모 배포에서는 tctl로 장기 생존 신원 파일을 생성할 수 있습니다:

tbot을 구성하여 the plugin에 필요한 자격증명을 생성하는 출력을 만듭니다. the plugin가 Teleport API에 접근할 것이므로, 올바른 출력 유형은 identity입니다.

이 가이드에서는 directory 대상을 사용합니다. 이를 통해 자격증명이 디스크의 지정된 디렉토리에 기록됩니다. 이 디렉토리는 tbot이 실행되는 리눅스 사용자가 쓸 수 있고, the plugin가 실행될 리눅스 사용자가 읽을 수 있어야 합니다.

tbot 구성을 수정하여 identity 출력을 추가하세요.

리눅스 서버에서 tbot을 실행하는 경우, /opt/machine-id 디렉토리에 자격증명 파일을 쓰기 위해 directory 출력을 사용하세요:

outputs:
- type: identity
  destination:
    type: directory
    # 이 가이드에서는 /opt/machine-id를 목적지 디렉토리로 사용합니다.
    # 필요에 따라 사용자 정의할 수 있습니다. 여러 출력은 동일한
    # 대상을 공유할 수 없습니다.
    path: /opt/machine-id

Kubernetes에서 tbot을 실행하는 경우, 대신 Kubernetes 비밀에 자격증명 파일을 기록하세요:

outputs:
  - type: identity
    destination:
      type: kubernetes_secret
      name: teleport-event-handler-identity

tbot을 백그라운드 서비스로 운영하는 경우, 이를 재시작하세요. tbot을 원샷 모드로 실행하는 경우 지금 실행하세요.

이제 /opt/machine-id 아래에 identity 파일이 보이거나 teleport-event-handler-identity이라는 이름의 Kubernetes 비밀이 보일 것입니다. 이는 the plugin가 Teleport Auth Service와 인증하는 데 필요한 개인 키와 서명된 인증서를 포함하고 있습니다.

모든 Teleport 사용자와 마찬가지로, teleport-event-handler는 Teleport 클러스터에 연결하기 위해 서명된 자격 증명이 필요합니다. 이러한 자격 증명을 요청하기 위해 tctl auth sign 명령을 사용합니다.

다음의 tctl auth sign 명령은 teleport-event-handler 사용자로 가장하고, 서명된 자격 증명을 생성하며, 로컬 디렉토리에 ID 파일을 작성합니다:

tctl auth sign --user=teleport-event-handler --out=identity

plugin는 TLS를 통해 Teleport Auth Service의 gRPC 엔드포인트에 연결합니다.

ID 파일인 identity는 TLS 및 SSH 자격 증명을 포함합니다. plugin는 SSH 자격 증명을 사용하여 Proxy Service에 연결하고, 이 Proxy Service는 Auth Service에 대한 리버스 터널 연결을 설정합니다. plugin는 이 리버스 터널과 TLS 자격 증명을 사용하여 Auth Service의 gRPC 엔드포인트에 연결합니다.

기본적으로, tctl auth sign은 비교적 짧은 수명의 인증서를 생성합니다. 프로덕션 배포의 경우, Machine ID를 사용하여 플러그인에 대해 인증서를 프로그램matically Issuing과 Renew하는 것을 권장합니다. 우리의 Machine ID 시작 가이드를 참조하여 자세히 알아보세요.

기존 자격 증명보다 유효 기간이 긴 인증서를 발급할 수 없습니다. 예를 들어, 1000시간의 TTL을 가진 인증서를 발급하려면 최소한 1000시간 동안 유효한 세션으로 로그인해야 합니다. 즉, 사용자는 최소 1000시간(60000분)의 max_session_ttl을 허용하는 역할을 가지고 있어야 하며, 로그인할 때 --ttl을 지정해야 합니다:

tsh login --proxy=teleport.example.com --ttl=60060

Linux 서버에서 plugin를 실행하는 경우, plugin를 위한 인증서 파일을 보관할 데이터 디렉토리를 만드세요:

sudo mkdir -p /var/lib/teleport/api-credentials
sudo mv identity /var/lib/teleport/plugins/api-credentials

Kubernetes에서 plugin를 실행하는 경우, Teleport ID 파일을 포함하는 Kubernetes 비밀을 생성하세요:

kubectl -n teleport create secret generic --from-file=identity teleport-event-handler-identity

Teleport 자격 증명이 만료되면, 다시 tctl auth sign 명령을 실행하여 갱신해야 합니다.

2단계/4. Universal Forwarder 구성

이 단계에서는 Universal Forwarder가 Teleport Event Handler 플러그인으로부터 감사 로그를 수신하고 이를 Splunk로 전달하도록 구성합니다. Event Handler는 application/json 콘텐츠 형식을 가진 HTTP POST 요청으로 감사 로그를 보냅니다.

Universal Forwarder를 설치할 때 $SPLUNK_HOME/opt/splunkforwarder로 지정했다고 가정합니다.

$SPLUNK_HOME을 찾기 위해 다음 명령을 실행하여 Universal Forwarder 서비스 정의의 위치를 확인하십시오:

sudo systemctl status SplunkForwarder.service
● SplunkForwarder.service - Systemd service file for Splunk, generated by 'splunk enable boot-start' Loaded: loaded (/lib/systemd/system/SplunkForwarder.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-10-07 15:57:37 UTC; 2h 18min ago Main PID: 1772 (splunkd) Tasks: 53 (limit: 2309) Memory: 70.8M (limit: 1.8G) CGroup: /system.slice/SplunkForwarder.service ├─1772 splunkd --under-systemd --systemd-delegate=yes -p 8089 _internal_launch_under_systemd └─1810 [splunkd pid=1772] splunkd --under-systemd --systemd-delegate=yes -p 8089 _internal_launch_under_systemd [process-runner]

Loaded: 필드에 표시된 경로에서 파일을 확인하십시오. 귀하의 $SPLUNK_HOMEExecStart 전에 있는 파일 경로 세그먼트를 포함합니다. 이 경우, $SPLUNK_HOME/opt/splunkforwarder/입니다:

ExecStart=/opt/splunkforwarder/bin/splunk _internal_launch_under_systemd

감사 로그에 대한 인덱스 생성

Splunk UI의 홈페이지를 방문하여 Settings > Indexes로 이동하여 Teleport 감사 로그에 대한 인덱스를 생성합니다. New Index를 클릭하십시오. 인덱스 이름을 teleport-audit-logs로 지정하고 Index Data Type 필드를 "Events"로 설정합니다.

다른 필드의 값인 Max raw data sizeSearchable retention (days) 는 귀하의 조직의 리소스 및 로그 관리 관행에 따라 다릅니다.

저장을 클릭하십시오.

Universal Forwarder에 대한 토큰 생성

Universal Forwarder는 클라이언트 트래픽을 인증하기 위해 토큰을 사용합니다. 토큰을 생성하려면 Splunk UI의 홈페이지로 이동하고 Settings > Data inputs로 이동하십시오. Local inputs 테이블에서 HTTP Event Collector 행을 찾아 Add new를 클릭합니다.

나중에 토큰을 관리할 수 있도록 인식할 수 있는 이름을 입력합니다. 예: Teleport Audit Events. Next를 클릭하십시오.

Input Settings 뷰에서 Source type 필드 옆에 있는 Select를 클릭하십시오. Select Source Type 드롭다운 메뉴에서 Structured_json을 클릭하십시오. Splunk는 수신 로그를 JSON으로 인덱싱하며, 이는 Event Handler가 Universal Forwarder로 로그를 전송하는 데 사용되는 형식입니다.

Index 섹션에서 이전에 생성한 teleport-audit-logs 인덱스를 선택합니다. Review를 클릭한 후 요약을 보고 Submit을 클릭하십시오. Token Value 필드를 복사하여 이 가이드 이후 사용할 수 있도록 안전한 곳에 보관하십시오.

Universal Forwarder에 대한 인증서 파일 준비

Universal Forwarder는 X.509 형식의 인증서와 RSA 개인 키를 포함하는 파일을 사용하여 TLS 인증서를 서명합니다. 이를 준비하려면, Universal Forwarder 호스트에서 다음 명령을 실행하십시오. server.crtserver.key는 이전에 teleport-event-handler configure 명령으로 생성한 두 개의 파일입니다:

cp server.crt server.pem
cat server.key >> server.pem

Universal Forwarder가 인증서 파일에 접근할 수 있도록 하십시오:

sudo chown splunk:splunk server.pem

HTTP Event Collector 구성

Universal Forwarder 호스트에서 /opt/splunkforwarder/etc/system/local/inputs.conf에 다음 내용을 가진 파일을 생성하십시오:

[http]
port = 9061
disabled = false
serverCert = server.pem
sslPassword =
requireClientCert = true

[http://audit]
token =
index = teleport-audit-logs
allowQueryStringAuth = true

이 구성은 HTTP 입력을 활성화하여 포트 9061에서 Teleport Event Handler 플러그인으로부터 로그를 수신하고 이를 teleport-audit-logs 인덱스에 지정합니다.

serverCert를 이전에 생성했던 server.pem 파일의 경로로 설정합니다.

sslPassword를 할당하려면, fluent.conf가 포함된 디렉토리에서 다음 명령을 실행하십시오:

cat fluent.conf | grep passphrase
private_key_passphrase "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"

비밀번호를 복사하여 sslPassword의 값으로 붙여넣으십시오.

[http://audit] 섹션의 token 필드는 Universal Forwarder가 토큰을 제시하는 HTTP 클라이언트로부터 로그를 수집할 수 있게 해줍니다. token을 이전에 생성한 토큰으로 할당합니다.

allowQueryStringAuth는 Teleport Event Handler가 기본값인 Authorization HTTP 헤더가 아닌 쿼리 문자열에 토큰을 포함할 수 있게 해줍니다. 이는 현재 Teleport Event Handler가 사용자 정의 HTTP 헤더를 지원하지 않기 때문에 필요합니다.

TLS 구성

Universal Forwarder와 Teleport Event Handler 간의 보안 통신을 구성하기 위해 /opt/splunkforwarder/etc/system/local/server.conf라는 파일을 생성하고 다음 내용을 추가합니다 (이 파일이 이미 존재하는 경우, [sslConfig] 섹션에 다음 필드를 추가하십시오):

[sslConfig]
sslRootCAPath =

sslRootCAPath를 이전에 생성한 ca.crt 파일의 경로로 설정하십시오.

Universal Forwarder가 CA 인증서에 접근할 수 있도록 하십시오:

sudo chmod +r ca.crt

출력 구성

Universal Forwarder에게 수집한 로그를 Splunk로 전송하라고 지시합니다.

/opt/splunkforwarder/etc/system/local/outputs.conf 경로에 다음 내용을 가진 파일을 생성하십시오:

[tcpout]
sslVerifyServerCert = true

[httpout]
httpEventCollectorToken =
uri =

httpEventCollectorToken에 이전에 생성한 토큰을 입력하십시오.

uri에는 다음과 같이 입력하되, MYHOST를 귀하의 Splunk 인스턴스의 호스트 이름으로, 8088을 Splunk HTTP Event Collector에 사용하는 포트로 바꾸십시오.

https://MYHOST:8088

사용할 URL의 형식은 귀하의 Splunk 배포에 따라 달라집니다. Splunk 문서에서 허용 가능한 URL 형식 목록을 참조하십시오.

URL에서는 스킴, 호스트 및 포트만 포함해야 합니다. Universal Forwarder는 로그를 전달할 때 Splunk 수집 API의 올바른 URL 경로를 추가합니다.

마지막으로 Universal Forwarder를 재시작합니다:

sudo systemctl restart SplunkForwarder

3단계/4. Teleport Event Handler 플러그인 실행

지금까지 Universal Forwarder가 HTTP를 통해 로그를 수신하고 이를 Splunk로 전달하도록 구성하였으므로, Teleport Event Handler 플러그인이 Universal Forwarder 및 Teleport 클러스터에 인증하도록 구성하고 Teleport Event Handler를 실행합니다.

Teleport Event Handler 구성

이 섹션에서는 귀하의 환경에 맞게 Teleport Event Handler를 구성합니다.

이전에 teleport-event-handler.toml이라는 파일을 생성하여 Fluentd 이벤트 핸들러를 구성했습니다. 이 파일은 다음과 유사한 설정을 포함하고 있습니다:

storage = "./storage"
timeout = "10s"
batch = 20
namespace = "default"
# 창 크기는 이벤트 핸들러가 Teleport로부터 이벤트를 요청하는 
# 시간 창의 지속 시간을 구성합니다. 기본적으로, 이는 24시간으로 설정됩니다.
# 기본 창 크기에 대해 이벤트 볼륨을 관리할 수 없는 경우
# 창 크기를 줄이세요.
# 창 크기는 Go의 time.ParseDuration으로 구문 분석된 지속 시간 문자열로 지정해야 합니다.
window-size = "24h"

[forward.fluentd]
ca = "/home/bob/event-handler/ca.crt"
cert = "/home/bob/event-handler/client.crt"
key = "/home/bob/event-handler/client.key"
url = "https://fluentd.example.com:8888/test.log"
session-url = "https://fluentd.example.com:8888/session"

[teleport]
addr = "example.teleport.com:443"
identity = "identity"

구성을 수정하여 fluentd.example.com을 Fluentd 배포의 도메인 이름으로 교체하십시오.

다음 템플릿을 사용하여 teleport-plugin-event-handler-values.yaml을 생성하십시오:

eventHandler:
  storagePath: "./storage"
  timeout: "10s"
  batch: 20
  namespace: "default"
  # 창 크기는 이벤트 핸들러가 Teleport로부터 이벤트를 요청하는 
  # 시간 창의 지속 시간을 구성합니다. 기본적으로, 이는 24시간으로 설정됩니다.
  # 기본 창 크기에 대해 이벤트 볼륨을 관리할 수 없는 경우 
  # 창 크기를 줄이세요.
  # 창 크기는 Go의 time.ParseDuration으로 구문 분석된 지속 시간 문자열로 지정해야 합니다.
  windowSize: "24h"

teleport:
  address: "example.teleport.com:443"
  identitySecretName: teleport-event-handler-identity
  identitySecretPath: identity

fluentd:
  url: "https://fluentd.fluentd.svc.cluster.local/events.log"
  sessionUrl: "https://fluentd.fluentd.svc.cluster.local/session.log"
  certificate:
    secretName: "teleport-event-handler-client-tls"
    caPath: "ca.crt"
    certPath: "client.crt"
    keyPath: "client.key"

persistentVolumeClaim:
  enabled: true

구성 파일을 다음과 같이 업데이트하십시오.

forward.fluentd.url을 다음과 같이 변경하십시오:

url = "https://localhost:9061/services/collector/raw?token=MYTOKEN"

URL에 귀하의 Universal Forwarder의 HTTP 입력의 스킴, 호스트 및 포트가 포함되고, Universal Forwarder가 원시 데이터에 사용하는 URL 경로가 포함되어야 합니다 (/services/collector/raw).

MYTOKEN을 이전에 Splunk Universal Forwarder를 위해 생성한 토큰으로 교체하십시오. Universal Forwarder와 Event Handler를 별도의 호스트에서 실행하는 경우, localhost를 Universal Forwarder의 IP 주소 또는 도메인 이름으로 교체하십시오.

forward.fluentd.session-urlforward.fluentd.url과 동일한 값으로 변경하되, 쿼리 매개변수 키 &noop=를 끝에 추가합니다:

session-url = "https://localhost:9061/services/collector/raw?token=MYTOKEN&noop="

물론 Teleport 세션과 관련된 감사 로그를 위해, Teleport Event Handler는 HTTP 입력 구성에서 사용하지 않는 라우팅 정보가 포함된 URL을 추가합니다. noop 쿼리 매개변수를 추가하는 것은 Teleport Event Handler가 라우팅 정보를 매개변수의 값으로 추가하도록 하여 Universal Forwarder가 이를 버릴 수 있게 합니다.

다음으로, 구성의 teleport 섹션을 다음과 같이 수정하십시오:

addr: Teleport Proxy Service 또는 Teleport Enterprise Cloud 테넌트의 호스트 이름과 HTTPS 포트를 포함하세요 (예: teleport.example.com:443 또는 mytenant.teleport.sh:443).

identity: 이전에 내보낸 식별자 파일의 경로를 입력하세요.

client_key, client_crt, root_cas: 이 구성에서는 사용하지 않으므로 주석 처리하세요.

address: Teleport Proxy Service 또는 Teleport Enterprise Cloud 테넌트의 호스트 이름과 HTTPS 포트를 포함하세요 (예: teleport.example.com:443 또는 mytenant.teleport.sh:443).

identitySecretName: 이전에 생성한 Kubernetes 비밀의 이름으로 identitySecretName 필드를 입력하세요.

identitySecretPath: Kubernetes 비밀 내의 식별자 파일 경로로 identitySecretPath 필드를 입력하세요. 위의 지침을 따랐다면, 이는 identity가 될 것입니다.

이벤트 핸들러에 tbot 바이너리를 사용하여 자격 증명을 제공하는 경우, 리눅스 서버에서 실행됩니다. 이벤트 핸들러 구성의 identity 값이 tbot이 생성하도록 구성한 아이덴티티 파일의 경로인 /opt/machine-id/identity와 동일한지 확인하세요.

Teleport Event Handler가 신원 파일을 읽을 수 있도록 하십시오:

chmod +r auth.pem

Teleport Event Handler 시작

Teleport 이벤트 핸들러를 시작하려면 아래 지침을 따르세요.

teleport-event-handler.toml 파일을 Linux 서버의 /etc로 복사하세요.
환경에 맞게 toml 파일 내의 설정을 업데이트하세요.
identitystorage와 같은 설정에서 절대 경로를 사용해야 합니다.
사용 중인 파일과 디렉토리는 teleport-event-handler 서비스를 실행하는 시스템 사용자만 접근할 수 있어야 합니다
예: /var/lib/teleport-event-handler.

다음으로, 다음 내용을 포함한 시스템d 서비스 정의를 경로
/usr/lib/systemd/system/teleport-event-handler.service에 생성하세요:

[Unit]
Description=Teleport Event Handler
After=network.target

[Service]
Type=simple
Restart=always
ExecStart=/usr/local/bin/teleport-event-handler start --config=/etc/teleport-event-handler.toml --teleport-refresh-enabled=true
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/run/teleport-event-handler.pid

[Install]
WantedBy=multi-user.target

Machine ID를 사용하여 Event Handler에 단기 자격 증명을 제공하지 않는 경우,
--teleport-refresh-enabled true 플래그를 제거할 수 있습니다.

플러그인을 활성화하고 시작하세요:

sudo systemctl enable teleport-event-handler
sudo systemctl start teleport-event-handler

start 명령을 실행할 때 Teleport 이벤트 핸들러가 이벤트를 내보내기 시작할 시점을 구성할 수 있습니다.
이 예시는 2021년 5월 5일부터 내보내기를 시작합니다:

teleport-event-handler start --config /etc/teleport-event-handler.toml --start-time "2021-05-05T00:00:00Z"

시작 시점은 Teleport 이벤트 핸들러를 처음 실행할 때만 결정할 수 있습니다.
시간 범위를 나중에 변경하려면 핸들러의 구성 파일의 storage 필드에서 지정한 플러그인 상태 디렉토리를 제거하세요.

Teleport 이벤트 핸들러가 시작되면 스캔된 이벤트와 전달된 이벤트에 대한 알림이 표시됩니다:

sudo journalctl -u teleport-event-handler
DEBU Event sent id:f19cf375-4da6-4338-bfdc-e38334c60fd1 index:0 ts:2022-09-2118:51:04.849 +0000 UTC type:cert.create event-handler/app.go:140...

작업 공간에서 다음 명령을 실행하세요:

helm install teleport-plugin-event-handler teleport/teleport-plugin-event-handler \ --values teleport-plugin-event-handler-values.yaml \ --version 16.2.0

이전에 configure 명령을 실행한 디렉토리로 이동하고 다음 명령을 실행하세요:

docker run --network host -v `pwd`:/opt/teleport-plugin -w /opt/teleport-plugin public.ecr.aws/gravitational/teleport-plugin-event-handler:16.2.0 start --config=teleport-event-handler.toml

이 명령은 이벤트 핸들러 컨테이너를 미리 설정된 host 네트워크에 추가하며,
Docker 호스트 네트워킹 모드를 사용하고 네트워크 격리를 제거하여 이벤트 핸들러가
localhost에서 Fluentd 컨테이너와 통신할 수 있도록 합니다.

4단계/4. Splunk에서 감사 로그 시각화

설정이 완료되었으므로 감사 로그가 구조화된 JSON 형식으로 Splunk로 전달됩니다. Splunk는 이를 자동으로 인덱싱하여 필드를 즉시 시각화에서 사용할 수 있도록 합니다. 이런 필드를 사용하여 사용자가 Teleport 클러스터와 상호작용하는 방식을 추적할 수 있는 대시보드를 생성할 수 있습니다.

예를 들어, Splunk UI 홈페이지에서 Search & Reporting > Dashboards > Create New Dashboard로 이동합니다. 대시보드의 제목으로 "Teleport Audit Log Types"를 입력하고 Classic Dashboards를 클릭합니다. Create를 클릭한 후, Edit Dashboard 뷰에서 Add Panel을 클릭합니다.

Add Panel 사이드바에서 New > Column Chart를 클릭합니다. Search String 필드에 다음을 입력합니다:

index="teleport-audit-logs" | timechart count by event

Add to Dashboard를 클릭하면 시간에 따른 Teleport 이벤트 유형의 개수를 볼 수 있으며, 사용자가 Teleport와 상호작용하는 방식에 대한 일반적인 감각을 얻을 수 있습니다.

연결 문제 해결

Teleport Event Handler가 귀하의 Teleport 클러스터에 연결하는 동안 오류 로그를 표시하는 경우, 다음을 확인하십시오:

  • Teleport Event Handler가 귀하의 Teleport 클러스터에 연결하는 데 사용하는 인증서가 만료되지 않았는지 확인하십시오. 이는 tctl auth sign 명령에서의 --ttl 플래그의 값으로, 기본값은 12시간입니다.
  • Teleport Event Handler 구성 파일(teleport-event-handler.toml)에 Teleport Proxy 서비스의 올바른 호스트와 포트를 제공했는지 확인하십시오.

다음 단계

감사 로그를 Splunk로 내보내게 되었다면, 비주얼화 및 알림을 계획할 수 있도록 우리의 감사 로그 참조를 참조하십시오.

이 가이드에서는 Teleport Event Handler가 귀하의 Teleport 클러스터와 소통할 수 있도록 자격 증명을 제공하기 위해 가장 적합한 사용하는 방법으로 임의창을 활용하였습니다. 임의창에 대해 더 알아보려면 우리의 가이드를 읽어보십시오.

이 가이드에서는 Teleport Event Handler를 위한 자격 증명을 발급하기 위해 tctl auth sign 명령을 사용했지만, 프로덕션 클러스터는 더 안전하고 신뢰할 수 있는 갱신을 위해 Machine ID를 사용해야 합니다. Machine ID를 시작하는 방법에 대한 우리의 가이드를 읽어보십시오.

Teleport 원문 보기