
Stenographer는 모든 패킷을 디스크에 신속하게 스풀(spool)한 다음, 해당 패킷들의 하위 집합에 대해 간단하고 빠른 접근을 제공하는 것을 목표로 하는 패킷 캡처 솔루션입니다. 토론/공지: [email protected]
Stenographer는 전체 패킷 캡처 유틸리티로, 침입 탐지 및 사고 대응 목적으로 디스크에 패킷을 버퍼링합니다. 고성능 NIC-디스크 패킷 쓰기 구현을 제공하며, 디스크가 가득 차면 해당 파일을 삭제하고, 특정 패킷 세트를 빠르고 쉽게 읽어올 수 있는 방법을 제공합니다.
다음과 같은 용도로 설계되었습니다:
다음과 같은 용도로 설계되지 않았습니다:
복잡한 패킷 처리 (TCP 스트림 재조립 등)
이 작업을 하지 않기 때문에 빠릅니다. 최소한의 단일 패킷 처리만으로도 인덱싱만으로 약 1Gbps를 처리하는 데 단일 코어의 75% 이상을 사용할 수 있습니다.
디스크에서 데이터를 다시 읽어서 처리하는 것도 작동하지 않습니다: 다음 항목 참조.
많은 양의 패킷(쓰여진 패킷의 1% 초과) 읽기
여기서 핵심 개념은 디스크 읽기가 디스크 쓰기와 경쟁한다는 점입니다… 디스크 속도의 90%로 쓸 수 있지만, 이는 읽기에 디스크 시간의 10%만 남깁니다. 또한, 우리는 매우 순차적인 데이터를 쓰고 있어 디스크가 빠르게 처리하는 데 능숙하지만, 일반적으로 많은 탐색이 필요한 희소 데이터를 읽는 것은 디스크가 느리게 처리합니다.
자세한 내용은 stenographer의 디자인에 대한 논의를 위해 **DESIGN.md**를 확인하거나, 머신에 stenographer를 설치하는 방법은 **INSTALL.md**를 읽어보세요.
사용자는 매우 간단한 쿼리 언어로 stenographer에 패킷을 요청합니다. 이 언어는 BPF의 간단한 하위 집합이며, 다음과 같은 프리미티브를 포함합니다:
host 8.8.8.8 # 단일 IP 주소 (호스트 이름은 허용되지 않음)
net 1.0.0.0/8 # CIDR로 네트워크
net 1.0.0.0 mask 255.255.255.0 # 마스크로 네트워크
port 80 # 포트 번호 (UDP 또는 TCP)
ip proto 6 # IP 프로토콜 번호 6
icmp # 'ip proto 1'과 동일
tcp # 'ip proto 6'과 동일
udp # 'ip proto 17'과 동일
# Stenographer 특정 시간 추가:
before 2012-11-03T11:05:00Z # 특정 시간 이전의 패킷 (UTC)
after 2012-11-03T11:05:00-07:00 # 특정 시간 이후의 패킷 (시간대 포함)
before 45m ago # 상대 시간 이전의 패킷
after 3h ago # 상대 시간 이후의 패킷
참고: 상대 시간은 위에 표시된 대로 시간 또는 분의 정수 값으로 측정되어야 합니다.
프리미티브는 and/&& 및 or/||로 결합할 수 있으며, 이들은 동일한 우선순위를 가지며 왼쪽에서 오른쪽으로 평가됩니다. 괄호를 사용하여 그룹화할 수도 있습니다.
(udp and port 514) or (tcp and port 8080)
stenoread 명령줄 스크립트는 Stenographer에서 패킷을 가져와 분석가에게 사용 가능한 형식으로 제공하는 작업을 자동화합니다. stenographer에 원시 패킷을 요청한 후 tcpdump를 통해 실행하여 더욱 풍부한 포맷팅/필터링 경험을 제공합니다. stenoread의 첫 번째 인수는 stenographer 쿼리입니다(위의 'Query Language' 참조). 다른 모든 인수는 tcpdump에 전달됩니다. 예를 들어:
# Request all packets from IP 1.2.3.4 port 6543, then do extra filtering by
# TCP flag, which typical stenographer does not support.
$ stenoread 'host 1.2.3.4 and port 6543' 'tcp[tcpflags] & tcp-push != 0'
# Request packets on port 8765, disabling IP resolution (-n) and showing
# link-level headers (-e) when printing them out.
$ stenoread 'port 8765' -n -e
# Request packets for any IPs in the range 1.1.1.0-1.1.1.255, writing them
# out to a local PCAP file so they can be opened in Wireshark.
$ stenoread 'net 1.1.1.0/24' -w /tmp/output_for_wireshark.pcap
소스 코드를 다운로드하려면 Go를 로컬에 설치한 후 다음을 실행하세요:
$ go get github.com/google/stenographer
Go가 stenographer가 의존하는 모든 Go 라이브러리를 다운로드하고 설치합니다. stenotype을 빌드하려면 stenotype 디렉토리로 이동하여 make를 실행하세요. 다음 Ubuntu 패키지(또는 다른 Linux 배포판의 해당 패키지)를 설치해야 할 수도 있습니다:
이것은 공식 Google 제품이 아니며(실험적이거나 기타), 단지 Google이 소유한 코드일 뿐입니다.
이 코드는 Google 사용자를 감시하기 위한 것이 아닙니다. 그 목적은 내부 모니터링 기능을 강화하여 네트워크 보안을 향상시키는 것입니다.