요약
서버에서 누가 SSH로 접속해 있는지 빠르게 확인하려면 여러 표준 유틸리티를 사용할 수 있습니다. 이 문서에서는 who, w, ps, netstat, ss, last 등 여러 방법의 사용법, 장단점, 운영자용 체크리스트와 보안 권장사항을 정리합니다.
만약 당신이 리눅스 시스템 관리자이고 서버 관리를 담당한다면, 활성 SSH 연결 수와 접속 출처를 알아야 할 때가 자주 있습니다. 리눅스에는 서버의 활성 SSH 연결을 찾을 수 있는 여러 명령과 도구가 있습니다.
이 튜토리얼에서는 리눅스에서 다양한 방법으로 활성 SSH 연결을 찾는 방법을 설명합니다.
전제 조건
- 리눅스 운영체제가 실행 중인 서버
- 해당 서버에 대한 루트(root) 또는 동등한 권한
who 명령으로 활성 SSH 연결 찾기
who는 현재 서버에 로그인한 사용자의 목록을 출력하는 기본 명령입니다. 터미널에서 다음을 실행하세요:
who
예시 출력:
root pts/0 2020-05-01 02:37 (27.61.161.61)
root pts/1 2020-05-01 02:39 (45.58.38.21)
이 출력에서 두 개의 활성 SSH 연결이 있고, 각각 클라이언트 IP는 27.61.161.61과 45.58.38.21임을 알 수 있습니다.
중요: who는 로그인 세션 정보만 보여주므로 짧게 접속했다 끊긴 세션이나 비표준 포트를 사용하는 일부 연결은 보이지 않을 수 있습니다.
w 명령으로 활성 SSH 연결 찾기
w는 who보다 더 많은 정보를 제공하는 도구로, 로그인한 사용자들의 현재 활동과 실행 중인 프로세스 정보를 보여줍니다. 실행:
w
예시 출력:
02:40:07 up 1 day, 18:35, 2 users, load average: 0.02, 0.02, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 27.61.161.61 02:37 1.00s 0.04s 0.01s ssh [email protected]
root pts/1 45.58.38.21 02:39 1.00s 0.02s 0.00s w
w는 idle 시간, 접속한 호스트, 로그인 시간, 시스템 부하와 각 세션에서 실행 중인 프로세스를 보여주므로 세션 활동을 빠르게 파악할 때 유용합니다.
ps 명령으로 활성 SSH 연결 찾기
ps 명령은 활성 SSH 세션 관련 프로세스를 보여주며, 각 연결의 PID(프로세스 ID)를 확인할 수 있습니다. 다음을 실행하세요:
ps auxwww | grep sshd: | grep -v grep
예시 출력:
root 609 0.0 0.1 12160 7268 ? Ss Apr29 0:01 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 35532 0.0 0.2 13864 8796 ? Ss 02:37 0:00 sshd: root@pts/0
root 35669 0.0 0.2 13860 8916 ? Ss 02:38 0:00 sshd: root@pts/1
ps를 사용하면 연결과 연관된 프로세스를 직접 확인하고 필요 시 특정 PID를 종료하거나 조사할 수 있습니다.
netstat 명령으로 활성 SSH 연결 찾기
netstat은 원격 호스트에서 서버로 들어오는 활성(ESTABLISHED) SSH 연결을 보여줄 수 있습니다. 실행:
netstat -tnpa | grep 'ESTABLISHED.*sshd'
예시 출력:
tcp 0 88 45.58.38.21:22 27.61.161.61:8363 ESTABLISHED 35532/sshd: root@pt
tcp 0 0 45.58.38.21:22 45.58.38.21:51166 ESTABLISHED 35669/sshd: root@pt
netstat은 소스/목적지 IP와 포트, 상태, 프로세스 ID를 함께 보여주므로 네트워크 관점의 조사를 할 때 유용합니다. 참고: 최신 배포판에서는 netstat이 비활성화되어 있을 수 있으며 ss를 권장합니다.
last 명령으로 활성 SSH 연결 찾기
last는 /var/log/wtmp 파일에 기록된 로그인/로그아웃 기록을 표시합니다. 현재 “still logged in” 상태인 세션을 필터링하면 활성 연결을 찾을 수 있습니다. 실행:
last -a | grep -i still
예시 출력:
root pts/1 Fri May 1 02:39 still logged in 45.58.38.21
root pts/0 Fri May 1 02:37 still logged in 27.61.161.61
reboot system boot Wed Apr 29 08:04 still running 5.4.0-26-generic
last는 로그인 기록을 기반으로 하므로 과거 추적과 현재 상태를 함께 확인할 때 유용합니다.
ss 명령으로 활성 SSH 연결 찾기
ss는 netstat의 현대적 대안으로 더 많은 정보를 빠르게 제공합니다. grep과 함께 사용하여 ssh 관련 연결만 필터링할 수 있습니다. 실행:
ss | grep -i ssh
예시 출력:
tcp ESTAB 0 0 45.58.38.21:51166 45.58.38.21:ssh
tcp ESTAB 0 56 45.58.38.21:ssh 27.61.161.61:8363
tcp ESTAB 0 0 45.58.38.21:ssh 45.58.38.21:51166
ss는 대규모 연결을 빠르게 검사할 때 적합하며 netstat보다 기본적으로 설치되어 있는 경우가 많습니다.
빠른 요약(체크리스트 및 치트시트)
- 누가 로그인했나 빠르게 확인: who
- 활동/프로세스 확인: w
- SSH 관련 프로세스 PID 확인: ps (예: ps auxwww | grep sshd:)
- 네트워크 레벨 연결 확인: ss 또는 netstat
- 로그인 기록 확인: last
치트시트(자주 쓰는 명령):
목적 | 명령 예시 |
---|---|
현재 로그인 사용자 | who |
활동/프로세스 확인 | w |
| sshd 관련 프로세스 | ps auxwww | grep sshd: | grep -v grep | | 네트워크 연결(빠름) | ss | grep -i ssh | | 네트워크 연결(netstat 방식) | netstat -tnpa | grep ‘ESTABLISHED.*sshd’ | | 로그인 기록에서 활성 세션 | last -a | grep -i still |
운영자용 점검 체크리스트
- IP가 낯선가? 방화벽/로그를 확인하고 필요 시 차단
- 동일한 계정에서 다수의 동시 접속이 있는가? 정책 검토
- 의심스러운 프로세스(PID)가 연결과 연관되어 있는가? ps로 PID 확인 후 lsof/journalctl 조사
- 인증 실패 기록은? /var/log/auth.log 또는 journalctl -u sshd 확인
- SSH 버전과 설정(포트, PermitRootLogin, PasswordAuthentication)을 점검
문제 발생 시: 언제 이 방법들이 실패하는가
- who/w는 로컬 로그인 기록을 기반으로 하므로 어떤 세션은 보이지 않을 수 있음(예: 비표준 세션 관리).
- netstat가 설치되어 있지 않거나 권한 부족으로 프로세스 식별을 못 할 수 있음.
- ps로는 이미 종료된 세션 또는 스레드 정보를 놓칠 수 있음.
- 로그 파일이 순환(logrotate)되어 오래된 정보가 사라졌을 수 있음.
해결 힌트: 여러 툴을 조합해서 교차검증(예: ss + ps + journalctl).
대안 및 확장 방법
- auditd 기반 감사: SSH 인증/세션 이벤트를 심층적으로 기록할 수 있음(규정 준수 필요 시 권장).
- journalctl -u sshd: systemd 기반 시스템에서 sshd 관련 로그 확인.
- lsof -i @HOST: 특정 포트/소켓을 연 프로세스 확인.
- 중앙 로그 수집(예: ELK, Graylog)으로 장기 추적 및 경보 설정.
보안 및 감사 권장사항
- root 직접 로그인을 비활성화하고, 공개키 인증(Public Key)만 허용하는 것을 고려하세요.
- 비밀번호 인증은 가능하면 비활성화하고, Fail2ban 같은 도구로 반복 로그인 시도를 차단하세요.
- SSH 접속 기록은 중앙 로그 서버로 전송하여 장기 보존 및 상관분석을 수행하세요.
- 정기적으로 허가된 공개키 목록을 검토하고 불필요한 계정을 삭제하세요.
간단 용어집
- SSH: 암호화된 원격 셸 프로토콜
- PID: 프로세스 ID
- ESTABLISHED: TCP 연결이 성립된 상태
- wtmp: 로그인/로그아웃 기록을 저장하는 바이너리 파일(/var/log/wtmp)
운영자용 간단 SOP: 의심스러운 SSH 세션 조사 흐름
- ss 또는 netstat로 현재 연결 확인(원격 IP, 포트, 프로세스 정보 수집)
- ps로 연관 PID 확인
- lsof, journalctl, /var/log/auth.log로 해당 PID/시간대 활동 확인
- 필요 시 해당 세션 강제 종료(예: kill
) 및 방화벽 차단 - 사건 기록 및 중앙 로그에 사건 알림 등록
flowchart TD
A[의심스러운 접속 보고] --> B{접속 확인}
B -->|활성| C[PID 및 프로세스 확인]
B -->|미활성| D[로그 기록 수집]
C --> E{악성 여부}
E -->|예| F[세션 종료 및 IP 차단]
E -->|아니오| G[모니터링 계속]
D --> G
결론
이 가이드에서는 who, w, ps, netstat, ss, last 등의 도구로 리눅스 서버의 활성 SSH 연결을 확인하는 여러 방법을 다뤘습니다. 운영 환경에서는 단일 도구에 의존하지 말고 네트워크/프로세스/로그 관점에서 복수의 도구로 교차검증하는 것이 안전합니다.
중요: 로그를 중앙에 보관하고, 강력한 인증 정책(공개키, 비밀번호 비활성화)과 자동 차단 도구를 함께 사용하면 SSH 관련 사고를 크게 줄일 수 있습니다.