Điểm:1

Định dạng Nhật ký SFTP để có Tên người dùng trên mỗi Mục nhập

lá cờ cn

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 đỡ.

Điểm:0
lá cờ cn

Tôi đã có thể xây dựng giải pháp với Python và systemd. Đây là rất nhanh và bẩn nhưng hoạt động cho mục đích của tôi. Tôi lấy một tệp nhật ký nội bộ sftp và chuyển nó sang một tệp được định dạng lại. Tôi không sửa đổi bản gốc trong trường hợp trình định dạng này mắc bất kỳ lỗi nào.

Tập lệnh Python

Điều này đăng xuất ra rsyslog để theo dõi và phản hồi SEGINT từ systemd. Có, điều này nên sử dụng thứ gì đó tốt hơn danh sách, nhưng python không có bộ đệm vòng hoặc hệ thống xếp hàng chính thức được tích hợp sẵn (gửi cho tôi nhận xét nếu tôi thiếu thứ gì đó). Dù bằng cách nào ... đây không phải là C!

#!/usr/bin/python3

nhật ký nhập khẩu
nhập lại
nhập khẩu hệ thống
thời gian nhập khẩu


lớp SFTPLogFormatter:

    def __init__(self, infile: str, outfile: str):
        self.logger = logging.getLogger(__name__)
        self.logger.setLevel(logging.DEBUG)
        stdout_handler = logging.StreamHandler()
        stdout_handler.setLevel(logging.DEBUG)
        stdout_handler.setFormatter(logging.Formatter('%(levelname)8s | %(message)s'))
        self.logger.addHandler(stdout_handler)

        self.infile = open(infile, 'r')

        # nối vào tệp và chỉ giữ lại 1 dòng trong bộ đệm ghi (ghi gần hết
        # ngay lập tức)
        self.outfile = open(outfile, 'a', 1)

    bắt đầu chắc chắn (tự):
        cố gắng:
            self.logger.info('trình định dạng bắt đầu')
            tự chạy()
        ngoại trừ Bàn phím Ngắt:
            self.logger.warning('SIGINT đã nhận, đang thoát')
            tự dừng ()

    @staticmethod
    def tail_file(file_obj):
        trong khi Đúng:
            dòng = file_obj.readline()
            # ngủ nếu tệp chưa được cập nhật
            nếu không dòng:
                time.sleep(1)
                tiếp tục

            dòng năng suất

    chạy def (tự):
        self.infile.seek(0, 2) # chuyển đến cuối tệp cho hành vi loại `tail -f`
        lines_read = []
        cho dòng trong self.tail_file(self.infile): # đuôi một tệp như `tail -f`
            lines_read.insert(0, line) # xử lý danh sách như một ngăn xếp
            lines_read = lines_read[:2000] # cắt ngăn xếp vì python không có bộ đệm vòng

            modifyline_match = re.match(r'(.*)\[(\d+)\]: (mở|đóng|xóa tên) (.*)', dòng) 
            nếu không sửa đổiline_match:
                self.logger.info(dòng)
                self.outfile.write(dòng)
                tiếp tục

            sửa đổi_line_procid = sửa đổiline_match.group(2)

            self.logger.debug(f'đang tìm kiếm câu lệnh mở phiên cho mở|đóng chuỗi khớp tệp: \"{modifyline_match.group(0)}\"')
            open_session_regex = rf'.*\[{modify_line_procid}\]: phiên mở cho người dùng cục bộ (.*) từ.*'
            open_session_match = Không
            cho dòng trước trong lines_read[1:]:
                open_session_match = re.match(open_session_regex, prevline)
                nếu open_session_match:
                    self.logger.debug(f'found session open string: \"{open_session_match.group(0)}\"')
                    nghỉ
            khác:
                # chúng tôi không tìm thấy gì
                self.logger.debug('không thể tìm thấy chuỗi phiên mở cho: \"{modifyline_match.group(0)}\"')
                tiếp tục

            sửa đổi_line_start = sửa đổiline_match.group(1)
            sửa đổi_line_operator = sửa đổiline_match.group(3)
            sửa đổi_line_details = sửa đổiline_match.group(4)

            tên người dùng = open_session_match.group(1)

            log_str = f'{modify_line_start}[{modify_line_procid}]: (người dùng={tên người dùng}) {modify_line_operator} {modify_line_details}\n'
            self.logger.info(log_str)
            self.outfile.write(log_str)

    def dừng (tự):
        self.logger.info('dọn dẹp')
        cố gắng:
            self.infile.close()
        ngoại trừ Ngoại lệ như e:
            self.logger.error(f'failure while close infile: {e}')

        cố gắng:
            self.outfile.close()
        ngoại trừ Ngoại lệ như e:
            self.logger.error(f'failure while close outfile: {e}')

        self.logger.info('thoát')
        sys.exit(0)


