の例AWS暗号化 CLI - AWS Encryption SDK

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

の例AWS暗号化 CLI

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

注記

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

新しいセキュリティ機能は、もともとでリリースされましたAWS暗号化 CLI バージョン 1.7。x2.0と2.0.x。ただし、AWS暗号化 CLI バージョン 1.8。xバージョン 1.7 を置き換えます。xそしてAWS暗号化 CLI 2.1。x2.0 を置き換えます。x。詳細については、関連するを参照してください。セキュリティアドバイザリaws-encryption-sdk-CLIのリポジトリGitHub。

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

使用方法を示す例AWS KMSマルチリージョンキー、「」を参照してください。マルチリージョンの使用 AWS KMS keys

ファイルの暗号化

この例ではを使用します。AWSのコンテンツを暗号化するための暗号化 CLIhello.txtファイル。このファイルには「Hello World」という文字列が含まれています。

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

最初のコマンドは、のキー ARN を保存します。AWS KMS keyの$keyArn変数. で暗号化する場合AWS KMS keyでは、キー ID、キー ARN、エイリアス名、またはエイリアス ARN を使用して識別できます。のキー識別子についての詳細AWS KMS key「」を参照してください。キー識別子AWS Key Management Serviceデベロッパーガイド

2 番目のコマンドは、ファイルの内容を暗号化します。コマンドは --encrypt パラメータを使用してオペレーションを指定し、--input パラメータを使用して暗号化するファイルを指定します。--wrapping-keys パラメータとその必須の key 属性は、キー 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). コマンドが失敗した場合、$?ゼロ以外 (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のパラメータとパラメータキー属性は、暗号化されたメッセージの復号に使用されるラッピングキーを指定します。で復号コマンドでAWS KMS keysの場合、キー属性の値はキー ARN。---wrapping-keys復号コマンドには、パラメータが必要です。を使用している場合AWS KMS keysとすると、キー指定する属性AWS KMS keys復号化または検出値がの属性true(ただし、両方ではない)。カスタムマスターキープロバイダを使用している場合は、キーそしてプロバイダー属性は必須です。

---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. $ 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 サフィックスが付加された新しいファイルを作成したかどうかを確認することもできます。プレーンテキストコンテンツを表示するには、ファイルコンテンツを取得するコマンドの 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

最初のコマンドは、Amazon リソースネーム (ARN)のAWS KMS keyの$keyArn変数.

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

---wrapping-keysパラメータであり、必須であるキー属性で、使用するラッピングキーを指定します。暗号化コマンドには暗号化コンテキスト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. $ 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

この decrypt コマンドは、内のすべてのファイルを復号します。TestEncディレクトリを作成し、プレーンテキストファイルをTestDecディレクトリ. ---wrapping-keysのパラメータとパラメータキー属性とキー ARN値は、AWS暗号化 CLIAWS KMS keysを使用して、ファイルを復号化します。コマンドでは、--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. $ 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) に書き込みます。

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

  • 最初のコマンドは、キー ARNのAWS KMS keyの$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'

     

  • 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=$keyArn )
    PowerShell
    PS C:\> $encrypted = 'Hello World' | aws-encryption-cli --encrypt -S ` --input - --output - --encode ` --wrapping-keys key=$keyArn

     

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

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

    この例ではを使用します。検出の属性--wrapping-keysパラメータで許可するAWSいずれかを使用するための暗号化 CLIAWS 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

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

前の例と同様に、--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暗号化 CLI。

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

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

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

この例では、3 つのラッピングキーを使用してFinance.logファイル、3 つにそれぞれ 1 つずつAWS リージョン。

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

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

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

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.log.clear ディレクトリの Finance ファイルに書き込みます。3 つ以下で暗号化されたデータを復号化するにはAWS KMS keysとすると、同じ3つを指定できるAWS KMS keysまたはそれらのサブセットです。この例では、AWS KMS keys。

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

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

ベストプラクティスとして、この例では--max-encrypted-data-keysパラメータを使用して、暗号化されたデータキーの数が多すぎる不正なメッセージを復号化しないようにします。この例では、復号化にラッピングキーを 1 つだけ使用しますが、暗号化されたメッセージには 3 つの暗号化されたデータキーがあります。暗号化時に使用される 3 つのラッピングキーごとに 1 つずつ。暗号化されたデータキーの予想数または適切な最大値 (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スクリプト内の暗号化 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 の小さなログファイルを含む複数のサブディレクトリを持つ大きなディレクトリを暗号化します。最初のコマンドは、AWS KMS key の ARN を keyARN 変数に保存します。2 番目のコマンドは、入力ディレクトリ内のすべてのファイルを (再帰的に) 暗号化し、アーカイブディレクトリに書き込みます。このコマンドでは、--suffix パラメータを使用して .archive サフィックスを指定します。

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

オプションの max_messages_encrypted 属性は 10 個のメッセージに設定されているため、1 つのデータキーが 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。データキーキャッシュなしでこの例を実行すると、完了に約 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