AWS Encryption CLI의 예제 - AWS Encryption SDK

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS Encryption CLI의 예제

다음 예제를 사용하여 원하는 플랫폼에서 AWS Encryption CLI를 사용해 보세요. 마스터 키 및 기타 파라미터에 대한 도움말은 AWS Encryption CLI 사용 방법 섹션을 참조하세요. 빠른 참조는 AWS Encryption SDK CLI 구문 및 파라미터 참조 섹션을 참조하세요.

참고

다음 예제에서는 AWS Encryption CLI 버전 2.1.x의 구문을 사용합니다.

새로운 보안 기능은 원래 AWS Encryption CLI 버전 1.7.x 및 2.0.x에서 릴리스되었습니다. 그러나 AWS Encryption CLI 버전 1.8.x는 버전 1.7.x를 대체하고 AWS Encryption CLI 2.1.x는 2.0.x를 대체합니다. 자세한 내용은 GitHub의 aws-encryption-sdk-cli 리포지토리에서 관련 보안 권고를 참조하세요.

암호화된 데이터 키를 제한하는 보안 기능을 사용하는 방법을 보여주는 예제는 암호화된 데이터 키 제한 섹션을 참조하세요.

AWS KMS 다중 리전 키를 사용하는 방법을 보여주는 예제는 다중 리전 AWS KMS keys 사용 섹션을 참조하세요.

파일 암호화

이 예제에서는 AWS Encryption CLI를 사용하여 "Hello World" 문자열이 포함된 hello.txt 파일의 내용을 암호화합니다.

파일에 대해 암호화 명령을 실행하면 AWS Encryption CLI가 파일 내용을 가져와 고유한 데이터 키를 생성하고 데이터 키로 파일 내용을 암호화한 다음 암호화된 메시지를 새 파일에 씁니다.

첫 번째 명령은 AWS KMS key의 ARN을 $keyArn 변수에 저장합니다. AWS KMS key를 사용하여 암호화할 때 키 ID, 키 ARN, 별칭 이름 또는 별칭 ARN을 사용하여 키를 식별할 수 있습니다. AWS KMS key의 키 식별자에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드키 식별자를 참조하세요.

두 번째 명령은 파일 내용을 암호화합니다. 이 명령은 --encrypt 파라미터를 사용하여 작업을 지정하고 --input 파라미터를 사용하여 암호화할 파일을 표시합니다. --wrapping-keys 파라미터와 관련 필수 key 속성은 CMK ARN으로 표현되는 AWS KMS key를 사용하도록 명령에 지시합니다.

이 명령은 --metadata-output 파라미터를 사용하여 암호화 작업에 대한 메타데이터를 위한 텍스트 파일을 지정합니다. 명령이 --encryption-context 파라미터를 사용하여 암호화 컨텍스트를 지정하는 것이 모범 사례입니다.

또한 이 명령은 --commitment-policy 파라미터를 사용하여 커밋 정책을 명시적으로 설정합니다. 버전 1.8.x에서는 --wrapping-keys 파라미터를 사용할 때 이 파라미터가 필요합니다. 버전 2.1.x부터 --commitment-policy 파라미터는 선택 사항이지만 권장됩니다.

--output 파라미터의 값인 점(.)은 출력 파일을 현재 디렉터리에 쓰도록 명령에 지시합니다.

Bash
\\ To run this example, replace the fictitious key ARN with a valid value. $ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab $ aws-encryption-cli --encrypt \ --input hello.txt \ --wrapping-keys key=$keyArn \ --metadata-output ~/metadata \ --encryption-context purpose=test \ --commitment-policy require-encrypt-require-decrypt \ --output .
PowerShell
# To run this example, replace the fictitious key ARN with a valid value. PS C:\> $keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' PS C:\> aws-encryption-cli --encrypt ` --input Hello.txt ` --wrapping-keys key=$keyArn ` --metadata-output $home\Metadata.txt ` --commitment-policy require-encrypt-require-decrypt ` --encryption-context purpose=test ` --output .

암호화 명령이 성공하면 어떤 출력도 반환하지 않습니다. 명령의 성공 여부를 확인하려면 $? 변수의 부울 값을 확인합니다. 명령이 성공하면 $?의 값은 0(Bash) 또는 True(PowerShell)입니다. 명령이 실패하면 $?의 값은 0이 아니거나(Bash) False(PowerShell)입니다.

Bash
$ echo $? 0
PowerShell
PS C:\> $? True

디렉터리 목록 명령을 사용하여 암호화 명령이 hello.txt.encrypted라는 새 파일을 생성했는지 확인할 수도 있습니다. 암호화 명령이 출력의 파일 이름을 지정하지 않았으므로 AWS Encryption CLI는 입력 파일과 동일한 이름에 접미사 .encrypted를 붙인 파일에 출력을 썼습니다. 다른 접미사를 사용하거나 접미사를 숨기려면 --suffix 파라미터를 사용합니다.

