Linux 시스템 보안 기초 · 14/50편
이 글은
리눅스 시스템 기초·파일 · 권한 · 사용자 관리·서비스 · 프로세스 관리시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.
SSH 무차별 대입은 인터넷에 서버를 올리면 몇 분 안에 시작되는, 가장 흔한 공격입니다. 선행 시리즈에서 기본 로그를 봤다면, 이번 편은 공격의 패턴을 정량적으로 분석하고 성공 여부를 판별하는 방법에 집중합니다.
무차별 대입 로그의 3대 신호입니다.
Failed password for <user>: 존재하는 계정에 대한 비밀번호 실패Invalid user <user>: 존재하지 않는 계정 시도(계정 열거)Accepted password for <user>: 성공 — 앞에 대량 실패가 있었다면 침해 성공 신호핵심 판별: '동일 IP에서 다수 실패 후 성공'이 있으면 무차별 대입이 뚫린 것으로 간주합니다.
203.0.113.10
│ Failed × 47 (admin, root, test, oracle ...) ← 계정 열거+대입
│ Invalid user × 30
▼
Accepted password for alice ← 성공! (침해 발생 지점)
│
▼
session opened → 이후 sudo/파일변경 추적 필요
공격 도구는 사전(wordlist)을 돌며 계정×비밀번호 조합을 반복 시도합니다. 각 실패는 sshd와 pam_unix가 로그로 남기며, MaxAuthTries에 걸리면 연결이 끊기고 다시 연결해 재시도합니다. 그래서 연결 수가 많고, 짧은 간격, 다수 계정명이라는 특징이 로그에 그대로 드러납니다.
분석의 요령은 개별 줄이 아니라 집계입니다. IP별·계정별·시간대별로 묶어야 공격의 규모와 성공 여부가 보입니다.
# 실패 상위 출발 IP (Ubuntu)
sudo grep 'Failed password' /var/log/auth.log \
| grep -oE 'from [0-9.]+' | awk '{print $2}' | sort | uniq -c | sort -rn | head
# 시도된 계정명 분포
sudo grep -E 'Failed password|Invalid user' /var/log/auth.log \
| grep -oE 'for (invalid user )?[a-z0-9_-]+' | awk '{print $NF}' | sort | uniq -c | sort -rn | head
# 성공 로그인 (실패 폭주 뒤 이게 있으면 침해 의심)
sudo grep 'Accepted' /var/log/auth.log | tail
전형적인 무차별 대입 분석 결과입니다. (예시 출력 — 표준 auth.log 집계 형식)
# 실패 상위 IP
312 203.0.113.10
47 198.51.100.23
# 시도된 계정명
88 root
51 admin
33 test
19 oracle
# 성공
Accepted password for alice from 203.0.113.10 port 51999 ssh2
실패 312회를 기록한 203.0.113.10에서 alice 로그인이 성공했습니다. 출발 IP가 실패 목록의 1위와 동일하다는 점이 결정적 — 무차별 대입이 성공한 것으로 판단합니다.
Invalid user 다수Accepted 발생(성공)성공이 확인되면 단순 차단을 넘어 침해사고 대응 절차(48편)로 전환해야 합니다.
Invalid user 급증으로 열거 탐지이 패턴은 SIEM/Wazuh의 대표 상관분석 룰입니다. Wazuh 기본 룰은 '동일 소스의 다중 인증 실패'를 레벨 10으로, '실패 후 성공'을 더 높은 레벨로 분류합니다. active-response로 fail2ban처럼 출발 IP를 방화벽에서 자동 차단할 수 있습니다. 성공 IP·시도 계정명은 즉시 IOC로 등록합니다.
[ ] 실패 상위 IP 집계
[ ] 시도 계정명 분포 확인
[ ] 실패 폭주 IP의 성공 여부 확인
[ ] 성공 시 침해 대응 절차 전환 판단
다음 편에서는 15. SSH Key 인증 보안 를 다룹니다. 무차별 대입의 근본 대안인 SSH 키 인증을, 키 탈취와 지속성 관점에서 봅니다.
본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.