Infograb logo
SSH를 위한 향상된 세션 기록(BPF 사용)

이 가이드는 BPF를 사용하여 SSH에 대한 향상된 세션 기록을 설명하고 Teleport 클러스터에서 설정하는 방법을 설명합니다.

Teleport의 기본 SSH 및 Kubernetes 세션 기록 기능은 터미널에 에코된 내용을 캡처합니다.

이는 고유한 장점이 있습니다. 예를 들어, 입력값이 캡처되지 않기 때문에 Teleport의 세션 기록에는 일반적으로 터미널에 입력된 비밀번호가 포함되지 않습니다.

단점은 세션 기록을 덜 유용하게 만드는 여러 기술이 있다는 것입니다:

  • 혼란화. 예를 들어, 명령어 echo Y3VybCBodHRwOi8vd3d3LmV4YW1wbGUuY29tCg== | base64 --decode | shcurl http://www.example.com을 포함하고 있지 않지만, 디코딩하면 그것이 실행됩니다.
  • 셸 스크립트. 예를 들어, 사용자가 스크립트를 업로드하고 실행하면 스크립트 내에서 실행된 명령은 캡처되지 않고 출력만 캡처됩니다.
  • 터미널 제어. 터미널은 사용자가 터미널 에코를 비활성화할 수 있는 다양한 제어 기능을 지원합니다. 이는 자격증명을 요청할 때 자주 사용됩니다. 터미널 에코를 비활성화하면 명령을 캡처되지 않게 실행할 수 있습니다.

또한, 비구조적인 특성으로 인해 세션 기록을 수집하고 모니터링 및 알림을 수행하기가 어렵습니다.

Teleport의 향상된 세션 기록은 고급 보안 및 더 나은 로깅 기능을 제공하여 세 가지 우려 사항을 완화하고 사용자의 활동과 더 잘 연관됩니다.

보안 경고

Teleport의 향상된 세션 기록은 자체적으로 안전한 환경을 제공하지 않으며 Linux 보안 모듈(SELinux, AppArmor 등)의 대체가 아닙니다. 신뢰할 수 있는 호스트 환경을 enforce하기 위해서는 적절한 시스템 경화 관행과 함께 사용해야 하며, 핵심 시스템 바이너리 및 라이브러리에 대한 적절한 접근 제어 및 잘 설계된 사용자 관리를 포함해야 합니다.

특권 사용자는(루트 또는 sudo를 통해) 세션 기록 활동에 간섭할 수 있습니다(필요한 라이브러리 언로드/비활성화, Teleport 실행 방식 변경, 커널 기능 변조, 터널 생성 또는 제한된 세션 외부에서 행동 수행). 또한, 모니터링된 세션과 비모니터링된 콘솔 세션 또는 ptrace 권한을 가진 로컬 사용자는 기록에서 완전히 캡처되지 않을 수 있습니다.

데몬(systemd, crond, atd 등)을 통해 실행된 명령은 기록된 세션 범위를 벗어날 수 있습니다. 가능한 무단 데이터 전송을 방지하기 위해 수신 트래픽에 대한 적절한 네트워크 기반 제한도 구현해야 합니다.

또한, 전체 바이너리 경로(잠재적인 심볼릭 링크를 고려), 공유 라이브러리 Preloading을 통한 수정 사항 및 환경 변수와 같은 특정 포렌식 정보는 세션 기록에 캡처되지 않을 수 있습니다.

전제 조건

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

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

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

  • Teleport Node Service를 실행하는 데 사용할 한 개 이상의 호스트. 해당 호스트는 Linux 커널 5.8(또는 그 이상)을 실행해야 합니다.

    커널 버전은 uname 명령을 사용하여 확인할 수 있습니다. 출력은 다음과 비슷해야 합니다.

    uname -r

    5.8.17

    Linux 커널 및 배포판의 필수 버전에 대한 자세한 내용은 아래를 참조하십시오.

우리의 표준 세션 기록은 더 오래된 Linux 커널과 함께 작동합니다. 자세한 내용은 Teleport Session Recording을 참조하십시오.

Linux 배포판 및 지원되는 커널

Teleport는 amd64arm64 아키텍처에서 BPF와 함께 향상된 세션 기록을 지원합니다.

배포판 이름배포판 버전커널 버전
Ubuntu "Groovy Gorilla"20.105.8+
Fedora335.8+
Arch Linux2020.09.015.8.5+
Flatcar2765.2.25.10.25+
Amazon Linux25.10+
  • 당신의 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단계/2단계. Teleport Node 구성하기

