상세 컨텐츠

본문 제목

윈도우, 리눅스 서버 접속(ssh, rdp) 보안

Dev Type

by ai developer 2023. 6. 8. 15:18

본문

IT쪽 일을 하다 보니 랜섬웨어 감염이라는 끔찍한 일을 겪게 됐고 앞으로 이런 일이 발생하지 않도록 대응책을 찾게 됐다.

물론 애초에 클라우드 아키텍쳐를 보안이 좋도록 서버와 코드 구성 등 많은 부분을 고칠 수 있지만 현재 회사에서는 그런 시도를 자유롭게 할 수 없는 환경이기에 다른 방법들을 찾기 시작했다.

 

이 포스트에서는 윈도우 서버와 리눅스 서버의 접속 관련 보안 방법인 IP 접속 제한, 계정 접속 시도 횟수 설정, 방화벽 설정 등에 대해 알아본다.

우선 클라우드를 이용하고 있다면 클라우드의 우리 서버까지 도달하기까지 클라우드에서 운영중인 방화벽이 따로 존재한다.

이 방화벽은 경비원과 같은 역활을 한다. 우리 서버가 통신 시 항상 거치는 곳이기 때문에 통신을 제한할 수 있다.

서버로부터 나가는 통신, 서버로 들어오는 통신 등을 설정해 보안을 강화할 수 있다.(여기서 ip 통제) 

그리고 보통 이 방화벽을 클라우드 관제센터에서 모니터링하기 때문에 문제 발생도 잡아주기 때문에 좋다.(하지만 모든 클라우드에서 지원해주지는 않음)

우선 고성능의 윈도우 서버에 RDP 구성 시 OS 레벨에서의 접속 보안 방법에 대해 먼저 생각해 보자!

윈도우의 기본 RDP 접속 포트는 3389포트다. 그래서 해킹시도 시 가장 먼저 열려있는 포트를 확인하기 위해 시도해 보게 된다.

그렇기 때문에 남들이 알아차리기 힘든 RDP 접속 포트로 원격 데스크톱의 수신 대기 포트를 변경해 이런 시도를 무산시킬 수 있다.

 

레지스트리를 변경하여 수행할 수 있는데 아래와 같은 순서로 실행하면 된다.

  1. 레지스트리 편집기를 시작합니다. (검색 상자에 regedit을 입력합니다.)
  2. 다음 레지스트리 하위 키로 이동합니다. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
  3. PortNumber를 찾습니다.
  4. 편집 > 수정을 클릭하고 Decimal을 클릭합니다.
  5. 새 포트 번호를 입력하고 확인을 클릭합니다.
  6. 레지스트리 편집기를 닫고 컴퓨터를 다시 시작합니다.
  7. 방화벽을 사용하는 경우 새 포트 번호로의 연결을 허용하도록 방화벽을 구성해야 합니다.
Get-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp' -name "PortNumber"

예를 들어:다음 PowerShell 명령을 실행하여 RDP 포트를 확인할 수도 있습니다. 이 명령에서는 새 RDP 포트를 3390으로 지정합니다.

$portvalue = 3390

Set-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp' -name "PortNumber" -Value $portvalue

New-NetFirewallRule -DisplayName 'RDPPORTLatest-TCP-In' -Profile 'Public' -Direction Inbound -Action Allow -Protocol TCP -LocalPort $portvalue
New-NetFirewallRule -DisplayName 'RDPPORTLatest-UDP-In' -Profile 'Public' -Direction Inbound -Action Allow -Protocol UDP -LocalPort $portvalue

 

두번째 보안 방법으로 방화벽을 활용해 IP를 통제하는 방법이다. 그 방법은 아래와 같다.

  1. 서버 연결
  2. 방화벽 설정인바운드 규칙 클릭 → 오른쪽에서 원격 데스크톱 – 사용자 모드 (TCP-In) 규칙을 찾는다.
  3. 찾은 규칙에서 마우스 오른쪽 클릭해 속성 클릭, 범위 탭으로 가서 서버에 액세스하려는 IP 주소와 범위를 추가



세번째로 원격 엑세스에 사용하는 계정에 대해 접속 시도 실패 시에 잠금을 설정하는 방법이 있다.

만약 이 설정이 되어 있지 않다면 해커들은 수 많은 경우의 수를 모두 시도해 봐도 계정을 계속 사용할 수 있기 때문에 시간만 주어진다면 언젠가는 접속할 수 있게 된다.(패스워드 복잡도에 따라 그 시간이 큰 차이가 생김)

 

