본문 바로가기
공부/프로그래밍

[aws] cloudfront 에 접근제한 및 가능 URL 만들기(Access denied)

by demonic_ 2021. 5. 3.
반응형

cloudfront 를 설정하면 연결된 경로는 public으로 전세계에서 접근이 가능하다. 경로를 노출시키지 않는다면 괜찮겠지...라는 생각은 찝찝함을 남기니 이참에 보안을 강화해야겠다고 생각이 들어 추가하기로 했다.

 

CloudFront 로 이동하여 기존 설정된 것에 에디트 화면으로 이동한다

 

아래 창에서 수정하고픈 CloundFront 체크 => Distrivution Settings 클릭 => Behaviros 탭 클릭 => 항목 클릭해서 Edit 버튼 클릭.

 

옵션중에 Restrict Viewer Access 부분이 있는데 여기를 Yes로 클릭한다.

바로 아래 Trusted Key Groups or Trusted Signer 에서 Trusted Signer 를 선택해야 한다.

Trusted Key Groups를 선택하는건 접근허용하는 서버를 할때 쓰는거 같다. CloudFront 에서 Key(ssh) 를 등록하고 그걸 그룹으로 묶는 메뉴가 있는데, 이번 포스트의 주제는 아니니 넘어간다.

 

이제 CloundFront의 키를 받아야 한다. 문제는 이 키를 받기 위해선 root 계정으로 접속해야 한다. 일반 계정으로 접속하면 키를 생성하는 메뉴가 뜨질 않는다. root로 접속하자

 

접속해서 계정을 클릭하면 내 보안 자격 증명 이란 메뉴가 있다. 클릭.

 

다음처럼 메뉴가 펼쳐지는데 이중에 CloudFront 키 페어를 클릭한다.

 

새 키 페어 생성을 클릭하면 다음과 같은 화면이 뜬다. 프라이빗 키 파일과 퍼블리 키 파일을 다운로드 받아야 보관해야한다. 프라이빗 키 파일은 재발급이 불가하다.

 

엑세스 키 ID를 따로 저장해두자. 추후 URL을 만들어야 할 떄 사용한다.

 

 

이제 엑세스 키 ID와 프라이빗 키 파일로 URL을 생성해야 한다. 이것을 설정하는데 참고한 사이트에서 파이썬으로 샘플을 주었는데 잘된다. 이자리를 빌어 감사인사.

참고:

https://mattpy.tistory.com/entry/S3%EC%99%80-CloudFront%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EA%B0%9D%EC%B2%B4-%EB%B3%B4%EC%95%88-2?category=833768

 

S3와 CloudFront를 이용한 객체 보안 (2)

2020/02/10 - [분류 전체보기] - S3와 CloudFront를 이용한 객체 보안 (1) S3와 CloudFront를 이용한 객체 보안 (1) 오랫동안 서비스에서 첨부파일을 별다른 보안없이 S3에 업로드하여 제공하였다. 시간이 흘러

mattpy.tistory.com

 

ACCESSKEY_ID 와 key_path 변수를 개인의 설정에 맞게 바꾼다.

참고로 위 글을 보면 cryptography 라이브러리가 설치되어 있지 않은경우 안될 수 있다고 하니 꼭 설치하자.

pip install cryptography
#!/usr/bin/python3

import datetime
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from botocore.signers import CloudFrontSigner

ACCESSKEY_ID = 'ABCDEFG'

def rsa_signer(message):
    #### .pem is the private keyfile downloaded from CloudFront keypair
    key_path = '/path/to/private/key_file.pem'  # Private key 파일 위치
    with open(key_path, 'rb') as key_file:
        private_key = serialization.load_pem_private_key(
            key_file.read(),
            password=None,
            backend=default_backend()
        )
    signer = private_key.signer(padding.PKCS1v15(), hashes.SHA1())
    signer.update(message)
    return signer.finalize()

url = 'https://d8dkcidfk.cloudfront.net/example.png'  # CloudFront 상 객체 주소
current_time = datetime.datetime.utcnow()
expire_date = current_time + datetime.timedelta(minutes=2)  # 만료시간을 정함
cloudfront_signer = CloudFrontSigner(ACCESSKEY_ID, rsa_signer)
# Create a signed url that will be valid until the specfic expiry date
# provided using a canned policy.
signed_url = cloudfront_signer.generate_presigned_url(url, date_less_than=expire_date)
print(signed_url)

 

실행해보면 다음과 같이 URL이 생성된다. 접속해보면 잘 뜬다.

 

참고로 코드중에 만료시간을 정하는 부분이 있는데 실제로 저 시간이 지나니 다음처럼 Access denied가 뜬다.

 

 

 

끝.

 

 

참고:

https://mattpy.tistory.com/entry/S3%EC%99%80-CloudFront%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EA%B0%9D%EC%B2%B4-%EB%B3%B4%EC%95%88-2?category=833768

 

S3와 CloudFront를 이용한 객체 보안 (2)

2020/02/10 - [분류 전체보기] - S3와 CloudFront를 이용한 객체 보안 (1) S3와 CloudFront를 이용한 객체 보안 (1) 오랫동안 서비스에서 첨부파일을 별다른 보안없이 S3에 업로드하여 제공하였다. 시간이 흘러

mattpy.tistory.com

https://m.blog.naver.com/PostView.nhn?blogId=theswice&logNo=220777523673&proxyReferer=https:%2F%2Fwww.google.com%2F

 

CloudFront

전 세계에 파일을 빠른 속도로 배포하는 CDN 서비스로써, CloudFront를 이용하여 EC2 인스턴스, E...

blog.naver.com

 

반응형

댓글