Я использую производственный сервер (Debian 10, стандартный пакет OpenSSH), на котором работает Pure-FTPD для устаревших соединений и SFTP для всех наших текущих соединений. SFTP-сервер настроен с chroot-тюрьмой, которая регистрируется через связанное устройство в пользовательской chroot-тюрьме. Это принимается rsyslog и отправляется в /var/log/sftp.log, после чего я использую logstash для разбора этого файла и пересылки всего на сервер визуализации для наших суперпользователей. Суперпользователи входят в визуализацию, чтобы просматривать все журналы SFTP и FTP/FTPS в одном месте.
Журналы pure-ftpd отформатированы так, как нравится нашим суперпользователям:
pure-ftpd: (testuser@hostname) [ВНИМАНИЕ] /home/ftpusers/testuser//outbound/testfile.pdf загружен (1765060 байт, 5989,55 КБ/сек)
Это здорово, потому что в одной строке отображается конкретный пользователь и точный файл, который он загрузил или скачал. Однако для SFTP ситуация не так хороша:
internal-sftp[8848]: сеанс открыт для локального пользователя testuser с [{ip_address}]
внутренний-sftp [8848]: opendir "/ входящий"
внутренний-sftp[8848]: реальный путь "/входящий/."
internal-sftp[8848]: открыть флаги "/inbound/testfile.pdf" WRITE,CREATE,TRUNCATE режим 0666
internal-sftp[8848]: закрыть "/inbound/testfile.pdf" байт прочитано 0 записано 1734445
В этом случае за логами легко следить. тестовый пользователь
входит в систему, записывает файл, готово. НО у нас есть много пользователей, которые входят в систему одновременно, и журналы из нескольких экземпляров внутреннего sftp могут происходить одновременно. Если это произойдет, единственный способ отследить активность пользователя — это найти имя пользователя. тестовый пользователь
, найдите идентификатор процесса, который регистрируется (8848
в приведенном выше примере), затем найдите все сообщения с этим идентификатором процесса. Многие пользователи входят в систему через cronjob, так что это происходит каждые 2 минуты или около того... когда у нас есть 300 пользователей, которые входят в систему через регулярные промежутки времени, вы можете себе представить, что поиск по такому количеству идентификаторов процессов может быть мучительным.
Мой вопрос
Есть ли способ предварять каждое сообщение журнала от sftp-internal именем пользователя, создающего журнал? Это должно работать в chroot-тюрьме. Я не могу найти ничего о том, как изменить сообщение, которое генерирует rsyslog, чтобы включить имя пользователя.
Я хотел бы увидеть что-то подобное из моих журналов SFTP:
internal-sftp[8848]: (testuser) открыть "/inbound/testfile.pdf" флаги WRITE,CREATE,TRUNCATE режим 0666
internal-sftp[8848]: (testuser) закрыть "/inbound/testfile.pdf" байт прочитано 0 записано 1734445
Текущее состояние конфигурации
Моя цепочка процессов идет:
ssh -> sftp-internal -> rsyslog (на local3.*) -> файл /var/log/sftp.log -> logstash -> экспорт на сервер визуализации
Выдержка из моей группы chroot в /etc/ssh/sshd_config
Match Group sftpusers
ChrootDirectory %h
AuthorizedKeysFile %h/.ssh/authorized_keys
ForceCommand внутренний-sftp -f local3 -l INFO
# ForceCommand internal-sftp -l VERBOSE
AllowTcpForwarding нет
X11Номер переадресации
и мой /etc/rsyslog.d/sftp.conf
local3.* -/var/log/sftp.log
Похожие вопросы:
Этот вопрос речь идет о ведении журнала SFTP для отдельных файлов, но упоминается это waybackmachine для старой статьи, которая включала красивое форматирование записей журнала SFTP, чтобы они выглядели как стандартные xferlogs.В статье упоминается сценарий Perl (Святой Грааль), который отформатирует его для вас, но, увы, ссылка мертва. Я мог бы написать сценарий Python или Perl, который находит конкретное сообщение для передачи, получает идентификатор процесса и выполняет обратный поиск, чтобы найти пользователя, а затем печатает переформатированное сообщение xfer с именем пользователя в файл. Но наверняка кто-то решал эту проблему раньше и имеет лучшее решение.
Спасибо за любую помощь.