Я думаю, что это должно работать таким образом, иногда очень полезно публиковать сообщения журнала из скрипта. Это, конечно, не было предназначено для пользователей, чтобы загрязнить системные журналы. Решением, на мой взгляд, является наличие хорошо настроенной системы ведения журналов, которая не позволит пользователям загрязнять журналы или подделывать системные сообщения, позволяя вам идентифицировать пользователей, которые имеют привычку это делать.
я использую rsyslogd
, поэтому я использую это для примеров.
В первую очередь необходимо настроить rsyslogd
для хранения определенных переменных из сокета, который он открывает:
модуль (load="imuxsock"
SysSock.Annotate="включено"
SysSock.ParseTrusted="включено"
)
При этом вы можете получить доступ к следующим переменным:
pid
: PID процесса регистрации.
жидкость
и Гид
: UID и GID, под которыми запускается процесс регистрации.
Имя приложения
: имя процесса регистрации
команда
: полная командная строка процесса регистрации
В случае регистратор
, pid
будет PID systemd-журнал
, и Имя приложения
всегда будет systemd-журнал
.
С ними вы можете сделать несколько вещей:
Просто зарегистрируйте эти
Вы можете использовать шаблон, который включает эти переменные, чтобы увидеть, есть ли расхождения между сообщением и полученными параметрами. В шаблоне вы можете получить доступ к этим переменным, например %$!пид%
. Так, например, вы используете такой шаблон:
$template SomeLogFormat,"%TIMESTAMP:::date-rfc3339% <%pri-text%> %syslogtag%%msg% (зарегистрировано pid=%$!pid%, работающим как %$!uid%)\n"
демон.* /var/log/daemon.log;SomeLogFormat
даст следующую запись:
2021-10-27T18:27:54.638759+02:00 <daemon.info> sshd[986]: Принят открытый ключ от порта 127.0.0.19.8 65537 sha2: RSA 2e:45:25:54:6o:34:3a: z3:55:07:04 (просто подделка) (зарегистрировано pid=540, работающим как 1000)
Из него вы можете увидеть, является ли сообщение законным, а если нет, вы получите UID пользователя, который находится в смешном настроении. Обратите внимание, что вместо того, чтобы указывать параметры один за другим, вы можете использовать %$!%
шаблон, который будет регистрировать вышеуказанные значения в формате JSON.
Перенаправить журналы пользователей
Вы можете поместить журналы, написанные пользователями, в отдельный файл (возможно, в отдельную файловую систему, чтобы пользователи не могли заполнять корневую файловую систему). Вы можете перенаправить все журналы, исходящие от пользователей, со следующей конфигурацией:
если $!uid > 999, то /opt/log/user.log;SomeLogFormat
& останавливаться
Использование шаблона (т. ;СомеЛогФормат
часть) не является обязательным. Таким образом, все, что исходит от чего-либо с UID 1000+, будет записано в /opt/журнал/user.log
. Вы даже можете разделить журналы пользователей по UID следующим образом:
$template userLogFile,"/opt/log/userlog_%$!uid%.log"
если $!uid > 999, то ?userLogFile;SomeLogFormat
& останавливаться
Таким образом, у каждого пользователя будет свой userlog_xxxx.log
файл.