현재 재직중인 회사에서는 일부 CS 처리를 위해서 운영하는 웹페이지가 존재한다.
그리고 제한된 목적으로 사용되는만큼 해당 웹페이지는 특정 사용자만 접근을 하도록 접근제한을 하고 있다.
기존에는 IP를 기반으로 접근제한을 하고 있었으나, 일단 클라이언트 IP는 유동적이며 최근 IPv6를 지원하는 단말기가 많아짐에 따라서 IP로 접근제한하는것에는 한계를 느끼고 있다.
그래서 여러가지 방안을 찾아보고 있었는데 AWS CloudFront에서 Signed-URL을 활용하면 될것 같아서, 이에 대해 기술하고자 한다.
- FE 코드 수정을 한다면, 다른 방법이 있을 수 있겠지만 니즈는 현재의 코드는 변경없이 인프라 단계에서 조치를 하고 싶었다.
CloudFront Signed-URL 개요
쉽게 말하면 One-Time-Password와 유사한 개념으로 일시적으로 사용이 가능한 URL을 만들어서 사용하는것이다.
즉, RSA Public/Private Key를 통해서 만료 날짜 또는 특정 IP에서만 접근이 가능하도록 제한된 URL을 생성하여 사용하는것이다.
당사에서는 IP 접근제한의 어려움으로 인해 CloudFront Signed-URL을 고려하였기 때문에 아래 글을 IP가 아닌 만료 날짜 지정을 기준으로 내용을 작성한다.
- 만료 날짜만 지정하는것은 One-Time으로 보기는 어렵다.
- 다만 만료 날짜를 짧게 지정하는 경우에는 One-Time에 준하는 효과를 얻을 수 있기 때문에 만료 날짜를 짧게 지정하여 생성한다.
CloudFront Signed-URL 생성 방법
생성 방법은 매우 간단하다. 먼저 전체적인 과정을 요약하자면 RSA Key를 생성한 다음에 해당 Key로 Signed-URL을 생성한다.
- RSA Key는 AWS CloudFront Public Key Group에 등록하여 사용한다.
RSA Key 생성
아래와 같이 Private, Public Key를 생성할 수 있다.
# Private Key Generator
openssl genrsa -traditional -out private_key.pem 2048
# Public Key Generator
openssl rsa -pubout -in private_key.pem -out public_key.pem
생성을 하면, 현재 경로의 Key 2개가 생성된다.
Public Key는 공개키이기 때문에 대외에 노출해도 상관이 없으나, Private Key는 개인키이므로 유출이 되면 안된다.
Private Key는 엄격하게 취급되어야 하며, 절대로 유출되어서는 안된다.
Public Key 등록(To AWS CloudFront)
생성한 Public Key를 CloudFront에 등록한다. CloudFront Signed-URL의 기본 로직은 아래와 같다.
- AWS에 Public Key를 등록한다.
- Private Key를 이용해서 URL을 생성한다.
- 그리고 등록된 Public Key를 이용해서 Private Key에 대한 검증을 진행한다.
위 과정과 같이 Private Key에 대한 검증을 하기 위해서 Public Key를 AWS에 등록한다.
그리고 Public Key를 등록했다면 실제로 CloudFront에서 사용할 수 있도록 Key group을 생성해야 한다.
CloudFront 에서 뷰어 액세스 제한 설정
위 과정에서 Key Group을 등록했다면, 이제 해당 Key를 CloudFront 동작에 설정하면 된다.
기존 동작에서 추가해도 되고, 아니면 새로운 동작을 만들어서 특정 경로에 대해서만 적용할 수 있도록 해도 된다.
다만, 여기서 주의해야 할것은 뷰어 액세스 제한을 설정한 다음부터는 이제 Signed-URL로 접근하는것이 아닌것은 모두 Missing Key로 접근이 불가능하다.
CloudFront Signed-URL 생성 Bash Script
아래 Script로 손쉽게 Signed-URL을 생성할 수 있다.
한가지 걸리는점은 Private Key가 있어야만 생성할 수 있기 때문에 Private Key에 대한 보안성을 어떻게 유지할지가 고민이다.
#!/bin/bash
# 적용하고자 하는 URL 경로
URL="https://xxxxxxx.xxx/"
# Public Key 등록 후의 ID
KEY_PAIR_ID="K30J4ESWZTHT6M"
# Public Key에 대한 Private Key
PRIVATE_KEY_PATH="private_key.pem"
# Signed-URL에 대한 만료 날짜
EXPIRATION_DATE="2024-12-12T01:00:00"
aws cloudfront sign \
--url "$URL" \
--key-pair-id "$KEY_PAIR_ID" \
--private-key "file://$PRIVATE_KEY_PATH" \
--date-less-than "$EXPIRATION_DATE"
CloudFront Signed-URL 접속 테스트
뷰어 액세스 제한 설정 이후에 대한 테스트 화면이다.
Non Signed-URL로 접속하는 경우(본래 URL)
접속이 되지 않는다. 뷰어 액세스 제한 설정을 하면 반드시 Signed-URL을 통해서만 접속이 가능하다.
Signed-URL로 접속하는 경우
만료시간 이전 접속
접속이 가능하다.
하지만 보시는것과 같이 다른 오브젝트가 다운로드가 안되었기 때문에 모든 컨텐츠가 표시되지는 않는다.
이는 추가적인 오브젝트는 Signed-URL이 아니라 본래의 URL을 통해서 컨텐츠를 다운로드하기 때문이다.
이 경우네는 각 오브젝트마다 Signed-URL 설정을 달리하며 동작하도록 설정하면 된다.
만료시간 이후 접속
당연하게도 만료시간이 지났기 때문에 접속이 불가능하다.
One-Time이라고 하면 일회성으로만 사용이 가능해야 하지만, CloudFont에서 제공하는 Signed-URL은 One-Time의 개념이 아니다.
그리고 가장 좋은것은 시스템에 One-Time으로 구현이 가능하도록 Session을 활용하거나 하는것이다.
이러한 구현이 어려울경우 CloudFront Signed-URL로 어느정도 우회는 가능하다. 하지만 이는 만능이 아니라는점!!을 알아야한다.
AWS에는 아주 많은 서비스가 있고, 해당 서비스에서도 보면 아주 많은 기능이 있다.
어떤 니즈가 있고, 어떻게 사용하는지는 개인의 능력에 달려있는것 같다. 내가 얼마나 열심히? 공부를 했는지 내가 얼마나 니즈를 해결하고자 하는지?에 달려있다.
오늘도 하나 배웠다!! 끝!
'기술 이모저모 > [AWS] Workshop' 카테고리의 다른 글
[AWS] ECS vs EKS, 비교/분석 (0) | 2023.12.25 |
---|---|
[AWS] Workspace, Local PC 자료교환 방법 (0) | 2022.12.10 |
[AWS] CrossAccount S3 File 객체 소유자 설정 (0) | 2022.12.10 |
[AWS] Fortigate를 이용한 Outbound traffic 통제, 방화벽 기능[2/2] (0) | 2022.09.17 |
[AWS] Fortigate를 이용한 Outbound traffic 통제, 구성[1/2] (0) | 2022.09.17 |