hello.txt.encrypted 파일에는 hello.txt 파일의 사이퍼텍스트, 데이터 키의 암호화된 사본, 추가 메타데이터(암호화 컨텍스트 포함)가 포함된 암호화된 메시지가 들어 있습니다.

Bash
$ ls hello.txt hello.txt.encrypted
PowerShell
PS C:\> dir Directory: C:\TestCLI Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 9/15/2017 5:57 PM 11 Hello.txt -a---- 9/17/2017 1:06 PM 585 Hello.txt.encrypted

파일 복호화

이 예제에서는 AWS Encryption CLI를 사용하여 이전 예제에서 암호화된 Hello.txt.encrypted 파일의 내용을 복호화합니다.

복호화 명령은 --decrypt 파라미터를 사용하여 작업을 표시하고 --input 파라미터를 사용하여 복호화할 파일을 식별합니다. --output 파라미터의 값은 현재 디렉터리를 나타내는 점입니다.

key 속성이 있는 --wrapping-keys 파라미터는 암호화된 메시지를 복호화하는 데 사용되는 래핑 키를 지정합니다. AWS KMS keys를 사용하는 복호화 명령에서 key 속성의 값은 키 ARN이어야 합니다. --wrapping-keys 파라미터는 복호화 명령에 반드시 필요합니다. AWS KMS keys를 사용하는 경우 key 속성을 사용하여 복호화를 위해 AWS KMS keys를 지정하거나 discovery 속성을 true 값으로 지정할 수 있습니다(둘 다 지정할 수는 없음). 사용자 지정 마스터 키 공급자를 사용하는 경우 key 속성과 provider 속성이 필요합니다.

버전 2.1.x부터 --commitment-policy 파라미터는 선택 사항이지만 권장됩니다. 이를 명시적으로 사용하면 기본값인 require-encrypt-require-decrypt를 지정하더라도 의도를 명확히 알 수 있습니다.

암호화 명령에 암호화 컨텍스트가 제공된 경우에도 --encryption-context 파라미터는 복호화 명령에서 선택 사항입니다. 이 경우 복호화 명령은 암호화 명령에 제공된 것과 동일한 암호화 컨텍스트를 사용합니다. 복호화하기 전에 AWS Encryption CLI는 암호화된 메시지의 암호화 컨텍스트에 purpose=test 페어가 포함되어 있는지 확인합니다. 그러지 않으면 복호화 명령이 실패합니다.

--metadata-output 파라미터는 복호화 작업에 대한 메타데이터를 위한 파일을 지정합니다. --output 파라미터의 값인 점(.)은 출력 파일을 현재 디렉터리에 씁니다.

암호화된 데이터 키가 너무 많은 잘못된 형식의 메시지를 복호화하지 않도록 --max-encrypted-data-keys 파라미터를 사용하는 것이 모범 사례입니다. 암호화된 데이터 키의 예상 수(암호화에 사용되는 각 래핑 키당 하나) 또는 합리적인 최대값(예: 5개)을 지정합니다. 자세한 내용은 암호화된 데이터 키 제한 섹션을 참조하세요.

--buffer는 디지털 서명이 있는지 확인하는 등 모든 입력이 처리된 후에만 일반 텍스트를 반환합니다.

Bash
\\ To run this example, replace the fictitious key ARN with a valid value. $ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab $ aws-encryption-cli --decrypt \ --input hello.txt.encrypted \ --wrapping-keys key=$keyArn \ --commitment-policy require-encrypt-require-decrypt \ --encryption-context purpose=test \ --metadata-output ~/metadata \ --max-encrypted-data-keys 1 \ --buffer \ --output .
PowerShell
\\ To run this example, replace the fictitious key ARN with a valid value. PS C:\> $keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' PS C:\> aws-encryption-cli --decrypt ` --input Hello.txt.encrypted ` --wrapping-keys key=$keyArn ` --commitment-policy require-encrypt-require-decrypt ` --encryption-context purpose=test ` --metadata-output $home\Metadata.txt ` --max-encrypted-data-keys 1 ` --buffer ` --output .

복호화 명령이 성공하면 어떤 출력도 반환하지 않습니다. 명령의 성공 여부를 확인하려면 $? 변수의 값을 가져옵니다. 디렉터리 목록 명령을 사용하여 명령이 .decrypted라는 접미사가 붙은 새 파일을 생성했는지 확인할 수도 있습니다. 일반 텍스트 콘텐츠를 보려면 파일 콘텐츠를 가져오는 명령(예: cat 또는 Get-Content)을 사용합니다.

Bash
$ ls hello.txt hello.txt.encrypted hello.txt.encrypted.decrypted $ cat hello.txt.encrypted.decrypted Hello World
PowerShell
PS C:\> dir Directory: C:\TestCLI Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 9/17/2017 1:01 PM 11 Hello.txt -a---- 9/17/2017 1:06 PM 585 Hello.txt.encrypted -a---- 9/17/2017 1:08 PM 11 Hello.txt.encrypted.decrypted PS C:\> Get-Content Hello.txt.encrypted.decrypted Hello World

디렉터리의 모든 파일 암호화

