機密を守るのは難しい場合があります。 幸いなことに、Amazon Web Services のツールボックスには役立つツールがいくつかあります。 AWS Secrets Manager について説明することから始めて、次に、Delphi クロスプラットフォーム アプリで Amazon シークレットを簡単に操作する方法を示します。
Table of Contents
AWS Secrets Manager とは?
AWS Secrets Manager はまさにその名のとおりです。 Secrets Manager は、データベースのパスワードなどを、Amazon Web Services に保存する必要がある場合に最適な場所です。 シークレットを作成し、最も簡単な使用法で必要なときに取得します。 Delphi でそれを行う方法を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
program KeepItSecret; {$APPTYPE CONSOLE} uses AWS.SecretsManager; var SecretsManager: ISecretsManagerClient; Request: ISecretsManagerCreateSecretRequest; Response: ISecretsManagerCreateSecretResponse; begin Request := TSecretsManagerCreateSecretRequest.Create( 'prod/MyApp/MyDBPassword', 'MyVerySecretPassword' ); SecretsManager := TSecretsManagerClient.Create; Response := SecretsManager.CreateSecret(Request); if Response.IsSuccessful then Writeln('Secret safely stored.') else Writeln('There was a problem storing your secret.'); end. |
このプログラムは、パスワード「MyVerySecretPassword」を現在の AWS リージョンの AWS Secrets Manager に「prod/MyApplication/MyDBPassword」という名前で保存します。
注: この場合、「展開ステージ/アプリケーション名/アプリケーション シークレット名」のように、シークレットに命名規則を使用することをお勧めします。
これでシークレットが保存されました。それを取り出す方法を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
program RetrieveSecret; {$APPTYPE CONSOLE} uses AWS.SecretsManager; var SecretsManager: ISecretsManagerClient; Response: ISecretsManagerGetSecretValueResponse; begin SecretsManager := TSecretsManagerClient.Create; Response := SecretsManager.GetSecretValue('prod/MyApp/MyDBPassword'); if Response.IsSuccessful then Writeln('Your secret is: ' + Response.SecretString) else Writeln('Could not retrieve your secret.'); end. |
これは、最も単純な形式で動作する Secrets Manager です。 Secrets Manager は、メタデータを使用してシークレットを整理し、指定されたスケジュールでシークレットを自動的にローテーションすることができる高レベルのサービスです。
そのため、暗号化は複雑なビジネスです。 Secrets Manager はどのように暗号化を処理し、必要なすべての複雑さを隠しているのでしょうか? 答えは AWS Key Management Service (AWS KMS) です。KMS について話しましょう…
AWS Key Management Service (AWS KMS) とは?
AWS Key Management Service は、他の AWS サービスが暗号化サービスを必要とするときに使用するサービスです。 いくつかの例を挙げると、Amazon S3 はそれを使用して保存されたオブジェクトの暗号化を有効にし、Amazon Simple Email Service は KMS を使用して暗号化されたメッセージを保存します。
KMS を使用する AWS の各サービスは、アカウント用に生成された暗号化キーをエイリアスの下の各リージョンに保存します。 たとえば、Secrets Manager はエイリアス aws/secretsmanager を使用します。 AWS のサービスに加えて、目的に合わせて独自の暗号化キーを生成して KMS に保存できます。 暗号化キーを作成し、それを使用して単純なテキスト データを暗号化し、暗号化されたデータを復号化する方法を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
program EncryptIt; {$APPTYPE CONSOLE} uses AWS.KMS, System.Classes, System.SysUtils; var KMS: IKMSClient; CreateKeyRequest: IKMSCreateKeyRequest; CreateKeyResponse: IKMSCreateKeyResponse; CreateAliasResponse: IKMSCreateAliasResponse; EncryptRequest: IKMSEncryptRequest; EncryptResponse: IKMSEncryptResponse; DecryptRequest: IKMSDecryptRequest; DecryptResponse: IKMSDecryptResponse; DecryptedText: TStringStream; begin KMS := TKMSClient.Create; try // Create a KMS key. CreateKeyRequest := TKMSCreateKeyRequest.Create; CreateKeyResponse := KMS.CreateKey(CreateKeyRequest); // Create an alias so I can remember my key. CreateAliasResponse := KMS.CreateAlias('alias/MyApp', CreateKeyResponse.KeyMetadata.KeyId); // Encrypt some text. EncryptRequest := TKMSEncryptRequest.Create('alias/MyApp', 'My secret...'); EncryptResponse := KMS.Encrypt(EncryptRequest); if EncryptResponse.IsSuccessful then begin Writeln( Format( 'Encrypted secret. Received %d bytes.', [EncryptResponse.CiphertextBlob.Size] ) ); // Let's decrypt the CiphertextBlob and output the text. DecryptRequest := TKMSDecryptRequest.Create(EncryptResponse.CiphertextBlob); DecryptResponse := KMS.Decrypt(DecryptRequest); if DecryptResponse.IsSuccessful then begin DecryptedText := TStringStream.Create; try DecryptedText.CopyFrom(DecryptResponse.Plaintext); Writeln(Format('Decrypted: "%s"', [DecryptedText.DataString])); finally DecryptedText.Free; end; end; end; except on E: EKMSException do Writeln(E.ClassName, ': ', E.Message); end; end. |
次の例では、キーのエイリアス alias/MyApp
を使用して、値を復号化するときに暗号化キーを参照します。 エイリアスを使用すると、今後の操作でキーを見つけやすくなります。
Secrets Manager ではなく KMS を使用する理由を疑問に思うかもしれません。 結局のところ、これらのプログラムは基本的に同じことを行います。 答えは、コストと機能の組み合わせです。 Secrets Manager の方が使いやすいですが、保存されているシークレットごとに料金がかかります。現在、KMS はキーごとに課金され、多くのシークレットを暗号化/復号化するために使用できます。 シークレット ローテーションを処理し、Amazon Relational Database Service (RDS) などのサービスと統合されたシンプルなマネージド ソリューションを探している場合は、Secrets Manager を購入する価値があります。 暗号化、復号化、署名、検証などの汎用暗号化機能を探しているなら、KMS が最適です。
Delphi を使用した AWS への接続に関する詳細はどこで確認できますか?
サンプル プロジェクト「Secrets Manager Console」は、GitHub の AWS SDK for Delphi サンプル リポジトリで入手でき、AWS Secrets Manager と AWS KMS の機能の一部を示しています。
AWS Secrets Manager の機能の詳細については、AWS Secrets Manager ユーザーガイドをお読みください。
AWS Key Management Service (AWS KMS) が提供するものについては、AWS Key Management Service ユーザーガイドをお読みください。
Appercept AWS SDK for Delphi について
Appercept AWS SDK for Delphi は、Embarcadero Delphi または RAD Studio の Enterprise または Architect サブスクリプションが有効な GetIt でのみ利用できます。 アクティブなサブスクリプションがある場合は、Delphi または RAD Studio 内の GetIt パッケージ マネージャーを介して SDK をインストールできます。
Appercept AWS SDK でできることについては、以下のサイトで詳しく読むことができます。
- Amazon Textract を使用して画像内のテキストを検出して抽出する方法
- Amazon Polly を使用して、クロス プラットフォーム アプリでテキストを簡単に音声に変換する方法
- アプリで AWS SES をネイティブに使用するために必要なものすべて
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition