Field Encryption

Drupalのフィールドデータを暗号化してデータベースに保存し、表示時に復号化することで機密データを保護するモジュール。

field_encrypt
2,233 sites
23
drupal.org

インストール

Drupal 11 v4.0.0
composer require 'drupal/field_encrypt:^4.0'
Drupal 10 v3.2.1
composer require 'drupal/field_encrypt:^3.2'

概要

Field Encryptは、Drupalのフィールドを暗号化された状態でデータベースに保存し、表示時に自動的に復号化する機能を提供します。これにより、データベースへの不正アクセスがあった場合でも、機密性の高いフィールドデータを保護できます。

このモジュールは、Encryptモジュールの暗号化プロファイルを使用して実際の暗号化処理を行います。フィールドの各プロパティ(例:テキストフィールドのvalueやsummary)を個別に暗号化対象として選択でき、きめ細かな制御が可能です。

設定可能フィールド(Field UI経由で作成されたフィールド)とベースフィールド(エンティティタイプに組み込まれたフィールド)の両方の暗号化に対応しています。暗号化設定を変更した場合は、既存のエンティティデータをバッチ処理またはcron経由で自動的に更新できます。

注意点として、暗号化されたフィールドはViewsフィルターやJSON:APIフィルタリングで使用できません。これは暗号化されたデータに対してデータベースレベルでの検索やソートが不可能なためです。

Features

  • フィールドストレージレベルでの暗号化:設定可能フィールドとベースフィールドの両方をサポートし、フィールドデータをデータベースに保存する前に暗号化
  • プロパティ単位の暗号化制御:フィールドの特定のプロパティのみを暗号化対象として選択可能(例:text_with_summaryフィールドのvalueとsummaryを個別に指定)
  • 暗号化プロファイルの管理:Encryptモジュールの暗号化プロファイルを使用し、プロファイルの変更時には既存データの再暗号化をサポート
  • 既存データの暗号化/復号化:暗号化設定変更後、既存エンティティをバッチ処理またはcronで自動更新
  • 暗号化フィールドの一覧表示:すべての暗号化されたフィールドを管理画面で確認し、暗号化の解除も可能
  • 多言語・リビジョン対応:エンティティの翻訳とリビジョンを含めたすべてのデータを適切に暗号化
  • キャッシュ制御:暗号化されたエンティティを永続キャッシュから除外するオプションでセキュリティを強化
  • 特定エンティティの暗号化除外:hook_field_encrypt_allow_encryption()により、条件に基づいて特定のエンティティの暗号化を無効化

Use Cases

個人情報(PII)の保護

ユーザーの氏名、住所、電話番号、メールアドレスなどの個人識別情報を暗号化して保存します。データベースへの不正アクセスがあった場合でも、暗号化鍵なしではデータを読み取れません。GDPRやその他のプライバシー規制への準拠に役立ちます。設定例:ユーザーエンティティのfield_address、field_phone、mailベースフィールドを暗号化。

決済・金融情報の保護

Eコマースサイトで、クレジットカード情報(PCI DSS準拠のため通常は保存しない)以外の財務情報、銀行口座詳細、注文の機密情報などを暗号化します。Commerce Orderエンティティのカスタムフィールドやベースフィールドに暗号化を適用できます。

医療・健康情報の保護

HIPAAなどの医療情報規制に準拠するため、患者の健康記録、診断情報、処方情報などを暗号化して保存します。医療機関向けDrupalサイトでPatientエンティティタイプのfield_medical_historyやfield_prescriptionなどのフィールドを暗号化。

機密ビジネスデータの保護

契約情報、価格設定データ、従業員の給与情報、機密性の高いビジネス文書へのリファレンスなど、競争上重要な情報を暗号化します。共有ホスティング環境やクラウド環境で、データベースアクセスが限定的でない場合に特に有用です。

暗号化プロファイルのローテーション

セキュリティベストプラクティスとして、定期的に暗号化鍵をローテーションする必要がある場合に使用します。新しい暗号化プロファイルを作成してデフォルトに設定し、エンティティタイプ設定ページから既存データを新しいプロファイルで再暗号化できます。

条件付き暗号化(公開/非公開コンテンツ)

hook_field_encrypt_allow_encryptionを使用して、公開済みコンテンツは暗号化せず、下書きや非公開コンテンツのみを暗号化します。これにより、公開コンテンツのパフォーマンスを維持しながら、未公開の機密情報を保護できます。

Tips

  • 暗号化プロファイルの設定は非常に重要です。EncryptモジュールとKeyモジュールのドキュメントを参照し、安全な鍵管理を設定してください。本番環境では環境変数やセキュアなキーストレージを使用することを推奨します。
  • 暗号化設定を変更する前に、必ずデータベースのバックアップを取得してください。バッチ処理中にエラーが発生すると、データが破損する可能性があります。
  • 本番環境での暗号化設定変更は、サイトへのアクセスが少ない時間帯に行うことを推奨します。バッチ処理中にデータが変更されると、不整合が発生する可能性があります。
  • settings.phpで`$settings['field_encrypt.use_eval_for_entity_hooks'] = FALSE;`を設定すると、eval()を使用しない動的フック実装に切り替えられます。ステータスレポートに代替コードが表示されます。
  • 暗号化フィールドのデータは、Viewsやデータベースクエリで直接検索できません。検索が必要なフィールドは暗号化しないでください。
  • フィールドの特定のプロパティのみを暗号化することで、必要なセキュリティレベルとパフォーマンスのバランスを取ることができます。例えば、text_with_summaryフィールドではsummaryは暗号化せずvalueのみを暗号化できます。

