Tôi đang chạy một máy chủ sản xuất (Debian 10, gói OpenSSH tiêu chuẩn) chạy Pure-FTPD cho các kết nối cũ và SFTP cho tất cả các kết nối hiện tại của chúng tôi. Máy chủ SFTP được thiết lập với một nhà tù chroot ghi nhật ký qua một thiết bị bị ràng buộc trong nhà tù chroot của người dùng. Điều này được chọn bởi rsyslog và gửi đến /var/log/sftp.log, sau đó tôi đang sử dụng logstash để phân tích cú pháp tệp đó và chuyển tiếp mọi thứ tới một máy chủ trực quan cho các siêu người dùng của chúng tôi. Người dùng cấp cao đăng nhập vào phần trực quan hóa để xem tất cả nhật ký SFTP và FTP/FTPS ở cùng một nơi.
Các bản ghi ftpd thuần túy được định dạng theo cách mà các siêu người dùng của chúng tôi thích:
pure-ftpd: (testuser@hostname) [THÔNG BÁO] /home/ftpusers/testuser//outbound/testfile.pdf đã tải xuống (1765060 byte, 5989,55KB/giây)
Điều này thật tuyệt, bởi vì trong một dòng, nó hiển thị chính xác người dùng và tệp chính xác mà họ đã tải lên hoặc tải xuống. Tuy nhiên, đối với SFTP, tình hình không tốt bằng:
internal-sftp[8848]: phiên mở cho người kiểm tra người dùng cục bộ từ [{ip_address}]
internal-sftp[8848]: opendir "/inbound"
internal-sftp[8848]: realpath "/inbound/."
internal-sftp[8848]: mở cờ "/inbound/testfile.pdf" Chế độ VIẾT, TẠO, TRUNCATE 0666
internal-sftp[8848]: đóng byte "/inbound/testfile.pdf" đọc 0 được viết 1734445
Trong trường hợp này, nhật ký rất dễ theo dõi. người kiểm tra
đăng nhập, ghi tập tin, xong. NHƯNG chúng tôi có nhiều người dùng đăng nhập cùng một lúc và nhật ký từ nhiều phiên bản sftp nội bộ có thể xảy ra cùng một lúc. Nếu điều này xảy ra, cách duy nhất để theo dõi hoạt động của người dùng là tìm kiếm tên người dùng người kiểm tra
, tìm ID tiến trình được ghi lại (8848
trong ví dụ trên), sau đó tìm bất kỳ thư nào có ID tiến trình đó. Nhiều người dùng đang đăng nhập thông qua một cronjob, vì vậy điều này xảy ra cứ sau 2 phút hoặc lâu hơn...khi chúng tôi có 300 người dùng đăng nhập đều đặn, bạn có thể tưởng tượng rằng việc tìm kiếm qua nhiều ID quy trình này sẽ là một điều khó khăn.
Câu hỏi của tôi
Có cách nào để mở đầu mỗi thông điệp tường trình từ sftp-internal với tên của người dùng đang tạo nhật ký không? Điều này sẽ phải làm việc trong một nhà tù chroot. Tôi không thể tìm thấy bất cứ điều gì về cách sửa đổi thông báo mà rsyslog tạo để bao gồm tên người dùng.
Tôi muốn thấy điều gì đó tương tự từ nhật ký SFTP của mình:
internal-sftp[8848]: (người kiểm tra) mở cờ "/inbound/testfile.pdf" chế độ WRITE,CREATE,TRUNCATE 0666
internal-sftp[8848]: (người kiểm tra) đóng "/inbound/testfile.pdf" byte đọc 0 ghi 1734445
Trạng thái cấu hình hiện tại
Chuỗi quy trình của tôi diễn ra:
ssh -> sftp-internal -> rsyslog (trên local3.*) -> tệp /var/log/sftp.log -> logstash -> xuất sang máy chủ trực quan
Trích từ nhóm chroot của tôi trong /etc/ssh/sshd_config
Kết hợp nhóm sftpusers
ChrootDirectory %h
AuthorizedKeysFile %h/.ssh/authorized_keys
ForceCommand internal-sftp -f local3 -l THÔNG TIN
# ForceCommand internal-sftp -l ĐỘNG TỪ
AllowTcpForwarding không
X11Số chuyển tiếp
và /etc/rsyslog.d/sftp.conf của tôi
local3.* -/var/log/sftp.log
Câu hỏi tương tự:
Câu hỏi này là về ghi nhật ký SFTP vào các tệp riêng biệt, nhưng nó đề cập đến cái này waybackmachine cho một bài viết cũ bao gồm các mục nhập nhật ký SFTP có định dạng đẹp để trông giống như xferlog tiêu chuẩn.Bài viết đề cập đến tập lệnh Perl (chén thánh) sẽ định dạng nó cho bạn, nhưng than ôi, liên kết đã chết. Tôi có thể viết một tập lệnh Python hoặc Perl để tìm thông báo cụ thể cho các lần chuyển, lấy id tiến trình và tìm kiếm ngược để tìm người dùng, sau đó in một thông báo xfer được định dạng lại với tên người dùng ra một tệp. Nhưng chắc chắn ai đó đã giải quyết vấn đề này trước đây và có giải pháp tốt hơn.
Cảm ơn bạn đã giúp đỡ.