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을 생성해야 한다. 이것을 설정하는데 참고한 사이트에서 파이썬으로 샘플을 주었는데 잘된다. 이자리를 빌어 감사인사.
참고:
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가 뜬다.
끝.
참고:
'공부 > 프로그래밍' 카테고리의 다른 글
[react] text 내 http에 a 태그로 변환, 링크 삽입 (0) | 2021.05.07 |
---|---|
[aws] cloudfront 에 s3 연결 후 access denied 뜰 때 (0) | 2021.05.05 |
[aws] cloudfront 와 도메인 연결(Alternate Domain Names (CNAMEs))때 주의점 (0) | 2021.04.30 |
[ec2] amazon linux2 에다 mysql 8 버전 설치 (0) | 2021.04.28 |
[swagger3] schema 등록시 Could not resolve reference: undefined 에러(Error-ModelName) (0) | 2021.04.26 |
댓글