Azure Synapse Analytics で暗号化を実装する
このセクションでは、Apache Spark の Transparent Data Encryption と TokenLibrary について説明します。
Transparent Data Encryption とは
Transparent Data Encryption (TDE) とは、Azure Synapse Analytics を保護するための暗号化メカニズムです。 これは悪意のあるオフライン アクティビティの脅威から Azure Synapse Analytics を保護します。 TDE はこれを、保存データを暗号化することによって行います。 TDE では、ユーザーがアプリケーションを変更する必要なしに、データベース、関連付けられたバックアップ、および保存されているトランザクション ログ ファイルの暗号化とその解除が、リアルタイムで実行されます。 Azure Synapse Analytics で TDE を使用するには、これを手動で有効にする必要があります。
TDE では、ページ レベルでデータの I/O の暗号化と暗号化解除がリアルタイムで実行されます。 ページがメモリに読み取られると、暗号化が解除されます。 ディスクに書き込む前に暗号化されます。 TDE では、データベース暗号化キー (DEK) という対称キーを使用してデータベース ストレージ全体が暗号化されます。 データベースを起動すると、暗号化されたデータベース暗号化キーの暗号化が解除されます。 その後 DEK は、SQL Server データベース エンジン内でデータベース ファイルの暗号化解除と再暗号化に使用されます。 DEK は Transparent Data Encryption 保護機能によって保護されています。 この保護機能は、サービスによって管理された証明書 (サービスによって管理された Transparent Data Encryption と呼ばれます)、または Azure Key Vault に格納されている非対称キー (お客様が管理する Transparent Data Encryption) のいずれかになります。
理解しておくべき重要な点は、Azure Synapse Analytics では、この TDE 保護機能がサーバー レベルで設定されていることです。 そこから、そのサーバーにアタッチされているか、そのサーバーに合わせて配置されているすべてのデータベースによって継承されます。 サーバーという言葉は、サーバーとインスタンスの両方を指します。
サービスによって管理された Transparent Data Encryption
前述したように、Transparent Encryption 保護機能によって保護される DEK を、サービスによって管理される証明書にできます。これは、サービスによって管理された TDE と呼ばれます。 Azure では、この既定の設定は、暗号化アルゴリズム AES256 を使用して、サーバーごとに一意の組み込み証明書によって DEK が保護されることを意味します。 データベースが geo レプリケーションのリレーションシップに含まれている場合、プライマリ データベースと geo セカンダリ データベースがプライマリ データベースの親サーバー キーによって保護されます。 これらのデータベースが同じサーバーに接続されている場合は、同じ組み込み AES256 証明書も共有されます。 Microsoft では、社内のセキュリティ ポリシーに準拠して証明書を自動的にローテーションしています。 ルート キーは Microsoft の社内シークレット ストアによって保護されています。 また、geo レプリケーションと復元のために、必要に応じてキーの移動と管理をシームレスに行います。
お客様が管理する Transparent Data Encryption のための独自のキーを使用する Transparent Data Encryption
前述のように、Transparent Data Encryption 保護機能によって保護されている DEK は、Azure Key Vault に格納されている非対称キー (お客様が管理する Transparent Data Encryption) を使用して、お客様が管理することもできます。 これは、TDE に対する Bring Your Own Key (BYOK) サポートとも呼ばれます。 このシナリオが該当する場合、DEK を暗号化する TDE 保護機能はお客様が管理する非対称キーです。 それは、独自の管理対象 Azure Key Vault に格納されます。 Azure Key Vault は、Azure のクラウドベースの外部キー管理システムです。 このマネージド キーは、キー コンテナーから出ることはありません。 TDE 保護機能はキー コンテナーによって生成できます。 別の方法として、オンプレミスのハードウェア セキュリティ モジュール (HSM) デバイスなどから TDE 保護機能をキー コンテナーに転送することもできます。 Azure Synapse Analytics には、DEK の暗号化解除と暗号化のために、ユーザーが所有するキー コンテナーへのアクセス許可が付与されている必要があります。 サーバーからキー コンテナーへのアクセス許可が取り消されると、データベースはアクセス不可となり、すべてのデータが暗号化されます。
TDE 用の Azure Key Vault 統合を使用すると、キーのローテーション、キーのバックアップ、キーのアクセス許可などのキー管理タスクを制御できます。 また、Azure Key Vault 機能の使用時に、すべての TDE 保護機能を監査し、レポートを作成できるようになります。 Key Vault を使用する理由は、厳密に監視された HSM が活用される中央のキー管理システムを提供するためです。 また、セキュリティ ポリシーへのコンプライアンスに適合するために、キーとデータの管理の職務を分離することもできます。
Azure portal で Transparent Data Encryption を管理します。
Azure Synapse Analytics では、Azure 管理者または共同作成者アカウントを使用してサインインした後、Azure portal でデータベースの TDE を管理できます。 TDE の設定は、ユーザー データベースの下にあります。
既定では、サービスによって管理された TDE が使用されるため、そのデータベースを含むサーバーに対して TDE 証明書が自動的に生成されます。
Transparent Data Encryption で保護されたデータベースの移動
一部のユース ケースでは、TDE で保護されているデータベースを移動する必要があります。 Azure 内では、データベースの暗号化を解除する必要はありません。 ソース データベースまたはプライマリ データベースの TDE の設定がターゲットに継承されます。 TDE を継承した Azure 内の操作には、次のようなものがあります。
- geo リストア
- セルフサービスのポイントインタイム リストア
- 削除されたデータベースの復元
- アクティブな地理的レプリケーション
- データベース コピーの作成
- Azure SQL Managed Instance にバックアップ ファイルを復元する
TDE で保護されたデータベースをエクスポートした場合、エクスポートされたコンテンツは暗号化されません。 これは暗号化されていない BACPAC ファイルに格納されます。 この BACPAC ファイルを保護し、新しいデータベースの bacpac ファイルのインポートが終了するとすぐに TDE を有効にする必要があります。
リンクされたサービスと Apache Spark の TokenLibrary を使用して資格情報をセキュリティで保護する
外部ソースからのデータにアクセスすることは、きわめて一般的なパターンです。 外部データソースで匿名アクセスが許可されていない限り、資格情報、シークレット、または接続文字列を使用して接続をセキュリティで保護することが必要になる可能性が高くなります。
Azure Synapse Analytics では、リンクされたサービスを提供することによって統合プロセスが簡略化されます。 これにより、リンクされたサービスまたは Azure Key Vault に接続の詳細を格納できます。 リンクされたサービスを作成すると、Apache Spark では、リンクされたサービスを参照して、コード内に接続情報を適用できるようになります。 Azure Synapse Analytics ワークスペース内の Azure Data Lake Storage Gen 2 からファイルにアクセスする場合は、認証に AAD パススルーを使用します。 そのため、TokenLibrary を使用する必要はありません。 ただし、他のリンクされたサービスに接続するために、TokenLibrary を直接呼び出すことができます。
次に例を示します。他のリンクされたサービスに接続するために、接続文字列を取得して、TokenLibrary を直接呼び出すことができます。 接続文字列を取得するには、getConnectionString 関数を使用し、リンクされたサービスの名前を渡します。
// Scala
// retrieve connectionstring from TokenLibrary
import com.microsoft.azure.synapse.tokenlibrary.TokenLibrary
val connectionString: String = TokenLibrary.getConnectionString("<LINKED SERVICE NAME>")
println(connectionString)
# Python
# retrieve connectionstring from TokenLibrary
from pyspark.sql import SparkSession
sc = SparkSession.builder.getOrCreate()
token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary
connection_string = token_library.getConnectionString("<LINKED SERVICE NAME>")
print(connection_string)
接続文字列をマップとして取得し、接続文字列のキーから特定の値を解析する場合は、次の例を参照してください。
次のような接続文字列で "キーと値" のペアから特定の値を解析するには、
DefaultEndpointsProtocol=https;AccountName=<AccountName>;AccountKey=<AccountKey>
getConnectionStringAsMap 関数を使用してキーを渡し、値を返します。
// Linked services can be used for storing and retreiving credentials (e.g, account key)
// Example connection string (for storage): "DefaultEndpointsProtocol=https;AccountName=<accountname>;AccountKey=<accountkey>"
import com.microsoft.azure.synapse.tokenlibrary.TokenLibrary
val accountKey: String = TokenLibrary.getConnectionStringAsMap("<LINKED SERVICE NAME">).get("<KEY NAME>")
println(accountKey)
# Linked services can be used for storing and retreiving credentials (e.g, account key)
# Example connection string (for storage): "DefaultEndpointsProtocol=https;AccountName=<accountname>;AccountKey=<accountkey>"
from pyspark.sql import SparkSession
sc = SparkSession.builder.getOrCreate()
token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary
accountKey = token_library.getConnectionStringAsMap("<LINKED SERVICE NAME>").get("<KEY NAME>")
print(accountKey)