반응형

최근에 꾸리기 시작한 홈서버 말고 간단한 작업용 + api서버용으로 사용하는 소형 PC가 있는데, 얼마전부터 자꾸 느려지고 꺼지는 현상이 발생했다. 그냥 그러려니 하고 넘어갔는데.. 최근에 보안에 조금 (아주 조금)관심을 갖게 되면서 이벤트 로그를 봤더니 연말부터 이상한곳에서 로그인을 시도한 이력이 남아있다. 다행히 로그인은 못한 것 같은데, 불안하니 우선 포트를 한번 더 변경하고 접속시도 제한 수를 설정해놨고, SSH tunneling이란걸 설정해두기로 했다.

1. RDP 포트변경 (3389 -> xxxx) + 로그인 시도 횟수 제한

  • 포트변경 (레지스트리): HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber
  • 로그인 시도 제한 (그룹정책)

2. window OpenSSH 

SSH 터널링 설정을 하는 이유는 RDP 패킷이 모두 평문이고, 시작 패킷으로 걸러낼 수 있다는 것을 알게 되어서인데, 네트워크 관리자 (사내 보안 담당자)의 입장에서는 당연히 막아야 하는 것이지만 나의 경우엔 해당 패킷을 검출해서 혹시라도 해킹이 있을까봐 (개인컴퓨터에 누가 해킹하겠냐만...) SSH 터널을 통해 RDP 패킷이 전송되도록 하려 한다. 우선은 윈도에서 적용하고 그 위(Hyper-V)에 돌아가는 우분투에도 적용할 계획.

1) 윈도에 SSH 서버 설치 및 구동 테스트

우선 윈도 기능에서 제공하는 SSH 서버를 설치하자. 마이크로소프트 런에 3가지 방식이 있는데 난 윈도 기능추가로 했다. 윈도 기능추가에 시간이 오래걸려서 이런저런거 찾아보다 openSSH 깃헙을 참고하라고 해놔서 대체 누군가 했더니, 마이크로소프트에 파워쉘 팀이 있었다. 누가 쓰나..? 내가쓰네

설치가 완료되면 poweshell을 관리자모드로 실행해서 아래 명령어를 입력하여 확인할 수 있다.

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

ssh 접속을 위해 유저네임 확인을 해야하는데, 나의 경우엔 마이크로소프트 계정 로그인으로 해놔서 그런가 유저네임 확인이 어려웠다. 환경변수의 USERNAME을 확인해야 하고, 마이크로소프트 계정 앞의 5글자(특문제외)가 되는 듯 하다.

Start-Service sshd -> SSH 서버 실행
$env:USERNAME -> 유저네임 출력 (확인)
ssh username@servername -> 접속요청, servername에 localhost, 아이피, 혹은 네트워크 상 컴퓨터 이름을 넣어도 됨.

접속 성공 시 아래 경로의 콘솔로 들어감.
username@컴퓨터이름 C:\Users\username>

2) SSH 포트 변경

SSH 기본포트인 22에서 다른 포트로 변경하자. 이 게시글을 참고했다. "C:\ProgramData\ssh\sshd_config" 파일의 "#Port 22" 구문의 #을 지우고 원하는 포트 숫자를 넣으면 된다. 관리자 권한이라도 바로 파일 수정은 안되고, 동일한 파일을 다른 위치에 생성 후 붙여넣는 방식으로 해야한다.
그리고 방화벽에 해당 포트 변경을 반영해줘야 한다. OpenSSH 설치 시 자동으로 SSH 기본 포트 (22)를 열어주는 규칙을 방화벽에 "OpenSSH Server (sshd)"라고 생성해주는데, 그걸 삭제하고 (변경이 안된다..) 새로 생성해야 한다.

  • 1) 아래 구문을 관리자권한으로 실행 된 PowerShell에 입력하거나 
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 새포트번호
  • 방화벽 설정에서 변경할 수 있다.
방화벽 – 고급 설정 – 인바운드 규칙 – 새 규칙

새포트 및 적용 파일 지정
실행파일 경로: %SystemRoot%\system32\OpenSSH\sshd.exe

변경한 포트로 접속할 때엔 뒤에 ssh 접속 시 "-p포트번호" 를 붙여주면 된다.

ssh username@servername -p포트번호

3. SSH 터널을 이용한 RDP 접속

SSH 설정까지 완료 했으니 이제 터널만 만들어주면 된다. SSH 터널을 통한 RDP 접속은 아래와 같은 구조를 갖는 것 같다. 기존에는 공개 네트워크 상에서 RDP 패킷이 오갔는데, 이제는 Secure Shell로 감싸진 통신으로 패킷이 오가는 상황이 된다.  

1) tunnel 만들기

SSH 접속 시 -L 인수를 넣어서 내부 포트를 서버와 이어주는 터널을 만들 수 있다. 요 페이지에서 자세히 설명해준다. (역시 갓구글)

-L [bind_address:]port:host:hostport

Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side. This works by allocating a socket to listen to port on the local side, optionally bound to the specified bind_address
. Whenever a connection is made to this port, the connection is forwarded over the secure channel, and a connection is made to host port hostport from the remote machine. Port forwardings can also be specified in the configuration file. IPv6 addresses can be specified by enclosing the address in square brackets. Only the superuser can forward privileged ports. By default, the local port is bound in accordance with the GatewayPorts setting. However, an explicit bind_address may be used to bind the connection to a specific address. The bind_address of “localhost” indicates that the listening port be bound for local use only, while an empty address or ‘*’ indicates that the port should be available from all interfaces.

즉, ssh 접속 시 아래와 같이 입력해주면 localhost와 host를 이어줄 수 있게 된다.

ssh username@servername -p포트번호 -L 내컴퓨터포트:서버ip(여기선 localhost):rdp포트

예)
ssh username@servername -p포트번호 -L 1111:localhost:rdp포트

2) tunnel을 통한 RDP (mstsc) 실행

이제는 아주 쉽다. 새로운 커맨드 창을 열고 mstsc를 실행만 하면 된다. (마소 글 참고)
위 1)과 같이, 내 컴퓨터에 포트를 1111로 지정했을 경우 아래 명령어를 입력하면 이전과 같이 접속하는 것 만으로 Secure Shell을 통한 RDP 접속이 이루어진다.

mstsc /v localhost:1111

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기