活動中のサービスとしての暗号化


TLドクター


このブログの記事を読んだ後、なぜ我々はサービスとして暗号化が必要なの概要があります.また、PythonとHashicorp Vaultを使ってPOCを実装し、我々が学んだことを適用します.

概要


現在、銀行や健康情報などの機密データを扱う企業があります.これは、セキュリティ違反の場合には、会社は、法的、金融、悪いPRの影響を受ける可能性があることを意味します.その結果、このタイプのデータを格納する業界標準のガイドラインがあります.例えば、クレジットカードデータを格納する際には、データベースに格納された口座番号を暗号化する必要がある.

交通の暗号化


残りの暗号化はシームレスに行うことができますusing a cloud provider , データを扱うときには、サービスの周りに移動するトリッキーすることができます.はい、サービス間で安全な通信チャネル(例えば、TLS)を使用できますが、これは十分ではありません.TLSを使用しても間違って行くことができる1つのことは、誤って情報をロギングすることです.これはcompanies that are worth billions of dollars and with an awesome engineering team .

アプリケーションレベルでの暗号化の取り扱い


これは、そこに良い暗号ライブラリがあるので可能です.しかし、開発者は正しい方法で実装を行うべきです.
さらに、会社がAを走らせている間Majestic Monolith , チャンスは、メインサービスと相互作用する他のサービスを持っていることです.これは以下のような質問になります.
  • 複数のサービスが機密データへのアクセスを必要とする場合はどうなりますか?
  • どのサービスが暗号化および/または復号化を処理しますか?
  • 暗号キーはどのように処理され、回転され、分散されますか?
  • キーが漏れている場合はどうなりますか?
  • 鍵管理システムの使用


    解決策は集中管理された鍵管理システムで機密データを保護することである.これはHashicorp Vault、AWS KMS、Google CMKなどを使用して行うことができます.アイデアは暗号化と復号化の責任をこのサービスに委ねることです.Hashicorp Vaultのようなソリューションを使用すると、https API呼び出しでアプリケーションデータを暗号化して復号化できます.つまり、
  • データは、残りの部分で暗号化することができます
  • データは、輸送(TLS)で固定されます
  • キー処理と暗号実装はVaultによって、開発者によって扱われます
  • より多くのサービスは、機密データと対話するために加えられるかもしれません
  • どうやって動くの?



    ソースコードを見つけることができますhere .
    ご覧のように、3つのサービスがあります.

    API


    このアプリケーションでは、名前とパン(主要アカウント番号)と“クレジットカード”を作成することができます.すべてのデータが暗号化されて格納され、APIは、使用されるタイプの暗号化について何かを知っているか、またはそれを復号する方法.

    カードプロセッサ


    このサービスは、ビジネスロジックに従って、これまでに作成したクレジットカードを処理します.APIと同様に、暗号化や復号化について何も知りません.

    ボルト


    このサービスはカードプロセッササービスによって行われたAPIと復号によって行われる暗号化を扱います.新しいサービスが将来追加されるならば、暗号化または復号化に関するすべてはまだVaultの上で100 %に依存するでしょう.最良の部分は、他のサービスで変更が行われないことです.

    ハウツー動画


    ジャストドゥーdocker-compose up --build そして、あなたは行く準備ができていなければなりません.

    構成


    次のスクリプトを実行します
    ./bin/vault.sh
    
    3つのことが起こりました.
  • トランジットの秘密エンジンが有効になっています.これはVaultにデータを保存せず、サービス機能として暗号化をオンにするよう指示します.
  • ルートトークンが作成されました.これは、暗号化と復号化するために我々のアプリによって使用されます.
  • 対称キーが生成されました.これはそれぞれのデータを暗号化して復号するために使用されます.
  • グラブtoken 出力値からVAULT_TOKEN env var in :
  • app/settings.py
  • card_processor.py
  • クレジットカードAPIの使用


    ポストリクエストを送るhttp://localhost:8000/credit-cards/ を返します.
    {
        "name":"Carlos Gardel",
        "pan":"4539296620131157"
    }
    
    すべてがうまくいけば、暗号化された主要なアカウント番号を受け取る必要があります.
    {
        "name": "Carlos Gardel",
        "pan": "vault:v1:JnC8pS/zmHhHPGd7dk5eCGilnUi8odvRIBP9Z+rBmMLAWXJ/dgYqGAU4MTk="
    }
    
    を返しますhttp://localhost:8000/credit-cards/ まだ暗号化されたパンフィールドが表示されます.

    カードプロセッササービスの使用


    では、このカードを使ってカードを処理しましょうcard_processor.py サービス
    python3 card_processor.py
    
    カードがうまく解読され処理されたことを見ることができます.
    Processing CARLOS GARDEL card with number 4539296620131157
    

    回転キー


    キーが漏らされるならば、危険を最小にするために、Vaultにそれを回転させるように伝えましょう.
    ./bin/rotate.sh
    
    我々がクレジットカードアプリケーションにもう一つのポスト要求をするならば、我々は我々が使用したのを見ますv2 暗号化を実行する.
    {
        "name": "Aníbal Troilo",
        "pan": "vault:v2:vdIlXggLzrM4n5Xlzxh6a/xpmd7yz/F9MsoifuR/kmOodGKV5wPaWvMMiEw="
    }
    
    我々の異なる暗号化キーバージョン(V 1とV 2)を得て、見ましょう:
    [
        {
            "name": "Carlos Gardel",
            "pan": "vault:v1:JnC8pS/zmHhHPGd7dk5eCGilnUi8odvRIBP9Z+rBmMLAWXJ/dgYqGAU4MTk="
        },
        {
            "name": "Aníbal Troilo",
            "pan": "vault:v2:vdIlXggLzrM4n5Xlzxh6a/xpmd7yz/F9MsoifuR/kmOodGKV5wPaWvMMiEw="
        }
    ]
    
    に戻りましょうcard_processor.py サービス現在、我々は両方のエントリを解読して、処理することができます.一つは復号されたv1 もう一方はv2 .
    Processing CARLOS GARDEL card with number 4539296620131157
    Processing ANÍBAL TROILO card with number 2720997130887021
    
    ベイル暗号化キーと回転はVaultによって処理されました.

    更なる考察


    生産はまだ準備中ですか。


    そうは思わない.
  • rootトークンを使用しています
  • VLultとサービスの間のTLSとコミュニケーションはまだ実装されていない
  • Vaultは密封される必要がある
  • Vaultサービスが信頼できることを確認する必要があります.
  • オープンソース対クラウドプロバイダーソリューション


    あなた自身のオープンソースソリューションに対処するか、またはそれぞれのクラウドプロバイダのソリューションに対処するか?

    包み上げる


    あなたが議論するか、実装に挑戦したいならば、私はそうするのがうれしいです.ちょうどコメントを残すか、私を見つけてください.

    参考文献

  • https://m.signalvnoise.com/the-majestic-monolith/
  • https://blog.deurainfosec.com/credit-card-primary-account-number-and-encryption/
  • https://www.zdnet.com/article/monzo-admits-to-storing-payment-card-pins-in-internal-logs/
  • https://aws.amazon.com/about-aws/whats-new/2019/02/amazon-dynamodb-adds-support-for-switching-encryption-keys-to-encrypt-your-data-at-rest/