Tôi nghĩ rằng nó sẽ hoạt động theo cách này, đôi khi việc đăng thông báo nhật ký từ một tập lệnh khá hữu ích. Nó chắc chắn không dành cho người dùng làm ô nhiễm nhật ký hệ thống. Theo tôi, giải pháp là có một hệ thống ghi nhật ký được định cấu hình tốt, hệ thống này sẽ ngăn người dùng làm ô nhiễm nhật ký hoặc giả mạo thông báo hệ thống, cho phép bạn xác định những người dùng có thói quen làm như vậy.
tôi sử dụng rsyslogd
, vì vậy tôi đang sử dụng nó để làm ví dụ.
Trước hết, bạn cần cấu hình rsyslogd
để lưu trữ các biến nhất định từ ổ cắm mà nó mở ra:
mô-đun (tải = "imuxsock"
SysSock.Annotate="on"
SysSock.ParseTrusted="on"
)
Với điều này, bạn có thể truy cập các biến sau:
pid
: PID của quá trình ghi nhật ký.
uid
và gid
: UID và GID mà quá trình ghi nhật ký chạy dưới dạng.
tên ứng dụng
: tên của quá trình ghi nhật ký
cmd
: dòng lệnh đầy đủ của quá trình ghi nhật ký
Trong trường hợp tiều phu
, pid
sẽ là PID của systemd-journald
, và tên ứng dụng
sẽ luôn là systemd-tạp chí
.
Với những điều này, bạn có thể làm một vài điều:
Đơn giản chỉ cần đăng nhập này
Bạn có thể sử dụng một mẫu bao gồm các biến này để bạn có thể xem liệu có sự khác biệt giữa thông báo và các tham số thu được hay không. Trong một mẫu, bạn có thể truy cập các biến này như %$!pid%
. Vì vậy, ví dụ, bạn sử dụng một mẫu như thế này:
$template SomeLogFormat,"%TIMESTAMP:::date-rfc3339% <%pri-text%> %syslogtag%%msg% (được pid=%$!pid% ghi nhật ký dưới dạng %$!uid%)\n"
daemon.* /var/log/daemon.log;SomeLogFormat
sẽ mang lại mục sau:
27-10-2021T18:27:54.638759+02:00 <daemon.info> sshd[986]: Đã chấp nhận khóa công khai từ cổng 127.0.0.19.8 65537 sha2: RSA 2e:45:25:54:6o:34:3a: z3:55:07:04 (chỉ là giả mạo) (được ghi bởi pid=540 chạy bằng 1000)
Từ đó, bạn có thể xem tin nhắn có hợp pháp hay không và nếu không, bạn sẽ nhận được UID của người dùng đang có tâm trạng vui vẻ. Lưu ý rằng thay vì cung cấp từng thông số một, bạn có thể sử dụng %$!%
mẫu, sẽ ghi lại các giá trị trên ở định dạng JSON.
Định tuyến lại nhật ký người dùng
Bạn có thể đặt nhật ký do người dùng ghi vào một tệp riêng biệt (có thể trên một hệ thống tệp riêng biệt để người dùng không thể điền vào hệ thống tệp gốc). Bạn có thể định tuyến lại tất cả nhật ký bắt nguồn từ người dùng với cấu hình sau:
nếu $!uid > 999 thì /opt/log/user.log;SomeLogFormat
& dừng lại
Việc sử dụng mẫu (các ;Một sốLogFormat
một phần) là tùy chọn. Bằng cách này, mọi thứ bắt nguồn từ bất kỳ thứ gì có UID trên 1000 sẽ được ghi vào /opt/log/user.log
. Bạn thậm chí có thể tách nhật ký người dùng theo UID như thế này:
$template userLogFile,"/opt/log/userlog_%$!uid%.log"
nếu $!uid > 999 thì ?userLogFile;SomeLogFormat
& dừng lại
Bằng cách này, mỗi người dùng sẽ có riêng của họ userlog_xxxx.log
tập tin.