У меня есть сервер Proftpd v1.3.2, и мне нужно отправлять все журналы (системные журналы + журналы авторизации + xferlogs) на удаленный сервер системного журнала. Он отлично работает для журналов system + auth. Но даже если "TransferLog
"был удален из файла конфигурации, Proftpd продолжает открываться /var/log/xferlog
для регистрации переводов (я проверил lsof) и ничего не отправляет на сервер системного журнала (я проверял с помощью tcpdump).
Как я могу указать proftpd отправлять xferlogs на удаленный сервер системного журнала?
Хорошо, я нашел решение: с помощью fifo. В /etc/proftpd/proftpd.conf
:
#SystemLog /var/log/proftpd/proftpd.log
#ControlsLog /var/log/proftpd/controls.log
TransferLog /var/log/xferlog.fifo
Затем :
mknod /var/log/xferlog.fifo p
chmod 666 /var/log/xferlog.fifo
И сценарий Perl, подобный этому (вдохновлен несколькими сценариями, найденными в Интернете), слушающий с другой стороны fifo:
#!/usr/bin/perl -w
use strict;
use File::Basename qw(basename);
use Sys::Syslog qw(:DEFAULT setlogsock);
$|=1;
my $fifo_file = "/var/log/xferlog.fifo";
my $syslog_facility = 'daemon';
my $syslog_level = 'info';
my $program = "xfer_ftp";
unless (-p $fifo_file)
{
unlink $fifo_file;
system('mknod', $fifo_file, 'p') && die "can't mknod $fifo_file: $!";
system('chmod', '666', $fifo_file) && die "can't chown $fifo_file: $!";
}
my $fifo_fh;
open($fifo_fh, "+< $fifo_file") or die "The FIFO file \"$fifo_file\" is missing, and this program can't run without it.:$!";
setlogsock 'unix';
openlog($program, 'pid', $syslog_facility);
# just keep reading from the fifo and processing the events we read
while (<$fifo_fh>) {
chomp;
syslog($syslog_level, $_);
}
closelog();
# should never really come down here ...
close $fifo_fh;
exit(0);
Если у вас есть более чистое решение ... :-)
Вероятно, вы используете стандартный rsyslog. Я бы посоветовал использовать syslog-ng, с помощью которого вы можете детально контролировать свои журналы.
Вот пример, который я использую для удаленного ведения журнала. Также замечательно то, что можно использовать TCP для туннелирования ваших журналов, что немного сложнее, но демонстрирует гибкость.
Фильтры могут управлять тем, что извлекать из журнала, если вы этого не хотите, или фильтровать определенные типы для определенных файлов. В приведенном ниже примере все обычно регистрируется в датированном формате, но копия отправляется удаленно.
Надеюсь это поможет.
@version: 3.0
#First, set some global options.
options {
long_hostnames(off);
flush_lines(0);
use_dns(no);
use_fqdn(no);
owner("root");
group("adm");
perm(0640);
stats_freq(0);
bad_hostname("^gconfd$");
keep_hostname(yes);
check_hostname(yes);
};
source inputs {
file("/proc/kmsg" program_override("kernel: "));
unix-stream("/dev/log");
internal();
udp();
tcp(max_connections(100));
};
destination remote {
udp("remotesyslog.serversomewhere.com" port(514));
};
destination logpile {
file("/var/log/eit/$YEAR-$MONTH-$DAY/$FACILITY"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log {
source(inputs);
destination(logpile);
destination(remote);
};