例AWS暗号化 CLI - AWS Encryption SDK

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

例AWS暗号化 CLI

以下の例を使用して、AWSご希望のプラットフォームでの暗号化 CLI。マスターキーおよびその他のパラメータのヘルプについては、「の使用方法AWS暗号化 CLI」を参照してください。クイックリファレンスについては、「AWS Encryption SDK CLI の構文およびパラメータのリファレンス」を参照してください。

注記

次の例では、の構文を使用します。AWS暗号化 CLI バージョン 2.1x

新しいセキュリティ機能は、当初AWS暗号化 CLI バージョン 1.7。xと 2.0.x。ただし、AWS暗号化 CLI バージョン 1.8xはバージョン 1.7 を置き換えます。xおよびAWS暗号化 CLI 2.1。x2.0 を置き換えます。x。詳細については、関連するセキュリティアドバイザリ()AWS 暗号化ryption-sdk-GitHub のリポジトリ。

暗号化されたデータキーを制限するセキュリティ機能の使用方法の例については、」暗号化されたデータキーの制限

使用方法を示す例AWS KMSマルチリージョンキーの詳細については、」マルチリージョン KMS キーの使用

ファイルの暗号化

この例ではを使用します。AWS暗号化 CLI を使用して、hello.txtファイルに格納されます。このファイルには「Hello World」という文字列が含まれています。

ファイルに対して encrypt コマンドを実行すると、AWS暗号化CLIは、ファイルの内容を取得し、一意なデータキー、データキーの下でファイルの内容を暗号化し、暗号化されたメッセージ新しいファイルに書き込まれます。

最初のコマンドは、のキー ARN を保存します。AWS KMSカスタマーマスターキー (CMK)$cmkArn変数. CMK で暗号化する場合、キー ID、キー ARN、エイリアス名、エイリアス ARN を使用して識別できます。キー識別子の詳細についてはAWS KMSカスタマーマスターキーについては、キー識別子()AWS Key Management Service開発者ガイド

2 番目のコマンドは、ファイルの内容を暗号化します。コマンドは --encrypt パラメータを使用してオペレーションを指定し、--input パラメータを使用して暗号化するファイルを指定します。---wrapping-keysパラメータ、および必須のkey属性で、キー ARN で表される CMK を使用するようにコマンドに指示します。

このコマンドは --metadata-output パラメータを使用して、暗号化オペレーションに関するメタデータのテキストファイルを指定します。ベストプラクティスとして、このコマンドは --encryption-context パラメータを使用して暗号化コンテキストを指定します。

このコマンドはまた、--commitment-policyパラメータを使用して、コミットメントポリシーを明示的に設定します。バージョン 1.8.xを使用する場合、このパラメータが必要です。--wrapping-keysパラメータ。バージョン 2.1xとすると、--commitment-policyパラメータはオプションですが推奨されます。

--output パラメータの値のドット (.) は、出力ファイルを現在のディレクトリに書き込むようコマンドに指示します。

Bash
\\ To run this example, replace the fictitious key ARN with a valid value. $ cmkArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab $ aws-encryption-cli --encrypt \ --input hello.txt \ --wrapping-keys key=$cmkArn \ --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:\> $CmkArn = '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=$CmkArn ` --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暗号化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暗号化の CLI を使用して、Hello.txt.encrypted前の例で暗号化されたファイル。

復号コマンドは --decrypt パラメータを使用してオペレーションを指定し、--input パラメータを使用して復号するファイルを指定します。--output パラメータの値は、現在のディレクトリを表すドットです。

---wrapping-keysパラメータとkey属性は、暗号化されたメッセージを復号するために使用されるラッピングキーを指定します。復号化コマンドでAWS KMSCMKの場合、キー属性の値はキー ARN。---wrapping-keysパラメータが必要です。を使用している場合AWS KMSCMK を使用する場合は、key属性を使用して復号化用の CMK を指定するか、検出の値を持つ属性をtrue(両方ではない)。カスタムマスターキープロバイダを使用している場合、keyおよびprovider属性は必須です。

---commitment-policyパラメータバージョン 2.1 以降では、オプションになります。xですが、推奨されます。明示的に使用すると、デフォルト値を指定しても、意図が明確になります。require-encrypt-require-decrypt

--encryption-context パラメータは、暗号化コマンドで暗号化コンテキストが指定されている場合でも、復号コマンドではオプションです。この場合、復号コマンドは暗号化コマンドで提供されたものと同じ暗号化コンテキストを使用します。復号化する前に、AWS暗号化 CLI は、暗号化されたメッセージの暗号化コンテキストにpurpose=testペア. そうでない場合、復号コマンドは失敗します。

