マルチ/ハイブリッド雲にあなたの(暗号化)キーをもたらす


ツールとセットアップ


我々がクラウド・プロバイダーの間で共有されるキーを得る楽しみの部分に飛び込む前に、いろいろなツールがこのチュートリアルを働かせるのに必要です.まず、必要がありますdownload and install Vault , それからそれを得るup and running . また、インストールする必要がありますcURL and OpenSSL — これらはたいていほとんどのLinux OSで事前にインストールされており、ほとんどのパッケージマネージャを介して入手できます(apt , yum , brew , choco/scoop , など)私たちの例では、ヘッドとdiffを使用しますcoreutils and diffutils Ubuntuの下のパッケージあなたは、あなたのOSのための類似したパッケージを見つけるか、それらの部分のために手動の回避策を見つけることができます.次に、インストールAWS command line tools ( CLI )と確認してくださいconfigure the CLI あなたのアカウントに接続する.最後のステップはinstall and configure 地獄
つの最後の注意- AHERUからキーを利用するHeroku機能は、プライベートまたはシールドのデータベースプランを必要とするので、あなたのアカウントがそれに応じて設定されていることを確認してください.

イントロ


今日のハイパー接続された世界では、仮想私設ネットワーク(VPN)の下で、または非武装化ゾーン(DMZ)の範囲内でサービスをロックする前のアプローチはもはや安全です.代わりに、我々はゼロ信頼ネットワークモデルで動作しなければならない.これは、アイデンティティとアクセス管理とともに、残りの、そして、トランジットでの暗号化の焦点がシステムが互いと対話することができることを確実とするのに重要であることを意味します.
暗号化プロセスの最も重要な部分のうちの1つは、情報を暗号化して、解読するか、アイデンティティを検証するのに用いられるキーです.この必要性への最近のアプローチは、あなた自身のキー(BYOK)を持って来るということです--顧客/エンドユーザーとしてどこで、あなたのキーを所有して、あなたのキーを管理して、使用のためにそれをサードパーティ(特に雲プロバイダー)に提供してください.しかし、我々がByokが何であるかについて掘る前に、そして、我々がそれを最も活用することができる方法は、重要な管理に関して迅速な要約をしましょう.

鍵管理


高いレベルで、キー管理は、キーが生成され、検証され、取り消しのメカニズムです-手動で、ワークフローの一部として.キー管理の別の機能は、すべての真実のソースとして使用されるルート証明書が他の証明書の下の層で保護されていることを保証しています.
キー管理のために使用されるより人気のあるツールの一つはHashiCorp’s Vault — 特に低い信頼とダイナミックな基盤の世界のために設計されます、そこで、重要な年齢は数年か時間ではなく、数年で測定されることができます.これは、秘密、暗号化を管理するための機能が含まれ、アイデンティティベースのアクセスは、(CLI、API、WebベースのUI)と対話するために多くの方法を提供し、プラグインを介して多くの異なるプロバイダに接続することができます.この記事はVaultを安全なやり方で展開する方法に焦点を当てません.しかし、VaultがBYOKの周りで提供し、今では複数のクラウド環境でキーを消費することができます.
Vaultを使用することの主な特徴は、それがインフラストラクチャとプロバイダーの不可知論的な機能で機能するということです.同時に、Vaultは、ユーザーにキーを公開せずに情報を暗号化して復号化するために使用することができます.

マルチクラウド


ここで、特定のユースケースに飛び込んでいきましょう.Amazon Web Service(AWS)とHerokuに焦点を当て、複数のクラウドに自分のキーを作成し、インジェストする方法を示します.我々の目的のために、AmazonのCLIを使用してAWS KMSにキーをアップロードし、AWS内でどのようにキーを使用できるかを示します.それから、手動でキーを回転させます-理想的に、これは生産実現で自動化されます.最後に、Herokuで生成されたキーを利用してPostgresデータベースを暗号化します.
📝 ノート
始める前に、Vaultはinstalled and running , そして、あなたはVault transit secrets engine setup guide , 我々はAWSにアップロードするキーを生成するために使用するので.Vaultが動作していることを検証したらAWS CLI is installed , 始める時間です.

