auth.log: sshd 로그인 줄 읽기
「누가 들어왔나?」라는 질문의 답은 auth.log(Debian · Ubuntu)나 /var/log/secure(RHEL 계열)의 sshd 줄에 있습니다. 줄이 짧고 규칙적이라 세기 쉽습니다. 다만 sshd 가 정확히 무엇을 쓰고 무엇을 빼는지 알아야 합니다.
파일을 이 페이지에 놓으면 보드에 IP · 계정별 로그인 실패, 없는 계정 시도, 무차별 대입 출처, 그리고 가장 중요한 「실패를 거듭한 뒤 성공한 로그인」이 나옵니다. 아래 한 줄 명령은 서버에서 같은 질문에 답합니다.
sshd 가 쓰는 것
각 줄은 syslog 머리(시각, 호스트, sshd[pid]:)와 메시지로 되어 있습니다. 인증 메시지는 OpenSSH 의 두 곳에서 나오며 모양은 다음과 같습니다.
<Accepted|Failed|Partial|Postponed> <method>[/<submethod>] for [invalid user ]<user> from <address> port <port> ssh2[: <key type and fingerprint>]
Invalid user <user> from <address> port <port>실제 줄입니다.
Oct 18 03:12:01 web-1 sshd[3011]: Invalid user admin from 203.0.113.66 port 41022
Oct 18 03:12:03 web-1 sshd[3011]: Failed password for invalid user admin from 203.0.113.66 port 41022 ssh2
Oct 18 03:12:05 web-1 sshd[3015]: Failed password for root from 203.0.113.66 port 41030 ssh2
Oct 18 04:01:21 web-1 sshd[3190]: Accepted password for deploy from 192.0.2.50 port 60110 ssh2
Oct 18 09:15:42 web-2 sshd[1844]: Accepted publickey for deploy from 10.0.0.5 port 50122 ssh2: ED25519 SHA256:3q8b…| 낱말 | 뜻 |
|---|---|
Accepted | 이 방법으로 인증에 성공했습니다. 로그인입니다. |
Failed | 이번 시도가 실패했습니다. |
Partial | 이 방법은 성공했지만 더 필요합니다(예: 키 다음에 일회용 코드). |
Postponed | 결정 전에 한 번 더 주고받아야 하는 방법입니다. |
Invalid user | 이 호스트에 없는 사용자 이름입니다. 뒤따르는 Failed … for invalid user … 줄이 시도 자체입니다. |
password · publickey · keyboard-interactive | 인증 방법입니다. publickey 면 "ssh2:" 뒤에 키 종류와 지문이 붙습니다. |
ssh2 | 프로토콜 2 입니다. 요즘 OpenSSH 에서는 늘 이 값입니다. |
어떤 실패는 파일에 없는 이유
sshd 는 인증 결과를 VERBOSE 수준으로 남기고, 로그인 성공, 없는 사용자, password 방법, 또는 실패가 MaxAuthTries 의 절반에 이르렀을 때만 INFO 로 올립니다. 흔히 쓰는 LogLevel INFO 에서는 있는 사용자의 공개키 실패 한 번(클라이언트가 엉뚱한 키를 먼저 내미는 경우)이 남지 않습니다. 그러니 「Failed publickey 줄이 없다」가 「거절된 키가 없다」는 뜻은 아닙니다. 필요하면 LogLevel VERBOSE 로 두십시오.
알아볼 만한 모양
| 모양 | 보이는 것 | 대개 무엇인가 |
|---|---|---|
| 무차별 대입 | 한 주소에서 한두 계정으로 Failed 가 많음. | root 나 흔한 계정의 비밀번호를 맞혀 보는 봇. |
| 계정 훑기 | 한 주소에서 Invalid user 이름이 많음(admin · test · oracle · ubuntu …). | 기본 계정을 찾는 스캐너. |
| 분산 추측 | 계정 하나에 여러 주소에서 몇 번씩 Failed. | 주소당 한도를 피하는 봇넷. |
| 실패 뒤 성공 | 어떤 주소에서 Failed 가 있고 같은 주소에서 Accepted. | 비밀번호를 잘못 친 사람이거나, 맞힌 추측입니다. 매번 어느 쪽인지 확인하십시오. |
| 뜻밖의 곳에서 Accepted | 평소 대역 밖 주소나 이상한 시각에 실제 사용자의 Accepted. | 훔친 비밀번호나 키, 또는 새 네트워크의 동료. 확인하십시오. |
장애나 사고 때 가장 먼저 돌릴 것은 실패 뒤 성공 검사입니다. 아래 명령은 실패한 뒤 로그인한 주소를 실패 횟수와 함께 모두 보여 줍니다.
auth.log 용 한 줄 명령
전통 syslog 머리를 단 표본 auth.log 로 실행해 확인했습니다. sshd 가 저널에만 쓰는 시스템이면 파일 대신 journalctl -u ssh(Debian · Ubuntu) 나 journalctl -u sshd(RHEL 계열)를 같은 명령에 파이프로 넣으십시오.
출발 주소별 비밀번호 실패
grep 'Failed password' auth.log | grep -oE 'from [0-9a-f.:]+' | cut -d' ' -f2 | sort | uniq -c | sort -rn | head사용자 이름별 실패(없는 계정 포함)
grep -oE 'Failed [a-z-]+ for (invalid user )?[^ ]+' auth.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head이 호스트에 없는데 시도된 사용자 이름
grep -oE 'Invalid user [^ ]+' auth.log | cut -d' ' -f3 | sort | uniq -c | sort -rn | head모든 로그인 성공: 시각, 방법, 사용자, 주소
grep 'Accepted ' auth.log | awk '{print $1, $2, $3, $7, $9, $11}'인증 방법별 Accepted · Failed
grep -oE '(Accepted|Failed) [a-z-]+' auth.log | sort | uniq -c | sort -rn실패한 뒤 로그인한 주소 — 하나하나 확인할 것
awk '/Failed /{for (i = 1; i < NF; i++) if ($i == "from") f[$(i+1)]++} /Accepted /{for (i = 1; i < NF; i++) if ($i == "from" && f[$(i+1)]) print $(i+1), "accepted after", f[$(i+1)], "failures"}' auth.log시간당 비밀번호 실패
grep 'Failed password' auth.log | cut -c1-9 | uniq -croot 비밀번호 실패 수
grep -c 'Failed password for root ' auth.log비밀번호에 실패한 서로 다른 주소 수
grep 'Failed password' auth.log | grep -oE 'from [0-9a-f.:]+' | sort -u | wc -l여러 서버가 한 파일에 쓸 때 호스트별 줄 수
awk '{print $4}' auth.log | sort | uniq -c | sort -rn
자주 묻는 질문
SSH 로그인 로그는 어디에 있나요?
Debian · Ubuntu 는 /var/log/auth.log, RHEL · CentOS · Rocky · Alma 는 /var/log/secure 입니다. systemd 저널만 쓰는 호스트라면 journalctl 로 ssh 또는 sshd 유닛을 읽습니다.
"Invalid user" 와 "Failed password for invalid user" 는 무엇이 다른가요?
Invalid user 는 이름을 찾았는데 없을 때 남고, 그 이름으로 한 인증 시도마다 Failed … for invalid user 줄이 따로 남습니다. 시도 수는 Failed 줄로, 시도된 이름은 Invalid user 줄로 세십시오. 둘을 더하면 이중으로 셉니다.
"Failed publickey" 줄이 없는 이유는?
기본 로그 수준에서 sshd 는 있는 사용자의 키 실패를 실패가 MaxAuthTries 의 절반에 이를 때만 남깁니다. 클라이언트가 키를 여러 개 시도하는 것은 정상이라 조용합니다. 보려면 LogLevel VERBOSE 를 쓰십시오.
무차별 대입이 성공했는지 어떻게 아나요?
Failed 줄이 있는 주소에서 Accepted 줄이 있는지 보십시오. 「실패한 뒤 로그인한 주소」 명령이 실패 횟수와 함께 보여 줍니다.
어떤 키로 들어왔는지 로그에 나오나요?
Accepted publickey 줄에는 "ssh2:" 뒤에 키 종류와 SHA256 지문이 나옵니다. ssh-keygen -lf 로 authorized_keys 의 지문과 맞춰 보십시오.
auth.log 를 온라인 도구에 붙여도 되나요?
사용자 이름, 출발 주소, 로그인 시각이 들어 있습니다. 이 페이지에서는 아무것도 브라우저 밖으로 나가지 않습니다. 페이지의 Content-Security-Policy 가 데이터를 보내지 못하게 막습니다.