Linux OS Logging (snoopy)
;;; REQUIRED Section
[snoopy]
;;; Log Message Format
; Security-enriched format: covers identity, session, process tree, and command context
; message_format = "datetime=%{datetime} hostname=%{hostname} user=%{username} uid=%{uid} euser=%{eusername} euid=%{euid} login=%{login} tty=%{tty} tty_user=%{tty_username} sid=%{sid} pid=%{pid} ppid=%{ppid} cwd=%{cwd} filename=%{filename} cmdline=%{cmdline}"
message_format = "user=%{username} %{datetime} cmdline=%{cmdline} loginuser=%{login} tty=%{tty}"
;;; Filter Chain
; Exclude high-noise system UIDs (0=root daemon activity, 1-999 = typical system accounts)
; Adjust UID ranges to match your system's service account allocation
; Keep only_tty if you want interactive-session-only logging (remove for full coverage)
filter_chain = "exclude_spawns_of:cron,sshd,systemd;exclude_uid:1,2,3,4,5,6,7,8,9,10"
;;; Output
output = file:/var/log/snoopy.log
;;; Error Logging
; Disable in production - enable only for troubleshooting
error_logging = no
;;; Syslog settings (relevant if switching output to devlog/syslog)
syslog_facility = LOG_AUTHPRIV
syslog_ident = snoopy
syslog_level = LOG_INFO
Additional Recommendations (outside this file)
- Add a logrotate entry for /var/log/snoopy.log with compress, dateext, and postrotate to avoid unbounded growth.
- If you’re forwarding to a SIEM, consider switching output to socket:/var/run/your-siem-socket.sock instead of file.
- Periodically audit the exclude_uid list against /etc/passwd as service accounts are added.
# /etc/logrotate.d/snoopy
#
# Logrotate configuration for Snoopy command-line logger
# Place this file at: /etc/logrotate.d/snoopy
#
# Rotation strategy:
# - Daily rotation with 90-day retention (adjust to meet your compliance requirements)
# - Compressed archives to minimize disk usage
# - Delayed compression to allow last-written log to remain readable
# - Missing log is not an error (handles first-run and output gaps gracefully)
/var/log/snoopy.log {
# Rotate daily; change to 'weekly' or 'monthly' if volume is low
daily
# Keep 90 days of history; align with your audit retention policy (e.g. 365 for ISO 27001)
rotate 90
# Compress rotated logs using gzip
compress
# Delay compression by one cycle — keeps yesterday's log uncompressed for easy access
delaycompress
# Do not error if log file is missing (e.g. snoopy not yet started)
missingok
# Do not rotate if log file is empty
notifempty
# Use date-based suffix instead of numeric (e.g. snoopy.log-20260217)
dateext
dateformat -%Y%m%d
# Create new log file with strict permissions after rotation
# Owner: root, Group: adm (change to syslog or your SIEM agent group if needed)
create 0640 root adm
# Rotate only this specific file, not any matching glob
nosharedscripts
postrotate
# Signal rsyslog to reopen log files if you are also forwarding via syslog
# Uncomment if rsyslog is in use:
# /usr/bin/systemctl reload rsyslog > /dev/null 2>&1 || true
# If you have a SIEM agent tailing the file, signal it here, for example for Filebeat:
# /usr/bin/systemctl reload filebeat > /dev/null 2>&1 || true
# Snoopy writes directly to file via LD_PRELOAD — no daemon to signal.
# New file is created automatically by the 'create' directive above.
/bin/true
endscript
# Optional: send alert if log exceeds 500MB before scheduled rotation
# Uncomment and adjust threshold to suit your environment
# size 500M
}
logrotate -d /etc/logrotate.d/snoopy # dry run, shows what would happen logrotate -f /etc/logrotate.d/snoopy # force rotation now to verify it works
Login
0 Comments
Oldest