Bulblub

ComposerプラグインのDrupal ParanoiaでDrupalをより安全なディレクトリ構造へ変更する

June 27, 2018

ComposerプラグインのDrupal ParanoiaでDrupalをより安全なディレクトリ構造へ変更する

Drupal Composerグループのリポジトリの中にDrupal ParanoiaというComposerのプラグインを見つけたので試した。前提として、適用するDrupalプロジェクトがdrupal-composer/drupal-projectで作成されていることが必要

なぜこのプラグインを使うか

DocumentRoot以下の不必要なPHPファイルから脆弱性を生まないようにするため。実際2016年にCoderというモジュールで脆弱性SA-CONTRIB-2016-039が発生した。

この脆弱性ではCodeモジュールが有効である必要ではなく、ファイルシステム上にありウェブからアクセスできる場所にあれば攻撃が可能だった。

The module does not need to be enabled for this to be exploited. Its presence on the file system and being reachable from the web are sufficient.

何をするプラグインなのか

DocumentRoot以下PHPファイルをウェブ側からアクセスできない場所に移動し、必要最小限のPHPファイル(スタブ)に置き換えれば目的は達成されるが、composer updateの度に都度行うのは手間なので、これを運用に乗せるため自動的に実行する。

確認

Drupal Paranoia適用前

❯ tree -L 1
.
├── LICENSE
├── README.md
├── composer.json
├── composer.lock
├── drush
├── load.environment.php
├── phpunit.xml.dist
├── scripts
├── vendor
└── web

4 directories, 6 files
❯ tree web -L 1
web
├── autoload.php
├── core
├── index.php
├── modules
├── profiles
├── robots.txt
├── sites
├── themes
├── update.php
└── web.config

5 directories, 5 files

Drupal Paranoia適用後

.
├── LICENSE
├── README.md
├── app
├── composer.json
├── composer.lock
├── drush
├── load.environment.php
├── phpunit.xml.dist
├── scripts
├── vendor
└── web

5 directories, 6 files
❯ tree web -L 1
web
├── core
├── index.php
└── sites

2 directories, 1 file
❯ tree app -L 1
app
├── autoload.php
├── core
├── index.php
├── modules
├── profiles
├── robots.txt
├── sites
├── themes
├── update.php
└── web.config

5 directories, 5 files

残されたPHPファイルは4ファイルのみ

❯ find ./web -name "*.php"
./web/core/install.php
./web/core/modules/statistics/statistics.php
./web/core/rebuild.php
./web/index.php

中身もほぼカラ

❯ cat ./web/index.php
<?php

chdir('../app/');
require './index.php';
❯ cat ./web/core/install.php
<?php

chdir('../../app/core/');
require './install.php';

PHP以外のファイルはシンボリックリンクに置き換え

❯ tree web/core/themes/classy/css
web/core/themes/classy/css
└── components
    ├── action-links.css -> ../../../../../../app/core/themes/classy/css/components/action-links.css
    ├── book-navigation.css -> ../../../../../../app/core/themes/classy/css/components/book-navigation.css
    ├── breadcrumb.css -> ../../../../../../app/core/themes/classy/css/components/breadcrumb.css
    ├── button.css -> ../../../../../../app/core/themes/classy/css/components/button.css
    ├── collapse-processed.css -> ../../../../../../app/core/themes/classy/css/components/collapse-processed.css
    ├── container-inline.css -> ../../../../../../app/core/themes/classy/css/components/container-inline.css
    ├── details.css -> ../../../../../../app/core/themes/classy/css/components/details.css
    (略)

動作確認

snize/demo_drupal-paranoia: Secure your site with Drupal Paranoia

drush site:install demo_umami --db-url="sqlite://sites/default/files/.ht.sqlite" -y
cd web && php -S localhost:8888

まとめ

今回の場合はweb(DocumentRoot)以下が必要最小限のファイルに置き換えられ、構造的に外部のアクセスから守られること確認した。本番運用しても問題ないように見える。 DrupalCon Nashville2018以降Drupal周辺のComposerプロジェクトが活発になっている気がするので今後もウォッチしていきたい。

Tags:

Tomotsugu Kaneko

Written by Tomotsugu Kaneko who lives and works in Japan. Follow me on Twitter