이 예제에서는 AWS Encryption CLI를 사용하여 디렉터리에 있는 모든 파일의 내용을 암호화합니다.

명령이 여러 파일에 영향을 미치는 경우 AWS Encryption CLI는 각 파일을 개별적으로 처리합니다. 파일 내용을 가져오고, 마스터 키에서 파일의 고유한 데이터 키를 가져오고, 데이터 키로 파일 내용을 암호화하고, 결과를 출력 디렉터리의 새 파일에 씁니다. 따라서 출력 파일을 독립적으로 복호화할 수 있습니다.

TestDir 디렉터리 목록에는 암호화하려는 일반 텍스트 파일이 표시됩니다.

Bash
$ ls testdir cool-new-thing.py hello.txt employees.csv
PowerShell
PS C:\> dir C:\TestDir Directory: C:\TestDir Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 9/12/2017 3:11 PM 2139 cool-new-thing.py -a---- 9/15/2017 5:57 PM 11 Hello.txt -a---- 9/17/2017 1:44 PM 46 Employees.csv

첫 번째 명령은 AWS KMS key의 Amazon 리소스 이름(ARN)$keyArn 변수에 저장합니다.

두 번째 명령은 TestDir 디렉터리에 있는 파일의 콘텐츠를 암호화하고 암호화된 콘텐츠의 파일을 TestEnc 디렉터리에 씁니다. TestEnc 디렉터리가 존재하지 않으면 명령이 실패합니다. 입력 위치가 디렉터리이므로 --recursive 파라미터가 필요합니다.

--wrapping-keys 파라미터와 필수 key 속성은 사용할 래핑 키를 지정합니다. 암호화 명령에는 암호화 컨텍스트dept=IT가 포함됩니다. 여러 파일을 암호화하는 명령에 암호화 컨텍스트를 지정하면 모든 파일에 동일한 암호화 컨텍스트가 사용됩니다.

또한 이 명령에는 암호화 작업에 대한 메타데이터를 작성할 위치를 AWS Encryption CLI에 알려주는 --metadata-output 파라미터도 있습니다. AWS Encryption CLI는 암호화된 각 파일에 대해 하나의 메타데이터 레코드를 작성합니다.

--commitment-policy parameter는 버전 2.1.x부터 선택 사항이지만 권장됩니다. 명령이나 스크립트가 사이퍼텍스트를 복호화할 수 없어 실패하는 경우 명시적 커밋 정책 설정을 사용하면 문제를 빠르게 감지하는 데 도움이 될 수 있습니다.

명령이 완료되면 AWS Encryption CLI는 암호화된 파일을 TestEnc 디렉터리에 작성하지만 출력은 반환하지 않습니다.

마지막 명령은 TestEnc 디렉터리의 파일을 나열합니다. 일반 텍스트 콘텐츠의 각 입력 파일마다 암호화된 콘텐츠의 출력 파일이 하나씩 있습니다. 명령이 대체 접미사를 지정하지 않았으므로 암호화 명령이 각 입력 파일의 이름에 .encrypted를 추가했습니다.

Bash
# To run this example, replace the fictitious key ARN with a valid master key identifier. $ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab $ aws-encryption-cli --encrypt \ --input testdir --recursive\ --wrapping-keys key=$keyArn \ --encryption-context dept=IT \ --commitment-policy require-encrypt-require-decrypt \ --metadata-output ~/metadata \ --output testenc $ ls testenc cool-new-thing.py.encrypted employees.csv.encrypted hello.txt.encrypted
PowerShell
# To run this example, replace the fictitious key ARN with a valid master key identifier. PS C:\> $keyArn = arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab PS C:\> aws-encryption-cli --encrypt ` --input .\TestDir --recursive ` --wrapping-keys key=$keyArn ` --encryption-context dept=IT ` --commitment-policy require-encrypt-require-decrypt ` --metadata-output .\Metadata\Metadata.txt ` --output .\TestEnc PS C:\> dir .\TestEnc Directory: C:\TestEnc Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 9/17/2017 2:32 PM 2713 cool-new-thing.py.encrypted -a---- 9/17/2017 2:32 PM 620 Hello.txt.encrypted -a---- 9/17/2017 2:32 PM 585 Employees.csv.encrypted

디렉터리의 모든 파일 복호화

이 예제는 디렉터리에 있는 모든 파일을 복호화합니다. 이전 예제에서 암호화된 TestEnc 디렉터리의 파일부터 시작합니다.

Bash
$ ls testenc cool-new-thing.py.encrypted hello.txt.encrypted employees.csv.encrypted
PowerShell
PS C:\> dir C:\TestEnc Directory: C:\TestEnc Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 9/17/2017 2:32 PM 2713 cool-new-thing.py.encrypted -a---- 9/17/2017 2:32 PM 620 Hello.txt.encrypted -a---- 9/17/2017 2:32 PM 585 Employees.csv.encrypted