Node에 Teleport 설치하기

Teleport Node를 실행할 호스트에서 귀하의 환경에 맞는 설치 지침을 따르십시오.

Linux 서버에 Teleport 설치하기:

  1. Teleport 에디션에 따라 edition을(를) 다음 중 하나로 지정합니다:

    에디션
    Teleport Enterprise Cloudcloud
    Teleport Enterprise (자체 호스팅)enterprise
    Teleport Community Editionoss
  2. 설치할 Teleport의 버전을 확인합니다. 클러스터에서 자동 에이전트 업데이트가 활성화되어 있는 경우, 업데이터와 호환되는 최신 Teleport 버전을 쿼리합니다:

    TELEPORT_DOMAIN=example.teleport.com
    TELEPORT_VERSION="$(curl https://$TELEPORT_DOMAIN/v1/webapi/automaticupgrades/channel/default/version | sed 's/v//')"

    그렇지 않으면, Teleport 클러스터의 버전을 확인합니다:

    TELEPORT_DOMAIN=example.teleport.com
    TELEPORT_VERSION="$(curl https://$TELEPORT_DOMAIN/v1/webapi/ping | jq -r '.server_version')"
  3. Linux 서버에 Teleport를 설치합니다:

    curl https://cdn.teleport.dev/install-v16.2.0.sh | bash -s ${TELEPORT_VERSION} edition

    설치 스크립트는 Linux 서버에서 패키지 관리자를 감지하고 이를 사용하여 Teleport 바이너리를 설치합니다. 설치를 사용자 지정하려면 설치 가이드에서 Teleport 패키지 리포지토리에 대해 알아보세요.

토큰 생성하기

tctl 도구를 사용하여 Node가 클러스터에 참가하는 데 사용할 초대 토큰을 생성합니다. 아래 예시에서 새로운 토큰이 5분의 TTL로 생성됩니다:

새 노드에 대한 짧은 기간의 초대 토큰 생성:

tctl nodes add --ttl=5m --roles=node

초대 토큰: abcd123-insecure-do-not-use-this


만료되지 않은 모든 생성된 토큰을 나열할 수도 있습니다:

tctl tokens ls

토큰 유형 만료 시간

------------------------ ----------- ---------------

abcd123-insecure-do-not-use-this 노드 25 Sep 18 00:21 UTC


... 또는 토큰이 사용되기 전에 초대 토큰을 폐기합니다:

tctl tokens rm abcd123-insecure-do-not-use-this

구성 파일 만들기

/etc/teleport.yaml에 다음 내용을 설정하여 Teleport Node를 구성하십시오.

# etc/teleport.yaml로 저장할 예제 구성
version: v3
teleport:
  nodename: graviton-node
  # 이전에 생성한 토큰
  auth_token: abcd123-insecure-do-not-use-this

  # Teleport Auth Service의 주소로 교체
  auth_server: 127.0.0.1:3025
  # 또는 Proxy Service 주소를 지정합니다.
  proxy_server: 127.0.0.1:3080

  data_dir: /var/lib/teleport
proxy_service:
  enabled: false
auth_service:
  enabled: false
ssh_service:
  enabled: true
  enhanced_recording:
    # 이 노드에 대한 향상된 감사를 활성화 또는 비활성화합니다. 기본 값: false.
    enabled: true

    # 선택 사항: command_buffer_size는 선택 사항이며 기본값은 8페이지입니다.
    command_buffer_size: 8

    # 선택 사항: disk_buffer_size는 기본값으로 128 페이지가 선택 사항입니다.
    disk_buffer_size: 128

    # 선택 사항: network_buffer_size는 선택 사항이며 기본값은 8 페이지입니다.
    network_buffer_size: 8

    # 선택 사항: cgroupv2 계층이 마운트되는 경로를 제어합니다. 기본값:
    # /cgroup2.
    cgroup_path: /cgroup2

    # 선택 사항: Teleport cgroups가 배치될 cgroupv2 계층 내부의 경로를 제어합니다. 기본값: /teleport
    root_path: /teleport

동일한 시스템에서 여러 Teleport 인스턴스를 운영하는 경우, root_path 구성으로 세션 시스템 리소스의 기본 cgroupv2 슬라이스 경로를 변경하여 보안 분리를 적용하십시오. 이를 통해 서로 다른 Teleport 인스턴스의 세션 간 보안 분리가 보장되며, 별도의 보안 규칙 및 리소스 제어를 적용할 수 있습니다.

