CentOS Stream 10에서 SSH 로그인 실패 기록을 확인하는 방법

안녕하세요. VISION IDC 기술팀입니다.

오늘은 CentOS Stream 10에서 SSH 로그인 실패 기록을 확인하는 방법을 알아보겠습니다. 서버에 비정상적인 접속 시도가 반복되거나 정상 계정의 SSH 로그인이 거부될 때는 먼저 sshd 로그에서 실패 시간, 사용자명, 원격 IP 주소와 실패 원인을 확인해야 합니다.

CentOS Stream 10에서는 journalctl로 systemd 저널을 조회하는 방법을 우선 사용할 수 있으며, rsyslog가 동작하는 일반적인 환경에서는 /var/log/secure에서도 인증 관련 기록을 확인할 수 있습니다. 이 문서에서는 실시간 확인, 기간·계정·IP별 검색, faillock과 Audit 로그를 활용한 추가 점검까지 단계별로 설명합니다.

적용 환경

운영체제 CentOS Stream 10
SSH 서버 openssh-server, sshd.service
주요 로그 systemd 저널, /var/log/secure
필요 권한 sudo 사용이 가능한 관리자 계정 또는 root

이 문서에서 확인할 내용

  • SSH 서버 상태와 기본 로그 수집 상태 확인
  • journalctl을 이용한 로그인 실패 기록 조회
  • /var/log/secure에서 인증 오류 검색
  • 특정 시간, 사용자명, 접속 IP별 로그 필터링
  • faillock과 Audit 로그를 이용한 추가 확인
  • 로그가 보이지 않을 때의 점검 방법

가장 먼저 확인할 항목

1. 운영체제 버전 확인

먼저 현재 서버가 CentOS Stream 10인지 확인합니다.

cat /etc/centos-release

출력에 CentOS Stream release 10이 포함되어 있는지 확인합니다.

2. OpenSSH 서버와 sshd 서비스 확인

SSH 로그인 기록은 sshd가 남기므로 패키지 설치 여부와 서비스 상태를 함께 확인합니다.

rpm -q openssh-server
sudo systemctl is-active sshd.service
sudo systemctl status sshd.service --no-pager

systemctl is-active 결과가 active이면 SSH 서버가 실행 중입니다. 서비스가 중지되어 있거나 시작에 실패한 경우에는 로그인 시도 자체가 정상적으로 처리되지 않을 수 있으므로 상태 메시지부터 확인해야 합니다.

journalctl로 SSH 로그인 실패 기록 확인

CentOS Stream 10에서 가장 먼저 사용할 수 있는 방법은 sshd.service의 systemd 저널을 조회하는 것입니다. 저널에는 SSH 접속 성공과 실패, 잘못된 사용자명, 인증 모듈 오류, 연결 종료 등의 메시지가 함께 기록됩니다.

최근 SSH 로그 전체 확인

sudo journalctl -u sshd.service --no-pager

로그가 많으면 가장 최근 기록부터 확인할 수 있도록 -r 옵션을 추가합니다.

sudo journalctl -u sshd.service -r --no-pager

오늘 발생한 SSH 로그 확인

sudo journalctl -u sshd.service --since today --no-pager

최근 한 시간의 접속 시도만 확인하려면 다음과 같이 기간을 지정합니다.

sudo journalctl -u sshd.service --since "1 hour ago" --no-pager

실패 관련 메시지만 검색

오늘의 SSH 로그에서 비밀번호 실패, 존재하지 않는 계정, PAM 인증 실패와 관련된 문구를 검색합니다.

sudo journalctl -u sshd.service --since today --no-pager | grep -Ei 'failed password|invalid user|authentication failure'

검색 결과에는 서버 설정과 OpenSSH 버전에 따라 메시지 표현이 다르게 나타날 수 있습니다. 출력이 없다고 해서 실패 기록이 전혀 없다고 단정하지 말고, 먼저 필터 없이 해당 시간대의 전체 sshd 로그를 확인하십시오.

실시간으로 접속 시도 관찰

SSH 접속을 직접 재현하면서 로그가 생성되는지 확인하려면 다음 명령을 실행한 상태에서 다른 터미널이나 PC에서 접속을 시도합니다.

sudo journalctl -u sshd.service -f

실시간 보기를 종료하려면 Ctrl+C를 누릅니다.

/var/log/secure에서 SSH 실패 기록 확인

RHEL 10 계열에서는 인증 및 보안 관련 메시지가 /var/log/secure에도 저장됩니다. rsyslog가 정상적으로 동작하는 CentOS Stream 10 서버라면 다음 명령으로 SSH 로그인 실패 기록을 검색할 수 있습니다.

sudo grep -Ei 'failed password|invalid user|authentication failure' /var/log/secure

가장 최근 로그부터 확인하려면 파일의 마지막 부분을 조회합니다.

sudo tail -n 100 /var/log/secure

실시간으로 기록이 추가되는 모습을 확인하려면 다음 명령을 사용합니다.

sudo tail -f /var/log/secure

회전된 이전 로그 확인

오래된 인증 기록은 로그 로테이션에 따라 별도 파일로 이동되거나 압축될 수 있습니다. 먼저 보관된 파일을 확인합니다.

sudo ls -lh /var/log/secure*

압축된 이전 로그까지 한 번에 검색하려면 zgrep을 사용할 수 있습니다.

sudo zgrep -Eih 'failed password|invalid user|authentication failure' /var/log/secure*

시간·계정·IP별 SSH 로그 검색

특정 기간의 기록 확인

문제가 발생한 시간을 알고 있다면 시작과 종료 시각을 지정하여 로그 범위를 줄이는 것이 좋습니다. 아래 날짜와 시간은 예시이므로 실제 장애 발생 시각으로 변경합니다.

sudo journalctl -u sshd.service \
  --since "2026-07-17 00:00:00" \
  --until "2026-07-17 23:59:59" \
  --no-pager

특정 사용자명의 기록 확인

예시 사용자명 admin_user와 관련된 SSH 로그를 찾습니다. 실제 확인할 계정명으로 변경하십시오.

sudo journalctl -u sshd.service --since today --no-pager | grep -F 'admin_user'

특정 원격 IP의 기록 확인

예시 IP 주소 198.51.100.20에서 발생한 접속 기록을 검색합니다. 실제 조사할 원격 IP로 변경하십시오.

sudo journalctl -u sshd.service --since today --no-pager | grep -F '198.51.100.20'

동일한 방식으로 /var/log/secure에서도 계정명이나 IP 주소를 검색할 수 있습니다.

sudo grep -F 'admin_user' /var/log/secure
sudo grep -F '198.51.100.20' /var/log/secure

faillock으로 계정별 인증 실패 기록 확인

pam_faillock이 적용된 환경에서는 faillock 명령으로 사용자별 최근 인증 실패 누적 기록을 확인할 수 있습니다. 전체 기록을 확인하려면 다음 명령을 실행합니다.

sudo faillock

특정 계정의 기록만 확인하려면 사용자명을 지정합니다.

sudo faillock --user admin_user

출력에는 실패 시각, 인증 방식, 접속 출처와 유효 상태가 표시될 수 있습니다. 다만 faillock은 SSH 전용 로그가 아니며 PAM을 통과한 인증 실패를 계정별로 집계하는 기능이므로, 원격 IP와 상세 실패 원인을 조사할 때는 journalctl 또는 /var/log/secure를 함께 확인해야 합니다.

Audit 로그로 로그인 실패 기록 추가 확인

보안 감사가 필요한 서버에서는 Linux Audit 로그를 추가로 확인할 수 있습니다. RHEL 10 공식 문서에서는 pam_faillock과 Audit이 로그인 실패 기록을 남길 수 있으며, ausearch로 관련 이벤트를 검색할 수 있다고 설명합니다.

먼저 Audit 서비스 상태를 확인합니다.

sudo systemctl is-active auditd.service
sudo systemctl status auditd.service --no-pager