이 복호화 명령은 TestEnc 디렉터리의 모든 파일을 복호화하고 일반 텍스트 파일을 TestDec 디렉터리에 씁니다. key 속성과 키 ARN 값이 있는 --wrapping-keys 파라미터는 파일 복호화에 사용할 AWS KMS keys를 AWS Encryption CLI에 알려줍니다. 이 명령은 --interactive 파라미터를 사용하여, 같은 이름의 파일을 덮어쓰기 전에 메시지를 표시하도록 AWS Encryption CLI에 지시합니다.

또한 이 명령은 파일이 암호화될 때 제공된 암호화 컨텍스트를 사용합니다. 여러 파일을 복호화할 때 AWS Encryption CLI는 모든 파일의 암호화 컨텍스트를 확인합니다. 파일에 대한 암호화 컨텍스트 확인에 실패하면 AWS Encryption CLI는 파일을 거부하고 경고를 작성하고 메타데이터에 실패를 기록한 다음 나머지 파일을 계속 확인합니다. AWS Encryption CLI가 다른 이유로 인해 파일을 복호화하는 데 실패하면 전체 복호화 명령이 즉시 실패합니다.

이 예제에서는 모든 입력 파일의 암호화된 메시지에 dept=IT 암호화 컨텍스트 요소가 포함되어 있습니다. 하지만 암호화 컨텍스트가 다른 메시지를 복호화하는 경우에도 암호화 컨텍스트의 일부는 확인 가능할 수도 있습니다. 예를 들어 일부 메시지의 암호화 컨텍스트가 dept=finance이고 다른 메시지의 암호화된 컨텍스트가 dept=IT인 경우 값을 지정하지 않고도 암호화 컨텍스트에 항상 dept 이름이 포함되어 있는지 확인할 수 있습니다. 좀 더 구체적으로 확인하려면 별도의 명령으로 파일을 복호화할 수 있습니다.

복호화 명령은 어떤 출력도 반환하지 않지만 디렉터리 목록 명령을 사용하여 복호화 명령이 .decrypted 접미사가 붙은 새 파일을 만들었는지 확인할 수 있습니다. 일반 텍스트 콘텐츠를 보려면 파일 콘텐츠를 가져오는 명령을 사용합니다.

Bash
# To run this example, replace the fictitious key ARN with a valid master key identifier. $ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab $ aws-encryption-cli --decrypt \ --input testenc --recursive \ --wrapping-keys key=$keyArn \ --encryption-context dept=IT \ --commitment-policy require-encrypt-require-decrypt \ --metadata-output ~/metadata \ --max-encrypted-data-keys 1 \ --buffer \ --output testdec --interactive $ ls testdec cool-new-thing.py.encrypted.decrypted hello.txt.encrypted.decrypted employees.csv.encrypted.decrypted
PowerShell
# To run this example, replace the fictitious key ARN with a valid master key identifier. PS C:\> $keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' PS C:\> aws-encryption-cli --decrypt ` --input C:\TestEnc --recursive ` --wrapping-keys key=$keyArn ` --encryption-context dept=IT ` --commitment-policy require-encrypt-require-decrypt ` --metadata-output $home\Metadata.txt ` --max-encrypted-data-keys 1 ` --buffer ` --output C:\TestDec --interactive PS C:\> dir .\TestDec Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 10/8/2017 4:57 PM 2139 cool-new-thing.py.encrypted.decrypted -a---- 10/8/2017 4:57 PM 46 Employees.csv.encrypted.decrypted -a---- 10/8/2017 4:57 PM 11 Hello.txt.encrypted.decrypted

명령줄에서 암호화 및 복호화

이 예제는 입력을 명령(stdin)으로 파이프하고 출력을 명령줄(stdout)에 쓰는 방법을 보여줍니다. 명령에서 stdin 및 stdout을 표현하는 방법과, 기본 제공 Base64 인코딩 도구를 사용하여 쉘이 ASCII가 아닌 문자를 잘못 해석하지 않도록 하는 방법을 설명합니다.

이 예제에서는 일반 텍스트 문자열을 암호화 명령으로 파이프하고 암호화된 메시지를 변수에 저장합니다. 그런 다음 변수에 있는 암호화된 메시지를 복호화 명령으로 파이프하고, 해당 명령은 출력을 파이프라인(stdout)에 씁니다.

이 예제는 다음과 같은 세 가지 명령으로 구성되어 있습니다.

  • 첫 번째 명령은 AWS KMS key의 키 ARN$keyArn 변수에 저장합니다.

    Bash
    $ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab
    PowerShell
    PS C:\> $keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

     

  • 두 번째 명령은 Hello World 문자열을 암호화 명령으로 파이프하고 그 결과를 $encrypted 변수에 저장합니다.

    --input--output 파라미터는 모든 AWS Encryption CLI 명령에 반드시 필요합니다. 입력이 명령(stdin)으로 파이프되고 있음을 나타내려면 --input 파라미터의 값에 하이픈(-)을 사용합니다. 출력을 명령줄(stdout)로 보내려면 --output 파라미터의 값에 하이픈을 사용합니다.

    --encode 파라미터는 출력을 반환하기 전에 출력을 Base64 인코딩합니다. 이렇게 하면 쉘이 암호화된 메시지의 ASCII가 아닌 문자를 잘못 해석하는 것을 방지할 수 있습니다.

    이 명령은 개념 증명일 뿐이므로 암호화 컨텍스트는 생략하고 메타데이터(-S)는 표시하지 않습니다.

    Bash
    $ encrypted=$(echo 'Hello World' | aws-encryption-cli --encrypt -S \ --input - --output - --encode \ --wrapping-keys key=$keyArn )
    PowerShell
    PS C:\> $encrypted = 'Hello World' | aws-encryption-cli --encrypt -S ` --input - --output - --encode ` --wrapping-keys key=$keyArn

     

  • 세 번째 명령은 $encrypted 변수의 암호화된 메시지를 복호화 명령으로 파이프합니다.

    이 복호화 명령은 --input -을 사용하여 입력이 파이프라인(stdin)에서 들어오고 있음을 나타내고 --output -을 사용하여 출력을 파이프라인(stdout)으로 보냅니다. (입력 파라미터는 실제 입력 바이트가 아니라 입력 위치를 사용하므로 $encrypted 변수를 --input 파라미터의 값으로 사용할 수 없습니다.)

    이 예제에서는 --wrapping-keys 파라미터의 discovery 속성을 사용하여 AWS Encryption CLI가 모든 AWS KMS key를 사용하여 데이터를 복호화할 수 있도록 합니다. 여기서는 커밋 정책을 지정하지 않으므로 버전 2.1.x 이상에 대한 기본값인 require-encrypt-require-decrypt를 사용합니다.

    출력이 암호화된 후 인코딩되었으므로 복호화 명령은 --decode 파라미터를 사용하여 Base64로 인코딩된 입력을 복호화하기 전에 디코딩합니다. 또한 --decode 파라미터를 사용하여 Base64로 인코딩된 입력을 암호화하기 전에 디코딩할 수 있습니다.

    앞서 말했듯이, 이 명령은 암호화 컨텍스트를 생략하고 메타데이터(-S)를 표시하지 않습니다.

    Bash
    $ echo $encrypted | aws-encryption-cli --decrypt --wrapping-keys discovery=true --input - --output - --decode --buffer -S Hello World
    PowerShell
    PS C:\> $encrypted | aws-encryption-cli --decrypt --wrapping-keys discovery=$true --input - --output - --decode --buffer -S Hello World

중간 변수 없이 단일 명령으로 암호화 및 복호화 작업을 수행할 수도 있습니다.

이전 예제에서처럼 --input--output 파라미터에는 - 값이 있으며 명령은 --encode 파라미터를 사용하여 출력을 인코딩하고 --decode 파라미터를 사용하여 입력을 디코딩합니다.

Bash
$ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab $ echo 'Hello World' | aws-encryption-cli --encrypt --wrapping-keys key=$keyArn --input - --output - --encode -S | aws-encryption-cli --decrypt --wrapping-keys discovery=true --input - --output - --decode -S Hello World
PowerShell
PS C:\> $keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' PS C:\> 'Hello World' | aws-encryption-cli --encrypt --wrapping-keys key=$keyArn --input - --output - --encode -S | aws-encryption-cli --decrypt --wrapping-keys discovery=$true --input - --output - --decode -S Hello World

여러 마스터 키 사용

이 예제는 AWS Encryption CLI에서 데이터를 암호화 및 복호화할 때 여러 개의 마스터 키를 사용하는 방법을 보여줍니다.

여러 마스터 키를 사용하여 데이터를 암호화하면 해당 마스터 키 중 하나를 사용하여 데이터를 복호화할 수 있습니다. 이 전략을 사용하면 마스터 키 중 하나를 사용할 수 없는 상황에서도 데이터를 복호화할 수 있습니다. 암호화된 데이터를 여러 AWS 리전에 저장하는 경우, 이 전략을 사용하면 동일한 리전에 있는 마스터 키를 사용하여 데이터를 복호화할 수 있습니다.

여러 마스터 키로 암호화하는 경우 첫 번째 마스터 키가 특별한 역할을 합니다. 이 키는 데이터를 암호화하는 데 사용되는 데이터 키를 생성합니다. 나머지 마스터 키는 일반 텍스트 데이터 키를 암호화합니다. 그 결과, 암호화된 메시지에는 암호화된 데이터와 암호화된 데이터 키 모음이 각 마스터 키마다 하나씩 포함됩니다. 데이터 키를 만든 것은 첫 번째 마스터 키이지만, 다른 모든 마스터 키로도 데이터 키를 복호화하여 데이터를 복호화할 수 있습니다.

세 개의 마스터 키를 사용한 암호화

이 예제 명령은 세 개의 래핑 키를 사용하여 세 개의 AWS 리전 각각에 하나씩 Finance.log 파일을 암호화합니다.

이 명령은 암호화된 메시지를 Archive 디렉터리에 씁니다. 이 명령은 값이 없는 --suffix 파라미터를 사용하여 접미사를 표시하지 않으므로 입력 및 출력 파일 이름이 동일합니다.

