
SSH를 어떻게 봐야 하는가
SSH는 단순한 원격 접속 프로토콜이 아니라 다음 기능을 함께 포함합니다.
- 원격 쉘 접속
- 파일 전송(SCP/SFTP)
- 포트 포워딩(Local/Remote/Dynamic)
- 터널링
- 원격 명령 실행
- 인증 키 기반 자동화
즉, SSH는 편리하지만 동시에 다음 위험도 함께 가집니다.
- 관리자 계정 탈취 시 곧바로 서버 장악 가능
- 키 파일 유출 시 장기간 은닉된 접근 가능
- 포트포워딩을 통한 내부망 우회 접속 가능
- 점프서버, 배스천, 자동화 계정이 많을수록 추적이 어려워짐
그래서 SSH는 접속 허용 여부만이 아니라
누가, 언제, 어디서, 어떤 방식으로, 무엇을 위해, 어떤 명령과 터널을 사용했는지까지 관리해야 합니다.
SSH의 기본 동작 구조
SSH는 보통 다음 흐름으로 동작합니다.
- 클라이언트가 서버의 22/tcp 또는 지정 포트로 접속
- 서버가 호스트키로 자기 신원을 증명
- 클라이언트가 사용자 인증 수행
- 성공 시 세션 채널 생성
- 쉘, 명령 실행, SFTP, 포워딩 중 하나 또는 복수 기능 수행
주요 구성 요소
- sshd: 서버 데몬
- ssh: 클라이언트
- known_hosts: 서버 호스트키 저장
- authorized_keys: 허용된 공개키 저장
- private key: 사용자 비밀키
- config: 클라이언트/서버 설정 파일
SSH 사용 방식의 종류
암호 로그인
가장 단순하지만 운영 환경에서는 보통 비권장입니다.
장점
- 사용이 쉬움
- 초기 설정이 간단함
단점
- 비밀번호 추측 공격에 취약
- 피싱, 재사용, 크리덴셜 스터핑 위험
- 계정 공유가 쉬워 감사성이 낮음
권장
- 외부망, 운영망, 중요 서버는 비밀번호 로그인 비활성화 권장
- 반드시 MFA 또는 키 기반 인증으로 전환
키 기반 로그인
운영환경에서 가장 많이 쓰는 방식입니다.
ssh-keygen -t ed25519 -C "admin@company"
ssh-copy-id user@server
장점
- 비밀번호보다 강함
- 자동화에 적합
- 계정별, 용도별 분리가 쉬움
주의점
- 개인키 유출 시 매우 위험
- 패스프레이즈 없는 키는 특히 위험
- 하나의 키를 여러 서버에서 재사용하면 추적 어려움
권장
- ed25519 우선
- 개인키는 패스프레이즈 설정
- 사용자별, 서비스별 키 분리
- 주기적 회전 및 철회 절차 마련
MFA / FIDO2 / 인증서 기반
고보안 환경에서는 권장되는 방식입니다.
형태
- 비밀번호 + OTP
- 키 + OTP
- FIDO2 보안키
- SSH Certificate Authority 기반 인증서
장점
- 키 유출만으로는 부족
- 계정 탈취 난이도 상승
- 중앙 인증 정책 적용 가능
점프서버 / 배스천 기반
운영망에서는 거의 필수입니다.
개념
- 외부에서 서버로 직접 접속하지 않고
- 먼저 점프서버로 들어간 뒤
- 내부 서버로 재접속
장점
- 접속 경로 통제 가능
- 감사 로그 집중 가능
- 세션 녹화 적용이 쉬움
주의점
- 점프서버가 단일 실패 지점이 될 수 있음
- 점프서버 권한이 지나치게 강하면 내부망 전체 위험 증가
SSH 핵심 보안 정책
반드시 관리해야 할 항목입니다.
인증 정책
- 비밀번호 로그인 제한 또는 금지
- root 직접 로그인 금지
- 개인별 계정 사용
- 공유 계정 금지
- 키 기반 로그인 우선
- MFA 적용
- 고위험 서버는 인증서 기반 또는 PAM 연동
예시
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication yes
접근 통제
- 허용 IP 제한
- VPN 또는 배스천 경유
- 업무 시간 제한
- 특권 계정 접근 승인 절차
- 서버별 역할 기반 권한 분리
예시
AllowUsers alice bob
AllowGroups ssh-admins
또는 방화벽에서
iptables -A INPUT -p tcp --dport 22 -s 10.10.10.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
세션 통제
- idle timeout 설정
- 세션 유지시간 제한
- PTY 제한
- 포트포워딩 제한
- X11 forwarding 비활성화
- 필요 시 특정 계정에만 허용
예시
ClientAliveInterval 300
ClientAliveCountMax 2
X11Forwarding no
AllowTcpForwarding no
PermitTunnel no
명령 및 기능 제한
일부 계정은 쉘 접근이 아니라 SFTP 또는 특정 명령만 허용해야 합니다.
예시
ForceCommand internal-sftp
또는 authorized_keys에서 제한
command="/usr/local/bin/backup-script",no-port-forwarding,no-agent-forwarding,no-pty ssh-ed25519 AAAA...
이렇게 하면 특정 키는 정해진 명령만 실행하게 만들 수 있습니다.
SSH 로그는 어디서 나오는가
SSH 관련 로그는 하나만 보지 말고 여러 층으로 보아야 합니다.
sshd 로그
가장 기본입니다.
Linux 예시
- Debian/Ubuntu:
/var/log/auth.log - RHEL/CentOS/Rocky:
/var/log/secure - systemd 환경:
journalctl -u sshd
주요 이벤트
- 로그인 성공
- 로그인 실패
- 키 인증 성공/실패
- root 로그인 시도
- 포워딩 요청
- 세션 종료
- 연결 끊김
- 재키잉(rekey)
- 인증서 만료
예시
journalctl -u sshd --since "today"
grep "Failed password" /var/log/auth.log
grep "Accepted publickey" /var/log/auth.log
PAM 로그
PAM을 사용하는 경우 MFA, 계정 정책, 세션 제어가 기록됩니다.
확인 포인트
- 계정 잠금
- 2차 인증 실패
- 접근 정책 위반
- 세션 오픈/클로즈
auditd / Linux Audit 로그
SSH 자체가 아니라 SSH 후 수행된 명령과 파일 변경 추적에 중요합니다.
추적 대상
- sudo 사용
- 쉘 실행
- 계정 생성/변경
- 키 파일 변경
- SSH 설정 변경
- 특정 디렉터리 접근
예
auditctl -w /etc/ssh/sshd_config -p wa -k sshd_config_change
auditctl -w /home -p wa -k home_changes
auditctl -w /root/.ssh -p wa -k root_ssh
EDR / XDR 로그
EDR이 있으면 SSH 접속 자체보다 접속 이후 행위를 보는 것이 중요합니다.
예시 탐지 대상
- bash, zsh, sh 실행
- curl/wget/nc/socat 사용
- 비정상 파일 전송
- 권한 상승
- 크리덴셜 덤프 시도
- 백도어 설치
- 비정상 장기 세션
네트워크 로그
방화벽, NDR, NetFlow, 프록시, IDS/IPS에서 다음을 봅니다.
- 22/tcp 접속량 증가
- 해외 IP에서 관리자 서버 접속
- 특정 시간대 대량 로그인 실패
- 다수 서버로의 순차 접속
- 비표준 포트 사용
- SSH 터널로 인한 내부 서비스 접근
SSH 로그에서 꼭 봐야 할 핵심 필드
실제로 운영할 때는 아래 항목을 묶어 봐야 합니다.
- 시각
- 소스 IP
- 목적 서버
- 사용자명
- 인증 방식
- 성공/실패
- 세션 ID
- 포트포워딩 여부
- 접속 지속 시간
- 세션 중 sudo 사용 여부
- 파일 전송 여부
- 명령 실행 여부
자주 보는 로그 예시
Accepted publickey for admin from 10.0.1.23 port 54211 ssh2: ED25519 SHA256:...
Failed publickey for root from 203.0.113.10 port 60022 ssh2
Invalid user test from 198.51.100.15 port 44554
pam_unix(sshd:session): session opened for user admin by (uid=0)
SSH 모니터링 지표
보안 모니터링은 “이벤트”와 “지표”를 같이 봐야 합니다.
인증 관련 지표
- 시간당 로그인 실패 수
- 사용자별 실패 비율
- IP별 실패 비율
- root 로그인 시도 수
- 키 인증 실패 수
- MFA 실패 수
세션 관련 지표
- 평균 세션 길이
- 야간 접속 비율
- 서버별 접속 빈도
- 점프서버 경유율
- 동시 접속 수
- 포트포워딩 사용률
운영 보안 지표
- 신규 SSH 키 등록 건수
- 기존 키 삭제/교체 건수
sshd_config변경 건수- root 직접 로그인 차단 여부
- 허용되지 않은 계정의 SSH 접속 시도 수
SSH 이상행위 탐지 시나리오
아래는 실무에서 매우 중요한 탐지 포인트입니다.
무차별 대입 공격
특징
- 같은 IP 또는 다수 IP에서 실패 반복
- 짧은 시간에 많은 사용자명 시도
Invalid user가 자주 보임
탐지 예시
- 5분 내 실패 10회 이상
- 1개 IP에서 다수 사용자에 대해 실패
- root 계정 실패 반복
계정 탈취 후 정상 로그인처럼 보이는 공격
특징
- 성공 로그는 정상처럼 보임
- 하지만 평소와 다른 시간, 다른 국가, 다른 서버, 다른 명령을 사용
- 처음 보는 키 또는 새 IP 사용
탐지 포인트
- 신규 호스트에서 첫 접속
- 평소 사용하지 않는 시간대 접속
- 지리적으로 비정상적인 접속
- 같은 계정이 여러 서버에 급격히 확산
포트포워딩을 이용한 내부망 우회
특징
- SSH 접속은 정상
- 하지만 터널링으로 내부 DB, Redis, Kubernetes API 등에 접근
탐지 포인트
-L,-R,-D사용 흔적- sshd 로그의 port forwarding request
- 내부 서버로의 비정상 연결 증감
- 비인가 포트로 접근하는 트래픽
키 유출 및 지속성 확보
특징
- 공격자가 공개키를
authorized_keys에 추가 - 백업용 계정에 키를 심음
- 관리자가 모르는 새 키가 등록됨
탐지 포인트
.ssh/authorized_keys변경- 새 키 등록 이후 외부 접속 성공
- 장기간 접속 패턴 유지
- 특정 키 fingerprint 반복 사용
root 직접 로그인
특징
- 운영상 금지되어야 함
- 직접 로그인은 사고 시 추적성이 나쁨
탐지 포인트
Accepted publickey for rootAccepted password for root- root 접속 횟수 증가
SSH 후 수상한 쉘 행위
특징
- 접속 직후
curl,wget,nc,bash -c실행 - 의심스러운 바이너리 다운로드
- cron/systemd/persistence 설정
/tmp,/dev/shm활용
탐지 포인트
- 명령행 감사
- EDR 프로세스 트리
- 파일 생성/권한변경
- 외부 통신
탐지 규칙 예시
아래는 SIEM/EDR에서 활용할 수 있는 형태의 예시입니다.
실패 로그인 급증
로직
- 동일 IP에서 5분간 실패 10회 이상
- 또는 동일 계정에서 5분간 실패 5회 이상
의미
- brute force, password spraying 가능성
root 로그인 성공
로직
Accepted * for root- 중요 서버에서 root 직접 로그인 발생 시 경보
신규 IP에서 관리자 계정 로그인
로직
- 과거 30일 기준 처음 보는 IP
- 평소 국가와 다른 지역
- 야간 로그인
SSH 키 파일 변경
로직
/home/*/.ssh/authorized_keys변경 감지/root/.ssh/authorized_keys변경 감지- 새 파일 생성, 권한 변경, 소유자 변경
비정상 포트포워딩
로직
- 포트포워딩 요청 허용 서버 외에서 발생
-Rreverse tunnel- dynamic SOCKS tunneling
- 특정 사용자에게 허용되지 않은 forwarding
로그 분석 실무 예시
실패 로그인 확인
grep "Failed password" /var/log/auth.log | tail -n 50
grep "Invalid user" /var/log/auth.log | tail -n 50
성공 로그인 확인
grep "Accepted publickey" /var/log/auth.log | tail -n 50
grep "Accepted password" /var/log/auth.log | tail -n 50
root 로그인 확인
grep "for root" /var/log/auth.log
특정 IP 추적
grep "203.0.113.10" /var/log/auth.log
SSH 세션 관련 로그
journalctl -u sshd --since "2026-03-18" | less
SSH 접속 제어 예시 설정
운영에서 자주 쓰는 sshd_config 예시입니다.
Port 22
Protocol 2
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication yes
AllowUsers alice bob
AllowGroups ssh-admins
X11Forwarding no
AllowTcpForwarding no
PermitTunnel no
GatewayPorts no
ClientAliveInterval 300
ClientAliveCountMax 2
LogLevel VERBOSE
설명
PermitRootLogin no: root 직접 로그인 차단PasswordAuthentication no: 비밀번호 로그인 차단LogLevel VERBOSE: 키 fingerprint 등 더 자세히 로깅AllowTcpForwarding no: 터널링 제한ClientAlive*: 유휴 세션 정리
SSH 클라이언트 측 운영 예시
관리자 단말에서도 표준화가 필요합니다.
~/.ssh/config 예시
Host bastion
HostName bastion.example.com
User admin
IdentityFile ~/.ssh/id_ed25519_admin
ServerAliveInterval 60
Host internal-*
User admin
ProxyJump bastion
IdentityFile ~/.ssh/id_ed25519_admin
장점
- 점프서버 경유가 표준화됨
- 실수로 직접 접속하는 것을 줄임
- 운영 일관성 확보
접속 기록 남기기
운영자가 직접 로컬에서 어떤 서버에 접속했는지도 남겨야 합니다.
예
script -a ~/ssh-session.log
ssh internal-db-01
또는 tmux, tlog, audit 연동을 고려할 수 있습니다.
중앙 모니터링 아키텍처
실무에서는 보통 아래 구조가 좋습니다.
수집 계층
- 서버:
sshd로그 - OS 감사:
auditd - 네트워크: 방화벽/NetFlow/NDR
- EDR: 프로세스/파일/행위
- 점프서버: 세션 녹화
- PAM/IdP: 인증 이력
집계 계층
- syslog
- Fluent Bit / Filebeat
- Kafka
- SIEM(Elastic, Splunk, Chronicle 등)
분석 계층
- 룰 기반 탐지
- UEBA
- 기준선 비교
- 위험도 스코어링
대응 계층
- Slack/메일 알림
- 계정 잠금
- IP 차단
- 세션 종료
- 키 폐기
- 티켓 자동 생성
운영 점검 체크리스트
아래는 SSH 보안점검 때 자주 보는 항목입니다.
기본
- root 직접 로그인 금지 여부
- 비밀번호 로그인 비활성화 여부
- 강한 키 알고리즘 사용 여부
- 오래된 키/약한 키 제거 여부
- 포트포워딩 허용 정책 명확성
- 점프서버 경유 여부
계정
- 공유 계정 존재 여부
- 퇴사자 계정 회수 여부
- 서비스 계정의 SSH 사용 필요성 검토
- 특권 계정 MFA 적용 여부
로그
- 성공/실패 로그 모두 수집되는지
- 키 fingerprint가 남는지
- 로그 보존 기간이 충분한지
- 중앙 SIEM으로 연동되는지
- 시간 동기화(NTP)가 맞는지
모니터링
- brute force 탐지
- root 로그인 탐지
- 신규 IP 접속 탐지
- authorized_keys 변경 탐지
- 비인가 포워딩 탐지
- 장시간 세션 탐지
대응
- 계정 잠금 절차
- 키 폐기 절차
- 서버 격리 절차
- 세션 강제 종료 절차
- 감사 증적 보존 절차
사고 대응 관점의 SSH 조사 방법
침해사고가 의심되면 다음 순서로 보면 좋습니다.
1단계: 접속 이력 확인
- 어떤 계정이 언제 접속했는가
- 어떤 IP에서 접속했는가
- 어떤 인증 방식이었는가
2단계: 세션 이후 행위 확인
sudo사용 여부- 파일 생성/변경 여부
- 다운로드/실행 여부
- 계정 추가 여부
- 키 추가 여부
3단계: 지속성 확인
authorized_keys수정cron,systemd,rc.local변경- 새 사용자 생성
- 백도어 계정 생성
4단계: 횡적 이동 확인
- 같은 계정으로 다른 서버 접속
- 점프서버를 통한 확산
- 내부망 포트포워딩 흔적
5단계: 차단
- 계정 비활성화
- 키 철회
- IP 차단
- 세션 종료
- 서버 격리
실무에서 자주 놓치는 부분
SSH 자체만 보고 끝내는 것
SSH 성공 로그만 보면 부족합니다.
접속 이후 명령, 파일, 권한 변화까지 봐야 합니다.
shared account 사용
공유 계정은 추적성을 무너뜨립니다.
반드시 개인 계정과 sudo 위임으로 바꿔야 합니다.
키 회전 미흡
오래된 키가 남아 있으면 퇴사자/외주자 계정이 살아 있을 수 있습니다.
점프서버 미감사
점프서버가 있으면 안전할 것 같지만,
실제로는 점프서버가 가장 중요한 감시 포인트입니다.
포워딩 과소평가
SSH는 원격 쉘만이 아닙니다.-L, -R, -D는 사실상 내부망 우회 채널이 될 수 있습니다.
보안용 권장 표준
아래처럼 운영 표준을 두면 관리가 쉬워집니다.
필수 표준
- 개인별 계정 사용
- root 직접 로그인 금지
- 비밀번호 로그인 제한
- 키 기반 + MFA 우선
- 점프서버 통해서만 운영망 접근
- 세션 로그 중앙 수집
- 명령/파일 변경 추적
- 포워딩 통제
- 키 정기 회전
- 비정상 접속 알림 자동화
간단한 예시 운영 시나리오
시나리오 A: 운영자가 서버에 접속
- VPN 접속
- 배스천 로그인
- 내부 서버로 ProxyJump 접속
- sudo 승인 후 작업
- 세션 로그와 audit 로그 중앙 저장
- 작업 종료 후 세션 자동 종료
시나리오 B: 의심스러운 외부 접속
- SIEM에서 신규 IP 접속 알림
- root 또는 관리자 계정 여부 확인
- 실패/성공 이력과 직전 명령 확인
- 포워딩 여부 점검
- 필요 시 계정/키 비활성화
- 서버 격리 및 포렌식 착수
현업에서 바로 쓰는 핵심 요약
운영
- SSH는 편의 기능이 아니라 특권 접근 통로
- 개인 계정, 키 기반, MFA, 점프서버가 기본
- 포워딩과 root 로그인은 강하게 통제
탐지
- 실패 로그인 폭증
- 신규 IP/국가/시간대 접속
- root 로그인
- authorized_keys 변경
- 포워딩 사용
- SSH 이후 비정상 쉘 행위
로그
- sshd 로그만 보지 말고 auditd, PAM, EDR, 네트워크 로그를 함께 봐야 함
- 세션 시작/종료뿐 아니라 세션 중 행위가 중요
대응
- 계정 잠금
- 키 폐기
- 세션 종료
- IP 차단
- 서버 격리
- 포렌식 보존
댓글