Windows RDP의 Brute Force 공격 방어에 대해 얘기해 본다.
이 글대로 적용 시 RDP 무차별 대입 공격(Brute Force)으로 인한 해킹을 100% 막아낼 수 있다.
본론부터 보고 싶으면 목차의 'OpenSSH Tunnel 세팅' 부분부터 보기 바란다.
목차
RDP 취약점
Windows 원격 제어를 위해 RDP 포트를 외부 IP에 노출하면 Brute Force 공격에 매우 취약하다.
기본 포트 번호인 3389에서 다른 번호로 변경해도 시간이 조금 더 걸릴 뿐 결국엔 노출되어 공격 받게 된다.
RDP 취약점 방어 방법
방법은 내가 아는 선에서는 아래와 같다.
- Source IP 제한하기
- 네트워크 방화벽, Windows 자체 방화벽 등에서 접근 IP를 제한한다.
- Fail2Ban 프로그램을 이용하여 침입 탐지 IP 제한하기.
- VPN 이용하기
- VPN 사설 IP 대역을 통해서만 접근 가능하도록 구성
- MFA 적용
- RDP G/W나 Multi-Factor Authentication와 같은 2차 인증 시스템을 구성
- SSH 터널링 적용
- openssh의 ssh tunnel 기능을 활용
이 포스팅에서는 마지막 방법에 대해 알아본다.
해당 방법은 무료이면서 매우 강력한 방어력을 가지고 있다.
Brute Force 공격 상황 파악
RDP 연결 시 아래와 같은 메시지와 함께 연결이 되지 않는 경우가 있는데 이는 Brute Force 공격이 원인일 경우가 있다.
- 내부 오류가 발생했습니다.
- 원격 데스크톱 서비스 세션이 종료되었습니다. 네트워크 관리자가 연결을 종료했을 수 있습니다. 다시 연결하거나 기술 지원팀에 문의하여 도움을 받으세요.
콘솔을 통해 세션 상태를 확인해 보면,
Brute Force 공격이 가해질 경우 SYN_RECEIVED 세션들이 확인되는데 Source IP를 조회해보면 중국/러시아 등의 해외 IP가 확인된다.
IP 출처는 아래 사이트에서 확인해보면 된다.
OpenSSH Tunnel 세팅
Server / Clinet에서 준비물은 크게 2가지다.
-
- Server (RDP 서버)
- OpenSSH Server
- Client (RDP 클라이언트)
- Putty 프로그램
- Server (RDP 서버)
- * 참고. RDP 셋업(3389 포트 Listen)은 사전에 되어있다는 전제로 설명을 진행한다.
OpenSSH Server 구성
Where : RDP 서버
-
OpenSSH Server 설치
- Windows 10 / 11, Windows Server 2019 / 2022
SSH 서버 설치하기
*2024.10월에 내용 추가
Windows Update와 함께 OpenSSH가 버전업 되면서 이 블로그에서 언급된 putty 버전으로는 ssh 연결이 안되게 되었다. 해결하는 방법은 2가지가 있다.
1) Windows 기본 제공 OpenSSH를 제거 후 OpenSSH 8.1.0.0 버전을 github에서 구해서 수동 설치
(만약 기존에 키를 만들었었다면, 기존 ssh key는 그대로 사용 가능)## OpenSSH-Win64.zip 압축해제 후 아래와 같이 명령 수행- sshd 인스톨
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1- 방화벽에 ssh port 22 allow 적용
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22- sshd 데몬 시작
net start sshd- sshd 데몬 서비스 등록 (부팅시 자동 시작)
Set-Service sshd -StartupType Automatic2) Putty 를 최신 버전 (8.x 버전)으로 사용
-> 둘 중 하나를 선택하여 해결하면 되나 현재 시점에서 putty 최신 버전으로는 putty tray 적용이 안되어 본인은 1번 안을 선택 적용
- Windows Server 2016 이하 / Windows 8.1 이하 버전
- Win32-OpenSSH (github.com) 에서 v7.7.1.0p1-Beta (OpenSSH-Win32.zip) 다운로드
(최신 버전이 아닌 v7.7.1.0p1-Beta 구 버전 사용할 것. 그렇지 않으면 HPutty p0.66-t027-h004 버전에서 ssh 접속 시 인증서 에러 발생. 최신 sshd와 최신 putty의 조합으로는 문제가 없지만 해당 포스팅에 첨부된 HPutty p0.66-t027-h004 를 사용하기 위해서 임.)
(오리지널 putty를 사용하지 않고 HPutty를 사용하는 이유 - Session 정보를 파일 형태로 저장할 수 있고, ssh 창을 Tray 아이콘으로 내릴 수 있어서 임) - OpenSSH-Win32.zip C:\Program Files (x86) 폴더에 위치 시켜서 압축을 푼다.
(반드시 C:\Program Files (x86) 폴더에 위치. 그렇지 않으면 권한 문제로 ssh 접속 시 Connection reset by 에러 발생 ) - cmd 창을 띄우고 OpenSSH-Win32 폴더로 이동하여 아래와 같은 명령 수행하여 sshd 설치
C:\Program Files (x86)\OpenSSH-Win32>powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1 - opensshd 실행
컴퓨터 관리 - 서비스 및 응용프로그램 - 서비스 - OpenSSH SSH Server (자동, 시작), OpenSSH Authentication Agent (자동, 시작)
또는 cmd 창에서 'Set-Service sshd -StartupType Automatic' 입력 후 'net start sshd' 입력 - 방화벽 설정
윈도우 설정 - 방화벽(검색) - 고급 설정 - 인바운드 규칙 - 새 규칙… - 포트 선택 - 특정 로컬 포트 : 22 - 연결 허용 선택 - 도메인/개인/공용 체크 - 이름: openssh - 마침
또는 cmd 창에서 아래와 같이 입력New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
- Win32-OpenSSH (github.com) 에서 v7.7.1.0p1-Beta (OpenSSH-Win32.zip) 다운로드
- Windows 10 / 11, Windows Server 2019 / 2022
- SSH 포트포워드 설정
OpenSSH Server 환경 세팅
Where : RDP 서버
- Windows 공통
- C:\ProgramData\ssh\sshd_config 설정
메모장으로 sshd_config 파일을 열고 맨 아래 2 줄을 주석 처리하고 5줄을 삽입 후 저장#Match Group administrators (주석처리) # AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys (주석처리) PasswordAuthentication no TCPKeepAlive yes ClientAliveInterval 300 ClientAliveCountMax 3 PermitTunnel yes
- sshd 재시작
- 컴퓨터 관리 - 서비스 및 응용프로그램 - 서비스 - OpenSSH SSH Server (중지, 시작)
또는 CMD 창에서 아래와 같이 수행net stop sshd net start sshd
- 컴퓨터 관리 - 서비스 및 응용프로그램 - 서비스 - OpenSSH SSH Server (중지, 시작)
- C:\ProgramData\ssh\sshd_config 설정
OpenSSH Client 구성
Where : RDP 클라이언트
- putty client 다운로드
- 다운로드 하기 (클릭)
* 안내. 바로 위 mypc-rdp.zip 파일을 다운로드하고 적절한 곳에 압축 해제.
압축을 해제하면 mypc-rdp 폴더가 생성됨. (폴더 미 생성 시 mypc-rdp 폴더를 만들고 압축 해제된 파일들을 위치 시킬 것)
* 안내. 폴더 안에 putty.exe 파일, keys 폴더, sessions 폴더, 기타 rdp 연결을 위한 스크립트 파일이 존재
이 포스트 내용대로 따라하면 연결이 되도록 사전 셋업 됨. (최적의 값으로 ssh 설정 튜닝이 되어 있음)
- 다운로드 하기 (클릭)
- SSH Key 생성 (Public / Private)
- Putty 실행 - Keygen - Generate
- 키 생성
화면(박스) 안에서 마우스 커서를 움직이면 키 생성이 진행된다. - 키 복사 / 저장
1. Public Key 메모장에 복사/붙여넣기 (파란색 박스 부분)
* 주의. ssh-rsa 부터 rsa-key-202XXXXXX 부분까지 스크롤하여 복사하여 메모장에 붙여넣기 (창이 작아 잘려있음. 스크롤 필요)
2. Key 저장 (빨간색 부분)
1) Save public key - 파일 이름 : mypc-pub (파일 위치 : mypc-rdp 폴더 내의 keys 폴더)
2) Save private key - (y) 누름 - 파일 이름 : mypc-pri (파일 위치 : mypc-rdp 폴더 내의 keys 폴더)
*주의. 파일명을 위와 같이 지정해야 함. (putty session 정보에 사전 정의함)
SSH Public 키 저장
Where : RDP 서버
- cmd 창에서 계정 홈 폴더로 접근 후 .ssh 폴더 생성
C:\Users\myuser> mkdir .ssh - authorized_keys 파일에 ssh pubic key 내용 저장
1) 메모장을 열고 위에서 복사해 둔 내용(파란박스 부분)을 붙여넣는다.
2) authorized_keys 파일이름으로 C:\Users\myuser\.ssh 폴더 내에 저장
Putty 설정 수정
Where : RDP 클라이언트
- putty 실행 / 설정 변경
RDP 연결
Where : RDP 클라이언트
- mypc-m 실행
- mypc-rdp 압축 보관
- 위 절차까지 진행 후 mypc-rdp 폴더를 zip으로 압축 후 이메일이나 클라우드 저장소에 보관
- rdp 클라이언트가 변경될 때 해당 zip 파일을 다운로드 후 mypc-m를 실행하여 사용하면 편리하게 사용 가능하다.
RDP 보안 강화
Where : RDP 서버
- RDP 연결을 localhost만 허용하기
선택 사항이긴 하지만 적용 시 보안상 좋다.! 주의
방화벽 설정을 잘 못 하면 RDP 연결이 끊어지고 접속이 안될 수 있으므로 콘솔 접속 경로를 미리 확보 후 작업할 것.
→ Windows 방화벽 인바운드 규칙 (RDP/TCP)에 대해 127.0.0.1 ip로만 접근 허용 룰 추가하기.
→ 같은 네트워크에 있는 rdp 클라이언트도 접근을 못하게 막는다.
즉, RDP 서버 외부에서는 ssh tunnel을 통해서만 접근이 가능하도록 제한하였다.
→ 또한 sshd_config에서 'PasswordAuthentication no' 옵션을 적용하였기 때문에 ssh의 password 방식 접속은 허용 불가다.
따라서 보안이 매우 뛰어나며, 만약 ssh private 키가 유출되어도 ssh 접근까지는 되지만 rdp 연결은 비번을 모르면 접근을 못한다.
(키 유출을 감안하여 윈도우 rdp 서버에서 관리자 권한이 빠진 ssh 전용 계정을 생성하여 해당 계정으로 ssh 연결을 하는 방법도 있다.)
AS-IS / TO-BE 비교
- 기존
→ 기존에는 Password 방식만 사용
Brute Force 공격에 매우 취약 - 개선
개선 후 3중 보안이 적용됨
> ① : SSH Key를 통해 터널링 세션을 만들 수 있음
> ② : SSH 터널을 통해서만 RDP 커넥션 가능
> ③ : RDP는 localhost (127.0.0.1)를 통해서만 연결 가능
결론, 개선 후에는 ssh key가 없는 이상 inboud 루트로의 rdp 접속은 거의 불가능하다.