
По сути, я хочу регистрировать каждый файл, который отправляется или принимается через SCP на сервере.
Допустим, пользователь делает SCP с Сервера-1 на Сервер-2. Я нашел способ получить логи на стороне отправителя,но как получить то, что было передано на стороне получателя?
Мне нужны логи на стороне получателя, содержащие имена файлов, которые передаются ему через SCP.
Также для получения журналов на стороне отправителя я использую свой скрипт bash, который сначала сохраняет имя файла в файл журнала, а затем использует SCP для его передачи. Есть ли какой-то лучший подход для этого.
Заранее спасибо за любые предложения.
решение1
Я только что нашел интересное решение, которое может быть интересно другим:
При использовании scp
он фактически также вызывает двоичный файл на сервере с флагом -f
. Это означает, что можно написать простую обертку для серверной части scp
, например:
Сначала измените scp
имя вашего исходного файла:
mv /usr/bin/scp /usr/bin/scp-org
Затем создайте простой скрипт с его названием:
sudo nano /usr/bin/scp
с содержанием:
#/bin/bash
scp-org $@ | tee >(grep -aEo "[CD][0-7]{4} [0-9]* .*$" --line-buffered >> /var/log/scp.log)
Конечно, это можно было бы усовершенствовать, но это работает как пример. Теперь вы можете использовать tail -f /var/log/scp.log
и видеть все файлы, которые передаются в реальном времени
решение2
Вы можете попробовать заменить scp
команду на сервере модифицированной версией, которая делает то, что вам нужно. scp
— это очень простая программа, и добавление в нее кода для ведения журнала не должно оказаться сложной задачей.
решение3
Вероятно, вы используете пакет программного обеспечения OpenSSH. scp
Утилита OpenSSH ничего не регистрирует. Она поддерживает вывод отладки для базовой сессии SSH, но не регистрирует фактические передачи файлов, которые происходят.
Аналогично сервер OpenSSH можно настроить на регистрацию подробностей своих действий, а также на регистрацию факта подключения и запуска пользователем scp
, но он не будет регистрировать фактическую передачу файлов, которая происходит.
Если вы не можете заставить этих пользователей использовать SFTP, вам доступны три подхода:
Изучите альтернативные (другими словами, коммерческие) серверы SSH/SFTP/SCP. Они должны, как правило, поддерживать передачу файлов журналов.
Замените
scp
утилиту на сервере на ту, которая регистрирует нужные вам данные. OpenSSH — это открытый исходный код. Кто-то, кто знает, как программировать на C для Unix, можетскачать исходный коди изменить его.Замените
scp
утилиту на "обертку", которая запускает оригинальную программу scp и отслеживает ее действия. Существуют инструменты отладки для Unix, которые могут отслеживать действия другого процесса.
Мне нужно было однажды зарегистрировать scp
передачи, и я использовал третий подход. Я написал скрипт Perl, который запустил исходную программу scp подслед. Strace выводит имена файлов, которые открываются и закрываются процессом scp. Скрипт Perl анализирует вывод strace и определяет, какие файлы передаются.
решение4
Я считаю, что решения, предлагающие создать оболочку вокруг scp
двоичного файла на сервере, не будут работать с новыми scp
клиентами.
Since OpenSSH 8.8 (8.7 in Red Hat/Fedora builds), scp has use the SFTP protocol for transfers by default.
Для таких новых клиентов этот механизм упаковки scp
на сервере будет работать только в том случае, если клиент вызывается scp
с -O
флагом (для принудительного применения старого протокола).
Для таких нужд, возможно, использование rsync
вместо scp
могло бы помочь? rsync
кажется, имеет возможность регистрации доступа к файлам: из rsyncd.conf
страницы руководства:
log format
This parameter allows you to specify the format used for logging file transfers when transfer logging is enabled.
[..]
%f the filename (long form on sender; no trailing lq/rq)