Amazon Web Services ブログ

Amazon RDS for SQL Server における列レベルの暗号化

Amazon Relational Database Service (Amazon RDS) for SQL Server は、列レベルのデータ暗号化をサポートしています。列レベルの暗号化では、すべての列または選択した列に適用できるより詳細なレベルのデータを暗号化できます。列レベルの暗号化では、列ごとに異なる暗号化キーを定義できます。

SQL Server では、接続、データ、ストアドプロシージャに暗号化を使用できます。暗号化の詳細については、「SQL Server 暗号化」を参照してください。

この投稿では、Amazon RDS for SQL Server に列レベルの暗号化を実装する方法を紹介します。

SQL Server の暗号化

Amazon RDS は、データベースインスタンス自動バックアップリードレプリカスナップショットの基盤となるストレージを保護するために、AWS Key Management Service (AWS KMS) を使用して保存時の暗号化をネイティブに提供します。

Amazon RDS for SQL Server は、Microsoft SQL Server Enterprise Edition と Standard Edition でサポートされている透過的データ暗号化 (TDE) をサポートしています。TDE はデータベース内の機密データを暗号化し、証明書を使用してデータを暗号化するキーを保護します。このソリューションでは、キーを持っていない人がデータを使用できないようにします。この種の保護は事前に計画しておく必要があります。TDE は、データおよびログファイルの I/O 暗号化と復号化をリアルタイムで行います。暗号化にはデータベース暗号化キー (DEK) を使用します。データベースブートレコードには、復旧時に使用できるようにキーが保存されます。DEK は対称キーです。サーバーのプライマリデータベースに保存される証明書または EKM モジュールが保護する非対称キーによって保護されます。

TDE は保存中のデータ、つまりデータファイルとログファイルを保護します。これにより、さまざまな業界で確立されている多くの法律、規制、ガイドラインに従うことができます。この機能により、ソフトウェア開発者は既存のアプリケーションを変更せずに AES および 3DES 暗号化アルゴリズムを使用してデータを暗号化し、データがストレージから読み取られるとデータを自動的に復号化できます。不正な復号化を防ぐために、TDE は暗号化キーをデータベース外部のセキュリティモジュールに保存します。データベースレベルの完全な暗号化を実装したいと考えているなら、TDE は良い選択肢です。

TDE はデータベース全体を暗号化しますが、列レベルの暗号化ではデータベース内の個々の列を暗号化できます。暗号化を行うと、対応する復号化キーやパスワードがないとデータが役に立たなくなります。暗号化を行ってもアクセス制御の問題は解決されません。ただし、一部のユースケースでは、アクセス制御がバイパスされてもデータ損失が制限され、セキュリティが強化されます。たとえば、データベースホストコンピューターの設定に誤りがあってハッカーが機密データを入手した場合、盗んだ情報が暗号化されていれば役に立ちません。

ソリューション概要

SQL Server の列レベルのデータ暗号化は、暗号化階層に基づいています。暗号化階層は、データと暗号化キーを保護するために使用されます。階層レベルは以下のとおりです。

  • Windows レベル – このレベルは、Windows データ保護 (DP) API を使用して次のレベルを暗号化して保護します。
  • SQL Server レベル – このレベルには Windows レベルで保護されているサービスマスターキー (SMK) が含まれています。SMK は次のレベルを保護するために使用されます。
  • データベースレベル – このレベルには、データベースマスターキー (DMK) と残りのキーと証明書が含まれます。DMK はデータベース内の証明書、対称キー、非対称キーを暗号化して保護します。

次の図は、完全な暗号化階層 (Microsoft ドキュメントにあるアーキテクチャリファレンス) を示しています。

列レベルの暗号化は、対称キーまたは非対称キーをそれぞれ証明書またはパスワードと組み合わせて使用することで実現できます。次の図は、列レベルの対称暗号化と非対称暗号化の概要を示しています。

以下のセクションでは、両方の実装方法を示します。

方法 1: 対称キーによる列暗号化

対称キーによる列レベルの暗号化の実装手順は次のとおりです。

RDS インスタンスで、次のコマンドを使用して SMK が存在することを確認します。

Use Master go select * from sys.symmetric_keys go

