-
S3와 CloudFront를 이용한 객체 보안 (2)AWS 2020. 2. 11. 22:06
2020/02/10 - [분류 전체보기] - S3와 CloudFront를 이용한 객체 보안 (1)
안녕하세요 저번 글에 이어서 객체 보안에 관한 글을 마무리하려고 합니다. 바로 본론으로 들어갈게요!
Behavior에 접근 제한 설정하기
바로 AWS Root계정으로 키페어 만들기를 하려고 하니 아직 CloudFront 설정이 다 안 끝났죠? 다른 설정은 일단 모른 척하시고 밑으로 내려가셔서 Restrict Viewer Access 항목으로 갑니다.
Yes로 설정하시면 뭔가 무섭게 경고를 하는 거 같습니다. 요약하면 뷰어 엑세스를 제한하게 되면 서명된 URL이나 서명된 cookie를 통해서만 콘텐츠 접근이 가능하다는 내용이에요. 다 알았으니 이제 저장을 해보죠. 일단 CloudFront 쪽 설정은 끝난 듯 보입니다. 다음은 서명된 URL을 만들기 위해 키 페어를 만들어 보도록 하죠.
Root 계정으로 CloudFront 키 페어 만들기
본 설정은 IAM으로 만들어낸 User가 아니라 루트계정으로 로그인하셔야 할 수 있는 설정입니다.
루트 계정으로 접근하면 위와 같이 화면 상단 메뉴가 나옵니다. 일단 "내 보안 자격 증명"을 클릭해보도록 할까요?
CloudFront 서명된 URL 또는 서명된 쿠키를 만들 때 사용하는 각 AWS 계정(신뢰할 수 있는 서명자)에는 고유한 CloudFront 활성 키 페어가 있어야 해요.
저는 이미 만들어 놓은 키가 있지만 여러분은 없을 수도 있으니 "새 키 페어 생성"을 눌러보도록 하죠.
그럼 다음과 같이 새 키 페어를 성공했다는 모달이 하나 뜰 거예요.
프라이빗 키와 퍼블릭 키를 둘 다 받아서 본인 컴퓨터에 저장하도록 합시다. 참고로 받으신 키는 절대로 공유가 되면 안 되기 때문에 잘 보관하도록 하셔야 합니다. 그리고 잃어버리면 다시 받을 수 없으니 주의해서 관리하시길!
키 페어의 키 페어 ID를 기록합니다. (AWS Management 콘솔에서는 "액세스 키 ID"라고 합니다.) 서명된 URL 또는 서명된 쿠키를 만들 때 이것을 사용합니다.
서명된 URL 만들기 예제
저는 파이썬 개발자이니까 파이썬으로 예제를 보여드릴게요. 방금 받으셨던 키 페어 파일과 액세스 키 ID를 잘 저장&메모해두셨죠?
#!/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)
botocore와 cryptogaphy가 사용되었고요. 라이브러리가 설치가 안되셨다면 pip으로 설치하시면 되겠습니다. 보통 boto3가 설치되어 있다면 botocore는 기본으로 설치됐을 거예요. cryptogaphy는 다음 명령어로 설치해주세요.
$ pip install cryptography
위에 코드를 보시면 URL 부분 중 앞에 도메인은 CloudFront에서 제공해주는 것이고 뒤에 이어지는 주소는 S3 객체의 키입니다. 만료일만 설정해주시면 만료일 까지만 접근이 유효하게 됩니다. 보안을 강화하시려면 만료일을 굳이 길게 가져갈 필요는 없겠죠?
이상으로 CloudFront로 S3 객체 접근 보안에 관해 알아보았습니다. 끝까지 읽어주셔서 감사합니다.
반응형'AWS' 카테고리의 다른 글
S3와 CloudFront를 이용한 객체 보안 (1) (0) 2020.02.10