Node에서 Teleport 시작하기

호스트가 부팅될 때 Teleport SSH 서비스가 자동으로 시작되도록 시스템 데몬 서비스를 생성하여 구성합니다. 지침은 Teleport SSH 서비스를 설치한 방법에 따라 다릅니다.

Teleport SSH 서비스를 실행할 호스트에서 Teleport를 활성화하고 시작하십시오:

sudo systemctl enable teleport
sudo systemctl start teleport

Teleport SSH 서비스를 실행할 호스트에서 Teleport에 대한 시스템 데몬 서비스 구성을 생성하고, Teleport 서비스를 활성화한 후 Teleport를 시작하십시오:

sudo teleport install systemd -o /etc/systemd/system/teleport.service
sudo systemctl enable teleport
sudo systemctl start teleport

Teleport SSH 서비스의 상태는 systemctl status teleport로 확인할 수 있으며, 로그는 journalctl -fu teleport로 볼 수 있습니다.

2단계/2단계. 감사 로그 검사하기

향상된 세션 기록 이벤트는 Teleport의 감사 로그에 표시됩니다. 이를 Teleport의 웹 UI를 방문하여 확인할 수 있습니다.

실행된 각 명령은 다음과 유사한 session.command 이벤트를 생성합니다:

{
  "argv": [
    "https://wttr.in"
  ],
  "cgroup_id": 2360,
  "cluster_name": "purple",
  "code": "T4000I",
  "ei": 50,
  "event": "session.command",
  "login": "ec2-user",
  "namespace": "default",
  "path": "/bin/curl",
  "pid": 5007,
  "ppid": 4985,
  "program": "curl",
  "return_code": 0,
  "server_hostname": "ip-172-31-34-128.us-east-2.compute.internal",
  "server_id": "531dc1de-c2c9-49bd-a0e3-4f4f3a523f5",
  "sid": "86aca627-971d-4883-854d-d309ba04c658",
  "time": "2023-07-04T16:42:20.54Z",
  "uid": "9b825e22-744d-4130-94c5-dea49198ae3d",
  "user": "alice@goteleport.com"
}

네트워크 연결은 다음과 유사한 session.network 이벤트로 기록됩니다:

{
  "action": 0,
  "cgroup_id": 2360,
  "cluster_name": "purple",
  "code": "T4002I",
  "dst_addr": "5.9.243.187",
  "dst_port": 443,
  "ei": 51,
  "event": "session.network",
  "login": "ec2-user",
  "namespace": "default",
  "operation": 0,
  "pid": 5007,
  "program": "curl",
  "server_hostname": "ip-172-31-34-128.us-east-2.compute.internal",
  "server_id": "531dc1de-c2c9-49bd-a0e3-4f4f3a523f5",
  "sid": "86aca627-971d-4883-854d-d309ba04c658",
  "src_addr": "172.31.34.128",
  "time": "2023-07-04T16:42:20.55Z",
  "uid": "da151350-bf45-4a04-a62b-7a4fc805e744",
  "user": "alice@goteleport.com",
  "version": 4
}

향상된 세션 기록이 활성화된 경우, 세션이 종료될 때 생성된 session.end 이벤트는 "enhanced_recording": true 필드를 포함합니다. 다음과 유사합니다:

{
  "code": "T2004I",
  "ei": 23,
  "enhanced_recording": true,
  "event": "session.end",
  "interactive": true,
  "namespace": "default",
  "participants": [
    "alice@goteleport.com"
  ],
  "server_id": "585fc225-5cf9-4e9f-8ff6-1b0fd6885b09",
  "sid": "ca82b98d-1d30-11ea-8244-cafde5327a6c",
  "time": "2019-12-12T22:44:46.218Z",
  "uid": "83e67464-a93a-4c7c-8ce6-5a3d8802c3b2",
  "user": "alice@goteleport.com"
}

Teleport 클러스터가 파일 기반 이벤트 로그를 사용하는 경우, Teleport Auth Service 호스트에서 감사 로그를 검사할 수 있습니다.

