Cloud/GCP

GCP에서 SSH 포트 변경시 다양한 방안

달빛궁전- 2023. 8. 7. 22:13

목적 : SSH(Secure Shell)는 원격 호스트에 접속하기 위해 사용되는 보안 프로토콜입니다.
기본으로 22 Port를 사용하며, 이미 알려진 well-known port 이므로, 무작위 대입 공격을 방지 하는 방법 중 하나로 포트를 변경해서 사용합니다. 
본 문서에서는 기운영 중인 OS의 config파일을 변경하여 적용하는 방법과 GCP의 템플릿, 메타데이터를 사용하여 프로젝트 전체에 적용하는 방법을 기술합니다.

유의사항 : 
이번 문서에서 GCP 메타데이터, 시작 스크립트를 통한 SSH Port를 변경하는 방법은 다양하게 있습니다.
기본적인 이해를 위해 확인하되, Docs를 참고하여 고객사 상황에 맞게 적용하는 것이 좋습니다. 
또한 SSH 접속포트가 변경 되었으므로,  변경한 포트에 대한 방화벽 규칙을 추가, 수정해야 합니다.

  • OS에서의 환경설정 파일 변경 방법
    OS상에서 구동 중인 ssh 데몬의 환경파일을 수정 후 적용하는 방안입니다.

    환경설정 파일 위치
    /etc/ssh/sshd_config
    
    sshd_config파일에는 sshd 데몬에 관련된 여러 설정을 적용할 수 있습니다.
    (ssh접속시 배너 출력, root접속 불가, 최대접속 시도 횟수, Key접속설정등 여러 설정 가능)

    파일 내용
         1
         2  # This is the sshd server system-wide configuration file.  See
         3  # sshd_config(5) for more information.
         4
         5  # This sshd was compiled with PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
         6
         7  # The strategy used for options in the default sshd_config shipped with
         8  # OpenSSH is to specify options with their default value where
         9  # possible, but leave them commented.  Uncommented options override the
        10  # default value.
        11
        12  Include /etc/ssh/sshd_config.d/*.conf
        13
        14  #Port 22 <-- 변경 내용
        15  #AddressFamily any
        16  #ListenAddress 0.0.0.0
        17  #ListenAddress ::
    

    sshd 설정이 기본일때 14번째 줄에 Port 설정 값이 있습니다.
    #은 주석이며, #뒤로 있는 내용은 실제 환경에 적용되지 않습니다.
    #Port 22 내용을 → Port “원하는 포트" 로 변경합니다.
    본문서에서는 “51547” 로 변경하겠습니다.

    변경된 내용
     1
     2  # This is the sshd server system-wide configuration file.  See
     3  # sshd_config(5) for more information.
     4
     5  # This sshd was compiled with PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
     6
     7  # The strategy used for options in the default sshd_config shipped with
     8  # OpenSSH is to specify options with their default value where
     9  # possible, but leave them commented.  Uncommented options override the
    10  # default value.
    11
    12  Include /etc/ssh/sshd_config.d/*.conf
    13
    14  Port 51547 <-- 변경 내용
    15  #AddressFamily any
    16  #ListenAddress 0.0.0.0
    17  #ListenAddress ::
    

    변경 후에는 아래의 명령어로 config파일에 대한 내용을 테스트 및 검사합니다.

    sudo sshd -t
     
    정상일 경우 아무런 메시지 없이 아래와 같이 나오며


    비정상일 경우는 아래와 같이 오류 위치와 내용을 보여 줍니다.
    14번째 줄에 포트 넘버가 잘못되어 있다고 출력되어있습니다.

    추가로 원본은 백업하고, config 파일을 지정해서 테스트 한다면 -f 옵션을 사용합니다.

    sudo sshd -t -f “파일위치"
    sudo sshd -t -f /etc/ssh/sshd_config_backup
     
    변경에 문제가 없으면 sshd 서비스를 재시작합니다.
    sudo systemctl restart sshd
    or
    sudo service sshd restart

    포트 변경확인
    sudo netstat -tnlp
    
     
    변경포트 번호(”51547”)가 LISTEN 상태 / PID에서 sshd가 해당 포트를 사용 중인지 확인합니다.
    sudo systemctl status sshd
    
     
    아래 캡쳐화면을 참조하여, 변경된 포트로 서비스 중인지 확인합니다.



    기존 연결된 세션은 종료될때까지 유지되므로, 변경된 포트로 접속 되는지 확인 후 접속종료 합니다.
    만약 제대로 변경이 안된채로 접속종료가 되면, 기존포트를 사용하거나 종료 후 GCP VM의 시리얼포트 접속 기능을 이용해 복구해야 됩니다. 
 
  • GCP Compute Engine의 template 사용하여 적용하기
    sshd Config 파일의 변경은 각각의 서버에서 설정이 필요합니다.
    template을 사용하여, instance-group이나 template으로 신규생성한 VM에도 별다른 작업없이 적용하는 방안 입니다.

    메뉴
    Compute Engine > instance-template 
    고급 옵션 > 관리 > 자동화 > 시작 스크립트
    sed -i "s|#Port 22|Port 51547|g" /etc/ssh/sshd_config
    systemctl restart sshd

    or 
    echo "Port 51547" | sudo tee -a /etc/ssh/sshd_config > /dev/null
    systemctl restart sshd
    



    sed 명령어는 파일에서 원하는 내용을 추출하거나, 치환하는 작업을 할 수 있습니다.
    본문서에서는 치환하는 작업을 위해 사용했고, 사용된 옵션과 뜻은 다음과 같습니다.

    sed -i  “s|#Port 22|Port 51547|g”
    sed -i (대소문자 상관없이  적용) “s(파일의 시작)|찾을 문자|변경할 문자|g(파일의 끝)”
     
    작은따옴표는 변화 없이 그대로 출력되며, 큰따옴표는 변수로 넣었다면 실제 값으로 치환된 후 보여 줍니다.
    본 문서에서는 변수를 사용하지 않으므로 큰따옴표, 작은따옴표 상관없이 사용하여도 됩니다.

    echo와 tee 명령어를 사용한 방법은 다음과 같습니다.
    echo "Port 51547" | sudo tee -a /etc/ssh/sshd_config > /dev/null
    echo "입력할 문자열" | sudo tee -a 앞에서 받아온 문자열을 "파일위치" 에 입력합니다 > /dev/null (화면에 출력되는 메시지는 null처리)하여 안보이게 합니다.
    echo 명령어는 문자열을 터미널에 출력하는 것입니다. 
    해당 문자열을 tee을 사용하여 sshd_config 파일에 추가합니다.
    위 방법은 기존 내용을 수정하는 것이 아닌, 추가하는 것으로 기존내용은 남아있으므로, 환경에 따라 좀 더 맞는 방안으로 진행하면 됩니다.
  • 기 구동 중인 VM에 적용
    서버가 기동 중인 상태에서 시작 스크립트에 내용을 입력하고, 적용하는 방안입니다.
    아래와 같이 메타 데이터에 저장된 스크립트를 실행할 수 있습니다.

    sudo google_metadata_script_runner startup
     
    스크립트가 제대로 적용이 안되어 수정, 테스트가 필요할때도 위의 명령어를 사용하여 트러블 슈팅이 가능합니다.

  • GCP 메타데이터 사용
    스크립트를 사용하여, 프로젝트 전체에 적용을 할 수도 있습니다.
    본 문서에서는 스크립트를 Cloud Storage에 저장 후 사용해 보겠습니다.

    유의사항 :
    ID 및 API액세스 하위의 서비스 계정에 아래의 권한이 있어야 정상적으로 Cloud Storage에 접근이 가능합니다.
    스토리지 객체 뷰어 역할(roles/storage.objectViewer)

    참고 Docs : https://cloud.google.com/compute/docs/instances/startup-scripts/linux?hl=ko#passing-directly

    다음과 같은 스크립트를 작성합니다. 
    #!/bin/bash
    
    sed -i "s|#Port 22|Port 51547|g" /etc/ssh/sshd_config
    systemctl restart sshd
     
    확장자를 .sh로 하여 저장 후 Cloud Storage에 업로드 합니다.
    “인증된 URL 복사" 선택하여 복사합니다.


    Compute Engine > 설정 > 메타데이터
    수정 > 항목 추가
    Key : startup-script-url
    Value : “Cloud Storage의 인증된 URL”
    예시 Value : https://storage.cloud.google.com/s/ssh_port.sh 

    이제 해당 프로젝트에서 생성되는 모든 VM은 Port가 변경 됩니다.
  • SSH Port 수정 후 접속방법
    Putty같은 접속 Tool에는 Port번호를 넣는 란이 있습니다.  변경된 Port 번호를 입력하여 접속합니다.

    ssh명령어
    ssh -p5147 id@1.1.1.1
    ssh -p”포트번호" id@호스트(IP, name)
     
    GCP Console
    Compute Engine > VM인스턴스
    SSH 화살표 클릭 > 커스텀 포트의 브라우저 창에서 열기
    “변경한 Port입력"