Configuration Read-only mode

Drupalの設定をロックし、管理UIでの変更を防止しながら、Drush経由での設定インポートは許可します。

config_readonly
5,399 sites
73
drupal.org

インストール

Drupal 11, 10, 9 v8.x-1.0
composer require 'drupal/config_readonly:8.x-1.0'

概要

Configuration Read-only mode モジュールは、管理インターフェースを通じたすべてのDrupal設定変更をブロックするセキュリティレイヤーを提供します。有効化すると、UIを通じた設定変更の試みはすべてブロックされ、設定が読み取り専用であることを説明する警告メッセージが表示されます。

主な使用ケースは、設定をロックし、Drushを使用してテスト環境から検証済みの設定インポートのみで変更を行うべき本番環境です。これにより、本番環境の設定変更がデプロイ前に適切にテストされ、バージョン管理されることが保証されます。

このモジュールは、Drupalのコア設定ストレージサービスをデコレートし、すべての書き込み操作(write、delete、rename、deleteAll)をインターセプトし、読み取り専用設定が有効な場合は例外をスローします。DrushのConfigImporterを介した設定インポートやupdate.phpを通じたデータベース更新は正常に処理されるようインテリジェントに動作します。

柔軟なホワイトリストシステムにより、読み取り専用モードがアクティブな場合でも特定の設定を編集可能に保つことができ、完全一致とワイルドカードパターンの両方をサポートしています。

Features

  • settings.phpで $settings['config_readonly'] = TRUE を設定すると、読み取り専用モードが有効になり、すべての設定書き込み操作がブロックされます
  • すべての設定フォーム(ConfigFormBase、ConfigEntityListBuilder、ConfigTranslationFormBase)で送信ボタンを自動的に無効化し、警告メッセージを表示します
  • ConfigImporterロックを検出することで、Drush設定インポートは正常に処理されます
  • update.phpを介したデータベース更新では、必要に応じて設定を変更できます
  • 完全一致またはワイルドカード(例:'system.performance' や 'block.block.*')を使用して、特定の設定を読み取り専用保護から除外するホワイトリストパターンをサポートします
  • ホワイトリストパターンはsettings.phpまたはhook_config_readonly_whitelist_patterns()で定義できます
  • 有効時は、設定単一インポートフォーム、モジュール有効化/無効化フォーム、ユーザー権限フォームをブロックします
  • Drupalステータスレポートページに、読み取り専用モードがアクティブかどうかを示すステータス情報を表示します
  • 環境変数に基づく条件付き有効化をサポートします(例:本番環境でのみ有効化)
  • カスタムイベント(ReadOnlyFormEvent)を提供し、他のモジュールがどのフォームを読み取り専用にするかをカスタマイズできます

Use Cases

本番環境の設定をロックする

主な使用ケースは、本番サーバーで設定をロックすることです。Drush設定インポートを許可しながら管理UIを通じた設定変更を防止するには、本番環境のsettings.phpに以下を追加します:$settings['config_readonly'] = TRUE;

環境固有の設定

環境変数を使用して、本番環境でのみ読み取り専用モードを条件付きで有効にします。例:if (isset($_ENV['AH_SITE_ENVIRONMENT']) && $_ENV['AH_SITE_ENVIRONMENT'] === 'prod') { $settings['config_readonly'] = TRUE; } これはAcquia、Platform.sh、または環境変数を設定する他のホスティング環境で有用です。

特定の設定を許可する

本番環境で特定の設定を編集可能のままにする必要がある場合(例:パフォーマンス設定や特定のブロック配置)、ホワイトリストパターンを使用します:$settings['config_readonly_whitelist_patterns'] = ['system.performance', 'block.block.header_*'];

UIのみの保護

UIの変更から保護しながらCLIの変更を許可したい場合(安全性は低いですが必要な場合もあります):if (PHP_SAPI !== 'cli') { $settings['config_readonly'] = TRUE; } 注意:これはシェルアクセスを持つ誰もが保護をバイパスできるため推奨されません。

