DevOps/etc

[DevOps] Domain & SSL 설정

chanyoungdev 2024. 11. 14. 23:36

도메인 및 SSL 설정 방법에 대해서 공유해보겠습니다!

💡참고
가비아에서 도메인 구매
AWS Route 53에서 서브 도메인 설정

 


 

🔐 Domain & SSL

 

1. Domain

 

a. 도메인 구매

  • 가비아에서 howabout.shop 이라는 도메인 구매
  • 구매 시 타사 네임서버 사용 옵션 선택

b. AWS Route 53에서 네임서버 정보 설정

  • AWS Route 53에서 도메인의 호스팅 영역 생성
  • 호스팅 정보 입력
    • 도메인 이름 : howabout.shop 입력
    • 타입 : Public hosted zone 선택
  • 네임서버(NS) 레코드 확인
    • 호스팅 영역을 생성하면 Route 53에서 기본적으로 네임서버(NS) 레코드와 SOA 레코드가 자동으로 생성
    • 생성된 호스팅 영역의 NS 레코드에 나열된 네임서버 주소(보통 4개의 주소)를 확인
  • 가비아 도메인 관리 페이지에서 네임서버 업데이트
    • 가비아 웹사이트에 로그인하여 도메인 관리 페이지로 이동
    • 네임서버 설정 변경 옵션 선택
    • 타사 네임서버 사용을 선택한 후, Route 53에서 확인한 네임서버(NS) 주소를 각각 입력

c. Route 53에서 주 도메인 A 레코드 설정

  • Route 53에서 호스팅 영역에 들어가 A 레코드를 생성
  • howabout.shop을 도메인 이름으로 입력하고 값 필드에 EC2의 Public IP 또는 Elastic IP를 설정하여 주 도메인과 EC2를 연결

d. 서브 도메인 A 레코드 추가

  • Route 53에서 호스팅 영역으로 이동
    • AWS에 로그인한 후 Route 53 서비스로 이동
    • 왼쪽 메뉴에서 Hosted Zones를 클릭하여 도메인 이름에 대한 호스팅 영역을 확인
  • A 레코드 설정
    • Record Name : 서브 도메인의 이름을 입력   ex) home
    • Record Type : A(주소) 레코드를 선택
    • Value : EC2 인스턴스의 Public IP 또는 Elastic IP 주소를 입력
    • TTL (Time To Live) : 기본값으로 두거나 적절한 값을 설정
    • Routing Policy : Simple Routing을 선택
    • Evaluate Target Health : No 선택 (EC2 인스턴스가 정상적으로 작동하는지 확인하는 옵션, 기본적으로 EC2의 상태를 모니터링 하지 않도록 설정)
    • A 레코드 생성

 

2. SSL 설정

a. Nginx 서버에 cerbot과 nginx 플러그인 설치

sudo apt update
sudo apt install certbot python3-certbot-nginx

 

b. Certbot으로 SSL 인증서 발급

sudo certbot --nginx -d home.howabout.shop

 

c. 설치 후 확인사항

  • https://home.howabout.shop 접속 테스트
  • 모든 경로에(엔드 포인트) 대한 HTTPS 동작 확인
  • HTTP에서 HTTPS로 리다이렉션 확인
  • SSL 인증서 정상 발급 여부 확인
    • /etc/letsencrypt/live/home.howabout.shop/

d. 모든 인증서 목록 확인

sudo certbot certificates

 

3. Nginx 설정 파일

위에서 도메인 및 SSL 설정 방법을 공유해봤습니다!

설정을 모두 마치면 Nginx 설정 파일에도 변경되게 됩니다.

server {
    listen 443 ssl; # managed by Certbot
    server_name home.howabout.shop;

    # FRONT
    location / {
        proxy_pass http://3.37.229.132:3000;				 # 리버스 프록시
        proxy_set_header Host $host; 					 # 원본 호스트 정보 전달
        proxy_set_header X-Real-IP $remote_addr;			 # 실제 방문자 IP 전달
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	 # 프록시 거친 IP들의 목록
        proxy_set_header X-Forwarded-Proto $scheme;			 # 프로토콜 정보(http/https) 전달
    }

    # BACK
    location /api {
        proxy_pass http://10.0.1.44:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # AI
    location /ai {
        proxy_pass http://10.0.2.211:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # SSL
    # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/home.howabout.shop/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/home.howabout.shop/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    # HTTP -> HTTPS
    # managed by Certbot
    if ($host = home.howabout.shop) {
        return 301 https://$host$request_uri;
    }

    # managed by Certbot
    listen 80;
    server_name home.howabout.shop;
    return 404;
}
💡 코드 구조

클라이언트와 Nginx 사이는 보안을 위해 HTTPS를 유지하고, Nginx와 내부 서버 사이는 성능을 위해 HTTP를 사용하는 구조



 🧑🏻‍💻 코드 설명

클라이언트가 HTTP로 접속할 경우 -> Nginx의 80 포트
-> 301 리다이렉션 -> HTTPS로 자동 전환
-> Nginx의 443 포트
-> 내부 서버와 HTTP 통신

 

 

밑의 코드는 Certbot에서 관리하는 코드인데 자세히 설명해보겠습니다!

listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/home.howabout.shop/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/home.howabout.shop/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
  • listen 443 ssl;
    • 443 포트는 HTTPS의 기본 포트
    • ssl 파라미터는 이 포트에서 SSL/TLS 암호화를 사용한다는 의미
  • ssl_certificate /etc/letsencrypt/live/home.howabout.shop/fullchain.pem;
    • SSL 인증서 파일의 경로
    • fullchain.pem은 서버 인증서와 중간 인증서를 모두 포함
    • 브라우저가 신뢰할 수 있는 인증서 체인을 형성
  • ssl_certificate_key /etc/letsencrypt/live/home.howabout.shop/privkey.pem;
    • SSL 인증서의 개인 키 파일 경로
    • 절대로 공개되면 안되는 비밀 키
    • 암호화된 연결을 설정하는데 사용
  • include /etc/letsencrypt/options-ssl-nginx.conf;
    • Let's Encrypt에서 제공하는 권장 SSL 설정 파일
    • 보안 관련 최적화된 설정들이 포함 : SSL/TLS 버전, SSL 세션 캐시 설정, 암호화 스위트 설정
  • ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    • Diffie-Hellman 키 교환에 사용되는 파라미터 파일
    • 완벽한 순방향 비밀성을 제공
    • 통신의 보안성을 높이는 역할

 

💡실제 보안 동작 과정

1. 클라이언트가 HTTPS로 접속 시도
2. 서버는 fullchain.pem의 인증서를 클라이언트에 전송
3. 클라이언트는 인증서의 유효성 검증
4. privkey.pem을 사용해 안전한 통신 채널 수립
5. dhparam을 통해 키 교환 수행
6. options-ssl-nginx.conf의 설정에 따라 안전한 암호화 통신 시작