Stenographer - Full Packet Capture System¶
Stenographer ist ein Full-Packet-Capture-Dienstprogramm zum Puffern von Paketen auf Festplatte für Intrusions-Erkennung und auftreffende Reaktionszwecke. Es bietet eine einfache, leistungsstarke Schnittstelle zum Speichern und Abrufen von Netzwerkpaketen im Maßstab.
Installation¶
Ubuntu/Debian¶
```bash
Install dependencies¶
sudo apt update sudo apt install build-essential git libpcap-dev libsnappy-dev libleveldb-dev
Install Go (if not already installed)¶
wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz export PATH=$PATH:/usr/local/go/bin
Clone and build Stenographer¶
git clone https://github.com/google/stenographer.git cd stenographer go build ./...
Install binaries¶
sudo cp stenographer stenoread stenocurl /usr/local/bin/ sudo chmod +x /usr/local/bin/steno* ```_
CentOS/RHEL/Fedora¶
```bash
Install dependencies¶
sudo yum groupinstall "Development Tools" sudo yum install git libpcap-devel snappy-devel leveldb-devel
Install Go¶
sudo yum install golang
Clone and build¶
git clone https://github.com/google/stenographer.git cd stenographer go build ./...
Install binaries¶
sudo cp stenographer stenoread stenocurl /usr/local/bin/ ```_
Docker Installation¶
```bash
Build Docker image¶
git clone https://github.com/google/stenographer.git cd stenographer docker build -t stenographer .
Run container¶
docker run -d --name stenographer \ --net=host \ --privileged \ -v /opt/stenographer:/opt/stenographer \ stenographer ```_
Konfiguration¶
Grundkonfiguration¶
```bash
Create configuration directory¶
sudo mkdir -p /etc/stenographer sudo mkdir -p /var/lib/stenographer
Create basic configuration file¶
sudo tee /etc/stenographer/config << 'EOF' \\{ "Threads": [ \\{ "PacketsDirectory": "/var/lib/stenographer/packets", "IndexDirectory": "/var/lib/stenographer/index", "MaxDirectoryFiles": 30000, "DiskFreePercentage": 10 \\} ], "StenotypePath": "/usr/local/bin/stenotype", "Interface": "eth0", "Port": 1234, "Host": "127.0.0.1", "Flags": [], "CertPath": "/etc/stenographer/certs" \\} EOF ```_
Erweiterte Konfiguration¶
json
\\\\{
"Threads": [
\\\\{
"PacketsDirectory": "/data/stenographer/packets0",
"IndexDirectory": "/data/stenographer/index0",
"MaxDirectoryFiles": 50000,
"DiskFreePercentage": 5
\\\\},
\\\\{
"PacketsDirectory": "/data/stenographer/packets1",
"IndexDirectory": "/data/stenographer/index1",
"MaxDirectoryFiles": 50000,
"DiskFreePercentage": 5
\\\\}
],
"StenotypePath": "/usr/local/bin/stenotype",
"Interface": "eth0",
"Port": 1234,
"Host": "0.0.0.0",
"Flags": [
"--threads=2",
"--fanout_type=FANOUT_HASH"
],
"CertPath": "/etc/stenographer/certs",
"RateLimit": "1000MB",
"MaxAge": "7d"
\\\\}
_
Zertifikat Setup¶
```bash
Create certificate directory¶
sudo mkdir -p /etc/stenographer/certs
Generate certificates¶
cd /etc/stenographer/certs sudo openssl genrsa -out stenographer.key 2048 sudo openssl req -new -x509 -key stenographer.key -out stenographer.crt -days 365 \ -subj "/C=US/ST=State/L=City/O=Organization/CN=stenographer"
Set permissions¶
sudo chown -R stenographer:stenographer /etc/stenographer/certs sudo chmod 600 /etc/stenographer/certs/* ```_
Basisnutzung¶
Starten Stenograph¶
```bash
Start stenographer daemon¶
sudo stenographer --config /etc/stenographer/config
Start as systemd service¶
sudo systemctl start stenographer sudo systemctl enable stenographer
Check status¶
sudo systemctl status stenographer ```_
Basic Pack Retrieval¶
```bash
Query packets by time range¶
stenocurl -s "2023-01-01T00:00:00Z" -e "2023-01-01T01:00:00Z"
Query packets by host¶
stenocurl -q "host 192.168.1.100"
Query packets by port¶
stenocurl -q "port 80"
Query packets by protocol¶
stenocurl -q "tcp"
Combine queries¶
stenocurl -q "host 192.168.1.100 and port 80" ```_
Ausgabeformate¶
```bash
Output to PCAP file¶
stenocurl -q "host 192.168.1.100" -w output.pcap
Output to stdout¶
stenocurl -q "port 443"|tcpdump -r -
Count packets only¶
stenocurl -q "tcp" -c
Limit number of packets¶
stenocurl -q "udp" -n 1000 ```_
Quersprache¶
Grundfilter¶
```bash
Host filters¶
stenocurl -q "host 10.0.0.1" stenocurl -q "src host 10.0.0.1" stenocurl -q "dst host 10.0.0.1"
Network filters¶
stenocurl -q "net 192.168.1.0/24" stenocurl -q "src net 10.0.0.0/8" stenocurl -q "dst net 172.16.0.0/12"
Port filters¶
stenocurl -q "port 80" stenocurl -q "src port 1234" stenocurl -q "dst port 443" stenocurl -q "portrange 1000-2000" ```_
Protokollfilter¶
```bash
Protocol types¶
stenocurl -q "tcp" stenocurl -q "udp" stenocurl -q "icmp" stenocurl -q "ip" stenocurl -q "ip6"
Application protocols¶
stenocurl -q "http" stenocurl -q "https" stenocurl -q "dns" stenocurl -q "ssh" stenocurl -q "ftp" ```_
Erweiterte Abfragen¶
```bash
Logical operators¶
stenocurl -q "host 10.0.0.1 and port 80" stenocurl -q "tcp or udp" stenocurl -q "not port 22" stenocurl -q "(host 10.0.0.1 or host 10.0.0.2) and port 443"
Packet size filters¶
stenocurl -q "greater 1500" stenocurl -q "less 64" stenocurl -q "len = 1518"
TCP flags¶
stenocurl -q "tcp[tcpflags] & tcp-syn != 0" stenocurl -q "tcp[tcpflags] & tcp-ack != 0" stenocurl -q "tcp[tcpflags] & tcp-rst != 0" ```_
Zeitbasierte Abfragen¶
```bash
Specific time range¶
stenocurl -s "2023-01-01T10:00:00Z" -e "2023-01-01T11:00:00Z" -q "tcp"
Last hour¶
stenocurl -s "$(date -d '1 hour ago' -Iseconds)" -q "dns"
Last 24 hours¶
stenocurl -s "$(date -d '1 day ago' -Iseconds)" -q "http"
Combine time and filters¶
stenocurl -s "2023-01-01T00:00:00Z" -e "2023-01-01T23:59:59Z" -q "host 192.168.1.100 and tcp" ```_
Erweiterte Funktionen¶
Multi-Threaded Capture¶
json
\\\\{
"Threads": [
\\\\{
"PacketsDirectory": "/fast-disk/packets0",
"IndexDirectory": "/fast-disk/index0",
"MaxDirectoryFiles": 100000,
"DiskFreePercentage": 5
\\\\},
\\\\{
"PacketsDirectory": "/fast-disk/packets1",
"IndexDirectory": "/fast-disk/index1",
"MaxDirectoryFiles": 100000,
"DiskFreePercentage": 5
\\\\}
],
"Flags": [
"--threads=4",
"--fanout_type=FANOUT_HASH",
"--blocks=8192",
"--blocksize=2097152"
]
\\\\}
_
Leistung Tuning¶
```bash
Optimize network interface¶
sudo ethtool -G eth0 rx 4096 tx 4096 sudo ethtool -K eth0 gro off lro off tso off gso off
Set CPU affinity¶
sudo taskset -c 0,1 stenographer --config /etc/stenographer/config
Increase buffer sizes¶
echo 'net.core.rmem_max = 134217728'|sudo tee -a /etc/sysctl.conf echo 'net.core.rmem_default = 134217728'|sudo tee -a /etc/sysctl.conf sudo sysctl -p ```_
Lagerverwaltung¶
```bash
Monitor disk usage¶
stenoread --stats
Clean old packets¶
stenoread --clean --before "2023-01-01T00:00:00Z"
Verify packet integrity¶
stenoread --verify
Export statistics¶
stenoread --stats --json > stenographer_stats.json ```_
Integration von Sicherheitswerkzeugen¶
Zeek Integration¶
```bash
Configure Zeek to use Stenographer¶
In local.zeek:¶
@load policy/misc/capture-loss
redef Pcap::snaplen = 65535; redef Pcap::bufsize = 128;
Extract packets for Zeek analysis¶
stenocurl -q "tcp and port 80" -w http_traffic.pcap zeek -r http_traffic.pcap ```_
Integration von Surat¶
```bash
Extract packets for Suricata analysis¶
stenocurl -q "tcp" -s "$(date -d '1 hour ago' -Iseconds)" -w recent_tcp.pcap
Run Suricata on extracted packets¶
suricata -r recent_tcp.pcap -c /etc/suricata/suricata.yaml -l /var/log/suricata/ ```_
Integration von Wirshark¶
```bash
Extract packets for Wireshark analysis¶
stenocurl -q "host 192.168.1.100" -w investigation.pcap
Open in Wireshark¶
wireshark investigation.pcap
Use tshark for command-line analysis¶
tshark -r investigation.pcap -T fields -e ip.src -e ip.dst -e tcp.port ```_
SIEM Integration¶
```bash
Export packet metadata to JSON¶
stenocurl -q "dns" -j|jq '.[]|\\{timestamp, src_ip, dst_ip, protocol\\}'
Send to Elasticsearch¶
stenocurl -q "http" -j|curl -X POST "localhost:9200/packets/_bulk" \ -H "Content-Type: application/json" --data-binary @-
Integration with Splunk¶
stenocurl -q "tcp" -j|splunk add oneshot -sourcetype stenographer ```_
Überwachung und Alarmierung¶
Gesundheitsüberwachung¶
```bash
!/bin/bash¶
Stenographer health check script¶
Check if stenographer is running¶
if ! pgrep -f stenographer > /dev/null; then echo "CRITICAL: Stenographer is not running" exit 2 fi
Check disk space¶
DISK_USAGE=$(df /var/lib/stenographer|tail -1|awk '\\{print $5\\}'|sed 's/%//') if [ $DISK_USAGE -gt 90 ]; then echo "WARNING: Disk usage is $\\{DISK_USAGE\\}%" exit 1 fi
Check packet capture rate¶
STATS=\((stenoread --stats --json) PACKETS_PER_SEC=\)(echo $STATS|jq '.packets_per_second') if [ \((echo "\)PACKETS_PER_SEC < 100"|bc) -eq 1 ]; then echo "WARNING: Low packet capture rate: $PACKETS_PER_SEC pps" exit 1 fi
echo "OK: Stenographer is healthy" exit 0 ```_
Leistungsüberwachung¶
```bash
Monitor capture statistics¶
watch -n 5 'stenoread --stats'
Monitor system resources¶
iostat -x 1|grep -E "(Device|stenographer)" top -p $(pgrep stenographer)
Network interface statistics¶
watch -n 1 'cat /proc/net/dev|grep eth0' ```_
Automatisierte Reinigung¶
```bash
!/bin/bash¶
Automated cleanup script¶
Configuration¶
MAX_AGE_DAYS=7 DISK_THRESHOLD=85 PACKETS_DIR="/var/lib/stenographer/packets"
Check disk usage¶
DISK_USAGE=$(df $PACKETS_DIR|tail -1|awk '\\{print $5\\}'|sed 's/%//')
if [ $DISK_USAGE -gt $DISK_THRESHOLD ]; then echo "Disk usage $\\{DISK_USAGE\\}% exceeds threshold $\\{DISK_THRESHOLD\\}%"
# Clean packets older than MAX_AGE_DAYS
CUTOFF_DATE=$(date -d "$\\\\{MAX_AGE_DAYS\\\\} days ago" -Iseconds)
stenoread --clean --before "$CUTOFF_DATE"
echo "Cleaned packets older than $CUTOFF_DATE"
fi ```_
Fehlerbehebung¶
Gemeinsame Themen¶
```bash
Check stenographer logs¶
sudo journalctl -u stenographer -f
Verify configuration¶
stenographer --config /etc/stenographer/config --check
Test network interface¶
sudo tcpdump -i eth0 -c 10
Check permissions¶
ls -la /var/lib/stenographer/ sudo chown -R stenographer:stenographer /var/lib/stenographer/ ```_
Leistungsfragen¶
```bash
Check for packet drops¶
cat /proc/net/dev|grep eth0 ethtool -S eth0|grep drop
Monitor CPU usage¶
top -p $(pgrep stenographer)
Check I/O wait¶
iostat -x 1
Verify disk performance¶
dd if=/dev/zero of=/var/lib/stenographer/test bs=1M count=1000 oflag=direct ```_
Netzwerkprobleme¶
```bash
Test connectivity¶
stenocurl -q "icmp" -c
Check interface configuration¶
ip addr show eth0 ip route show
Verify capture filter¶
tcpdump -i eth0 -d "tcp and port 80" ```_
Sicherheit Best Practices¶
Zugriffskontrolle¶
```bash
Create dedicated user¶
sudo useradd -r -s /bin/false stenographer
Set file permissions¶
sudo chown -R stenographer:stenographer /var/lib/stenographer/ sudo chmod 750 /var/lib/stenographer/ sudo chmod 640 /etc/stenographer/config
Restrict certificate access¶
sudo chmod 600 /etc/stenographer/certs/* ```_
Netzwerksicherheit¶
```bash
Use TLS for remote access¶
stenocurl --cert /etc/stenographer/certs/client.crt \ --key /etc/stenographer/certs/client.key \ --ca /etc/stenographer/certs/ca.crt \ -q "tcp"
Firewall configuration¶
sudo ufw allow from 192.168.1.0/24 to any port 1234 sudo ufw deny 1234 ```_
Datenschutz¶
```bash
Encrypt packet storage¶
sudo cryptsetup luksFormat /dev/sdb1 sudo cryptsetup luksOpen /dev/sdb1 stenographer-data sudo mkfs.ext4 /dev/mapper/stenographer-data sudo mount /dev/mapper/stenographer-data /var/lib/stenographer/
Secure deletion¶
sudo shred -vfz -n 3 /var/lib/stenographer/packets/* ```_
Dieses umfassende Stenographer-Catsheet umfasst Installation, Konfiguration, Nutzung und Integration mit Sicherheitswerkzeugen. Stenographer bietet leistungsstarke Full-Packet-Capture-Fähigkeiten für die Überwachung der Netzwerksicherheit und Notfall-Reaktionsoperationen.