이 명령은 세 가지 key 속성을 가진 --wrapping-keys 파라미터를 사용합니다. 같은 명령에 여러 개의 --wrapping-keys 파라미터를 사용할 수도 있습니다.

로그 파일을 암호화하기 위해 AWS Encryption CLI는 목록의 첫 번째 래핑 키인 $key1에 데이터 암호화에 사용할 데이터 키를 생성하도록 요청합니다. 그런 다음 나머지 래핑 키를 각각 사용하여 동일한 데이터 키의 일반 텍스트 사본을 암호화합니다. 출력 파일의 암호화된 메시지에는 암호화된 데이터 키 세 개가 모두 포함됩니다.

Bash
$ key1=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab $ key2=arn:aws:kms:us-east-2:111122223333:key/0987ab65-43cd-21ef-09ab-87654321cdef $ key3=arn:aws:kms:ap-southeast-1:111122223333:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d $ aws-encryption-cli --encrypt --input /logs/finance.log \ --output /archive --suffix \ --encryption-context class=log \ --metadata-output ~/metadata \ --wrapping-keys key=$key1 key=$key2 key=$key3
PowerShell
PS C:\> $key1 = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' PS C:\> $key2 = 'arn:aws:kms:us-east-2:111122223333:key/0987ab65-43cd-21ef-09ab-87654321cdef' PS C:\> $key3 = 'arn:aws:kms:ap-southeast-1:111122223333:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d' PS C:\> aws-encryption-cli --encrypt --input D:\Logs\Finance.log ` --output D:\Archive --suffix ` --encryption-context class=log ` --metadata-output $home\Metadata.txt ` --wrapping-keys key=$key1 key=$key2 key=$key3

이 명령은 Finance.log 파일의 암호화된 사본을 복호화하여 Finance 디렉터리의 Finance.log.clear 파일에 씁니다. 세 개의 AWS KMS keys로 암호화된 데이터를 복호화하려면 동일한 세 개의 AWS KMS keys 또는 그 중 일부를 지정할 수 있습니다. 이 예제에서는 AWS KMS keys 중 하나만 지정합니다.

데이터를 복호화하는 데 사용할 AWS KMS keys를 AWS Encryption CLI에 알리려면 --wrapping-keys 파라미터의 key 속성을 사용합니다. AWS KMS keys를 사용하여 복호화할 때 key 속성의 값은 키 ARN이어야 합니다.

지정한 AWS KMS keys에 대해 Decrypt API를 호출할 수 있는 권한이 있어야 합니다. 자세한 정보는 AWS KMS에 대한 인증 및 액세스 제어를 참조하세요.

모범 사례로서, 이 예제는 암호화된 데이터 키가 너무 많은 잘못된 형식의 메시지를 복호화하지 않도록 --max-encrypted-data-keys 파라미터를 사용합니다. 이 예제에서는 복호화에 래핑 키 하나만 사용하지만, 암호화된 메시지에는 암호화할 때 사용되는 세 개의 래핑 키에 대해 각각 하나씩 총 세 개의 암호화된 데이터 키가 있습니다. 암호화된 데이터 키의 예상 개수 또는 적절한 최대값(예: 5)을 지정합니다. 최대값을 3보다 작게 지정하면 명령이 실패합니다. 자세한 내용은 암호화된 데이터 키 제한 섹션을 참조하세요.