nếu __name__ == '__main__':
    tệp tin = sys.argv[1]
    tệp ngoài = sys.argv[2]
    dịch vụ = SFTPLogFormatter(tệp vào, tệp ra)
    dịch vụ.start()

Tệp dịch vụ

Tệp dịch vụ sau đã được tạo và kích hoạt trong systemd.

[Đơn vị]
Mô tả=Định dạng thông báo nhật ký từ sftp để có tên người dùng trên bất kỳ tệp nào được đọc, ghi và xóa, làm cho nhật ký nhiều người dùng dễ đọc hơn nhiều.
Sau=mạng.mục tiêu

[Dịch vụ]
Người dùng = root
Loại = đơn giản
ExecStart=/usr/bin/python3 /home/admin/services/format_sftp_logs_with_username.py /var/log/sftp.log /var/log/sftp_with_usernames.log
KillSignal=SIGINT

[Cài đặt]
WantedBy=multi-user.target

Kết quả

Điều này dẫn đến các thông điệp bản ghi sau. Lưu ý các bổ sung (người dùng = XYZ).

Ngày 11 tháng 2 21:22:01 ip-10-20-0-96 internal-sftp[18241]: phiên mở cho người kiểm tra người dùng cục bộ từ [127.0.0.1]
Ngày 11 tháng 2 21:22:02 ip-10-20-0-96 internal-sftp[18241]: opendir "/"
Ngày 11 tháng 2 21:22:02 ip-10-20-0-96 internal-sftp[18241]: closedir "/"
Ngày 11 tháng 2 21:22:05 ip-10-20-0-96 internal-sftp[18241]: opendir "/inbound"
Ngày 11 tháng 2 21:22:05 ip-10-20-0-96 internal-sftp[18241]: closedir "/inbound"
Ngày 11 tháng 2 21:22:10 ip-10-20-0-96 internal-sftp[18241]: opendir "/inbound/"
Ngày 11 tháng 2 21:22:10 ip-10-20-0-96 internal-sftp[18241]: closedir "/inbound/"
Ngày 11 tháng 2 21:22:12 ip-10-20-0-96 internal-sftp[18241]: (user=testuser) mở cờ "/inbound/mailhog-deployment.yaml" chế độ ĐỌC 0666
Ngày 11 tháng 2 21:22:12 ip-10-20-0-96 internal-sftp[18241]: (user=testuser) close "/inbound/mailhog-deployment.yaml" byte đọc 815 viết 0
Ngày 11 tháng 2 21:22:13 ip-10-20-0-96 internal-sftp[18241]: opendir "/inbound/"
Ngày 11 tháng 2 21:22:13 ip-10-20-0-96 internal-sftp[18241]: closedir "/inbound/"
Ngày 11 tháng 2 21:22:14 ip-10-20-0-96 internal-sftp[18241]: opendir "/inbound/"
Ngày 11 tháng 2 21:22:14 ip-10-20-0-96 internal-sftp[18241]: closedir "/inbound/"
Ngày 11 tháng 2 21:22:14 ip-10-20-0-96 internal-sftp[18241]: (user=testuser) xóa tên "/inbound/mailhog-deployment.yaml"
Ngày 11 tháng 2 21:22:18 ip-10-20-0-96 internal-sftp[18241]: (người dùng=người dùng kiểm tra) mở cờ "/inbound/mailhog-deployment.yaml" ở chế độ WRITE,CREATE,TRUNCATE 0644
Ngày 11 tháng 2 21:22:18 ip-10-20-0-96 internal-sftp[18241]: (user=testuser) close "/inbound/mailhog-deployment.yaml" byte đọc 0 viết 815
Ngày 11 tháng 2 21:22:19 ip-10-20-0-96 internal-sftp[18241]: phiên đóng đối với người kiểm tra người dùng cục bộ từ [127.0.0.1]

Hạn chế

Bộ đệm có 2000 dòng nhìn phía sau để tìm id tiến trình. Tăng số lượng đó lên nếu bạn có hàng chục hoặc hàng trăm người dùng đăng nhập ngay lập tức. Mặt khác, điều này sẽ đáp ứng hầu hết các nhu cầu của máy chủ.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.