暗号化/復号データを.NET 6とAzureキーVault


セキュリティは難しい.道に沿って間違って行くことができる多くのものがあるので、それは難しいです.攻撃者は1つの小さなギャップを見つける必要がありますが、開発者とITのプロは、すべての可能な攻撃の置換と潜在的なセキュリティ脆弱性について考える必要があります.そういうわけで、我々は話します"security in layers" それが敏感なデータを扱うシステムを構築することになるとき.そして、静的なマーケティングページを作成していない限り、あなたのソリューションが何らかのデータで動作する必要があるでしょう.

どこから始めますか.
あなたがAzure(または他の雲プロバイダ)で動作しているならば、あなたはあなたのデータを休ませて、そして、トランジットで安全にしておくのを助けるためのツールがあります.これはすばらしいdocument それはAzureデータセキュリティと暗号化の高いレベルの概要を得ることができます.そして、より多くのツールがロックダウンしてしっかりとデータへのアクセスを監視するためです.Azure Security Center , アジュールアドバイザーmore その他
このブログの投稿では、クライアントデータの暗号化/復号化を使用します.NETとAzureキーVault.しかし、あなたがそうでないならば.NET開発者は、このブログの投稿の慣習とアイデアはAzure SDKによってサポートされているすべての言語に適用可能であり、すべての言語で利用可能であり、すべてが私たちのAzure REST APIのラッパーであるため、あなた自身のライブラリをロールバックすることができます
このブログ記事の主なポイントは、開発者が根本的な暗号実装を心配することなくデータを暗号化/復号化するための堅牢なソリューションを実装するのを助けることです.したがって、どのように暗号化作品(対称、非対称、推奨アルゴリズムとハード数学)を学ぶの週または数ヶ月を費やす代わりに、AzureキーVaultのようなサービスに仕事を委任する.この方法では、あなたのキーを管理し、コードの外に複雑な操作を実行するための信頼性と拡張性の高いサービスを持っている!そして、それは鍵です:コードからの敏感な操作を取り除くことは、それをより堅牢にします