ファイルベースのトグル

緊急時には、ファイルの存在に基づいて読み取り専用ステータスを設定できます:if (!file_exists('/home/myuser/disable-readonly.txt')) { $settings['config_readonly'] = TRUE; } これにより、コードデプロイなしでトグルファイルを作成するだけで素早く無効化できます。

マルチサイト設定

マルチサイト構成では、各サイトのsettings.phpで読み取り専用設定を定義するか、サイト固有のオーバーライドを含む共有設定を使用して、どのサイトで読み取り専用設定を有効にするかを制御します。

Tips

  • 本番環境にデプロイする前に、非本番環境でホワイトリストパターンを必ずテストしてください
  • 環境変数を使用して読み取り専用モードを条件付きで有効にすると、異なる環境間での管理が容易になります
  • フォームがブロックされると、モジュールはホワイトリストに追加する必要がある設定名を表示します。この情報を使用してホワイトリストを構築してください
  • より動的なホワイトリストロジックが必要な場合は、settings.phpの代わりにカスタムモジュールでhook_config_readonly_whitelist_patterns()を使用することを検討してください
  • 設定インポートとデータベース更新は、読み取り専用設定に関係なく常に許可されることを覚えておいてください
  • ReadOnlyFormEventを使用して、どのフォームを読み取り専用にするかを決定するカスタムロジックを実装できます
  • ホワイトリストパターンはパターン内の任意の場所でワイルドカード(*)をサポートします - 'foo.*.bar'は'foo.baz.bar'にマッチします

Technical Details

Hooks 1
hook_config_readonly_whitelist_patterns

読み取り専用モードがアクティブな場合でも編集可能のままにすべき設定のホワイトリストパターンをモジュールが提供できるようにします。パターンは*文字を使用したワイルドカードをサポートします。

Troubleshooting 5
モジュールは有効だが、設定を変更できてしまう

モジュールを有効化しただけでは保護は有効になりません。読み取り専用モードを有効にするには、settings.phpファイルに $settings['config_readonly'] = TRUE; を追加する必要があります。

Drush config:importがブロックされる

Drush経由の設定インポートは、モジュールがConfigImporterロックを検出するため自動的に動作するはずです。ブロックされる場合は、標準の設定インポートコマンド(drush config:importまたはdrush cim)を使用しており、ConfigImporterをバイパスするカスタムコードではないことを確認してください。

データベース更新(update.php)が失敗する

モジュールはsystem.db_updateルートを介したデータベース更新を自動的に許可します。更新がブロックされる場合は、標準のupdate.phpまたはdrush updatedbメソッドで更新を実行していることを確認してください。

ブロックされている特定の設定を編集する必要がある

settings.phpのホワイトリストに設定名を追加します:$settings['config_readonly_whitelist_patterns'] = ['config.name.here']; 'block.block.*'のようなワイルドカードを使用して複数の設定にマッチさせることができます。

ステータスレポートに「Config Read-only module is enabled but not active」と表示される

この警告は、モジュールはインストールされているが、settings.phpで$settings['config_readonly']がTRUEに設定されていないことを示しています。保護を有効にするには設定を追加してください。

Security Notes 5
  • このモジュールはDrupalのセキュリティアドバイザリポリシーの対象です
  • CLIのみモード(PHP_SAPIチェック)は、シェルまたはDrushアクセスを持つ誰もが設定を変更できるため推奨されません
  • ファイルベースのトグルは、ウェブベースの操作を防ぐためにウェブルート外のファイルを使用する必要があります
  • このモジュールはUI変更から保護しますが、カスタムコードや直接のデータベース操作による設定変更は防止しません
  • 最大限のセキュリティのために、settings.phpの適切なファイル権限と組み合わせ、本番サーバーへのDrush/シェルアクセスを制限してください