본문 바로가기

Programming/프로그래밍 내용 정리

AWS Lightsail로 HTTPS 서버를 구축해보다.

 

GitHub - olive-side-project/payment-project: 📌[ 결제 시스템 프로젝트 ] 👉 확장성을 고려한 멀티모

📌[ 결제 시스템 프로젝트 ] 👉 확장성을 고려한 멀티모듈 구조와 결제 API 설계 👉 Redis 기반 동시성 처리 👉 멀티프로파일 환경에서의 로그백 설정 및 MDC를 활용한 쓰레드별 로그 관리 - olive-s

github.com

 

[ AWS Lightsail을 선택한 이유 ]

 

 

최근 사이드 프로젝트를 진행하면서

HTTPS로 서버를 구축하기로 했다.

 

이때 AWS Lightsail을 사용했다.

Lightsail은 AWS에서 제공하는 가상 프라이빗 서버로,

간편하고 직관적인 서버 설정을 제공해 준다.

 

AWS EC2는 다양한 용도에 맞춰 수백 가지 인스턴스 옵션과 네트워크, 스토리지 설정이 제공된다.

하지만 그만큼 설정해야 할 내용이 많아 복잡한 관리가 필요하다.

 

반면 Lightsail은 이러한 복잡성을 줄여 간단하게 EC2 환경을 구성할 수 있어

간단한 사이드 프로젝트를 배포하는데 더 장점이 많다고 생각했다.

(또한 가격도 더 저렴!)

 

 

 

 

 


[ Lightsail로 인스턴스 생성해보기 ]

 

 

 

 

선택 가능한 이미지로는 Linux 계열과 MS 윈도우 계열이 있다.

나는 우분투로 선택했다.

 

 

 

 

 

보안을 위해 SSH 접속 키페어를 등록해야 한다.

 

나같은 경우 이미 생성해서 lightsail_keypair 을 선택할 수 있도록 되어있는데,

새롭게 키페어를 생성하면 프라이빗 키를 다운로드해서 잘 보관해두면 된다.

 

 

 

 

 

 

 

사이드프로젝트용 서버이기 때문에 가격은 가장 저렴한 것으로 진행했고

인스턴스 이름은 Ubuntu-Node로 정했다.

 

 

 


[ 인스턴스 방화벽 설정 ]

 

 

 

 

 

인스턴스가 생성되면, Manage 메뉴를 클릭해서

여러가지 세팅을 할 수 있다.

 

 

 

 

 

그다음 아무나 내 인스턴스에 접근하면 안되기 때문에 

SSH 접속을 내 아이피에서만 접속할 수 있도록 방화벽을 설정하였다.

 

 

 

 


[ SSH  접속은 Termius 이용 ]

 

 

 

 

 

윈도우에서는 모바엑스텀(MobaXterm)을 사용하면 좋은데,

개인 노트북은 맥북이라서 Termius를 다운받아

keypair을 이용해 터미널에 접속해 보았다.

 

 

 

그다음 아래 명령어로 아파치 서버를 띄워준다.

 

sudo -s # 루트 권한 얻기
apt-get update
sudo apt-get install apache2  # 아파치 서버 설치
service apache2 start  # 아파치 서버 시작

 

 

 

 

터미널 접속 확인 후, 웹서버가 잘 가동되고 있는지 확인하기 위해

브라우저 주소창에 lightsail에서 할당된 아이피를 입력해보니 잘 접속되었다.

 

 

 


[ SSH 보안 설정: 파일 및 디렉토리 권한 설정 ]

 

 

SSH 접속을 설정하면서, SSH 키 파일과 디렉토리의 권한 설정이 중요한 단계였다.

먼저 `authorized_keys` 파일과 `.ssh` 디렉토리의 권한을 아래와 같이 설정했다.

 

 

 

1. 파일 및 디렉토리 권한 설정

 

# authorized_keys 파일의 권한을 설정 (소유자만 읽기/쓰기 가능)
chmod 600 ~/.ssh/authorized_keys

# .ssh 디렉토리의 권한을 설정 (소유자만 접근 가능)
chmod 700 ~/.ssh

 

 

  • authorized_keys 파일:
    • 이 파일에는 서버에 접속할 수 있는 SSH 공개 키들이 저장된다.
    • 서버 소유자 외에 다른 사용자가 이 파일을 읽거나 수정할 수 없도록 권한을 600으로 설정했다.
    • 이는 서버 보안을 강화하여, 외부에서 이 파일에 접근해 허가받지 않은 키를 추가하거나 변경하지 못하도록 하는 것이다.
  • .ssh 디렉토리:
    • 이 디렉토리는 SSH와 관련된 모든 중요한 파일들이 저장되는 장소이다.
    • 권한을 700으로 설정하면 소유자만 이 디렉토리에 접근할 수 있게 되며
    • 다른 사용자가 디렉토리 내부의 파일을 읽거나 수정할 수 없게 된다.

