Drupalで2要素認証を使用する

提供: Amayus Wiki
Jump to navigation Jump to search

Google Authenticator loginというモジュールがあったので、導入してみる。Most Installed で上位に出たから一番使われているんでしょう、たぶん。alphaだけどな。

前提[編集]

あっというまに obsolete したけど、8.6.1 でも動いている

  • Drupal 8.5.3 を標準インストールした環境
  • PHP 7.2.8

Require[編集]

標準インストールでは入ってなくて追加したモジュール

Composerを用意

$ cd $DRUPAL_ROOT
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
$ ls -F composer.phar
composer.phar*

外からまるみえなので隠す

$ cp -pi .htaccess .htaccess.bak
$ cp -pi .htaccess .htaccess.new
$ vi .htaccess.new
$ diff -u .htaccess .htaccess.new > .htaccess-20180903.patch
$ cat .htaccess.patch
--- .htaccess   2018-08-02 05:50:42.000000000 +0900
+++ .htaccess.new       2018-09-03 14:21:52.000000000 +0900
@@ -3,7 +3,7 @@
 #

 # Protect files and directories from prying eyes.
-<FilesMatch "\.(engine|inc|install|make|module|profile|po|sh|.*sql|theme|twig|tpl(\.php)?|xtmpl|yml)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\.(?!well-known).*|Entries.*|Repository|Root|Tag|Template|composer\.(json|lock))$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig|\.save)$">
+<FilesMatch "\.(engine|inc|install|make|module|profile|po|sh|.*sql|theme|twig|tpl(\.php)?|xtmpl|yml)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\.(?!well-known).*|Entries.*|Repository|Root|Tag|Template|composer\.(json|lock|phar))$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig|\.save)$">
   <IfModule mod_authz_core.c>
     Require all denied
   </IfModule>
$ patch .htaccess .htaccess-20180903.patch
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- .htaccess  2018-08-02 05:50:42.000000000 +0900
|+++ .htaccess.new      2018-09-03 14:21:52.000000000 +0900
--------------------------
Patching file .htaccess using Plan A...
Hunk #1 succeeded at 3.
done
$ diff -u .htaccess .htaccess.new
$ rm .htaccess.bak .htaccess.new .htaccess-20180903.patch

christian-riesen/otp を追加。特に説明はなかったか読み飛ばしたかしたかだけど、chillerlan/php-qrcodeparagonie/constant_time_encodingもいるみたいなので一緒にいれる。

