Согласно systemd
документации, journalctl
рекомендуется для просмотра журналов, а не /var/log/*
дерева файлов.
Покаman 1 journalctl
описывает, как его использовать, я все еще не знаю, какие аргументы ему нужны, чтобы дать мне список того, что я хочу. Например, я хочу увидеть список логинов пользователей. Я знаюsshd
обрабатывает входы по ssh, но как насчет локальных входов в систему и общей аутентификации пользователей?
Вот что я попробовал:
#shows all logs. huge
journalctl
#limit history and search for "login"
journalctl --since "yesterday" | grep login
#a week ago rather than just a day
journalctl --since `date +"%Y-%m-%d" --date "last week"` | grep login
... systemd-logind[678]: New session 81 of user jozxyqk.
Это, кажется, дает некоторые указания, но определенно не самый надежный метод. Как правильно?
решение1
Бегать:
journalctl -q _AUDIT_TYPE=1112 _TRANSPORT=audit
Объяснение:
Если у вас запущена подсистема аудита (а если вы ее не отключили, то она у вас есть), то это лучший способ получить такую информацию, поскольку, помимо прочего, если вы используете _TRANSPORT=audit
, сообщения не могут быть подделаны, как сообщения через традиционный сокет syslog. Чтобы увидетьвсесообщений, отправляемых через этот транспорт, используйте journalctl -q _TRANSPORT=audit
. (-q исключает раздражающие -- Reboot --
строки.)
Чтобы увидеть их в подробной форме, выполните journalctl -q _TRANSPORT=audit -o verbose
. На самом деле, я предлагаю остановиться и сделать это прямо сейчас, пока вы следуете за мной, потому что следующее, что мы хотим сделать, это отфильтровать по одному из полей, которые мы там видим. Вот запись из моей системы:
_BOOT_ID=[redacted]
_MACHINE_ID=[redacted]
_HOSTNAME=[redacted]
_UID=0
_TRANSPORT=audit
SYSLOG_FACILITY=4
SYSLOG_IDENTIFIER=audit
AUDIT_FIELD_HOSTNAME=?
AUDIT_FIELD_ADDR=?
AUDIT_FIELD_RES=success
_AUDIT_LOGINUID=18281
_AUDIT_TYPE=1112
AUDIT_FIELD_OP=login
AUDIT_FIELD_ID=18281
_PID=5398
_SELINUX_CONTEXT=system_u:system_r:local_login_t:s0-s0:c0.c1023
AUDIT_FIELD_EXE=/usr/bin/login
AUDIT_FIELD_TERMINAL=tty6
_AUDIT_SESSION=541
_SOURCE_REALTIME_TIMESTAMP=1480529473269000
_AUDIT_ID=7444
MESSAGE=USER_LOGIN pid=5398 uid=0 auid=18281 ses=541 subj=system_u:system_r:local_login_t:s0-s0:c0.c1023 msg='op=login id=18281 exe="/usr/bin/login" hostname=? addr=? terminal=tty6 res=success'
Внизу MESSAGE
находится неструктурированная запись журнала, которая по сути является тем, что вы видите в неподробном выводе в стиле syslog. Мымогgrep for MESSAGE=USER_LOGIN
(и сделать это прямо сейчас), но журнал позволяет нам делать более интересные вещи, так что давайте продолжим.
Каждый тип сообщения аудита имеет связанный _AUDIT_TYPE
(представьте себе!). По какой-то причине это не преобразуется в текст в структурированном выводе, но 1112
соответствует USER_LOGIN
. Я подтвердил это, проверив libaudit.h
, который имеет (с некоторыми строками контекста):
#define AUDIT_USER_CHAUTHTOK 1108 /* User acct password or pin changed */
#define AUDIT_USER_ERR 1109 /* User acct state error */
#define AUDIT_CRED_REFR 1110 /* User credential refreshed */
#define AUDIT_USYS_CONFIG 1111 /* User space system config change */
#define AUDIT_USER_LOGIN 1112 /* User has logged in */
#define AUDIT_USER_LOGOUT 1113 /* User has logged out */
#define AUDIT_ADD_USER 1114 /* User account added */
#define AUDIT_DEL_USER 1115 /* User account deleted */
Итак, journalctl -q _AUDIT_TYPE=1112 _TRANSPORT=audit
это то, что вам нужно. Он получает входы ssh, терминала и GUI, а также записывает успехи и неудачи. Обратите внимание, что онне делаетотслеживайте такие вещи, как sudo
или su
— для них существуют различные записи аудита.
Даже «короткая» версия вывода довольно многословна, поэтому вы можете использовать -o json
и создать короткий скрипт для анализа вывода в удобном формате.
решение2
journalctl -q SYSLOG_FACILITY=10 SYSLOG_FACILITY=4
Это сообщает журналу о необходимости отфильтровывать сообщения, поступающие из двух разных источников. Номер 10 для authpriv
и номер 4 для auth
. ssh, а также многие другие приложения, чувствительные к входу в систему, используют эти два источника для ведения журнала.
решение3
Вам нужны входы или попытки входа?
Это показывает логины, ноне попытки(например, сегодня) и работает в Fedora 22:
$ journalctl -u 'systemd-logind' --since "today" --until "tomorrow"
Вот пример вывода:
-- Logs begin at Mon 2014-09-01 03:10:03 BST, end at Fri 2015-11-20 09:55:02 GMT. -- Nov 20 08:47:15 meow systemd[1]: Starting Login Service... Nov 20 08:47:15 meow systemd-logind[699]: New seat seat0. Nov 20 08:47:15 meow systemd-logind[699]: Watching system buttons on /dev/input/event2 (Power Button) Nov 20 08:47:15 meow systemd-logind[699]: Watching system buttons on /dev/input/event0 (Power Button) Nov 20 08:47:15 meow systemd-logind[699]: Watching system buttons on /dev/input/event1 (Lid Switch) Nov 20 08:47:15 meow systemd[1]: Started Login Service. Nov 20 08:47:37 meow systemd-logind[699]: New session c1 of user gdm. Nov 20 08:47:46 meow systemd-logind[699]: New session c2 of user gdm. Nov 20 08:47:46 meow systemd-logind[699]: Removed session c1. Nov 20 08:47:46 meow systemd-logind[699]: Removed session c2. Nov 20 08:47:46 meow systemd-logind[699]: New session c3 of user gdm. Nov 20 08:51:22 meow systemd-logind[699]: New session 1 of user david1.
Он загроможден другой информацией, такой как крышка и кнопки питания, поэтому вы можете выполнить команду grep, чтобы session
быть более точным:
$ journalctl -u 'systemd-logind' --since "today" --until "tomorrow" | grep session Nov 20 08:47:37 meow systemd-logind[699]: New session c1 of user gdm. Nov 20 08:47:46 meow systemd-logind[699]: New session c2 of user gdm. Nov 20 08:47:46 meow systemd-logind[699]: Removed session c1. Nov 20 08:47:46 meow systemd-logind[699]: Removed session c2. Nov 20 08:47:46 meow systemd-logind[699]: New session c3 of user gdm. Nov 20 08:51:22 meow systemd-logind[699]: New session 1 of user david1.