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 출처는 아래 사이트에서 확인해보면 된다.

http://whois.nida.or.kr

 

OpenSSH Tunnel 세팅

Server / Clinet에서 준비물은 크게 2가지다.

    • Server (RDP 서버)
      • OpenSSH Server
    • Client (RDP 클라이언트)
      • Putty 프로그램
    * 참고. RDP 셋업(3389 포트 Listen)은 사전에 되어있다는 전제로 설명을 진행한다.

OpenSSH Server 구성

Where : RDP 서버

  • OpenSSH Server 설치
    • Windows 10 / 11, Windows Server 2019 / 2022
    • 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
  • SSH 포트포워드 설정
    • 공유기(또는 방화벽)에서 포트 포워드 설정을 한다.
      예) 
              외부 포트를 기본 openssh 포트 22번 그대로 외부에 노출하여도 되지만 여기서는 5800으로 변경하였다.

 

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 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 실행 / 설정 변경

    • → myuser_mypc를 선택 후 Load (빨간 박스)
      → 파란 박스 부분의 정보를 자신의 환경에 맞게 수정 (windows 계정 / ssh 주소 / 포트)
      → 수정 후 myuser_mypc가 선택된 상태에서 Save 하고 프로그램을 닫는다.

 

RDP 연결

Where : RDP 클라이언트

  • mypc-m 실행

    • → 왼쪽 창은 putty 를 통한 ssh 연결 창이다.
      → 오른쪽 창. 최초 실행 시 키 저장을 위한 창이 뜬다. Y를 눌러준다.
    • Y를 누르면 ssh연결과 함께 tunnel이 형성되고 localhost로 rdp 접속을 한다.
      (만약 rdp 로그인 창이 안뜨면 mypc-m 파일을 다시 실행해 준다.)

      → Windows 계정 정보를 입력하고 RDP 연결을 하면 된다.
  • 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 접속은 거의 불가능하다.

참고 : RDP connecting via ssh tunnel – mapoo's blog

 

RDP Connecting via SSH Tunnel [2]

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다