pts 로그인에서 ‘마지막’출력에 IP 정보가 누락 된 이유는 무엇입니까?

나는 5 개의 CentOS 6 리눅스 시스템을 사용하고 있는데, 내가 가지고있는 모든 리눅스 시스템에서 내 사용자 아이디 로만 발생하는 것처럼 보이는 다소 이상한 문제가 발생했다 . 이것은 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 시스템에는 시스템을 공유하는 최대 6 명의 다른 사용자가 있습니다. 내 로그인의 약 10 %에서이 문제가 발생하지만 다른 사용자 이름으로는이 동작이 나타나지 않습니다 . /var/log/secure소스 IP 주소 가없는 항목에는 항목이 없습니다 .

질문

이러한 시스템에 많은 종류의 네트워크 인프라를 제어하는 ​​일종의 스크립트를 감안할 때, 나는 이것에 약간 짜증이 나서 로그인이 때때로 소스 주소를 그리워하는 원인을 이해하고 싶습니다.

  • pts 행 항목에last -i 표시 0.0.0.0되는 이유 ( 이 답변 참조 )
  • 행동을 합리적으로 설명 할 수있는 (악의적 인 활동 이외의) 것이 있습니까?
  • 배쉬 히스토리 타임 스탬프 외에, 이슈를 추적하기 위해 할 수있는 다른 것들이 있습니까?

정보 제공

이 시작 일어나는 때문에, 나는 활성화 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명령이나 GUI로 로그인하지 않았습니다 . 모든 로그인은 SSH에서 온 것입니다. 현상금 상을 수상하기 위해, 당신은 인용한다 권위 Explain 스에 대한 참조 last -i 0.0.0.0만 SSH를 통해 공급 항목을.

편집 2 (ewwhite의 질문)

/etc/resolv.conf( 회사 정보를 숨기기 위해 위의 출력 .local에서 addrs를 사용했습니다 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 (이 사용자 지정 호스트 파일은 이러한 문제가있는 시스템 중 하나에 만 존재 함)

[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)

최종 해상도

아래 내 답변을 참조하십시오



답변

script RedHat과 데비안의 동작 차이

연결된 라이브러리

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)

우분투 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을한다. 다음은 테스트입니다.

우분투 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$ 

우분투 12.04 script는 새로운 pts (2)를 열었습니다. 방금 업데이트되지 않았습니다 /var/log/wtmp.

CentOS 6

우리는 이미 scriptpty를 열고 wtmp에 등록 한다는 것을 알고 테스트를 건너 뜁니다 .

신병

  • 프로젝트 : http://freecode.com/projects/libutempter
  • 설명 : libutempter는 screen 및 xterm과 같은 터미널 에뮬레이터를위한 라이브러리 인터페이스를 제공하여 사용자 세션을 utmp 및 wtmp 파일에 기록합니다.

따라서 주요 차이점은 libutempter.so.0CentOS script와 연결된 추가 라이브러리 ( ) 입니다.

우분투 12.04로 테스트

scriptlibutempter로 컴파일

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.

레드햇 백 포트

흥미로운 점은 업스트림이 util-linux-ng-2.17.2실제로 지원하지 않는다는 것입니다 libutempter. Redhat은이 지원을 다시 추가하기로 결정했습니다.

john@U64D211:~/tmp/util-linux-ng-2.17.2$ ./configure --help|grep utemp

위 명령은 빈 결과를 반환합니다.

결론

따라서 두 배포판의 동작 차이는 버그가 아니라 선택입니다. RedHat은이 기능을 지원하기로 결정했지만 데비안은이 기능을 건너 뛰었습니다.


답변

이것은 나에게 절대적으로 수수께끼처럼 보인다. 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를 사용해야합니다.

더 파헤칠 수 있는지 살펴 보겠습니다. 그러나 ewwhite가 요구 한 것은 유효한 질문입니다.


답변

희망이 당신에게 적어도 줄 것이다 디버거에서 마지막으로 내가 한으로 실행 그래서 몇 가지 질문에 대한 답을. 내 감정은 근본 원인이 더 깊습니다.

pts 행 항목에 last -i가 0.0.0.0을 표시하는 이유

이것을 설명하는 가장 좋은 방법은 -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);
}

둘 다 usednsuseip(기본 옵션을 사용하여)는 플래그가되지 않습니다. 이 구조체 밖으로 복사 할 논리를 원인 p->ut_host에 따라 man utmp에 쓴 무엇에 의해 기록 된 원격 로그인 이름을 포함합니다 utmp.

char ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or
                              kernel version for run-level
                              messages */

귀하의 경우 여기의 값은 0입니다. 이것이 당신이 last아무것도 달리지 않을 때 나타나는 이유 입니다.

이 경우 last -idns_lookup이 호출됩니다. 이것은 DNS를 통해 해결하기 위해 항목 (p-> ut_addr_v6)을 전달합니다. 귀하의 경우이 값 에는 0 포함됩니다.

대부분 dns_lookup은 창 드레싱과 heusteric입니다. 기본적으로 중요한 것은 기능 getnameinfo입니다. 이것은이 경우에 저장된 이진 값을 해결하기 위해 최선을 다할 라이브러리 호출입니다 ut_addr_v6. 이 항목에 0이 포함되어 있으면 (예 : 경우와 같이) 실제로 출력에서 0.0.0.0발생 하는 것과 같이 이것을 해결합니다 last -i.

행동을 합리적으로 설명 할 수있는 (악의적 인 활동 이외의) 것이 있습니까?

글쎄요, 아마도 버그 나 감독 일 것입니다. 이 떠나 바보 보이기 때문에 그 가능성은 악성하기 위해 어떤 오히려 소스 주소를 생략보다 공격자로 추적을.

지금까지 답변의 초점은 잘못된 장소를보고있었습니다. last단지 읽고 utmpwtmp. 그러나 last가지고있는 데이터로 최선을 다하고 있습니다.

당신의 근본 원인은 utmp쓰여지는 방식에 어딘가에 있습니다 !

몇 가지 응용 프로그램이 직접 작성하는 동안 utmp문제의 원인 sshd이 세션 관리를 처리하는 것 같습니다.

배쉬 히스토리 타임 스탬프 외에, 이슈를 추적하기 위해 할 수있는 다른 것들이 있습니까?

utmp일반적으로 쓰기 가능하지 않으며 의미가 없습니다. utmp당신을 로그인하고 세션을 설정하도록 설계된 응용 프로그램에 의해 작성됩니다. 귀하의 경우는입니다 sshd.

sshd가 사용자를 올바르게 처리하지 않는 이유는 사용자가 온 호스트 이름을 올바르게 복사해야하기 때문에 매우 이상합니다. 디버깅 노력에 집중해야 할 곳입니다. 로그에 sshd의 디버그 출력을 추가하고 이상이 있는지 확인하십시오.

문제를 해결하려면 (또는 문제에 대한 자세한 내용을 알고 싶다면) /etc/pam.d/sshd 의 세션 항목 에 추가 pam_lastlog하여 관리 할 수 있습니다 .utmp

사실, 이미 존재하는지 확인하는 것은 아프지 않을 것입니다. 경험하는 행동을 분명히 설명 pam_lastlog하는 nohost옵션이 포함되어 있기 때문 입니다.

마지막으로, 당신은 전혀 마지막으로 사용할 수 없습니다. aulast감사 서브 시스템을 통해 동일한 작업을 수행합니다.

그것이 올바른 주소를 쓰는 데 성공했는지 살펴볼 가치가 있습니다. 그렇지 않은 경우 sshd가 utmp 또는 audit와 같은 다른 하위 시스템 주위에 DNS 이름을 전달하므로 문제 sshd에 있어야합니다 .


답변

(1) OP last출력 기반

ssh를 통해 로그인 한 후, localhost에 ssh last -i하고 나중에 0.0.0.0을 얻을 수 있습니다 .

OP 로그의 처음 네 줄 기준

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-key를 사용하십니까? 그렇다면 서버에서 로컬로 로그인하도록 ssh-key를 설정 했습니까?
  • 동일한 시간대의 / var / log / secure를 확인하거나 게시하십시오. 힌트를 줄 수 있습니다.
  • 사용하는 스크립트 확인
  • 사용하는 쉘 별명 확인
  • 명령 내역 확인

(2) 추가 시나리오

시나리오 1-sudo 및 터미널

  1. UserA 로그인 X 창
  2. 터미널 창을 열고 xhost + localhost
  3. su - UserB또는 sudo su - UserB새로운 터미널을 엽니 다 (xterm, gnome-terminal 등)
  4. UserB 0.0.0.0으로 표시됩니다 last -i

su - UserBUserB마지막 으로 로그인으로 등록하지 않지만 터미널을 열면됩니다.