ボールトでキーを作る


まず、vault内に暗号キーを作成する必要があります.
vault write -f transit/keys/byok-demo-key exportable=true allow\_plaintext\_backup=true
キーをエクスポートするには、vault UIを使用できます.http://localhost:8200/ui/vault/secrets/transit/actions/byok-demo-key?action=export ), または使用する必要がありますcURL , Vault CLIは直接エクスポートをサポートしていません.127.0.0.1アドレスはvaultサーバにマップされます-生産セットアップはlocalhostではなく、暗号化されません.
curl — header “X-Vault-Token: <token>” [http://127.0.0.1:8200/v1/transit/export/encryption-key/byok-demo-key/1](http://127.0.0.1:8200/v1/transit/export/encryption-key/byok-demo-key/1)
このコマンドは、AWS KMSにアップロードするキーのbase 64符号化平文バージョンを出力します.ファイル内のbase 64プレーンテキストキーを保存するvault_key.b64 .

キーをアップロードする


さて、キーマストのないカスタマーマスターキー(CMK)を生成する必要があります.
\# create the keyaws kms create-key — origin EXTERNAL — description “BYOK Demo” — key-usage ENCRYPT\_DECRYPT\# give it a nice nameaws kms create-alias — alias-name alias/byok-demo-key — target-key-id <from above>
出力からキーIDをコピーし、公開キーとインポートトークンをダウンロードします.
aws kms get-parameters-for-import — key-id <from above> — wrapping-algorithm RSAES\_OAEP\_SHA\_1 — wrapping-key-spec RSA\_2048
上記のステップの出力から公開キーとインポートトークンを別々のファイルにコピーしますimport_token.b64 and public_key.b64 ファイル名として、base64 デコード
openssl enc -d -base64 -A -in public\_key.b64 -out public\_key.binopenssl enc -d -base64 -A -in import\_token.b64 -out import\_token.bin
インポートトークンと公開キーを使用すると、我々は現在、キーをOpenSSLバイト形式に変換し、キーをKMSから公開キーを使用して暗号化することで、Vaultからキーをラップするために使用することができます.
\# convert the vault key to bytesopenssl enc -d -base64 -A -in vault\_key.b64 -out vault\_key.bin\# encrypt the vault key with the KMS keyopenssl rsautl -encrypt -in vault\_key.bin -oaep -inkey public\_key.bin -keyform DER -pubin -out encrypted\_vault\_key.bin\# import the encrypted key into KMSaws kms import-key-material — key-id <from above> — encrypted-key-material fileb://encrypted\_vault\_key.bin — import-token fileb://import\_token.bin — expiration-model KEY\_MATERIAL\_EXPIRES — valid-to $(date — iso-8601=ns — date=’364 days’)
鍵がアップロードされたので、キーが正しく機能していることを検証するために、CLIをすばやく暗号化して復号化できます.
\# generate some random text to a filehead /dev/urandom | tr -dc A-Za-z0–9 | head -c 1024 > encrypt\_me.txt\# encrypt the fileaws kms encrypt — key-id <from above> — plaintext fileb://encrypt\_me.txt — output text — query CiphertextBlob | base64 — decode > encrypted\_file.bin\# decrypt the fileaws kms decrypt — key-id <from above> — ciphertext-blob fileb://encrypted\_file.bin — output text — query Plaintext | base64 — decode > decrypted.txt\# validate they match; should be a blank linediff encrypt\_me.txt decrypted.txt
この時点で、キーは適切であり、残りの部分でデータを暗号化するか、またはAWSの異なる部分のトランジットで使用することができます.つは、最も重要な場所のデータを暗号化するS 3にありますファイルは、暗号化されているストレージmandateで座っている.バケットを作成するときは、サーバー側の暗号化を有効にし、キーの種類としてKMSを選択し、KMSマスターキードロップダウンから作成した特定のキーを選択します.

この時点で、バケットに置かれるオブジェクトは自動的に暗号化され、それらが読み込まれると復号化されます.この同じアプローチは、データベースを暗号化するために使用することができますhere .

HerokuでKMSキーを使用する


私たちの次のステップは、我々が生成し、HerokuでAWSにアップロードしたキーを使用することです!目的のために、作成中にPostgresデータベースを暗号化します.これを行うには、HerokuのAWSアカウントアクセスを作成したキーに付与する必要があります.これは、キーを作成するときに、AWI UIを介して、CLI、またはポリシーを介して行うことができます.
AWSのキー作成ウィザードの間、ステップ4はキー使用許可を定義するよう頼みます;AWSアカウントIDをキーに追加できる別のセクションがあります.

Heroku AWSのアカウントIDを入力します.021876802972 ) ウィザードを終了します.CLIを使用してこれを実現する場合は、キーの既定のポリシーを更新する必要があります.
\# get the existing key policyaws kms get-key-policy — policy-name default — key-id <from above> — output text
上記の出力をテキストファイルに保存するheroku-kms-policy.json 次の2つの文を追加します.
{
  "Sid": "Allow use of the key",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::021876802972:root"
  },
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt\*",
    "kms:GenerateDataKey\*",
    "kms:DescribeKey"
  ],
  "Resource": "\*"
},
{
  "Sid": "Allow attachment of persistent resources",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::021876802972:root"
  },
  "Action": [
    "kms:CreateGrant",
    "kms:ListGrants",
    "kms:RevokeGrant"
  ],
  "Resource": "*",
  "Condition": {
    "Bool": {
      "kms:GrantIsForAWSResource": "true"
    }
  }
}
さて、新しいステートメントで既存のポリシーを更新します.
aws kms put-key-policy — key-id <from above> — policy-name default — policy file://heroku-kms-policy.json
上記の出力はないので、再実行しますget-key-policy コマンドが動作したことを検証するコマンドです.
UIを介してポリシーを更新するには、AWS KMSコンソールの「Customer Management Key」セクションの下のキーを参照し、上から2つのステートメントを追加するように編集します.ポリシーからデフォルトビューへの切り替え時には、「他のAWSアカウント」セクションが表示されます.