Bash
$ aws-encryption-cli --decrypt --input /archive/finance.log \ --wrapping-keys key=$key1 \ --output /finance --suffix '.clear' \ --metadata-output ~/metadata \ --max-encrypted-data-keys 3 \ --buffer \ --encryption-context class=log
PowerShell
PS C:\> aws-encryption-cli --decrypt ` --input D:\Archive\Finance.log ` --wrapping-keys key=$key1 ` --output D:\Finance --suffix '.clear' ` --metadata-output .\Metadata\Metadata.txt ` --max-encrypted-data-keys 3 ` --buffer ` --encryption-context class=log

스크립트의 암호화 및 복호화

이 예제에서는 스크립트에서 AWS Encryption CLI를 사용하는 방법을 보여줍니다. 데이터 암호화 및 복호화만 하는 스크립트를 작성하거나 데이터 관리 프로세스의 일부로 암호화 또는 복호화하는 스크립트를 작성할 수 있습니다.

이 예제에서 스크립트는 로그 파일 모음을 가져와 압축하고 암호화한 다음 암호화된 파일을 Amazon S3 버킷에 복사합니다. 이 스크립트는 각 파일을 개별적으로 처리하므로 사용자는 파일을 독립적으로 복호화하고 확장할 수 있습니다.

파일을 압축하고 암호화할 때는 반드시 암호화하기 전에 압축해야 합니다. 올바르게 암호화된 데이터는 압축할 수 없습니다.

주의

악의적인 공격자가 제어할 수도 있는 비밀 키 및 데이터가 모두 포함된 데이터를 압축할 때는 주의해야 합니다. 압축된 데이터의 최종 크기로 인해 의도치 않게 데이터 내용에 대한 민감한 정보가 드러날 수 있습니다.

Bash
# Continue running even if an operation fails. set +e dir=$1 encryptionContext=$2 s3bucket=$3 s3folder=$4 masterKeyProvider="aws-kms" metadataOutput="/tmp/metadata-$(date +%s)" compress(){ gzip -qf $1 } encrypt(){ # -e encrypt # -i input # -o output # --metadata-output unique file for metadata # -m masterKey read from environment variable # -c encryption context read from the second argument. # -v be verbose aws-encryption-cli -e -i ${1} -o $(dirname ${1}) --metadata-output ${metadataOutput} -m key="${masterKey}" provider="${masterKeyProvider}" -c "${encryptionContext}" -v } s3put (){ # copy file argument 1 to s3 location passed into the script. aws s3 cp ${1} ${s3bucket}/${s3folder} } # Validate all required arguments are present. if [ "${dir}" ] && [ "${encryptionContext}" ] && [ "${s3bucket}" ] && [ "${s3folder}" ] && [ "${masterKey}" ]; then # Is $dir a valid directory? test -d "${dir}" if [ $? -ne 0 ]; then echo "Input is not a directory; exiting" exit 1 fi # Iterate over all the files in the directory, except *gz and *encrypted (in case of a re-run). for f in $(find ${dir} -type f \( -name "*" ! -name \*.gz ! -name \*encrypted \) ); do echo "Working on $f" compress ${f} encrypt ${f}.gz rm -f ${f}.gz s3put ${f}.gz.encrypted done; else echo "Arguments: <Directory> <encryption context> <s3://bucketname> <s3 folder>" echo " and ENV var \$masterKey must be set" exit 255 fi
PowerShell
#Requires -Modules AWSPowerShell, Microsoft.PowerShell.Archive Param ( [Parameter(Mandatory)] [ValidateScript({Test-Path $_})] [String[]] $FilePath, [Parameter()] [Switch] $Recurse, [Parameter(Mandatory=$true)] [String] $wrappingKeyID, [Parameter()] [String] $masterKeyProvider = 'aws-kms', [Parameter(Mandatory)] [ValidateScript({Test-Path $_})] [String] $ZipDirectory, [Parameter(Mandatory)] [ValidateScript({Test-Path $_})] [String] $EncryptDirectory, [Parameter()] [String] $EncryptionContext, [Parameter(Mandatory)] [ValidateScript({Test-Path $_})] [String] $MetadataDirectory, [Parameter(Mandatory)] [ValidateScript({Test-S3Bucket -BucketName $_})] [String] $S3Bucket, [Parameter()] [String] $S3BucketFolder ) BEGIN {} PROCESS { if ($files = dir $FilePath -Recurse:$Recurse) { # Step 1: Compress foreach ($file in $files) { $fileName = $file.Name try { Microsoft.PowerShell.Archive\Compress-Archive -Path $file.FullName -DestinationPath $ZipDirectory\$filename.zip } catch { Write-Error "Zip failed on $file.FullName" } # Step 2: Encrypt if (-not (Test-Path "$ZipDirectory\$filename.zip")) { Write-Error "Cannot find zipped file: $ZipDirectory\$filename.zip" } else { # 2>&1 captures command output $err = (aws-encryption-cli -e -i "$ZipDirectory\$filename.zip" ` -o $EncryptDirectory ` -m key=$wrappingKeyID provider=$masterKeyProvider ` -c $EncryptionContext ` --metadata-output $MetadataDirectory ` -v) 2>&1 # Check error status if ($? -eq $false) { # Write the error $err } elseif (Test-Path "$EncryptDirectory\$fileName.zip.encrypted") { # Step 3: Write to S3 bucket if ($S3BucketFolder) { Write-S3Object -BucketName $S3Bucket -File "$EncryptDirectory\$fileName.zip.encrypted" -Key "$S3BucketFolder/$fileName.zip.encrypted" } else { Write-S3Object -BucketName $S3Bucket -File "$EncryptDirectory\$fileName.zip.encrypted" } } } } } }

데이터 키 캐싱 사용

이 예제에서는 많은 수의 파일을 암호화하는 명령에 데이터 키 캐싱을 사용합니다.

기본적으로 AWS Encryption CLI(및 기타 버전의 AWS Encryption SDK)는 암호화하는 각 파일마다 고유한 데이터 키를 생성합니다. 각 작업에 고유한 데이터 키를 사용하는 것이 암호화 모범 사례이긴 하지만, 일부 상황에서는 데이터 키를 제한적으로 재사용할 수 있습니다. 데이터 키 캐싱을 고려 중인 경우 보안 엔지니어에게 문의하여 애플리케이션의 보안 요구 사항을 파악하고 적합한 보안 임계값을 결정하세요.

이 예제에서는 데이터 키 캐싱으로 마스터 키 공급자에 대한 요청 빈도를 줄여서 암호화 작업의 속도를 높입니다.