Technical Details

Admin Pages 6
Field Encrypt settings /admin/config/system/field-encrypt

暗号化プロファイルの選択と、フィールドタイプごとのデフォルト暗号化プロパティを設定します。

Encrypted fields entity type settings /admin/config/system/field-encrypt/entity-types

ベースフィールドの暗号化設定を行います。エンティティタイプを選択し、暗号化するベースフィールドとそのプロパティを選択します。

Encrypted fields overview /admin/config/system/field-encrypt/field-overview

システム内のすべての暗号化されたフィールドを一覧表示し、各フィールドの暗号化を解除できます。

Process queued updates /admin/config/system/field-encrypt/process-queues

暗号化設定変更後にキューに登録されたエンティティ更新を手動で処理します。

フィールド暗号化解除確認 /admin/config/system/field-encrypt/field-decrypt/{entity_type}/{field_name}/{base_field}

特定のフィールドの暗号化を解除する前の確認画面。確認後、既存データはバッチ処理で復号化されます。

暗号化プロファイル更新確認 /admin/config/system/field-encrypt/entity-types/{entity_type}/update_encryption_profile/{encryption_profile}

エンティティの暗号化プロファイルを現在のデフォルトプロファイルに更新する前の確認画面。

権限 1
フィールド暗号化の管理

フィールドを個別に暗号化してデータをより安全に保護する設定を行えます。この権限により、暗号化プロファイルの選択、フィールドの暗号化/復号化設定、既存データの更新処理を実行できます。機密性の高い権限のため、信頼できる管理者のみに付与してください。

Hooks 1
hook_field_encrypt_allow_encryption

特定のエンティティの暗号化を条件付きで無効化するためのフック。例えば、公開済みノードのみ暗号化をスキップしたい場合などに使用します。

Troubleshooting 6
暗号化されたフィールドでViewsフィルターが機能しない

これは既知の制限事項です。暗号化されたデータはデータベースレベルでのフィルタリング、ソート、検索ができません。代替として、暗号化されていない別のフィールドでフィルタリングするか、プログラムによるフィルタリングを検討してください。JSON:APIフィルタリングも同様に機能しません。

EntityInterface::postSave()で暗号化されたデータにアクセスすると値がプレースホルダーになっている

Field Encryptはentity_presave時に暗号化を行い、entity_storage_load時に復号化します。postSave()ではプレースホルダー値(🔒等)が入っています。カスタムエンティティタイプの場合は、postSave()の先頭で\Drupal::service('field_encrypt.process_entities')->decryptEntity($entity);を呼び出してください。

フィールド暗号化設定後、既存データが暗号化されない

暗号化設定変更後は、/admin/config/system/field-encrypt/process-queuesで「Process updates」をクリックしてバッチ処理を実行するか、cronが実行されるのを待ってください。キューに登録されたエンティティ数が表示されます。

バージョン3.xからのアップグレードができない

Field Encrypt 4.xへの直接アップグレードはサポートされていません。まず3.xでデータを復号化し、モジュールをアンインストールしてから、4.xをインストールして再設定してください。ステータスレポートでエラーが表示されます。

暗号化プロファイルが削除できない

使用中の暗号化プロファイルは削除できません。まず、そのプロファイルを使用しているすべてのエンティティを新しいプロファイルで再暗号化するか、フィールドの暗号化を解除してください。エンティティタイプ設定ページで使用状況を確認できます。

パフォーマンスの低下

暗号化・復号化処理はCPUを使用します。「エンティティを永続キャッシュから除外」オプションを有効にすると、さらにパフォーマンスに影響します。本当に必要なフィールドのみを暗号化し、バッチサイズを調整してください。また、Sodiumモジュールは一般的にReal AESより高速です。

Security Notes 6
  • 暗号化鍵はデータベースとは別の場所に安全に保管してください。データベースと鍵が同じ場所にある場合、暗号化の意味がありません。Keyモジュールの環境変数プロバイダーやファイルプロバイダーを使用することを推奨します。
  • 暗号化プロファイルが削除されると、そのプロファイルで暗号化されたデータは永久に復号化できなくなります。プロファイルの削除前に、すべてのデータを新しいプロファイルで再暗号化するか復号化してください。
  • 「administer field encryption」権限は、非常に機密性の高い操作(暗号化の有効化/無効化、プロファイル変更)へのアクセスを許可します。信頼できる管理者のみに付与してください。
  • 暗号化はデータベースレベルでの保護を提供しますが、アプリケーションレベルでのセキュリティ(アクセス制御、入力検証など)も引き続き重要です。暗号化は多層防御の一部として使用してください。
  • 復号化されたデータはPHPメモリに存在するため、メモリダンプやデバッグログには注意が必要です。本番環境ではデバッグ出力を無効にしてください。
  • このモジュールはDrupalのセキュリティカバレッジの対象です。セキュリティ問題が発見された場合は、drupal.orgのセキュリティチームに報告されます。