2. SSH 서비스 설정 파일 편집

 

이후, SSH 서비스의 동작을 제어하는 설정 파일인 sshd_config을 편집했다.

이 파일을 통해 SSH 접속과 관련된 다양한 보안 설정을 조정할 수 있다.

 

# SSH 설정 파일 편집
sudo vi /etc/ssh/sshd_config

 

 

 

일반적으로 수정할 수 있는 중요한 설정들은 다음과 같다.

 

# SSH Root 로그인 비활성화
PermitRootLogin no

# 암호 인증 비활성화 (SSH 키 인증만 허용)
PasswordAuthentication no

# SSH 키 파일 경로 설정 (기본값)
AuthorizedKeysFile %h/.ssh/authorized_keys

 

 

3. SSH 서비스 재시작

설정을 변경한 후에는 SSH 서비스에 변경 사항이 적용되도록 재시작했다.

 

# SSH 서비스 재시작 
sudo systemctl restart ssh
 

 

 


[ 도메인 생성하기 ] 

 

 

 

Domain & Dns 메뉴를 통해

Register domain 버튼을 눌러 도메인을 생성했다.

 

 

 

 

 

 

 

사용가능한 Domain Name 인지 먼저 체킹하고,

그 외 필요한 각종 정보를 입력해 Lightsail에서 도메인을 생성했다.

가격은 1년에 14USD 였다.

 

 

 

 

 

 


[ DNS Zone 생성, 레코드 설정하기 ] 

 

 

 


그다음 Create DNS zone 버튼을 눌러 Dns 영역을 생성했다.

DNS Zone이 생성되면, 이제 DNS 레코드를 설정해 주어야 한다.

 

 

 

 

도메인 주소와 서버의 IP 주소를 직접 매핑하는

A레코드를 추가해줬다.

 

A 레코드는 주어진 도메인의 IP 주소를 나타낸다.

예를 들어 A 레코드를 http://good-luck-olive.com으로 설정하면,

사용자가 해당 URL을 입력할 때 자동으로 서버의 IP 주소로 연결되어 웹사이트에 접속할 수 있다.

 

 

(외부 도메인인 경우, 그 외부 도메인 설정에서

이 lightsail의 네임서버를 등록해 주어야 한다.)

 

 

 


[ HTTPS - 무료 SSL 인증서 받기 ] 

 

https:// 로 접근이 되기 위해서는

SSL 인증서를 받아야 한다.

 

AWS Lightsail에서는 Lets' Encrypt SSL 라는 인증서를 통해

무료로 SSL 인증서를 적용할 수 있는 방법을 제공한다.

 

이때 Cerbot (SSL 인증서 관리 도구)를 설치해서 SSL을 발급 받을 수 있다.

Certbot은 Let’s Encrypt에서 인증서를 요청하고

이를 웹 서버에 배포하는 데 사용되는 클라이언트이다.

 

먼저 Termius를 통해 서버에 접속한 후 터미널 창에서 아래와 같이 명령어를 실행했다.

 

 

# 루트 권한으로 전환
sudo -s

# 패키지 목록 업데이트 및 필요한 소프트웨어 설치
sudo apt-get update
sudo apt-get install software-properties-common

# Certbot 저장소 추가 및 설치
sudo apt-add-repository ppa:certbot/certbot -y
sudo apt-get update -y
sudo apt-get install certbot -y

# 도메인 및 와일드카드 도메인 변수 설정
DOMAIN=good-luck-olive.com
WILDCARD=*.$DOMAIN

# Certbot을 사용하여 SSL 인증서 발급 (DNS 인증 방식 사용)
sudo certbot -d $DOMAIN -d $WILDCARD --manual --preferred-challenges dns certonly

# DNS TXT 레코드가 제대로 설정되었는지 확인 (필요시)
dig TXT _acme-challenge.$DOMAIN

# 웹 서버(Apache) 재시작하여 변경사항 적용
sudo systemctl restart apache2

 

 


[ HTTPS - 방화벽 설정, DNS TXT 레코드 설정 ] 

 

 

 

 

그다음 443 포트 방화벽을 열어주었다.

 

HTTPS 요청은 기본적으로 TCP의 443번 포트를 사용하여 전송되기 때문에, 