$ ./composer.phar require
Search for a package: christian-riesen/otp
Enter the version constraint to require (or leave blank to use the latest version): 2.0
Search for a package: (空Enter)
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 35 installs, 0 updates, 0 removals
  - Installing christian-riesen/base32 (1.3.1): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing christian-riesen/otp (2.0.0): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing symfony/css-selector (v3.4.14): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing behat/mink (dev-master d5ee350): Cloning d5ee350c40 from cache
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing symfony/dom-crawler (v3.4.14): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing symfony/browser-kit (v3.4.14): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing fabpot/goutte (v3.2.1): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing behat/mink-browserkit-driver (v1.3.2): Downloading (connecting...Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing behat/mink-goutte-driver (v1.2.1): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing instaclick/php-webdriver (1.4.5): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing behat/mink-selenium2-driver (dev-master f4efaf5): Cloning f4efaf52fe from cache
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing squizlabs/php_codesniffer (2.8.1): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing drupal/coder (8.2.12): Cloning 984c54a7b1 from cache
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing jcalderonzumba/gastonjs (v1.0.2): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing jcalderonzumba/mink-phantomjs-driver (v0.3.2): Downloading (conneDownloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing mikey179/vfsstream (v1.6.5): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing sebastian/version (1.0.6): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing sebastian/global-state (1.1.1): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing sebastian/recursion-context (1.0.5): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing sebastian/exporter (1.2.2): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing sebastian/environment (1.3.8): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing sebastian/diff (1.4.1): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing sebastian/comparator (1.2.4): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing phpunit/php-text-template (1.2.1): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing doctrine/instantiator (1.0.5): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing phpunit/phpunit-mock-objects (2.3.8):Downloading (100%)         )
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing phpunit/php-timer (1.0.9): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing phpunit/php-file-iterator (1.4.2): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing phpunit/php-token-stream (1.4.11): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing phpunit/php-code-coverage (2.2.4): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing phpdocumentor/reflection-docblock (2.0.4): Downloading (connectinDownloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing phpspec/prophecy (v1.7.0): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing phpunit/phpunit (4.8.36): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing symfony/phpunit-bridge (v3.4.14): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing ircmaxell/password-compat (v1.0.4): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
behat/mink suggests installing behat/mink-zombie-driver (fast and JS-enabled headless driver for any app (requires node.js))
behat/mink suggests installing dmore/chrome-mink-driver (fast and JS-enabled driver for any app (requires chromium or google chrome))
sebastian/global-state suggests installing ext-uopz (*)
phpunit/php-code-coverage suggests installing ext-xdebug (>=2.2.1)
phpdocumentor/reflection-docblock suggests installing dflydev/markdown (~1.0)
phpdocumentor/reflection-docblock suggests installing erusev/parsedown (~1.0)
phpunit/phpunit suggests installing phpunit/php-invoker (~1.1)
Writing lock file
Generating autoload files
> Drupal\Core\Composer\Composer::preAutoloadDump
> Drupal\Core\Composer\Composer::ensureHtaccess
$ ./composer.phar require
Search for a package: chillerlan/php-qrcode
Enter the version constraint to require (or leave blank to use the latest version):  (空Enter)
Using version ^2.0 for chillerlan/php-qrcode
Search for a package: (空Enter)
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
  - Installing chillerlan/php-traits (1.1.13): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
  - Installing chillerlan/php-qrcode (2.0.6): Downloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
Writing lock file
Generating autoload files
> Drupal\Core\Composer\Composer::preAutoloadDump
> Drupal\Core\Composer\Composer::ensureHtaccess
$ ./composer.phar require
Search for a package: paragonie/constant_time_encoding
Enter the version constraint to require (or leave blank to use the latest version): (空Enter)
Using version ^2.2 for paragonie/constant_time_encoding
Search for a package: (空Enter)
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing paragonie/constant_time_encoding (v2.2.2): Downloading (connectinDownloading (100%)
> Drupal\Core\Composer\Composer::vendorTestCodeCleanup
Writing lock file
Generating autoload files
> Drupal\Core\Composer\Composer::preAutoloadDump
> Drupal\Core\Composer\Composer::ensureHtaccess
$

Install[編集]

  • /admin/modules で下記モジュールを有効化
    • Google Login Authenticator
    • Two-factor Authentication (TFA)
    • Encrypt
    • Key
    • Chaos tools
    • Services
    • Serialization

Config[編集]

/admin/config/system/keys/add で暗号鍵を作成[編集]

  • 鍵が作成されない
    • Key typeによって作ってくれたりくれなかったりする?EncryptionだとThe selected key size does not match the actual size of the key.と言われて勝手には作ってくれなかったので、このページを参考に下記要領で生成して「Key value」に設定した。実際に使う鍵の値を公開しちゃだめだぞ☆彡
$ openssl rand -base64 16
EK4MT3oWyu0b9+gCcdX0Fw==
  • 設定した値
項目名 必須? 説明とか設定した値とか
Key name 必須 鍵につける適当な名前、全角文字も使えるけど漢字はシステム内部名称が中国語読みになるっぽい?
説明 任意 鍵のメモ
TYPE SETTINGS Key type 必須 鍵の用途、Encryption を選択
Key size 必須 鍵の強度、128 を選択
PROVIDER SETTINGS Key provider 必須 鍵の保管方法?、環境設定 を選択
Base64-encoded 任意 チェックをつけると鍵を base64 エンコードして保管するっぽい。チェックつけなかった場合はよくわかんない、とりあえずチェックした
Key value 任意 シード値とかじゃなくて値そのものを入れる?、EK4MT3oWyu0b9+gCcdX0Fw==とかを入力
Base64-encoded 任意 入力した鍵がbase64でエンコードされているかどうか?チェックつける

/admin/config/system/encryption/profiles/add でプロファイルを作成[編集]

  • 設定した値
項目名 必須? 説明とか設定した値とか
ラベル 必須 プロファイルにつける適当な名前
Encryption Method 必須 試した環境だとMCrypt AES 128しか選べなかった
Encryption Key 必須 ↑で作った鍵を選ぶ、鍵のビット数が Encyption Method のビット数と一致している必要あり?

/admin/config/people/tfa で2要素認証の設定[編集]

  • プロファイルを作成していなかった場合、No Encryption profiles available. Please set one up.と怒られる。
項目名 説明とか設定した値とか
Enable TFA チェックつける
Roles required to set up TFA 2要素認証を必須にするロールの設定?、とりあえず管理者だけチェックつけた
Allowed Validation plugins 使用できる認証タイプ。GA Login Time-based OTP(TOTP)のみチェックつける
Default Validation plugin 標準の認証タイプ。GA Login Time-based OTP(TOTP)を選択
VALIDATION FALLBACK PLUGINS 端末なくしたとかでワンタイムパスワードが作れなくなったとき用の認証コードを作成するか、いくつ作成するかの設定。特にいじる必要ないかと。
他いろいろ なんか飽きた。たぶんそのままでよし。発行者表示を決める Issuer だけは標準の Drupal からは変えたほうがいいかも。

使ってみる[編集]

  1. /user/XX/security/tfa ができているのでアクセス
  2. Set up application のリンクを選択
  3. 現在のパスワードを聞かれるので入力
    • chillerlan/php-qrcode が入っていないとError: Drupal\ga_login\Plugin\TfaSetup\GALoginTotpSetup->getQrCodeUri() 内 Class 'chillerlan\QRCode\QRCode' not foundエラーが出る
  4. 秘密鍵とQRコードが表示されるので、アプリケーションに登録してApplication verification codeを回答
    • paragonie/constant_time_encoding が入っていないとError: Drupal\ga_login\Plugin\TfaSetup\GALoginTotpSetup->validate() 内 Class 'ParagonIE\ConstantTime\Encoding' not foundエラーが出る
    • iOS版のGoogle Authenticaorでバーコードでの登録ができなかった。Issuerに全角文字を使ったせい?Android版は大丈夫だった。手動登録すればiOS版でも設定可能。
  5. 認証に成功すれば2要素認証の有効化と、リカバリーコードが発行される
  6. リカバリーコードを保存するかどうかを聞かれるので、選択する
  7. ログアウト
  8. ログインすると確認コードを聞かれるようになっている
  9. おしまい