아무튼 원격 액세스 클라이언트 계정 잠금을 활성화하고 시간을 다시 설정하려면 다음 단계를 수행합니다.

  1. 시작 → 열기 →*regedit*한 다음 Enter
  2. 레지스트리 키 선택
  3. HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\RemoteAccess\\Parameters\\AccountLockout
  4. MaxDenials를 더블 클릭
  5. 기본값은 0이고 0일 경우 계정 잠금이 해제됨을 의미. 계정을 잠글 때 로그인 시도 실패에 대한 횟수를 설정하고 확인
  6. ResetTime(분) 값을 두 번 클릭합니다.
  7. 기본값은 2,880분(2일) 동안 16진수인 0xb40 . 네트워크 보안 요구 사항을 충족하도록 수정 후 확인
  8. 레지스트리 편집기 종료

만약 계정이 잠긴 경우 위에서 설정한 ResetTime에 따라 사용자가 다시 로그온 가능하지만 바로 원할 경우 레지스트리 키에서 DomainName:UserName 값을 삭제할 수 있는 방법은 아래와 같다.

  1. 시작 → 열기 →regedit한 다음 Enter
  2. 레지스트리 키 선택
  3. HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\RemoteAccess\\Parameters\\AccountLockout
  4. 도메인 이름:사용자 이름 값을 찾은 다음 항목을 삭제
  5. 레지스트리 편집기 종료
  6. 계정을 테스트 해 더 이상 잠기지 않는지 확인

---------------------------------------------WINDOW END---------------------------------------------------

여기서부터 리눅스 접속 관련 보안에 대해 생각해 보자!

리눅스 접속 중 SSH에 대해 알아볼 예정인데 SSH 서버 관련 설정은 기본으로 되어 있는 곳이 많다.

카페24, 가비아, AWS, Azure, GCP 등은 모두 SSH 서비스를 기본으로 제공하고 최신판 리눅스들은 대부분 SSH 서버를 기본 탑재하고 있다.

 

rpm -qa | grep openssh-server 를 터미널에 입력해 설치되어 있는지 체크해 볼 수도 있고, 만약 설치되어 있지 않다면 yum install openssh-server (CentOS, RedHat Enterprise), apt install openssh-server (Ubuntu, Debian) 으로 설치한 뒤 which sshd 를 통해 설치 경로를 확인해 볼 수도 있다. 그런 뒤 방화벽 설정 프로그램에서 tcp 22 포트를 허용해 주면 된다.(root 권한 필요)

그 방법은 아래와 같다.

  1. iptables의 경우 - iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
  2. firewalld의 경우(CentOS 7이상) - firewall-cmd --zone=public --add-port=22/tcp —permanent
  3. ufw의 경우(ubuntu) - ufw allow 22/tcp

ssh 설정은 보통  /etc/sshd/sshd_config 여기서 설정할 수 있고 여기서 아래와 같은 설정도 할 수 있다.

  1. SSH 포트 변경
  2. 접속 허용 클라이언트 및 패스워드 입력 시도 횟수 제한 설정
  3. 패스워드, 공개 키 사용자 인증 설정
  4. 접속 로그, 배너 메시지

설정이 끝나면 service sshd start 또는 systemctl start sshd 를 통해 실행해 주면 된다.

SSH 보안 관련 설정은 /etc/sshd/sshd_config 에서 하게 된다.

우선 리눅스 서버에서 root 권한은 윈도우에서의 관리자 권한처럼 위험하다.

그래서 애초에 root 로 접속하는 것을 막는 것이 보안상 권장된다.

다른 계정으로 접속해 root 권한을 얻어 사용하는 것이 좀 더 바람직하다.

 

이 때 사용하는 파라미터가 PermitRootLogin 인데 아래와 같은 옵션이 있다.

  1. PermitRootLogin yes - root 로그인 허용
  2. PermitRootLogin no - root 로그인 차단
  3. PermitRootLogin without-password(최신 openssh에서 prohibit-password로 변경됨) - password가 아닌 공개 키 인증으로만 접속

말했던 것처럼 2번을 사용하면 된다.

그 외에도 윈도우에서 했던 것처럼 접속 시도 실패 횟수를 카운트 해 막아주는 방법은 MaxAuthTries 파라미터를 활용하면 되는데,

MaxAuthTries 6 - 계정 당 최대 연결 시도 횟수로 6인 경우 6번을 뜻하고 6번부터 계정이 막히는 것을 알 수 있다.

그 외에도 LoginGraceTime 2m - 사용자 인증 요청받을 수 있는 최대 시간 설정(2m은 2분)과 MasSessions 10 - SSH 연결 허용할 최대 클라이언트 수 등 여러 파라미터들이 존재하고 보안에 유리하게 조율하면 된다.

300x250

관련글 더보기

댓글 영역