Teleport의 세션 기록 백엔드는 teleport.storage.audit_sessions_uri 필드를 통해 구성됩니다. 제공된 URI에 클라우드 기반 서비스에 해당하는 스킴(예: s3:// 또는 dynamodb://)이 포함된 경우 Auth Service 호스트의 파일 시스템에서 세션 기록을 확인할 수 없습니다.

다음과 같이 /var/lib/teleport/log의 내용을 검사하십시오:

teleport-auth ~: tree /var/lib/teleport/log

/var/lib/teleport/log

├── 1048a649-8f3f-4431-9529-0c53339b65a5

│ ├── 2020-01-13.00:00:00.log

│ └── sessions

│ └── default

│ ├── fad07202-35bb-11ea-83aa-125400432324-0.chunks.gz

│ ├── fad07202-35bb-11ea-83aa-125400432324-0.events.gz

│ ├── fad07202-35bb-11ea-83aa-125400432324-0.session.command-events.gz

│ ├── fad07202-35bb-11ea-83aa-125400432324-0.session.network-events.gz

│ └── fad07202-35bb-11ea-83aa-125400432324.index

├── events.log -> /var/lib/teleport/log/1048a649-8f3f-4431-9529-0c53339b65a5/2020-01-13.00:00:00.log

├── playbacks

│ └── sessions

│ └── default

└── upload

└── sessions

└── default

감사 로그의 상태를 빠르게 확인하려면 tail -f /var/lib/teleport/log/events.log 명령으로 로그를 간단히 확인할 수 있습니다. Teleport에서 생성한 결과물은 각 명령 및 네트워크 요청에 대한 JSON 로그가 될 것입니다.

향상된 세션 기록 이벤트는 Teleport의 감사 로그에 표시됩니다. 이를 Teleport의 웹 UI를 방문하여 확인할 수 있습니다.

실행된 각 명령은 다음과 유사한 session.command 이벤트를 생성합니다:

{
  "argv": [
    "https://wttr.in"
  ],
  "cgroup_id": 2360,
  "cluster_name": "purple",
  "code": "T4000I",
  "ei": 50,
  "event": "session.command",
  "login": "ec2-user",
  "namespace": "default",
  "path": "/bin/curl",
  "pid": 5007,
  "ppid": 4985,
  "program": "curl",
  "return_code": 0,
  "server_hostname": "ip-172-31-34-128.us-east-2.compute.internal",
  "server_id": "531dc1de-c2c9-49bd-a0e3-4f4f3a523f5f",
  "sid": "86aca627-971d-4883-854d-d309ba04c658",
  "time": "2023-07-04T16:42:20.54Z",
  "uid": "9b825e22-744d-4130-94c5-dea49198ae3d",
  "user": "alice@goteleport.com"
}

네트워크 연결은 다음과 유사한 session.network 이벤트로 기록됩니다:

{
  "action": 0,
  "cgroup_id": 2360,
  "cluster_name": "purple",
  "code": "T4002I",
  "dst_addr": "5.9.243.187",
  "dst_port": 443,
  "ei": 51,
  "event": "session.network",
  "login": "ec2-user",
  "namespace": "default",
  "operation": 0,
  "pid": 5007,
  "program": "curl",
  "server_hostname": "ip-172-31-34-128.us-east-2.compute.internal",
  "server_id": "531dc1de-c2c9-49bd-a0e3-4f4f3a523f5f",
  "sid": "86aca627-971d-4883-854d-d309ba04c658",
  "src_addr": "172.31.34.128",
  "time": "2023-07-04T16:42:20.55Z",
  "uid": "da151350-bf45-4a04-a62b-7a4fc805e744",
  "user": "alice@goteleport.com",
  "version": 4
}

향상된 세션 기록이 활성화된 경우, 세션이 종료될 때 생성된 session.end 이벤트는 "enhanced_recording": true 필드를 포함합니다. 다음과 유사합니다:

{
  "code": "T2004I",
  "ei": 23,
  "enhanced_recording": true,
  "event": "session.end",
  "interactive": true,
  "namespace": "default",
  "participants": [
    "alice@goteleport.com"
  ],
  "server_id": "585fc225-5cf9-4e9f-8ff6-1b0fd6885b09",
  "sid": "ca82b98d-1d30-11ea-8244-cafde5327a6c",
  "time": "2019-12-12T22:44:46.218Z",
  "uid": "83e67464-a93a-4c7c-8ce6-5a3d8802c3b2",
  "user": "alice@goteleport.com"
}

다음 단계

  • 세션 기록에 대한 자세한 내용을 읽어보세요.
  • 향상된 세션 기록을 위한 모든 구성 옵션을 구성 참조에서 확인하세요.
Teleport 원문 보기