--metadata-output パラメータは、復号オペレーションに関するメタデータのファイルを指定します。--output パラメータの値のドット (.) は、出力ファイルを現在のディレクトリに書き込みます。

ベストプラクティスとして、--max-encrypted-data-keysパラメーターを使用して、暗号化されたデータキーの数が多すぎて、不正な形式のメッセージを復号化しないようにします。暗号化されたデータキーの予想数(暗号化で使用されるラップキーごとに 1 つ)または妥当な最大値(5 など)を指定します。詳細については、「暗号化されたデータキーの制限」を参照してください。

---bufferは、すべての入力が処理された後にのみプレーンテキストを返します。これには、デジタル署名が存在する場合の検証も含まれます。

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

復号コマンドが成功した場合、出力を返しません。コマンドが成功したかどうかを確認するには、$? 変数の値を取得します。また、ディレクトリ一覧コマンドを使用して、コマンドが .decrypted サフィックスが付加された新しいファイルを作成したかどうかを確認することもできます。プレーンテキストコンテンツを表示するには、ファイルコンテンツを取得するコマンドの catGet-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暗号化CLI:ディレクトリ内のすべてのファイルの内容を暗号化します。

コマンドが複数のファイルに影響する場合、AWS暗号化 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

最初のコマンドは、 カスタマーマスターキー (CMK) の Amazon リソースネーム (ARN)AWS KMS を $cmkArn 変数に保存します。

2 番目のコマンドは、TestDir ディレクトリ内のファイルのコンテンツを暗号化し、暗号化されたコンテンツのファイルを TestEnc ディレクトリに書き込みます。TestEnc ディレクトリが存在しない場合、コマンドは失敗します。入力場所はディレクトリのため、--recursive パラメータが必要です。

---wrapping-keysパラメータ、および必須のkey属性で、使用する折り返しキーを指定します。暗号化コマンドには暗号化コンテキストdept=IT が含まれています。複数のファイルを暗号化するコマンドに暗号化コンテキストを指定すると、すべてのファイルで同じ暗号化コンテキストが使用されます。

また、コマンドには--metadata-outputパラメーターを使用して、AWS暗号化オペレーションに関するメタデータを書き込む暗号化CLI。-AWS暗号化 CLI は、暗号化されたファイルごとに 1 つのメタデータレコードを書き込みます。

---commitment-policy parameterバージョン 2.1 以降では、オプションになります。xですが、推奨されます。コマンドまたはスクリプトが暗号文を復号化できないために失敗した場合は、明示的なコミットメントポリシー設定を使用して問題を迅速に検出できます。

コマンドが完了すると、AWS暗号化 CLI は、暗号化されたファイルをTestEncディレクトリには何も出力を返しません。

最後のコマンドは TestEnc ディレクトリ内のファイルを一覧表示します。プレーンテキストの入力ファイルごとに、暗号化されたコンテンツの出力ファイルが 1 つあります。コマンドは代替サフィックスを指定していないため、暗号化コマンドは各入力ファイル名に .encrypted を付加しました。

Bash
# To run this example, replace the fictitious key ARN with a valid master key identifier. $ cmkArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab $ aws-encryption-cli --encrypt \ --input testdir --recursive\ --wrapping-keys key=$cmkArn \ --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:\> $cmkArn = 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=$cmkArn ` --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 ディレクトリに書き込みます。---wrapping-keysパラメータとkey属性とキー ARN値は、AWSファイルの復号化に使用する CMK の暗号化 CLI。このコマンドはを使用します。--interactiveパラメーターを使用して、AWS暗号化CLI では、同じ名前のファイルを上書きする前にプロンプトを表示します。

このコマンドは、ファイルが暗号化されたときに指定された暗号化コンテキストも使用します。複数のファイルを復号する場合、AWS暗号化CLI はすべてのファイルの暗号化コンテキストをチェックします。ファイルの暗号化コンテキストチェックが失敗した場合、AWS暗号化CLI は、ファイルを拒否し、警告を書き込み、失敗をメタデータに記録してから、残りのファイルのチェックを続けます。そのファイルにAWS暗号化 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. $ cmkArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab $ aws-encryption-cli --decrypt \ --input testenc --recursive \ --wrapping-keys key=$cmkArn \ --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:\> $cmkArn = '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=$cmkArn ` --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) に書き込みます。

