티스토리 뷰

반응형

안녕하세요. 09LABS 입니다.

오늘의 주제는 AWS입니다. AWS는 많이 들어보셨다시피 Amazone Web Service의 약자이며
가상화 컴퓨팅, 스토리지 서버, IoT Core, 데이터베이스 등 아주 다양한 서비스를 운영하고 있습니다.

AWS S3는 쉽게 생각하면 스토리지 서버이며 공개된 URL로 파일을 다운로드 받을 수도 있으며
미리 서명된 URL (Presigned URL)을 사용하여 파일을 업 / 다운로드 할 수 있습니다.

Presigned URL을 발급하기 위해선 AWS 계정에 할당된 Access Key ID와 Secret Access Key를 사용해야만
가능합니다. 그렇다면 사용자의 계정에 할당된 키를 사용하는 것이 적절한가?

이것도 X입니다.

아니 그럼 적절한 방법이 뭔데 ㅡㅡ 

여기서 소개해드릴 좋은 방법은 바로 임시 자격 증명 방법(Temporary Security Credential)을 사용하는 것입니다.

제가 이 방법을 소개하는 이유는 AWS IoT Core에 등록된 장비를 통해 안전하게 파일을 전송하는 방법에 대해 고민하다가
AWS 솔루션즈 아키텍트께 문의해본 결과 Device 인증서를 활용하는 방법에 대해 조언을 해주셨습니다.

AWS IoT Core에 등록된 디바이스는 각자 Fleet Provisioning을 통해 Device의 인증서를 발급하여 보관하고 있습니다.
이 인증서는 단순히 IoT Core에만 사용될 것으로 생각되겠지만 Policy에 AssumeRoleWithCertificate를 추가해주면
인증서와 IAM Role을 연결하여 IAM Policy를 부여할 수 있습니다.

결과적으로 IoT Core에 등록된 디바이스가 발급한 인증서를 사용하여 S3, DynamoDB, EC2 등 다양한 서비스에 접근할
수 있다는 말입니다. 자세한 방법은 많이 복잡해서... 우선 간단한 원리에 대해 말씀드리자면

위 사진과 같이 Credential Provider를 통해 Security Token 발급 요청을 하면 IAM에 유효한 요청인지 확인 후 AWS STS(Security Token Service)에 IAM 역할을 대신할 수 있도록 호출합니다. STS는 보안 토큰 발급 후 Credential Provider가 토큰을 디바이스로 
넘겨주게 되고 이후 디바이스는 임시 토큰, Access Key ID, Secret Access Key를 사용하여 AWS 서비스를 이용할 수 있습니다.

과정이 좀.... 복잡하죠?ㅋ

우선 Credential Provider에 접근하기 위해선 Credential Provider의 Endpoint Address를 알아야 합니다.
그럼 이걸 어떻게 알아내느냐? 우리에겐 AWS CLI가 있습니다. 먼저 AWS CLI를 사용하기 위해선 aws-vault를 이용해야합니다.
AWS CLI를 그냥 사용해보니 MFA를 사용하지 않아서 제가 사용중인 계정에선 쓰지 못하더라구요...

aws-vault 설정 방법은 https://www.44bits.io/ko/post/securing-aws-credentials-with-aws-vault 이 글을 참고하였습니다.

저는 aws-vault Profile로 09labs-test 를 사용하였습니다. 참고로 아래 작업을 수행하기 위해서 Admin 계정이거나
S3 Full Access 권한이 없으면 진행이 다소 어렵습니다.

먼저 간단하게 S3 버킷 리스트를 출력해보겠습니다.

$ aws-vault exec 09labs-test -- aws s3 ls

정상적으로 실행이 되었다면 S3에 존재하는 버킷 리스트를 확인할 수 있습니다.
이제 Credential Provider의 Endpoint Address를 취득해보겠습니다.
아래 Documentation을 참고하여 작성하였습니다.

https://docs.aws.amazon.com/iot/latest/developerguide/authorizing-direct-aws.html

 

Authorizing direct calls to AWS services using AWS IoT Core credential provider - AWS IoT Core

The AWS IoT Core Credential Provider can issue a credential with a maximum lifetime is 43,200 seconds (12 hours). Having the credential be valid for up to 12 hours can help reduce the number of calls to the credential provider by caching the credential lon

docs.aws.amazon.com

 

$ aws-vault exec 09labs-test -- aws iot describe-endpoint --endpoint-type iot:CredentialProvider

위와 같이 실행하면 아래 결과를 볼 수 있습니다.

{
    "endpointAddress": "<foo-bar>.credentials.iot.<region>.amazonaws.com"
}


위에서 취득한 Endpoint Address, 디바이스에 저장된 인증서, 아마존 Root CA1 인증서를 사용하여 임시 토큰 발급을 해보겠습니다.

$ curl --cert <디바이스 Cert> --key <디바이스 Private Key> -H "x-amzn-iot-thingname: <Thing Name>" --cacert ./AmazoneRootCA1.pem https://<endpoint>.credentials.iot.<region>.amazonaws.com/role-aliases/<Role Alias Name>/credentials

위 명령어 실행 결과는 아래와 같습니다.

{
	"credentials": {
    	"accessKeyId":"wow",
        "secretAccessKey":"nice",
        "sessionToken":"session token is here",
        "expiration":"2022-09-16T09:37:15Z"
    }
}

보안상의 이유로 실제 값은 제거하였습니다.
위와 같이 AWS IoT Core 디바이스 인증서를 사용하여 Access Key ID와 Secret Access Key, Session Token을 발급받으면
이를 사용하여 AWS 서비스를 이용할 수 있습니다.

자세한 방법은 추후 공유하도록 하겠습니다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함