必要条件
このソリューションでコードを使用できるようにするには、次の手順を実行します.
  • 不当な購読get a FREE one
  • 紺碧のキーボルトcreate one )
  • .ネット6Download
  • 対コードDownload
  • 我々がまだ議論していない1つのものは、この解決がキーVaultに入るインターネットアクセスを必要とするということです.その結果、あなたが孤立して実行し、Azureに呼び出す必要はありませんON Premアプリを持っている場合は、Hashicorp VaultなどのようなPRMのソリューションに相当するを見てする必要があります.

    アカウントセキュリティとベストプラクティス
    ほとんどの開発者は、Azureで作業するときに便利な自分のアカウントを使用する傾向がある.しかし、これは理想的ではない.代わりに、必要なリソースだけに制限されたアクセス権を持つサービスプリンシパルを使用する必要があります.生産に移動するときは、アジュール.アイデンティティライブラリは非常にコードを変更せずに管理されたアイデンティティに切り替えることが容易になります.セキュリティエンドツーエンド.
    適切な権限を持つサービスプリンシパルを作成しましょう.
    お気に入りの端末( Azure CLIがインストールされている)をオープンしたり、Azureクラウドシェルに直接ジャンプして、次のコマンドを実行します.
    az ad sp create-for-rbac -n "cm-keyvault-crypto" --role "Key Vault Crypto User"
    az keyvault set-policy --name cm-identity-kv --object-id a4e0e9c6-c507-4449-a9c4-25243ef61fe9 --key-permissions decrypt encrypt list get
    az login --service-principal -u 2ff15c46-97bd-424a-b97a-433c8e5640d7 -p <your secret> --tenant 72f988bf-86f1-41af-91ab-2d7cd011db47
    
    最初のコマンドはサービスプリンシパルアカウントを作成し、それをcryptoユーザーRBACロールに割り当てます.この例ではRBACを使用しませんが、SPSに適切なロールを割り当てるための推奨練習です.また、デフォルトaz ad sp create-for-rbac コマンドの振る舞いが変更され、貢献者の役割をデフォルトで割り当てを停止-大きなセキュリティ対策を進めて!貢献者は超越した役割です、そして、我々はdev/test/prodのためにそのようなアカウントを使用するのを避けたいです.

    番目のコマンドは、暗号化/復号化に使用するキーを取得できるように、AzureキーVaultに適切なアクセスポリシーを割り当てます.
    最終的なコマンドはAzure CLIのサービスプリンシパルに署名します.

    コードを書きましょう
    この解決法のために、我々は使用するつもりです...NET CLIとVSコード.次のように入力します.
    dotnet new console -n EncryptDecryptSample
    dotnet add package install Azure.Identity
    dotnet add package Azure.Security.KeyVault.Keys -v 4.3.0-beta.2 
    
    VSコードでプロジェクトを開きますcode . . 今、我々はデータを暗号化して解読するために必要なコードを書くことができます.更新Program.cs 次のコードをファイルします
    using System.Text;
    using Azure;
    using Azure.Identity;
    using Azure.Security.KeyVault.Keys;
    using Azure.Security.KeyVault.Keys.Cryptography;
    
    // vault URL could be passed as a parameter
    var KeyVaultUrl = "https://cm-identity-kv.vault.azure.net";
    // using Azure AD to support secretless authentication to Azure Key Vault
    var credentials = new ChainedTokenCredential(
                            new AzureCliCredential(),
                            new ManagedIdentityCredential()
                    );
    
    var client = new KeyClient(new Uri(KeyVaultUrl), credentials);
    
    //this could be parametarized as you may wish to pass different keys for different operations
    var keyName = "MyEncryptionKey";
    
    //get the key (or create one on the fly - very unlikely in a production environment)
    KeyVaultKey key;
    try 
    {
        key = await client.GetKeyAsync(keyName); 
    } 
    catch (RequestFailedException ex) when (ex.Status == 404) 
    {
        key = await client.CreateRsaKeyAsync(new CreateRsaKeyOptions(keyName));
    } 
    
    //get the crypto client of the key
    var cryptoClient = client.GetCryptographyClient(key.Name, key.Properties.Version);
    
    //do the fun stuff
    var plainText = "My secret message";
    var byteData = Encoding.Unicode.GetBytes(plainText);
    
    Console.WriteLine("Encrypting...");
    var encryptedResult = await cryptoClient.EncryptAsync(EncryptionAlgorithm.RsaOaep, byteData);
    Console.WriteLine($"Encrypted data: {Convert.ToBase64String(encryptedResult.Ciphertext)}");
    Console.WriteLine("Decrypting...");
    var decryptedResult = await cryptoClient.DecryptAsync(EncryptionAlgorithm.RsaOaep, encryptedResult.Ciphertext);
    Console.WriteLine($"Decrypted data: {Encoding.Unicode.GetString(decryptedResult.Plaintext)}");
    
    サービスプリンシパルが正しく構成されている場合、dotnet run 次の出力を生成します.

    キーVault許可が間違っているならば、(上の指示に従って、適切な口座で署名したならば、彼らはそうしてはいけません)、あなたは以下のエラーを受け取るかもしれません:

    コードはAzureを使用します.AzureキーVaultを認証してからAをインスタンス化するIDライブラリKeyClientCryptographyClient 必要な操作を実行する.この方法では、我々は決してキーを使用してキーや秘密キーVaultに我々のアプリケーションをより安全にする認証する必要があります.

    NOTE: this code attempts to retrieve a key and, if not found, it creates a new one. The current Service Principal (as configured earlier) doesn't have the appropriate permission to create keys so the code will fail. We can either create a key using a more privileged account, or temporarily update the SP with a Create permission. In real world scenarios, the IT Admins or Security team will be responsible for creating (and rolling) keys in Key Vault.



    そのコードはどこですか.
    このGithub Repoからコードをつかむことができます-それがどのようにまっすぐにジャンプするかに注意してくださいhttps://github.dev/425show/EncryptDecryptDataWithKeyVault )

    概要
    アプリケーションのセキュリティは難しいですが、我々はそれによって脅かされるべきではない、特に以来、開発者は、これらの日の選択のために台無しにされて!我々が過去に解決しなければならなかった多くの困難な問題は、現在我々が簡単に棚を抜けることができて、我々の解決に加えることができるサービスまたは製品です.したがって、アプリケーションでデータを暗号化/復号化する必要がある場合、Azureキーを使用してAzureキーVaultを使用して20行以下のコードを使用することができます.