이 예제의 명령은 총 약 800개의 작은 로그 파일이 포함된 여러 개의 하위 디렉터리가 있는 큰 디렉터리를 암호화합니다. 첫 번째 명령은 AWS KMS key의 ARN을 keyARN 변수에 저장합니다. 두 번째 명령은 입력 디렉터리의 모든 파일을 (재귀적으로) 암호화하여 아카이브 디렉터리에 씁니다. 이 명령은 --suffix 파라미터를 사용하여 .archive 접미사를 지정합니다.

--caching 파라미터는 데이터 키 캐싱 사용을 설정합니다. 직렬 파일 처리는 한 번에 두 개 이상의 데이터 키를 사용하지 않기 때문에 캐시의 데이터 키 수를 제한하는 capacity 속성은 1로 설정됩니다. 캐시된 데이터 키를 사용할 수 있는 기간을 결정하는 max_age 속성은 10초로 설정됩니다.

선택 사항인 max_messages_crypted 속성은 메시지 10개로 설정되므로 하나의 데이터 키는 10개 이상의 파일을 암호화하는 데 사용되지 않습니다. 각 데이터 키로 암호화되는 파일 수를 제한하면 혹시라도 데이터 키가 손상되는 예기치 못한 상황이 발생하더라도 영향을 받는 파일 수를 줄일 수 있습니다.

운영 체제에서 생성하는 로그 파일에서 이 명령을 실행하려면 관리자 권한(Linux의 경우 sudo, Windows의 경우 관리자 권한으로 실행)이 필요할 수 있습니다.

Bash
$ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab $ aws-encryption-cli --encrypt \ --input /var/log/httpd --recursive \ --output ~/archive --suffix .archive \ --wrapping-keys key=$keyArn \ --encryption-context class=log \ --suppress-metadata \ --caching capacity=1 max_age=10 max_messages_encrypted=10
PowerShell
PS C:\> $keyARN = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' PS C:\> aws-encryption-cli --encrypt ` --input C:\Windows\Logs --recursive ` --output $home\Archive --suffix '.archive' ` --wrapping-keys key=$keyARN ` --encryption-context class=log ` --suppress-metadata ` --caching capacity=1 max_age=10 max_messages_encrypted=10

이 예제에서는 데이터 키 캐싱의 효과를 테스트하기 위해 PowerShell의 Measure-Command cmdlet을 사용합니다. 이 예제를 데이터 키 캐싱 없이 실행하면 완료하는 데 약 25초가 걸립니다. 이 프로세스는 디렉터리의 각 파일에 대해 새 데이터 키를 생성합니다.

PS C:\> Measure-Command {aws-encryption-cli --encrypt ` --input C:\Windows\Logs --recursive ` --output $home\Archive --suffix '.archive' ` --wrapping-keys key=$keyARN ` --encryption-context class=log ` --suppress-metadata } Days : 0 Hours : 0 Minutes : 0 Seconds : 25 Milliseconds : 453 Ticks : 254531202 TotalDays : 0.000294596298611111 TotalHours : 0.00707031116666667 TotalMinutes : 0.42421867 TotalSeconds : 25.4531202 TotalMilliseconds : 25453.1202

데이터 키 캐싱을 사용하면 각 데이터 키를 최대 10개 파일로 제한하는 경우에도 프로세스가 더 빨라집니다. 이제 이 명령은 완료하는 데 12초 미만이 소요되며 마스터 키 공급자에 대한 호출 수를 원래 값의 1/10로 줄입니다.

PS C:\> Measure-Command {aws-encryption-cli --encrypt ` --input C:\Windows\Logs --recursive ` --output $home\Archive --suffix '.archive' ` --wrapping-keys key=$keyARN ` --encryption-context class=log ` --suppress-metadata ` --caching capacity=1 max_age=10 max_messages_encrypted=10} Days : 0 Hours : 0 Minutes : 0 Seconds : 11 Milliseconds : 813 Ticks : 118132640 TotalDays : 0.000136727592592593 TotalHours : 0.00328146222222222 TotalMinutes : 0.196887733333333 TotalSeconds : 11.813264 TotalMilliseconds : 11813.264

max_messages_encrypted 제한을 제거하면 모든 파일이 동일한 데이터 키로 암호화됩니다. 이렇게 변경하면 프로세스가 훨씬 빨라지지는 않고 데이터 키를 재사용할 위험이 증가합니다. 그러나 마스터 키 공급자에 대한 호출 횟수는 1로 줄어듭니다.

PS C:\> Measure-Command {aws-encryption-cli --encrypt ` --input C:\Windows\Logs --recursive ` --output $home\Archive --suffix '.archive' ` --wrapping-keys key=$keyARN ` --encryption-context class=log ` --suppress-metadata ` --caching capacity=1 max_age=10} Days : 0 Hours : 0 Minutes : 0 Seconds : 10 Milliseconds : 252 Ticks : 102523367 TotalDays : 0.000118661304398148 TotalHours : 0.00284787130555556 TotalMinutes : 0.170872278333333 TotalSeconds : 10.2523367 TotalMilliseconds : 10252.3367