Herokuがキーへのアクセスを許可しているので、Heroku CLIを使用してPostgresデータベースをアプリケーションにアタッチすることができます.
heroku addons:create heroku-postgresql:private-7 — encryption-key CMK\_ARN — app your-app-name
あなたはfull set of documentation HerokuのPostgresデータベースの暗号化については、既存のデータベースを暗号化する方法についての情報を含めてください.

掃除


この時点で、Herokuでプライベートまたはシールドデータベースを実行するコストを考えると、作成したすべてのリソースを削除することができます.同様に、AWSからキーを取り外すことは、それらが完全にprovisionedされて、削除されるために7日かかるので、示唆されます.vault devサーバを終了すると、devのインスタンスが一時的なので、すべての情報が削除されます.

考慮


AWSとHerokuへのBYOKアプローチについては、多くの点がありますが、強調する必要があるいくつかの考察があります.
  • Vaultはキーの回転を可能にしますが、それは外部自動化を必要とします- cron、ciパイプライン、nomad/kubernetesジョブなど.
  • 同様に、AWSの顧客管理キーも必要ですmanual rotation .
  • があるならばcatastrophic failure in AWS , キーが再インポートされる必要がある可能性があります自動化、テスト、およびこれを検証するすべての生産ユースケースの一部である必要があります.
  • HERUで使用されている間、キーがAWSで削除されるならば.all services and servers that depend on that key will be shutdown .
  • 結論


    これのすべてで、我々はあなたの暗号化キーのローカル所有を維持することは可能であり、望ましいです、そして、所有権がそれからいろいろな雲プロバイダーに広げられることができることを証明しました.この記事はVault、KMS、Herokuによって提供された機能の表面をひっくり返しただけです- Vault自体は同様に非対称の暗号化を管理するのに用いられることができます.そして、アイデンティティ合法化とともにトランジットでデータを保護するのを助けます.KMSはAWSでの暗号化のための基礎であり、ほとんどのサービスにフック、データを確保するための楽な方法を可能にするフックが確保されます.最後に、HerokuのKMSキーを消費する能力は、管理オーバーヘッドを追加することなく、セキュリティレベルを追加することができます.