실패한 로그인 이벤트를 사람이 읽기 쉬운 형태로 검색합니다.

sudo ausearch --message USER_LOGIN --success no --interpret

PAM 인증 실패 이벤트까지 넓혀 확인하려면 다음 명령을 사용할 수 있습니다.

sudo ausearch --message USER_AUTH --success no --interpret

Audit 로그에는 SSH 외에 콘솔 로그인, sudo와 다른 PAM 인증 이벤트도 포함될 수 있습니다. 결과의 실행 파일이 /usr/sbin/sshd인지, 터미널이 ssh인지 확인하여 SSH 관련 기록을 구분하십시오.

주요 SSH 로그인 실패 메시지 해석

자주 확인되는 SSH 인증 로그와 의미
로그 문구 의미 확인할 항목
Failed password 입력한 비밀번호가 인증에 실패했음을 의미합니다. 사용자명, 원격 IP, 반복 횟수, 정상 사용자의 입력 실수 여부
Invalid user 서버에 존재하지 않거나 SSH에서 유효하지 않은 사용자명으로 접속을 시도한 경우입니다. 동일 IP의 사용자명 대입 패턴과 자동화 공격 여부
authentication failure PAM 인증 단계에서 실패가 발생했음을 나타냅니다. 계정 잠금, 비밀번호, PAM 정책, SSSD 또는 외부 인증 상태
not allowed 계정 또는 그룹이 SSH 접근 제어 설정에 의해 허용되지 않았을 수 있습니다. AllowUsers, DenyUsers, AllowGroups, DenyGroups 설정
Connection closed 또는 Disconnected 인증 도중 클라이언트 또는 서버가 연결을 종료한 경우입니다. 직전 인증 메시지, 네트워크 상태, 클라이언트 오류, 접속 제한 정책

로그 한 줄만으로 원인을 단정하지 말고 같은 프로세스 ID의 직전·직후 기록을 함께 확인하는 것이 중요합니다. 특히 정상 계정의 로그인이 실패하는 경우에는 사용자명과 비밀번호뿐 아니라 계정 잠금, 만료, 접근 허용 그룹, 공개키 권한과 외부 인증 서비스 상태까지 점검해야 합니다.

로그가 보이지 않을 때 해결 방법

SSH 로그인 실패 기록이 확인되지 않을 때 점검할 항목
증상 가능한 원인 확인 및 해결 방법
journalctl 결과가 비어 있음 조회 기간이 잘못되었거나 접속 시도가 sshd까지 도달하지 않음 sudo journalctl -u sshd.service --no-pager로 필터 없이 조회하고, 방화벽·보안 그룹·포트 상태를 확인합니다.
/var/log/secure가 없음 rsyslog가 설치되지 않았거나 중지됨 rpm -q rsyslogsystemctl status rsyslog를 확인하고, 우선 systemd 저널을 사용합니다.
이전 날짜의 기록이 없음 저널 또는 파일 로그가 회전·삭제되었거나 영구 저장이 제한됨 journalctl --list-boots, ls -lh /var/log/secure*, 저널 저장 정책과 로그 보존 기간을 확인합니다.
faillock 결과가 비어 있음 pam_faillock이 적용되지 않았거나 기록 보존 시간이 지남 SSH 원본 로그를 우선 확인하고, 현재 인증 프로파일과 /etc/security/faillock.conf 설정을 점검합니다.
Permission denied가 표시됨 인증 로그 조회 권한 부족 sudo를 사용하거나 관리자 권한으로 실행합니다. 로그 파일 권한을 임의로 완화하지 마십시오.

rsyslog 상태 확인

rpm -q rsyslog
sudo systemctl is-active rsyslog.service
sudo systemctl status rsyslog.service --no-pager

저널에 보관된 부팅 단위 확인

sudo journalctl --list-boots

목록에 현재 부팅 기록만 표시된다면 과거 저널이 보존되지 않았거나 이미 정리되었을 수 있습니다. 중요한 운영 서버는 사고 발생 후에 설정을 바꾸기보다 사전에 로그 보존 기간과 원격 로그 전송 정책을 정해 두는 것이 안전합니다.

