AWS KMS의 한 가지 행동

TL;박사


이 블로그를 읽고 나면 AWS KMS를 사용하여 암호화를 하나의 서비스로 사용하는 방법에 대해 개괄적으로 설명할 것입니다.

개요


, Hashicorp Vault를 사용하여 암호화 및 복호화 작업을 수행합니다.이제 다른 방법을 살펴보자.왜?Vault는 backed by a great community.의 오픈 소스 솔루션이지만 사용자에게 적합하지 않을 수 있습니다.예를 들어, 이를 관리하고 100% 가동 시간을 확보해야 합니다.그렇지 않으면 응용 프로그램의 가용성을 위태롭게 할 수 있다.이것도 공사 자원이 필요하기 때문에 회사의 우선사항에 따라 다른 선택을 고려할 수 있습니다.AWS KMS를 사용하면 암호화를 서비스의 장점으로 삼는 동시에 관리 업무의 관건적인 서비스에 대한 걱정을 줄일 수 있습니다.

빠른 시작


다음 그림에서는 구현된 작동 원리를 요약합니다.

암호화기


이 서비스는 사용자를 식별합니다.그리고 콘솔을 통해 받은 메시지를 암호화합니다.우리가 메시지를 암호화할 때, 암호화 프로그램은 KMS에서 암호 블록(바이트)을 수신합니다.그러나 클라이언트에게 메시지를 되돌려주기 전에 암호화 프로그램base64가 인코딩합니다.이렇게 하는 것은 더욱 간단한 방식으로 데이터를 전송하기 위해서이다.

복호화기


이 서비스는 사용자를 식별합니다.그리고 컨트롤러 알림을 통해 받은 암호화 메시지 (base64 인코딩) 를 복호화합니다.

AWS KMS


이 서비스는 우리를 위해 암호화와 복호화를 관리할 것이다.하지만 우선 우리는 그것을 창조해야 한다.따라서 CloudFormation(CF)을 사용하여 필요한 리소스를 요청합니다.

CF를 사용하여 AWS의 리소스 요청


소스 코드 here을 찾을 수 있습니다.재구매한 CF 템플릿을 사용하여 다음 리소스를 작성합니다.

버튼(CMK)


키 차원 구조의 맨 위를 나타내는 논리 키.우리는 그것을 사용하여 암호화와 복호화 작업을 실행한다.기본적으로 대칭 키이기 때문에 암호화와 복호화를 동시에 할 수 있습니다.

테아리아스


이것은 우리 열쇠의 별명이다.이것은 인성화된 형식으로 키를 인용하는 데 도움이 된다.예를 들어, UUID 대신 alias/the-alias을 사용할 수 있습니다.별명이 theKey과 연결되면 ARN 대신 이 별명을 사용할 수 있습니다.

ICANcryptStuffGroup 및 ICANcryptStuffGroup


이러한 IAM 그룹에는 KM이 각각 암호화 또는 복호화할 수 있는 정책이 있습니다.

EncryptorUser 및 DecryptorUser


이 사용자들은 자신이 속한 그룹에 따라 암호화하거나 복호화할 수 있다.

EncryptorUserAccessKey 및 DecryptorUserAccessKey


이러한 자격 증명은 연관된 사용자가 AWS API를 사용할 수 있도록 합니다.일반적으로 응용 프로그램을 실행하는 EC2 인스턴스에 IAM 역할을 만들고 첨부하지만 로컬 스크립트[0]를 사용합니다.

배치