この例では、3 つのコマンドで構成されています。

  • 最初のコマンドは、キー ARNのAWS KMSカスタマーマスターキー (CMK)$cmkArn変数.

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

  • 2 番目のコマンドは、Hello World 文字列を暗号化コマンドにパイプし、その結果を $encrypted 変数に保存します。

    ---inputおよび--outputパラメータは、すべてのAWS暗号化 CLI コマンド 入力がコマンドにパイプされている (stdin) ことを示すには、(-) を --input パラメータの値に使用します。出力をコマンドラインに送信する (stdout) には、--output パラメータの値にハイフンを使用します。

    --encode パラメータは、出力を返す前に Base64 エンコードします。これにより、暗号化されたメッセージの ASCII 以外の文字をシェルが誤って解釈することを防止します。

    このコマンドは PoC (概念実証) に過ぎないため、暗号化コンテキストを省略し、メタデータを抑制します (-S)。

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

  • 3 番目のコマンドは、$encrypted 変数に格納された暗号化されたメッセージを復号コマンドにパイプします。

    この復号コマンドでは、入力がパイプラインから来ている (stdin) ことを示すために --input - を使い、出力をパイプラインに送る (stdout) ために --output - を使います。(入力パラメータは実際の入力バイトではなく、入力の場所を取るため、$encrypted 変数を --input パラメータの値として使用することはできません。)

    この例ではを使用します。検出の属性--wrapping-keysパラメーターを使用して、AWS暗号化 CLI を使用して、任意の CMK を使用してデータを復号化します。これは、コミットメントポリシーに設定されているため、バージョン 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

暗号化および復号オペレーションは、介在する変数なしで 1 つのコマンドで実行することもできます。

前の例と同様に、--input および --output パラメータには - 値があり、このコマンドは --encode パラメータを使用して出力をエンコードし、--decode パラメータを使用して入力をデコードします。

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

複数のマスターキーの使用

この例では、でデータを暗号化および復号する際に複数のマスターキーを使用する方法を示します。AWS暗号化 CLI。

複数のマスターキーを使用してデータを暗号化すると、いずれかのマスターキーを使用してデータを復号できます。この戦略では、マスターキーの 1 つが使用できなくてもデータを復号できます。暗号化されたデータを複数の AWS リージョンに保存する場合は、同じリージョン内のマスターキーを使用してデータを復号できます。

複数のマスターキーで暗号化する場合、最初のマスターキーが特別な役割を果たします。それは、データの暗号化に使用されるデータキーを生成します。残りのマスターキーは、プレーンテキストのデータキーを暗号化します。結果として得られる暗号化されたメッセージには、暗号化されたデータと、各マスターキーに対して 1 つずつの暗号化されたデータキーの集合が含まれます。最初のマスターキーがデータキーを生成したにもかかわらず、いずれのマスターキーもデータキーの 1 つを復号でき、それをデータキーの復号に使用することができます。

3 つのマスターキーを使用した暗号化

この例では、3 つの折り返しキーを使用してFinance.logファイル、3 つの各ファイルに 1 つずつAWSリージョン:

これは、暗号化されたメッセージを Archive ディレクトリに書き込みます。このコマンドでは、サフィックスを抑制する値を指定せずに --suffix パラメータを使用しているため、入力ファイル名と出力ファイル名は変わりません。

このコマンドは、--wrapping-keys パラメータとその 3 つの key 属性を使用します。同じコマンドで複数の --wrapping-keys パラメータを使用することもできます。

ログファイルを暗号化するには、AWS暗号化 CLI は、リストの最初のラッピングキー$cmk1を使用して、データの暗号化に使用するデータキーを生成します。次に、他の各ラッピングキーを使用して、同じデータキーのプレーンテキストのコピーを暗号化します。出力ファイルの暗号化されたメッセージには、暗号化された 3 つのデータキーがすべて含まれています。

Bash
$ cmk1=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab $ cmk2=arn:aws:kms:us-east-2:111122223333:key/0987ab65-43cd-21ef-09ab-87654321cdef $ cmk3=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=$cmk1 key=$cmk2 key=$cmk3
PowerShell
PS C:\> $cmk1 = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' PS C:\> $cmk2 = 'arn:aws:kms:us-east-2:111122223333:key/0987ab65-43cd-21ef-09ab-87654321cdef' PS C:\> $cmk3 = '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=$cmk1 key=$cmk2 key=$cmk3