로그 확인 후 권장 보안 조치

SSH 로그인 실패 기록에서 동일한 IP의 반복 시도나 여러 사용자명을 대입하는 패턴이 확인되면 단순 입력 실수보다 자동화된 무차별 대입 공격일 가능성을 고려해야 합니다.

  • 정상 사용자의 접속이 아니라면 해당 IP와 시도 시간, 사용자명을 별도로 보존합니다.
  • 비밀번호 인증보다 SSH 공개키 인증을 우선 사용합니다.
  • root 직접 로그인을 제한하고 관리용 일반 계정과 sudo를 사용합니다.
  • 관리자 접속 IP가 고정되어 있다면 방화벽 또는 상위 보안 그룹에서 SSH 접근 대상을 제한합니다.
  • 반복적인 실패 시도를 자동 차단해야 한다면 계정 잠금 정책이나 침입 방지 도구를 운영 환경에 맞게 검토합니다.
  • 로그 보존이 중요한 서버는 중앙 로그 서버로 전송하여 공격자가 로컬 로그를 삭제하더라도 기록이 남도록 구성합니다.

공식 참고자료

자주 묻는 질문

journalctl과 /var/log/secure 중 어느 것을 먼저 확인해야 하나요?

CentOS Stream 10에서는 journalctl -u sshd.service를 먼저 확인하는 것이 좋습니다. /var/log/secure는 rsyslog 상태와 로그 로테이션 설정에 영향을 받을 수 있으므로 저널과 함께 교차 확인하면 됩니다.

Failed password 로그가 있으면 서버가 침해된 것인가요?

로그인 실패만으로 침해를 의미하지는 않습니다. 다만 동일한 IP에서 반복적으로 발생하거나 여러 계정을 순차적으로 시도한다면 무차별 대입 공격 가능성이 있으므로 성공 로그인 기록, 계정 변경 내역과 실행 명령까지 추가로 점검해야 합니다.

SSH 로그인 성공 기록도 같은 방법으로 볼 수 있나요?

가능합니다. journalctl -u sshd.service 또는 /var/log/secure에서 Accepted가 포함된 메시지를 검색하면 비밀번호나 공개키 인증에 성공한 기록을 확인할 수 있습니다.

sudo journalctl -u sshd.service --since today --no-pager | grep -F 'Accepted'

방화벽에서 차단된 SSH 시도도 sshd 로그에 남나요?

패킷이 방화벽에서 먼저 차단되어 sshd까지 도달하지 않았다면 SSH 인증 로그에는 남지 않습니다. 이 경우에는 firewalld, nftables, 클라우드 보안 그룹 또는 상위 네트워크 장비의 로그를 확인해야 합니다.

faillock 기록이 없으면 로그인 실패가 없었던 것인가요?

그렇지 않습니다. pam_faillock이 활성화되지 않았거나 해당 사용자가 집계 대상이 아니거나 보존 시간이 지나면 기록이 비어 있을 수 있습니다. SSH 로그인 실패 조사에서는 journalctl/var/log/secure를 기본 자료로 사용하십시오.

마무리

오늘은 CentOS Stream 10에서 journalctl/var/log/secure를 이용해 SSH 로그인 실패 기록을 확인하고, 시간·계정·IP별로 검색하는 방법을 설명드렸습니다. 계정별 누적 실패는 faillock으로, 보안 감사 이벤트는 ausearch로 추가 확인할 수 있습니다.

로그를 분석할 때는 한 줄의 오류만 보지 말고 같은 시간대의 전후 기록과 접속 출처를 함께 확인하시기 바랍니다. 비정상적인 반복 접속이 확인되면 원본 로그를 보존한 뒤 SSH 공개키 인증, 접근 IP 제한과 중앙 로그 보관 등 운영 환경에 맞는 보안 조치를 적용하는 것이 좋습니다.

  • 0 사용자에게 유용한 정보 제공
이 답변이 도움이 되었나요?
« Back