원격 개발 서버 설정 방법

원격 서버에서 개발 환경을 설정하면 여러 가지 이점이 있습니다. 예를 들어, 다른 위치에서 프로젝트를 작업하는 것이 더 쉽습니다. 원격으로 SSH를 통해 간단히 모든 도구를 사용할 수 있습니다. 또는 하위 계층 컴퓨터는 로컬 컴퓨터가 아닌 원격 서버가 리소스를 사용하여 컴퓨팅을 수행해야 하므로 그다지 문제가 되지 않습니다.

이 서버는 프로덕션 애플리케이션을 제공하기 위한 것이 아니므로 외부 세계에 대한 대부분의 연결이 차단될 수 있습니다. 실제로 화이트리스트에 있는 몇 개의 IP를 제외한 모든 수신 연결은 아무런 응답 없이 끊어야 합니다. 우리는 우리 자신의 컴퓨터만 ssh를 통해 연결할 수 있도록 허용하려고 합니다. 아무것도. 이렇게 하면 공격의 위험이 크게 줄어듭니다.

목차


  • Prerequisites
  • Super User
  • SSH Keys
  • SSH Config
  • Firewall
  • Disable IPV6
  • Fail2Bann
  • Workflows
  • Port Forwarding
  • Wrapping Up

  • 전제 조건

    In order to follow along, you need access to a remote server or have a VM installed your machine. The commands shown here are based on RHEL CentOS 8.

    슈퍼 유저

    As good measure, create a user and add it to the wheel group. Use this user instead of root. The user can run commands that require root privileges with sudo.

    SSH as root into the server and create the user. At this occasion upgrade the kernel, before exiting.

    ssh root@remote_host
    adduser username && passwd username
    usermod -aG wheel username
    dnf distro-sync -y
    dnf upgrade -y
    exit
    

    SSH 키 생성 및 배포

    Add a public ssh key to users authorized keys file. The easiest way to achieve to is to copy the public key from the local machine via ssh onto the remote host.
    Make sure you are connecting with the created user and not with root.

    cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && \
         touch ~/.ssh/authorized_keys && \
         chmod -R go= ~/.ssh && \
         cat >> ~/.ssh/authorized_keys"
    
    You can create the key with a tool called ssh-keygen .

    SSH 구성

    Connect back to remote and edit the config file.

    ssh username@remote_host
    sudo vim /etc/ssh/sshd_config
    

    Add the following lines to the config file.

    LoginGraceTime 1m
    PermitRootLogin no
    PubkeyAuthentication yes
    PasswordAuthentication no
    PermitEmptyPasswords no
    IgnoreRhosts yes
    Protocol 2
    AllowUsers username
    

    Before disabling password authentication, test the public key authentication by restarting sshd , exiting the session and reconnecting.
    If it is not asking for your password anymore but logs you in, the key is working.

    Restart the service.

    sudo systemctl restart sshd
    

    방화벽 구성

    The next part step is to configure the firewall. Firewalld은 CentOS에 사전 설치되어 있습니다.

    들어오는 모든 트래픽이 승인 없이 차단되도록 기본 영역을 차단으로 변경합니다. 공용 리소스 그룹에 로컬 머신의 공용 IP를 추가하십시오. 각 그룹에 여러 소스를 추가할 수 있으므로 이것은 기본적으로 IP 화이트리스트입니다. 마지막으로 사용하지 않는 두 서비스를 제거하고 SSH만 사용 가능한 상태로 둡니다.

    sudo firewall-cmd --set-default-zone=block
    sudo firewall-cmd --permanent --zone=public --add-source=my.public.ip.address
    sudo firewall-cmd --permanent --zone=public --remove-service=cockpit --remove-service=dhcpv6-client
    sudo firewall-cmd --reload
    


    구성을 확인하십시오.

    sudo firewall-cmd --list-all
    sudo firewall-cmd --zone=public --list-all
    


    IPV6 비활성화

    Next, disable IPV6 all together as it's not needed and reduces the attack surface.

    sudo vim /etc/sysctl.d/disableipv6.conf
    

    Place the following entry to disable IPv6 for all adapter

    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1
    # A particular network card instead of default can be accessed
    # for example for the imaginary card enp0s3
    # net.ipv6.conf.enp0s3.disable_ipv6 = 1
    

    Restart the Service

    sudo systemctl restart systemd-sysctl
    

    If the below command does not return anything, ipv6, is disabled.

    ip a | grep inet6
    

    Fail2Ban 설정

    Lastly, install Fail2ban . fail2ban은 로그 파일(예:/var/log/apache/error_log)을 검사하고 악성 징후를 나타내는 IP를 차단합니다.

    sudo dnf install epel-release
    sudo dnf install fail2ban
    sudo systemctl start fail2ban
    sudo systemctl enable fail2ban
    


    SSH를 제외한 모든 것이 차단됩니다. 이 특정 사용 사례에 대한 일부 구성을 추가합니다.

    sudo vim /etc/fail2ban/fail.d/ssh.conf
    


    다음 설정은 2시간 동안 3번의 로그인 시도 실패 후 모든 IP를 영구 차단합니다. 이 시점에서 우리는 우리 외에 다른 사람이 연결할 수 있다고 기대하지 않습니다. 일부 중복성은 해를 끼칠 수 없습니다.

    [DEFAULT]
    bantime = -1
    findtime = 2h
    maxretry = 3
    
    [sshd]
    enabled = true
    


    워크플로우

    Now the development environment is secure. All connections to the outside world and are cut off and only the ssh connection to the local machine is open. How does the actually workflow look like now? There are essentially two major ways, old and new school.

    올드 스쿨 일명 Vim me out, Bro



    첫 번째 방법은 오랫동안 해왔던 방식이다. 기본 작업 환경은 원격 호스트에 설치된 Vim입니다. 어떤 사람들은 tmux 및 또는 zsh을 함께 사용하는 것을 좋아합니다. 실제로 매우 강력한 조합입니다. 이러한 도구를 마스터하면 어떤 기능도 놓칠 필요가 없습니다.



    새로운 학교 일명 VS 코드 GUI



    VS Code은 뛰어난 원격 개발 지원 기능을 제공합니다. 원격 호스트에 확장을 설치하고 로컬에서 GUI를 사용할 수 있습니다.


    자세한 내용은 official docs 을 참조하십시오.

    포트 포워딩 / SSH 터널

    Ok, you can write some code now, that's great but how can an application actually be viewed? The answer is simple, run the app on the remote server on some port. Then forward whatever is sent on this port to the local machine.

    Let's say you just started a React dev server on the remote host. The React app is being served at localhost:8080 . You can now connect with a new shell but this time, only to forward the ports.

    ssh -L -O localhost:6000:localhost:8080 username@remote_host
    

    Navigate to localhost:6000 in the browser of your local machine and see the application.

    VS Code has some built in functionality around SSH Tunneling as well. You can read more in the official docs .

    마무리

    We have learned how to secure a remote development server, taking care of various configurations such the firewall and ssh. We have also looked at possible workflows for our environment and at SSH Tunneling.

    It was an exiting trip, I hope you enjoyed it as much as I did.

    Thank you.

    좋은 웹페이지 즐겨찾기