시나리오 2-로그인

  1. 서버로 ssh
  2. 유형 sudo login
  3. 자신으로 로그인
  4. 확인 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 시스템에서 수행하십시오.

이 두 시나리오는 특정 상황에서 표준 패키지조차도 그렇게 만드는 것을 보여줍니다.

(3) 배쉬 히스토리 해킹

세션 bash이 대화식 쉘로 사용 되는 경우에만 작동합니다 .

.bashrc그리고 .bash_profile만에 의해 사용됩니다 bash.

세션이 다른 쉘 (sh, csh 등)을 사용하거나 프로그램을 직접 실행하면 자동으로 소싱되지 않으며 bash 기록이 없습니다.

(4) 프로세스 회계

OP는 secure파일에 대해 언급하지 않았으므로 막 다른 골목이라고 가정하고 실제로 힌트를 제공합니다.

다음 가정이 맞다면

`last` 0.0.0.0 entries are actually created with in OP own session

auth.log (debian) / secure (CentOS)는 도움이되지 않습니다. 인증 관련 작업 만 기록되어 있습니다.

데이터 구조에 제한이있는 wtmp / utmp 또한 막 다른 골목입니다. 그것들을 만든 것에 대한 정보가 없습니다.

프로세스 회계라는 하나의 옵션 만 남게 됩니다. 이것은 큰 총이므로주의해서 사용해야합니다.

  1. 회사 정책에 어쩌면
  2. 공유 시스템의 다른 사용자가 활성화되어 있으면 불행하거나 불편할 수 있습니다.
  3. 로그 파일은 많은 디스크 공간을 사용할 수 있습니다. 파일 크기 증가율을 주시하십시오.

게시물 에 따르면 psacct 패키지 버전은 6.3.2-56 이상 이어야합니다 .

이것이 사용 /var/log되며 공간이 제한되어 있으면 acct 로그 파일을 아래의 디렉토리 (루트 전용 액세스)로 변경하십시오 /home. 일반적으로 훨씬 더 많은 공간이 있습니다.

이것은 정말로 큰 총입니다. OP 10 % 발생률로 일주일 이내에 결과가 발생합니다. 이 기간 동안 빈 항목이 표시 last되지만 acct 로그에 아무것도 표시 되지 않으면 수수께끼 상황 이되고 과감한 조치 가 필요 합니다 .

다음은 샘플 출력입니다 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 : 몇 개의 터미널과 ssh 세션을 열려고했습니다. 새로운 pt를 여는 것이 분명하지 않습니다 (또는 정확히 파악하기 쉽지 않음). 그러나 해당 pt / 세션 내에서 실행 된 모든 내용이 표시됩니다.

PS2 : Mike의 acct 사용에 관한 블로그 게시물.


답변

머신에 로그인 할 때 마지막 명령에서이 항목이 적을 수 있습니다.

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)    

CTRL + ALT + F1-6을 눌러 터미널이나 콘솔을 통해 로그인하면 tty *의 첫 번째 항목이 나타납니다. 사용중인 터미널에서 꽤 분명합니다.

두 번째 항목은 일반적으로 머신에 로그인하고 GUI에서 터미널 창을 열 때 나타납니다. 동일한 터미널 창에서 새 탭을 열어도 항목이 있습니다.

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의 터미널 윈도우가있는 화면과 화면 세션이있는 두 가지 경우 중 하나에 해당한다고 확신합니다.

이것이 도움이 되었기를 바랍니다.


답변

나는 우리가 last.c를 디버깅하지 않고 이것으로 멀리 갈 것이라고 생각하지 않지만, 쉽게 컴파일되므로 너무 어렵지 않아야합니다 …

한 가지 가능성은 utmpdump 명령을 사용하여 / var / log / wtmp 파일을 덤프 하고 원시 레코드를 살펴보면 약간의 도움이 될 수 있습니다. 그렇지 않은 경우 관련 출력을 게시하십시오

utmpdump /var/log/wtmp 

디버깅을 위해 wtmp의 로컬 복사본을 다시 만들 수 있습니다.

utmpdump -r <dumpfile >wtmp

답변

12 개의 다중 사용자 CentOS 및 RHEL 6.3 기반 응용 프로그램 서버를 확인했습니다. 이 행동은 보이지 않았다. last4-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) 와 동일합니다 .

이 작업을 강제로 수행 할 수 있으면 동일한 소스 시스템의 다른 사용자 계정으로 시도하십시오. 그러나 이것이 OS 문제라는 표시는 없습니다.