Причины отсутствия информации об IP в `last` выводе при pts логинах?
У меня есть пять Linux-систем CentOS 6 в работе, и я столкнулся с довольно странной проблемой, которая, кажется, возникает только с моим идентификатором пользователя во всех системах Linux, которые у меня есть... Это пример проблемы из записей, которые я исключил из last
команда...
mpenning pts/19 Fri Nov 16 10:32 - 10:35 (00:03)
mpenning pts/17 Fri Nov 16 10:21 - 10:42 (00:21)
bill pts/15 sol-bill.local Fri Nov 16 10:19 - 10:36 (00:16)
mpenning pts/1 192.0.2.91 Fri Nov 16 10:17 - 10:49 (12+00:31)
kkim14 pts/14 192.0.2.225 Thu Nov 15 18:02 - 15:17 (4+21:15)
gduarte pts/10 192.0.2.135 Thu Nov 15 12:33 - 08:10 (11+19:36)
gduarte pts/9 192.0.2.135 Thu Nov 15 12:31 - 08:10 (11+19:38)
kkim14 pts/0 :0.0 Thu Nov 15 12:27 - 15:17 (5+02:49)
gduarte pts/6 192.0.2.135 Thu Nov 15 11:44 - 08:10 (11+20:25)
kkim14 pts/13 192.0.2.225 Thu Nov 15 09:56 - 15:17 (5+05:20)
kkim14 pts/12 192.0.2.225 Thu Nov 15 08:28 - 15:17 (5+06:49)
kkim14 pts/11 192.0.2.225 Thu Nov 15 08:26 - 15:17 (5+06:50)
dspencer pts/8 192.0.2.130 Wed Nov 14 18:24 still logged in
mpenning pts/18 alpha-console-1. Mon Nov 12 14:41 - 14:46 (00:04)
Вы можете видеть две из моих записей входа в систему pts выше, с которыми не связан IP-адрес источника. У моих компьютеров CentOS шесть других пользователей, которые совместно используют системы. Примерно 10% моих логинов видят эту проблему, но никакие другие имена пользователей не проявляют такого поведения. Там нет записи в /var/log/secure
для записей без исходного IP-адреса.
Вопросы
Учитывая вид сценариев, которые я держу в этих системах (которые контролируют большую часть нашей сетевой инфраструктуры), я немного испуган этим и хотел бы понять, что может привести к тому, что мои логины будут иногда пропускать адреса источника.
- Почему
last -i
шоу0.0.0.0
для записей в строке pts (см. также этот ответ) - Есть ли что-нибудь (кроме злонамеренной деятельности), которое разумно объясняет поведение?
- Кроме метки времени в истории bash, есть ли другие способы, которые я могу сделать, чтобы отследить проблему?
информационный
Так как это начало происходить, я включил bash
отметка времени истории (т.е. HISTTIMEFORMAT="%y-%m-%d %T "
в .bash_profile
) а также добавил несколько других хаков истории bash; однако, это не дает подсказки к тому, что произошло во время предыдущих случаев.
Все системы работают под управлением CentOS 6.3...
[mpenning@typo ~]$ uname -a
Linux typo.local 2.6.32-279.9.1.el6.x86_64 #1 SMP Tue Sep 25 21:43:11 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
[mpenning@typo ~]$
РЕДАКТИРОВАТЬ
Если я использую last -i mpenning
Я вижу записи, как это...
mpenning pts/19 0.0.0.0 Fri Nov 16 10:32 - 10:35 (00:03)
mpenning pts/17 0.0.0.0 Fri Nov 16 10:21 - 10:42 (00:21)
Примечание для тех, кто пытается ответить: я не вошел с screen
команда или графический интерфейс. Все мои логины из SSH; Чтобы получить награду, вы должны привести официальные ссылки, чтобы объяснитьlast -i
0.0.0.0
Записи получены только через SSH.
РЕДАКТИРОВАТЬ 2 (для вопросов Ewwhite)
/etc/resolv.conf
(обратите внимание, что я использовал .local
адреса в last
вывод выше, чтобы скрыть информацию моей компании)
[mpenning@sasmars network]$ cat /etc/resolv.conf
nameserver 192.0.2.40
nameserver 192.0.2.60
domain mycompany.com
search mycompany.com
[mpenning@sasmars network]$
/etc/hosts
info (обратите внимание, что этот настроенный файл hosts существует только на одном из компьютеров, на котором возникли эти проблемы)
[mpenning@sasmars network]$ cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.0.2.44 sasmars.mycompany.com sasmars
::1 localhost6.localdomain6 localhost6
## Temporary kludge until I add reverse hostname mappings...
## Firewalls
192.0.2.254 a2-inet-fw1
192.0.2.253 a2-inet-fw2
192.0.2.254 a2-wan-fw1
192.0.2.253 a2-wan-fw2
192.0.2.201 a2-fab-fw1
192.0.2.202 a2-fab-fw2
192.0.2.203 t1-eds-fw1
192.0.2.42 sasvpn
192.0.2.246 sasasa1
192.0.2.10 sasoutfw1
## Wireless
192.0.2.6 saswcs1
192.0.2.2 l2wlc3
192.0.2.4 l2wlc4
192.0.2.12 f2wlc5
192.0.2.16 f2wlc6
192.0.2.14 f2wlc1
192.0.2.8 f2wlc2
[mpenning@sasmars network]$
sftp
Выход из/var/log/secure
*
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: called (pam_tacplus v1.3.7)
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: user [mpenning] obtained
Dec 26 10:36:37 sasmars sshd[26016]: tacacs_get_password: called
Dec 26 10:36:37 sasmars sshd[26016]: tacacs_get_password: obtained password
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: password obtained
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: tty [ssh] obtained
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: rhost [192.0.2.91] obtained
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: trying srv 0
Dec 26 10:36:38 sasmars sshd[26016]: Accepted password for mpenning from 192.0.2.91 port 55118 ssh2
Dec 26 10:36:38 sasmars sshd[26016]: pam_sm_setcred: called (pam_tacplus v1.3.7)
Dec 26 10:36:38 sasmars sshd[26016]: pam_unix(sshd:session): session opened for user mpenning by (uid=0)
Dec 26 10:36:38 sasmars sshd[26018]: pam_sm_setcred: called (pam_tacplus v1.3.7)
Dec 26 10:36:38 sasmars sshd[26018]: subsystem request for sftp
Dec 26 10:37:20 sasmars sshd[26016]: pam_unix(sshd:session): session closed for user mpenning
Dec 26 10:37:20 sasmars sshd[26016]: pam_sm_setcred: called (pam_tacplus v1.3.7)
ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ
Смотрите мой ответ ниже
14 ответов
script
различия в поведении между RedHat и Debian
Связанные библиотеки
CentOS 6.3 - скрипт (util-linux-ng 2.17.2)
#ldd /usr/bin/script
linux-vdso.so.1 => (0x00007fff077ff000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f309f5d1000)
libutempter.so.0 => /usr/lib64/libutempter.so.0 (0x00007f309f3cf000)
libc.so.6 => /lib64/libc.so.6 (0x00007f309f03b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f309f7e1000)
Ubuntu 12.04 - скрипт (util-linux 2.20.1)
#ldd /usr/bin/script
linux-vdso.so.1 => (0x00007fff375ff000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fc0d7ab0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc0d76f1000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc0d7cdc000)
PTY
Основываясь на исходном коде, script
из обеих версий открываются новые pty. Следующее - тест.
Ubuntu 12.04
john@U64D211:~/tmp$ ls /dev/pts
0 1 5 8 ptmx
john@U64D211:~/tmp$ script
Script started, file is typescript
john@U64D211:~/tmp$ ls /dev/pts
0 1 2 5 8 ptmx
john@U64D211:~/tmp$ last -i
john pts/0 0.0.0.0 Sat Jan 5 09:09 still logged in
reboot system boot 0.0.0.0 Sat Jan 5 09:08 - 09:52 (00:44)
john pts/0 0.0.0.0 Thu Jan 3 00:50 - 01:42 (00:52)
reboot system boot 0.0.0.0 Thu Jan 3 00:48 - 01:43 (00:54)
wtmp begins Tue Jan 1 20:48:28 2013
john@U64D211:~/tmp$ exit
exit
Script done, file is typescript
john@U64D211:~/tmp$ ls /dev/pts
0 1 5 8 ptmx
john@U64D211:~/tmp$
Ubuntu 12.04 script
действительно открыл новый оч (2). Это просто не обновлялось /var/log/wtmp
,
CentOS 6
Я пропускаю тест, поскольку мы уже знаем, что script
сделать pty и зарегистрироваться с помощью wtmp.
libutemper
- Проект: http://freecode.com/projects/libutempter
- Описание: libutempter предоставляет интерфейс библиотеки для эмуляторов терминала, таких как screen и xterm, для записи пользовательских сессий в файлы utmp и wtmp.
Так что основное отличие, похоже, в дополнительной библиотеке (libutempter.so.0
) CentOS script
связан с.
Тест с Ubuntu 12.04
составление script
с libutempter
john@U64D211:~/tmp/util-linux-2.20.1$ sudo apt-get install libutempter-dev
john@U64D211:~/tmp/util-linux-2.20.1$ ./configure --with-utempter
john@U64D211:~/tmp/util-linux-2.20.1$ make
john@U64D211:~/tmp/util-linux-2.20.1$ cd term-utils/
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ ldd ./script
linux-vdso.so.1 => (0x00007fff54dff000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f289e635000)
libutempter.so.0 => /usr/lib/libutempter.so.0 (0x00007f289e432000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f289e072000)
/lib64/ld-linux-x86-64.so.2 (0x00007f289e861000)
тестирование
Перед запуском script
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ ls /dev/pts
0 1 5 8 ptmx
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ last -i
john pts/0 0.0.0.0 Sat Jan 5 09:09 still logged in
reboot system boot 0.0.0.0 Sat Jan 5 09:08 - 10:37 (01:28)
john pts/0 0.0.0.0 Thu Jan 3 00:50 - 01:42 (00:52)
reboot system boot 0.0.0.0 Thu Jan 3 00:48 - 01:43 (00:54)
wtmp begins Tue Jan 1 20:48:28 2013
В script
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ ./script
Script started, file is typescript
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ ls /dev/pts
0 1 2 5 8 ptmx
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ last -i
john pts/2 0.0.0.0 Sat Jan 5 10:37 still logged in
john pts/0 0.0.0.0 Sat Jan 5 09:09 still logged in
reboot system boot 0.0.0.0 Sat Jan 5 09:08 - 10:37 (01:29)
john pts/0 0.0.0.0 Thu Jan 3 00:50 - 01:42 (00:52)
reboot system boot 0.0.0.0 Thu Jan 3 00:48 - 01:43 (00:54)
wtmp begins Tue Jan 1 20:48:28 2013
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ exit
exit
Script done, file is typescript
После script
конец
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ ls /dev/pts
0 1 5 8 ptmx
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ last -i
john pts/2 0.0.0.0 Sat Jan 5 10:37 - 10:37 (00:00)
john pts/0 0.0.0.0 Sat Jan 5 09:09 still logged in
reboot system boot 0.0.0.0 Sat Jan 5 09:08 - 10:37 (01:29)
john pts/0 0.0.0.0 Thu Jan 3 00:50 - 01:42 (00:52)
reboot system boot 0.0.0.0 Thu Jan 3 00:48 - 01:43 (00:54)
wtmp begins Tue Jan 1 20:48:28 2013
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ last
john pts/2 Sat Jan 5 10:37 - 10:37 (00:00)
john pts/0 :0 Sat Jan 5 09:09 still logged in
reboot system boot 3.2.0-35-generic Sat Jan 5 09:08 - 10:38 (01:30)
john pts/0 :0 Thu Jan 3 00:50 - 01:42 (00:52)
reboot system boot 3.2.0-35-generic Thu Jan 3 00:48 - 01:43 (00:54)
wtmp begins Tue Jan 1 20:48:28 2013
Основная причина имени хоста emtpy
И да, script.c
действительно создать wtmp
запись с пустым именем хоста. Посмотрите на следующий блок кода в util-linux-2.20.1/term-utils/script.c
Линия:245-247
#ifdef HAVE_LIBUTEMPTER
utempter_add_record(master, NULL);
#endif
Основывается на libutempter-1.1.5/utempter.h
extern int utempter_add_record (int master_fd, const char *hostname);
Так script.c
фактически передает пустое имя хоста в utempter_add_record
,
RedHat Backport
Интересно, что вверх по течению util-linux-ng-2.17.2
на самом деле не поддерживает libutempter
, Кажется, Redhat решил добавить эту поддержку обратно.
john@U64D211:~/tmp/util-linux-ng-2.17.2$ ./configure --help|grep utemp
Приведенная выше команда возвращает пустой результат.
Заключение
Таким образом, разница в поведении между двумя дистрибутивами - это не ошибка, а выбор. RedHat решил поддержать эту функцию, в то время как Debian ее пропустил.
Это выглядит абсолютно загадочным для меня. Либо он должен использовать DNS-имя или IP-адрес. Я проверил last.c
файл также, но я до сих пор не могу найти, почему он ничего не показывает. Вероятно, по прошествии некоторого времени я смогу разобраться в части о 0.0.0.0.
int dns_lookup(char *result, int size, int useip, int32_t *a)
307 {
308 struct sockaddr_in sin;
309 struct sockaddr_in6 sin6;
310 struct sockaddr *sa;
311 int salen, flags;
312 int mapped = 0;
313
314 flags = useip ? NI_NUMERICHOST : 0;
315
316 /*
317 * IPv4 or IPv6 ?
318 * 1. If last 3 4bytes are 0, must be IPv4
319 * 2. If IPv6 in IPv4, handle as IPv4
320 * 3. Anything else is IPv6
321 *
322 * Ugly.
323 */
324 if (a[0] == 0 && a[1] == 0 && a[2] == htonl (0xffff))
325 mapped = 1;
326
327 if (mapped || (a[1] == 0 && a[2] == 0 && a[3] == 0)) {
328 /* IPv4 */
329 sin.sin_family = AF_INET;
330 sin.sin_port = 0;
331 sin.sin_addr.s_addr = mapped ? a[3] : a[0];
332 sa = (struct sockaddr *)&sin;
333 salen = sizeof(sin);
334 } else {
335 /* IPv6 */
336 memset(&sin6, 0, sizeof(sin6));
337 sin6.sin6_family = AF_INET6;
338 sin6.sin6_port = 0;
339 memcpy(sin6.sin6_addr.s6_addr, a, 16);
340 sa = (struct sockaddr *)&sin6;
341 salen = sizeof(sin6);
342 }
343
344 return getnameinfo(sa, salen, result, size, NULL, 0, flags);
345 }
Вот две глобальные переменные, используемые в контексте:
int usedns = 0; /* Use DNS to lookup the hostname. */
72 int useip = 0; /* Print IP address in number format */
Таким образом, теоретически, он должен использовать DNS или IP.
Я посмотрю, смогу ли я копать что-нибудь дальше. Но то, что спросили, это правильные вопросы.
(1) База на ОП last
выход
После входа в систему через ssh можно войти в ssh на локальный хост и получить 0.0.0.0 в last -i
на потом.
База на первых четырех строках журнала ОП
mpenning pts/19 Fri Nov 16 10:32 - 10:35 (00:03)
mpenning pts/17 Fri Nov 16 10:21 - 10:42 (00:21)
bill pts/15 sol-bill.local Fri Nov 16 10:19 - 10:36 (00:16)
mpenning pts/1 192.0.2.91 Fri Nov 16 10:17 - 10:49 (12+00:31)
pts/19
вход был в пределах pts/17
период входа.
pts/17
вход был в пределах pts/1
период входа.
Для этого конкретного случая логично предположить, что OP ssh из 192.0.2.91 (pty/1
), затем в этом сеансе SSH, войдите в систему локально (ssh localhost
снова на сервер (pts/17
), и опять(pts/19
).
Пожалуйста, проверьте, не происходит ли это совпадение с другим случаем.
Следующее может помочь определить причину
- Вы используете SSH-ключ? Если да, то на сервере вы настроили ssh-key для локального входа?
- Проверьте или отправьте /var/log/secure того же периода времени. Это может дать намек.
- Проверьте скрипты, которые вы используете
- Проверьте псевдонимы оболочки, которые вы используете
- Проверьте историю команд
(2) Дополнительный Secnario
Сценарий 1 - судо и терминал
- UserA логин X Window
- Откройте терминал windows, сделайте
xhost + localhost
su - UserB
или жеsudo su - UserB
затем откройте новый терминал (xterm, gnome-терминал и т. д.)UserB
будет отображаться как 0.0.0.0 вlast -i
su - UserB
не будет регистрироваться как UserB
войдите в систему последним, но открытие терминала будет.
Сценарий 2 - вход
- SSH на сервер
- тип
sudo login
- войдите под своим именем
- проверять
last
а такжеlast -i
last
не показывать имя хоста или IP для login session
, last -i
будет IP 0.0.0.0 для login session
,
john@U64D211:~$ last -5
john pts/0 Sun Dec 23 20:50 still logged in
john pts/0 Sun Dec 23 20:50 - 20:50 (00:00)
john pts/0 :0 Sun Dec 23 20:50 - 20:50 (00:00)
reboot system boot 3.2.0-35-generic Sun Dec 23 20:49 - 20:50 (00:01)
john pts/2 js.example.com Sun Dec 23 17:14 - crash (03:34)
wtmp begins Sat Dec 1 06:30:46 2012
john@U64D211:~$ last -5i
john pts/0 0.0.0.0 Sun Dec 23 20:50 still logged in
john pts/0 0.0.0.0 Sun Dec 23 20:50 - 20:50 (00:00)
john pts/0 0.0.0.0 Sun Dec 23 20:50 - 20:50 (00:00)
reboot system boot 0.0.0.0 Sun Dec 23 20:49 - 20:50 (00:01)
john pts/2 192.168.1.90 Sun Dec 23 17:14 - crash (03:34)
wtmp begins Sat Dec 1 06:30:46 2012
Ответ Mife уже показывает блок кода last.c
, Причина last
отображать пустое имя хоста /IP потому что ut_host
для этих записей на самом деле пусто. Для полной структуры wtmp, сделайте man wtmp
в любой системе Linux.
2 сценария показывают, что даже стандартные пакеты в определенных ситуациях создают их как таковые.
(3) Взломать историю Bash
Это будет работать только при использовании сеанса bash
как интерактивная оболочка.
.bashrc
а также .bash_profile
используются только bash
,
Они не будут получены автоматически, если сессия использует какую-либо другую оболочку (sh, csh и т. Д.) Или выполнит программу напрямую, и истории bash также не будет.
(4) Процесс учета
С ОП ничего не говорится о secure
файл, я буду считать, что это тупик, и он на самом деле предоставить сейчас подсказку.
Если следующее предположение верно
`last` 0.0.0.0 entries are actually created with in OP own session
auth.log(debian)/secure(CentOS) не поможет. Поскольку в нем записано только действие, связанное с аутентификацией.
wtmp / utmp, с ограничением в их структуре данных, также является тупиком. Нет информации о том, что их создало.
Это оставляет нас с одним вариантом, процесс учета. Это большой пистолет, и его следует использовать с осторожностью.
- Может быть, против политики компании
- Другие пользователи в общей системе могут быть недовольны / неудобны, если она включена
- Файл журнала может занимать много места на диске. Следите за скоростью роста размера файла.
Версия пакета psacct должна быть 6.3.2-56 или выше, согласно этому посту.
Если это будет использоваться, и /var/log
имеет ограниченное пространство, измените файл журнала acct на каталог (доступ только root) в /home
, который обычно имеет гораздо больше места.
Это действительно большой пистолет. При ОП 10% частота должна быть в течение недели. Если в течение этого периода пустая запись появится в last
но ничего из журнала действий, это стало загадочной ситуацией и потребовало бы каких-то решительных действий.
Ниже приведен пример вывода lastcomm
lesspipe john pts/8 0.02 secs Mon Dec 24 17:10
lesspipe F john pts/8 0.00 secs Mon Dec 24 17:10
dirname john pts/8 0.00 secs Mon Dec 24 17:10
basename john pts/8 0.00 secs Mon Dec 24 17:10
kworker/1:2 F root __ 0.00 secs Mon Dec 24 16:54
tty john pts/6 0.01 secs Mon Dec 24 17:09
tty john pts/4 0.01 secs Mon Dec 24 17:09
cron F root __ 0.05 secs Mon Dec 24 17:09
sh S root __ 0.01 secs Mon Dec 24 17:09
find root __ 0.01 secs Mon Dec 24 17:09
maxlifetime root __ 0.00 secs Mon Dec 24 17:09
php5 root __ 0.23 secs Mon Dec 24 17:09
which root __ 0.00 secs Mon Dec 24 17:09
lastcomm root pts/0 0.01 secs Mon Dec 24 17:08
tty john pts/1 0.01 secs Mon Dec 24 17:08
dconf worker X john __ 5.46 secs Mon Dec 24 16:58
lastcomm root pts/7 0.04 secs Mon Dec 24 17:05
mesg S root pts/7 0.00 secs Mon Dec 24 17:05
bash F root pts/7 0.00 secs Mon Dec 24 17:05
dircolors root pts/7 0.00 secs Mon Dec 24 17:05
Вы также можете использовать "dump-acct", чтобы показать больше информации.
PS1: я пытался открыть несколько терминалов и ссх сессии. Непонятно (или не просто указать точку), что открывают новые очки. Тем не менее, он показывает все, что выполнялось в этом сеансе.
PS2: сообщение в блоге об использовании acct Майком.
Так что я побежал последним в отладчике, который, надеюсь, даст вам хотя бы несколько ответов на ваш вопрос. Мое чувство коренная причина, хотя глубже.
Почему последний -i показывает 0.0.0.0 для записей строки pts
Лучший способ объяснить это то, что происходит, когда вы не передаете -i.
Причина этого в этом разделе кода last.c
if (usedns || useip)
r = dns_lookup(domain, sizeof(domain), useip, p->ut_addr_v6);
if (r < 0) {
len = UT_HOSTSIZE;
if (len >= sizeof(domain)) len = sizeof(domain) - 1;
domain[0] = 0;
strncat(domain, p->ut_host, len);
}
И то и другое usedns
а также useip
(с использованием параметров по умолчанию) не помечены. Это заставляет логику копировать из структуры p->ut_host
который согласно man utmp
содержит имя для удаленного входа в систему, записанное тем, кто записал utmp
,
char ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or
kernel version for run-level
messages */
В вашем случае значение здесь равно нулю. Вот почему, когда вы бежите last
ничего не появляется для вас.
В случае last -i
тогда вызывается dns_lookup. Это передаст запись (p->ut_addr_v6) для разрешения через DNS. В вашем случае это значение также содержит нули.
Большинство dns_lookup
это оформление витрин и шутка. В основном важна функция getnameinfo
, Это библиотечный вызов, который в этом случае будет стараться разрешить двоичное значение, хранящееся в ut_addr_v6
, Когда эта запись содержит нули (например, в вашем случае), вы фактически решаете это как 0.0.0.0
как это происходит с вашим last -i
выход.
Есть ли что-нибудь (кроме злонамеренной деятельности), которое разумно объясняет поведение?
Ну, это, наверное, ошибка или недосмотр. Маловероятно, что это будет злонамеренно, поскольку кажется глупым оставлять какой-либо след в качестве злоумышленника, а не опускать адрес источника
До сих пор в центре внимания находились не в том месте. last
просто читает utmp
или же wtmp
, тем не мение last
делает все возможное с данными, которые у него есть.
Ваша коренная причина лежит где-то в манере, к которой utmp
пишется!
Хотя несколько приложений напрямую пишут в utmp
Я думаю, источник ваших проблем лежит на пути sshd
обрабатывает управление сеансом.
Кроме метки времени в истории bash, есть ли другие способы, которые я могу сделать, чтобы отследить проблему?
utmp
обычно не доступен для записи и не предназначен для этого. utmp
написано приложениями, предназначенными для входа в систему и настройки сеанса. В вашем случае это sshd
,
Почему sshd не обрабатывает вашего пользователя должным образом, очень странно, так как он должен правильно копировать имя хоста, с которого вы пришли. Вот где усилия по отладке, вероятно, должны быть сосредоточены. Начните с добавления отладочных выходных данных sshd в ваши журналы и посмотрите, не возникнет ли что-то аномальное.
Если вы хотите обойти проблему (или, возможно, даже узнать больше о проблеме), вы можете использовать pam_lastlog
управлять utmp
добавив его в запись сеанса в /etc/pam.d/sshd.
На самом деле это не помешает проверить, если он уже там - потому что pam_lastlog
содержит nohost
вариант, который определенно объяснит ваше поведение, которое вы испытываете.
Наконец, вы не могли использовать последний вообще. aulast
выполняет ту же работу через подсистему аудита.
Возможно, стоит попробовать проверить, удалось ли хотя бы написать правильный адрес. Если это не так, то ваша проблема должна быть с sshd, так как sshd передает DNS-имена различным подсистемам, таким как utmp или аудит.
Когда вы входите в систему, это может быть несколько записей в последней команде.
geekride tty2 Fri Dec 21 15:45 - 15:45 (00:00)
geekride pts/1 Fri Dec 21 13:45 still logged in
geekride pts/1 :pts/0:S.0 Thu Dec 6 12:49 - 00:40 (11:50)
geekride pts/1 10.31.33.47 Thu Dec 6 12:49 - 00:40 (11:50)
Первая запись с tty* появляется, когда вы входите через терминал или консоль, нажимая CTRL+ALT+F1-6. Это довольно ясно из терминала, который он использует.
Вторая запись обычно появляется, когда вы входите в систему и открываете окно терминала в графическом интерфейсе. Также будет запись, даже если вы откроете новую вкладку в том же окне терминала.
Третий тип ввода происходит, когда вы открываете сеанс экрана после входа в систему через SSH. Это также создаст запись там и без какого-либо IP-адреса.
Четвертая запись вполне нормальна, и все это понимают.
Если вы делаете last -i
со следующими записями вы увидите что-то вроде этого:
geekride tty2 0.0.0.0 Fri Dec 21 15:45 - 15:45 (00:00)
geekride pts/9 0.0.0.0 Fri Dec 21 13:45 still logged in
geekride pts/1 0.0.0.0 Thu Dec 6 12:49 - 00:40 (11:50)
Я почти уверен, что ваш случай подходит к любому из двух случаев: один с окном терминала в GUI, а другой с сеансом экрана.
Надеюсь, что это помогло.
Я проверил 12 многопользовательских серверов приложений CentOS и RHEL 6.3. Никто не демонстрировал это поведение. Там не было пропущенных записей в last
Выход вернется на 4-5 недель.
Я думаю, что было бы важно увидеть ваши /etc/hosts
запись файла, чтобы убедиться, что он соответствует этому формату.
Кроме того, что вы делаете для разрешения DNS? Вы можете опубликовать свой /etc/resolv.conf
?
Другие ответы, указывающие, что 0.0.0.0
Представляет, что локальные соединения верны. Типичными примерами являются события перезагрузки и входа в консоль:
reboot system boot 0.0.0.0 Sat Dec 8 06:12 - 05:57 (12+23:45)
reboot system boot 0.0.0.0 Sat Dec 8 05:25 - 06:09 (00:44)
reboot system boot 0.0.0.0 Fri Nov 30 14:28 - 05:22 (7+14:54)
root tty1 0.0.0.0 Fri Nov 30 13:52 - 13:55 (00:03)
reboot system boot 0.0.0.0 Fri Nov 30 13:51 - 14:25 (00:34)
Так как это происходит только с именованными пользователями, есть ли какое-то изменение, что происходит что-то необычное или запускается в их сценариях входа? Ты изменился ~/.bashrc
или же ~/.bash_profile
по умолчанию? Существуют ли другие специальные сценарии входа в среду?
--Редактировать--
Я все еще не могу воспроизвести это каким-либо образом. Я смотрю на два критических компонента, хотя. last
Команда стабильна и не менялась долгое время. Если посмотреть на журнал изменений для sysvinit-tools, то здесь нет соответствующих ошибок. То же самое для начальных букв (wtmp).
Если вы можете заставить это произойти, попробуйте это с другой учетной записью пользователя из тех же исходных компьютеров. Но я не вижу никаких признаков того, что это проблема ОС.
ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ
Я уже присудил бонус, так что это чисто для будущих гуглеров с таким же вопросом.
Причина, по которой это появляется только в ~10% моих входов в систему, заключается в том, что когда я делаю серьезные изменения в наших маршрутизаторах или коммутаторах, я использую script foo.log
поэтому у меня есть полный журнал регистрации изменений. По причинам, которые я до сих пор не понимаю, CentOS создает pts
запись при использовании script
команда... я продемонстрирую вывод last -i
до и после бега script
...
[mpenning@sasmars net]$ last -i | head
kkim14 pts/13 192.0.2.225 Wed Jan 2 09:43 still logged in
kkim14 pts/12 192.0.2.225 Wed Jan 2 09:43 still logged in
kkim14 pts/10 192.0.2.225 Wed Jan 2 09:43 still logged in
kkim14 pts/9 192.0.2.225 Wed Jan 2 09:43 still logged in
kkim14 pts/5 192.0.2.225 Wed Jan 2 09:43 still logged in
mpenning pts/17 192.0.2.29 Mon Dec 31 16:45 - 16:49 (00:03)
gduarte pts/16 192.0.2.135 Thu Dec 27 10:54 still logged in
gduarte pts/14 192.0.2.135 Thu Dec 27 10:44 still logged in
dspencer pts/14 192.0.2.4 Thu Dec 27 09:56 - 09:57 (00:01)
mpenning pts/14 192.0.2.91 Thu Dec 27 08:31 - 08:32 (00:00)
[mpenning@sasmars net]$ script ~/something_random.log
Script started, file is /home/mpenning/something_random.log
[mpenning@sasmars net]$ date
Thu Jan 3 16:14:19 CST 2013 # <--------------------------------------------------
[mpenning@sasmars net]$ exit
exit
Script done, file is /home/mpenning/something_random.log
[mpenning@sasmars net]$ last -i | head
mpenning pts/15 0.0.0.0 Thu Jan 3 16:14 - 16:14 (00:00) # <------
kkim14 pts/13 192.0.2.225 Wed Jan 2 09:43 still logged in
kkim14 pts/12 192.0.2.225 Wed Jan 2 09:43 still logged in
kkim14 pts/10 192.0.2.225 Wed Jan 2 09:43 still logged in
kkim14 pts/9 192.0.2.225 Wed Jan 2 09:43 still logged in
kkim14 pts/5 192.0.2.225 Wed Jan 2 09:43 still logged in
mpenning pts/17 192.0.2.29 Mon Dec 31 16:45 - 16:49 (00:03)
gduarte pts/16 192.0.2.135 Thu Dec 27 10:54 still logged in
gduarte pts/14 192.0.2.135 Thu Dec 27 10:44 still logged in
dspencer pts/14 192.0.2.4 Thu Dec 27 09:56 - 09:57 (00:01)
[mpenning@sasmars net]$ cat /etc/redhat-release
CentOS release 6.3 (Final)
[mpenning@sasmars net]$
Такое поведение кажется уникальным для CentOS 6... у нас в лаборатории есть машины CentOS 4.7, которые не помещают пустую запись в wtmp
... Машины Debian / Gentoo такого поведения также не демонстрируют. Наши администраторы linux ломают голову, почему CentOS намеренно добавил еще pts
запись при исполнении script
... Я подозреваю, что это ошибка RHEL.
РЕДАКТИРОВАТЬ: я подал эту проблему как идентификатор ошибки RHEL 892134
НОТА
Некоторые люди ошибочно предположили, что я положил script
в моем ~/.bashrc
или же ~/.bash_profile
, Это неверный аргумент... если бы это было правдой, мой wtmp
должен иметь 0.0.0.0
запись после каждого из моих логинов SSH...
[mpenning@sasmars net]$ last -i | head
kkim14 pts/13 192.0.2.225 Wed Jan 2 09:43 still logged in
kkim14 pts/12 192.0.2.225 Wed Jan 2 09:43 still logged in
kkim14 pts/10 192.0.2.225 Wed Jan 2 09:43 still logged in
kkim14 pts/9 192.0.2.225 Wed Jan 2 09:43 still logged in
kkim14 pts/5 192.0.2.225 Wed Jan 2 09:43 still logged in
mpenning pts/18 0.0.0.0 Mon Dec 31 16:45 - 16:49 (00:03) # <-----
mpenning pts/17 192.0.2.29 Mon Dec 31 16:45 - 16:49 (00:03) # <-----
gduarte pts/16 192.0.2.135 Thu Dec 27 10:54 still logged in
gduarte pts/14 192.0.2.135 Thu Dec 27 10:44 still logged in
dspencer pts/14 192.0.2.4 Thu Dec 27 09:56 - 09:57 (00:01)
mpenning pts/15 0.0.0.0 Thu Dec 27 08:31 - 08:32 (00:00) # <-----
mpenning pts/14 192.0.2.91 Thu Dec 27 08:31 - 08:32 (00:00) # <-----
Конечно, это был не тот случай...
Я не думаю, что мы доберемся до этого без отладки last.c, но это не должно быть слишком сложно, так как он легко компилируется...
Одна из возможностей, однако, - выгрузить файл /var/log/wtmp с помощью команды utmpdump и взглянуть на необработанные записи, которые могут пролить свет на вас. Если нет, пожалуйста, опубликуйте соответствующий вывод
utmpdump /var/log/wtmp
так что мы можем воссоздать локальные копии вашего wtmp для отладки с
utmpdump -r <dumpfile >wtmp
Соединения псевдотерминала Slave (pts) - это соединения SSH или telnet, что означает косвенные соединения с системой. Все эти соединения могут подключаться к оболочке, которая позволит вам подавать команды на компьютер. Поэтому, когда вы открываете терминал в вашей системе из графического интерфейса, он открывает pts с исходным IP-адресом 0.0.0.0. Из предоставленной вами информации кажется, что это происходит из-за запуска сценария на этом сервере или по расписанию, который использует службу ssh или telnet или локальные точки для выдачи вывода в терминал.
Какой SSH-клиент вы используете? Некоторые клиенты ssh могут мультиплексировать несколько терминалов по одному соединению, и я замечаю, что все ваши сеансы без IP попадают в более длинные сеансы, которые имеют зарегистрированный IP.
Я не могу продублировать это поведение с помощью ssh.
Возможно, ваш IP-адрес преобразуется в пустую строку на одном из ваших DNS-серверов, возможно, вторичную, если это происходит только в 10% случаев (или, возможно, просто в файл hosts, если они распространяются из центрального хранилища). Это объясняет отсутствующую (или пробел) запись и согласуется с прочтением Сохемом источника.
Это происходит потому, что вы используете локальную систему, а 0.0.0.0 означает IP-адрес всех интерфейсов. Если вы думаете, что, возможно, кто-то взломал, вы попытаетесь настроить полную регистрацию оболочки, включая команды через ssh - http://blog.pointsoftware.ch/index.php/howto-bash-audit-command-logger/
"0.0.0.0" означает, что это локальный пользователь (не удаленный вход в систему), вероятно, вызванный приложением, например, cronjob.
Я решил это, добавив скрипт в ~/.bashrc, скрипт находит последний IP-адрес источника соединения telnet, затем вы можете добавить IP в файл журнала или сделать все, что вам нужно..
client_ip=$(echo $(netstat -nae | grep $(netstat -nae | grep 23 | awk '{print $8}' | sort -n | tail -n1) | awk '{print $5}') | awk -F':' '{print $1}' )
echo "client_ip=$client_ip"
Sharon