このコマンドは、Finance.log ファイルの暗号化されたコピーを復号し、それを Finance.log.clear ディレクトリの Finance ファイルに書き込みます。3 つの CMK で暗号化されたデータを復号化するには、同じ 3 つの CMK またはそれらのサブセットを指定できます。この例では、CMK の 1 つだけを指定します。

伝えるためにAWS暗号化 CLIAWS KMSデータを復号するために使用する CMK は、keyの属性--wrapping-keysパラメータ。CMK を使用して復号化する場合、key属性は、キー ARN

を呼び出すアクセス権限が必要です。復号化 APIを指定した CMK に入力します。詳細については、「」を参照してください。に対する認証とアクセスコントロールAWS KMS

ベストプラクティスとして、この例では--max-encrypted-data-keysパラメーターを使用して、暗号化されたデータキーの数が多すぎて、不正な形式のメッセージを復号化しないようにします。この例では、復号化にラッピングキーを 1 つだけ使用していますが、暗号化されたメッセージには、暗号化時に使用される 3 つのラッピングキーごとに 1 つずつ、暗号化されたデータキーが 3 つあります。暗号化されたデータキーの予想数、または妥当な最大値(5 など)を指定します。3 より小さい最大値を指定すると、コマンドは失敗します。詳細については、「暗号化されたデータキーの制限」を参照してください。

Bash
$ aws-encryption-cli --decrypt --input /archive/finance.log \ --wrapping-keys key=$cmk1 \ --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=$cmk1 ` --output D:\Finance --suffix '.clear' ` --metadata-output .\Metadata\Metadata.txt ` --max-encrypted-data-keys 3 ` --buffer ` --encryption-context class=log

スクリプトでの暗号化と復号

この例は、使用する方法を示していますAWSスクリプト内の暗号化 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暗号化 CLI (およびその他のバージョンのAWS Encryption SDK) は、暗号化する各ファイルに対して一意のデータキーを生成します。各オペレーションに一意のデータキーを使用するのは暗号化のベストプラクティスですが、一部の状況では限定的なデータキーの再利用が許容されます。データキーキャッシュを検討している場合は、セキュリティエンジニアに相談して、アプリケーションのセキュリティ要件を理解し、適切なセキュリティしきい値を判断してください。

この例では、マスターキープロバイダへのリクエストの頻度を減らすことによって、データキーキャッシュは暗号化オペレーションを高速化します。

この例のコマンドは、合計約 800 の小さなログファイルを含む複数のサブディレクトリを持つ大きなディレクトリを暗号化します。最初のコマンドは CMK の ARN を cmkARN 変数に保存します。2 番目のコマンドは、入力ディレクトリ内のすべてのファイルを (再帰的に) 暗号化し、アーカイブディレクトリに書き込みます。このコマンドでは、--suffix パラメータを使用して .archive サフィックスを指定します。

--caching パラメータはデータキーキャッシュを有効にします。シリアルのファイル処理では一度に複数のデータキーを使用することはないため、キャッシュ内のデータキーの数を制限する capacity 属性は 1 に設定されます。キャッシュされたデータキーの使用可能時間を決定する max_age 属性は 10 秒に設定します。

オプションの max_messages_encrypted 属性は 10 個のメッセージに設定されているため、1 つのデータキーが 10 個以上のファイルを暗号化するために使用されることはありません。各データキーで暗号化するファイル数を制限することで、万一データキーが侵害された場合に影響を受けるファイルの数を減らすことができます。

オペレーティングシステムが生成するログファイルに対してこのコマンドを実行するには、管理者アクセス許可 (Linux では sudo、Windows では [管理者として実行]) が必要な場合があります。

Bash
$ cmkArn=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=$cmkArn \ --encryption-context class=log \ --suppress-metadata \ --caching capacity=1 max_age=10 max_messages_encrypted=10
PowerShell
PS C:\> $cmkARN = '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=$cmkARN ` --encryption-context class=log ` --suppress-metadata ` --caching capacity=1 max_age=10 max_messages_encrypted=10

データキーキャッシュの効果をテストするために、この例では PowerShell の Measure-Command コマンドレットを使用します。データキーキャッシュなしでこの例を実行すると、完了に約 25 秒かかります。このプロセスは、ディレクトリ内のファイルごとに新しいデータキーを生成します。

PS C:\> Measure-Command {aws-encryption-cli --encrypt ` --input C:\Windows\Logs --recursive ` --output $home\Archive --suffix '.archive' ` --wrapping-keys key=$cmkARN ` --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=$cmkARN ` --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=$cmkARN ` --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