이제 우리의 인프라 시설을 배치할 때가 되었다../deploy.sh을 실행하면 자원을 만들 수 있습니다.변수를 업데이트하고 CF 템플릿을 실행할 수 있는 충분한 권한이 있는 AWS 계정이 있는지 확인하십시오.
아래 출력을 보시면 시작할 수 있습니다.
{
"ExportingStackId": "arn:aws:cloudformation:us-east-2:XXX:stack/kms-poc/a59778da-fe1b-11ea-adc1-0242ac120002",
"Name": "DecryptorUserAccessKey",
"Value": "AKIAXXXXXXXXXXXXXXXX"
},
{
"ExportingStackId": "arn:aws:cloudformation:us-east-2:XXX:stack/kms-poc/a59778da-fe1b-11ea-adc1-0242ac120002",
"Name": "DecryptorUserSecretAccessKey",
"Value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
{
"ExportingStackId": "arn:aws:cloudformation:us-east-2:XXX:stack/kms-poc/a59778da-fe1b-11ea-adc1-0242ac120002",
"Name": "EncryptorUserAccessKey",
"Value": "AKIAXXXXXXXXXXXXXXXX"
},
{

"ExportingStackId": "arn:aws:cloudformation:us-east-2:XXX:stack/kms-poc/a59778da-fe1b-11ea-adc1-0242ac120002",
"Name": "EncryptorUserSecretAccessKey",
"Value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
{
"ExportingStackId": "arn:aws:cloudformation:us-east-2:XXX:stack/kms-poc/a59778da-fe1b-11ea-adc1-0242ac120002",
"Name": "theKeyAlias",
"Value": "alias/kms-poc"
},
{
"ExportingStackId": "arn:aws:cloudformation:us-east-2:XXX:stack/kms-poc/a59778da-fe1b-11ea-adc1-0242ac120002",
"Name": "theKeyId",
"Value": "a59778da-fe1b-11ea-adc1-0242ac120002"
}
.env 파일을 만들고 env.example을 사용하여 영감을 얻습니다.이전의 출력에서 필요한 모든 정보를 얻을 수 있어야 합니다.
주의: KEY_ID env 변수의 값에 대해 우리는 theKeyId 또는 theKeyAlias의 값을 사용할 수 있습니다.

암호화 방법

  • 운행 python3 encryptor.py
  • 사용 alice 또는 bob "검증"
  • 메시지를 작성하여
  • 암호화
  • 클릭 입력
  • 다음과 같은 base64 출력을 볼 수 있습니다.
    AQICAHhQUp2GIUg1Tf/r2I9nmNWsIJGDrRYieOviWRC0SLz/bwEXoiPmO1CgXGPhO5su0nhJAAAAbjBsBgkqhkiG9w0BBwagXzBdAgEAMFgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM9eb1WUEj8kK/WBjvAgEQgCs9K6dPBPgWZ+ZqKqXdIt1S/CUE1Xj9fcUq9vo95Mw/6XKv8yQkciWBnH55
    

    어떻게 복호화합니까

  • 암호화기의 출력을 복사하고 다음 동작을 통해 복호화기를 계속 실행합니다. python3 decryptor.py
  • 은 과정 중 이전에 암호화에 사용된 같은 사용자 (alice 또는bob)
  • 을 사용합니다
  • 붙여넣기base64 출력
  • 만약 모든 것이 계획대로 진행된다면 다음과 같은 내용을 보셔야 합니다.
  • Username:
    
    alice
    
    Hello alice, please enter your message to decrypt:
    
    AQICAHhQUp2GIUg1Tf/r2I9nmNWsIJGDrRYieOviWRC0SLz/bwEXoiPmO1CgXGPhO5su0nhJAAAAbjBsBgkqhkiG9w0BBwagXzBdAgEAMFgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM9eb1WUEj8kK/WBjvAgEQgCs9K6dPBPgWZ+ZqKqXdIt1S/CUE1Xj9fcUq9vo95Mw/6XKv8yQkciWBnH55
    
    Your decrypted message: this is a secret
    

    컨텍스트 암호화


    현재 메시지를 alice으로 암호화하려고 시도하지만, 메시지를 bob으로 복호화합니다.비록 우리가 사용하는 것은 같은 키이고 적당한 권한을 가지고 있지만, 우리는 InvalidCiphertextException을 얻었다.이것은 우리가 암호화와 복호화할 때 서로 다른 EncryptionContext을 사용했기 때문이다.이 매개 변수는 선택할 수 있어도 사용해야 합니다.이 값은 주어진 주 키를 사용하는 이유와 어떤 동작을 했는지 알 수 있도록 도와줍니다.우리가 로그를 볼 때, 이것은 매우 편리할 것이다.EncryptionContext은 비밀을 지킬 필요가 없지만 "의식적"방식으로 서비스 간에 암호화되고 복호화되고 있음을 이해하는 데 도움이 됩니다.예를 들어 응용 프로그램이 alice의 메시지를 처리하고 있지만 bob에서 메시지를 잘못 받으면 복호화 작업에 실패합니다.그럼에도 불구하고 Encryption+EncryptionContext은 둘 다: belt and suspenders과 같다.

    키 포인트 회전


    KMS를 사용할 때 이 기능을 장점 또는 단점으로 간주할 수 있습니다.예를 들어, AWS::KMS::Key을 생성할 때 EnableKeyRotation을 사용하면 KMS는 자동으로 새 주요 재료를 생성하고 매년 한 번씩 회전합니다.만약 어떤 이유에서 비롯된다면, 당신은 더욱 빈번하게 이렇게 해야 한다. 당신은 manual rotation을 만들어야 한다.또 하나 추가해야 할 것은 KMS는 삭제할 때까지 모든 키 버전을 유지합니다.즉, CMK의 이전 버전은 삭제할 수 없습니다.

    기타 고려 사항


    핵심 전략


    이 예에서, 우리는 사용자의 메시지를 암호화하고 복호화하기 위해 키 하나만 사용합니다.만약 우리가 수백만 명의 사용자가 수백만 개의 메시지를 암호화하고 있다면, 무슨 일이 일어날까요?이런 상황에서 당신은 조직의 수요를 만족시키는 관건적인 차원 구조 모델을 채택해야 합니다.만약 당신이 더 많은 것을 알고 싶다면, 나는 here부터 시작할 것을 건의합니다.

    공급업체 잠금


    AWS API는 단도직입적이지만 다른 키 관리 시스템으로 이동하는 방법을 알고 지금까지 저장된 모든 blob를 다시 암호화할 필요가 없습니다. 이것은 매우 흥미롭습니다.

    DR(재해 복구)


    암호화 키에 접근할 수 없으면 프로그램에서 실행할 수 없습니다.따라서 다운타임이 발생한 상황에서 다중 지역 정책을 어떻게 실시하는지 볼 수 있다.

    그것을 싸라


    보시다시피 AWS KMS를 사용하여 기본 작업을 설정하고 실행하는 것은 매우 간단합니다.또 다른 장점은 서비스의 정상적인 운행 시간을 걱정하지 않는다는 것이다.특히 암호화와 복호화 작업에 의존할 때 좋습니다.그럼에도 불구하고 적절한 암호화 상하문을 정의하고 키 정책을 제시하며 공급업체의 잠금을 피하는 방법을 분석하고 재난 복구 정책을 제정하는 것을 고려해야 합니다.

    참고


    [0] https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html

    좋은 웹페이지 즐겨찾기