서버가 HTTPS 요청을 처리하려면 방화벽에서 443 포트를 열어두어야 한다.

 

 

서버에서도 아래 명령어를 실행해 주었다.

 

sudo ufw allow 443/tcp
sudo ufw status

 

 

 

 

 

 

 

Let's Encrypt 인증을 위해

제공된 TXT 레코드를 DNS 관리 콘솔에서 도메인에 추가해야 한다.

 

(ex) _acme-challenge.good-luck-olive.com에 제공된 값으로 TXT 레코드를 추가해줬다.

 

 


[ HTTP에서 HTTPS로 리다이렉트 설정하기 ] 

 

HTTPS를 적용하기 위해 Nginx 서버의 설정 파일을 수정해야 했다.

이 과정이 다소 까다로웠는데

아래와 같은 방법으로 HTTP 요청을 HTTPS로 리다이렉트하였다.

 

 

먼저 서버 터미널에서

아래 명령어를 통해 Nginx 설정 파일을 열어 수정했다.

 

sudo vi /etc/nginx/nginx.conf

 

1. HTTP 서버 블록 설정

HTTP 요청을 받는 서버 블록을 설정할 때

모든 HTTP 요청을 HTTPS로 리다이렉트하도록 했다.

 

이를 통해 사용자가 http://로 접속해도 자동으로 https://로 전환이 된다.

 

server {
    # 특정 도메인에 대한 요청을 HTTPS로 리다이렉트
    if ($host = www.good-luck-olive.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;  # HTTP 포트에서 수신
    server_name www.good-luck-olive.com;

    root /var/www/html; # 웹사이트 파일이 위치하는 디렉토리
    index index.html;  # 기본 인덱스 파일

    location / {
        try_files $uri $uri/ =404;  # 요청된 파일이 없을 경우 404 에러 반환
    }

    # HTTP 요청을 HTTPS로 리다이렉트합니다.
    return 301 https://$host$request_uri;
}

 

2. HTTPS 서버 블록 설정

HTTPS 요청을 처리하는 서버 블록을 아래와 같이 설정해 주었다.

 

server {
    listen 443 ssl;  # HTTPS 포트에서 수신
    server_name www.good-luck-olive.com;

    root /var/www/html; # 웹사이트 파일이 위치하는 디렉토리
    index index.html;  # 기본 인덱스 파일
    
    # SSL 인증서 경로 (Certbot이 관리)
    ssl_certificate /etc/letsencrypt/live/www.good-luck-olive.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.good-luck-olive.com/privkey.pem;

    location / {
        try_files $uri $uri/ =404;  # 요청된 파일이 없을 경우 404 에러 반환
    }
}

 

3. 설정 적용 후 서버 재시작

설정 파일을 수정한 후, Nginx 설정을 테스트하고 서버를 재시작했다.

 

# 설정 파일에 오류가 없는지 테스트
sudo nginx -t

# 서버 재시작하여 설정 적용
sudo systemctl restart nginx

 

 

 


[ 마무리 - HTTPS를 어떻게 구현했나요? ] 

 

HTTPS를 구현하기 위해 AWS Lightsail을 사용해 서버를 구축했습니다.

먼저 서버에 Apache를 설치하고, 보안을 위해 SSH 키 기반 인증을 설정했습니다.

이후 도메인 이름이 서버의 IP 주소와 올바르게 연결되도록 DNS 설정을 완료했습니다.

이를 통해 사용자가 도메인 이름을 통해 서버에 접근할 수 있게 되었습니다.

 

DNS 설정 후, Let's Encrypt의 Certbot을 사용해 무료 SSL 인증서를 발급받았습니다.

SSL 인증서는 웹사이트와 사용자의 데이터가 암호화된 상태로 전송되도록 보장하기 위해 필요합니다.

이 과정에서 도메인 소유권을 검증하기 위해 DNS TXT 레코드를 추가했습니다.

이 레코드는 도메인 소유자가 SSL 인증서를 발급받을 권한이 있다는 것을 Let's Encrypt에 증명하기 위해 필요했습니다.

 

SSL 인증서 발급 후, Apache와 Nginx 서버에 SSL 인증서를 적용하여 HTTPS를 활성화했습니다.

Nginx 설정 파일을 수정하여 모든 HTTP 요청을 HTTPS로 자동 리다이렉트하도록 설정했고,

이를 지원하기 위해 HTTPS 트래픽이 기본적으로 사용되는 443 포트를 열어 방화벽 설정을 진행했습니다.

 

최종적으로 서버를 재시작하여 설정을 적용했고, 이를 통해 HTTPS를 통한 안전한 통신을 보장할 수 있었습니다.