翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
の例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
サフィックスが付加された新しいファイルを作成したかどうかを確認することもできます。プレーンテキストコンテンツを表示するには、ファイルコンテンツを取得するコマンドの 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暗号化 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