データベースの対称キーを作成するには、まず、対称キーストアの保護機能として機能するマスターキーと証明書を使用してユーザーデータベースを設定する必要があります。

  1. データベースレベルのプライマリキーを作成します。
    use <dbname> CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘<password>’

  2. 証明書を作成します。
    use <dbname>
    CREATE CERTIFICATE <certificate-name> WITH SUBJECT = 'A label for this certificate'

  3. 対称キーを作成します。
    use <dbname>
    CREATE SYMMETRIC KEY <key-name>
    WITH ALGORITHM = AES_256
    ENCRYPTION BY CERTIFICATE <certificate-name>;
    GO

  4. 列を暗号化します。
    use <dbname>
    OPEN SYMMETRIC KEY <key-name>
    DECRYPTION BY CERTIFICATE <certificate-name>;
    UPDATE <table-name>
    SET <encrypted-column-name> = EncryptByKey(Key_GUID('<key-name>’), <column-name>);

  5. 列を復号化します。
    use <dbname>
    OPEN SYMMETRIC KEY <key-name>
    DECRYPTION BY CERTIFICATE < certificate-name>;
    GO
    SELECT
    CONVERT(varchar, DecryptByKey(<encrypted-column-name>)) AS
    'Decrypted-column’ FROM <table-name>;
    GO

方法 2: 非対称キーによる列暗号化

非対称キーによる列レベルの暗号化の実装手順は次のとおりです。

RDS インスタンスで、インスタンスの起動時に Amazon RDS ですでに作成されている SMK を確認します。

Use Master
   go
   select * from sys.symmetric_keys
   go

ユーザーデータベースの非対称キーを作成するには、まずプライマリキーを使用してデータベースを設定し、次にパスワードで暗号化して非対称キーを作成する必要があります。

  1. データベースレベルのプライマリキーを作成します。
    use <dbname>
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘<key-password>’

  2. 非対称キーの作成します。
    use <dbname>
    IF NOT EXISTS (SELECT *
    FROM sys.asymmetric_keys
    WHERE name = '<Asym-key-name>')
    
    BEGIN
    CREATE ASYMMETRIC KEY <Asym-key-name>
    WITH ALGORITHM = RSA_2048
    ENCRYPTION BY PASSWORD = '<Asym-key-password>' ;
    END
    GO

  3. 列を暗号化します。
    use <dbname>
    UPDATE <table-name>
    SET <encrypted-column-name> = ENCRYPTBYASYMKEY(ASYMKEY_ID('<Asym-key-name>'), <column-name>)
    GO

  4. 列を復号化します。
    use <dbname> 
    SELECT *, <Decrypted-column-name> = CONVERT(CHAR(11),DECRYPTBYASYMKEY(ASYMKEY_ID ('<Asym-key-name>'), <encrypted-column-name>, N'<Asym-key-password>’)) FROM <table-name>; 
    GO

まとめ

この投稿では、Amazon RDS for SQL Server に列レベルの暗号化を実装する方法を学びました。暗号化はセキュリティの確保に役立つ貴重な技術ですが、すべてのデータや接続に暗号化を考慮すべきではありません。暗号化を実装するかどうかを決めるときは、ユーザーがどのようにデータにアクセスするかを検討してください。ユーザーがパブリックネットワーク経由でデータにアクセスする場合は、セキュリティを強化するためにデータを暗号化することを強くお勧めします。ただし、すべてのアクセスがセキュアに設定されたイントラネットの中にある場合は、暗号化は必要ない場合があります。暗号化を使用する際には、パスワード、キー、証明書のメンテナンス方法も含める必要があります。


著者について

Kiran Mulupuru は、アマゾンウェブサービスのデータベーススペシャリストテクニカルアカウントマネージャーです。Amazon RDS と Amazon Aurora データベースを専門としています。彼女はお客様と協力して、データベースの運用パフォーマンスに関する技術支援を提供し、データベースのベストプラクティスを共有しています。

Lakshman Thatisetty は、アマゾンウェブサービスのデータベーススペシャリストソリューションアーキテクトです。彼は AWS のお客様と協力してデータベースプロジェクトに関するソリューションを設計し、既存のデータベースを AWS クラウドに移行してモダナイズする支援や、AWS での大規模な移行のオーケストレーションを支援しています。

翻訳はソリューションアーキテクトの Yoshinori Sawada が担当しました。原文はこちらです。