ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • S3와 CloudFront를 이용한 객체 보안 (2)
    AWS 2020. 2. 11. 22:06

    2020/02/10 - [분류 전체보기] - S3와 CloudFront를 이용한 객체 보안 (1)

     

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

    오랫동안 서비스에서 첨부파일을 별다른 보안없이 S3에 업로드하여 제공하였다. 시간이 흘러 필연적으로 구글로 부터 보안 검사를 해야 Gmail API를 계속 사용할 수 있다는 경고를 받았다. 우리 서비스에서 사용하..

    mattpy.tistory.com

     

    안녕하세요 저번 글에 이어서 객체 보안에 관한 글을 마무리하려고 합니다. 바로 본론으로 들어갈게요!

     

    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

    댓글

Designed by Tistory.