adminerでSQLiteを使う時はパッケージ導入が吉

紹介

adminer は OSS で提供されている、各種 DB へのアクセスを提供する非常に便利なツールです。

OSS で提供されている DB クライアントツールでは、MySQL 用の phpMyAdmin や PostgreSQL 用の phpPgAdmin などが有名ですが、それらよりも「操作画面がシンプル」で使いやすくお勧めです。
※参考書や雑誌の説明などでは、よく phpMyAdmin や phpPgAdmin などが紹介されますが、これはこれらのツールが各 DB 専用に設計されているためなのでしょう。

adminer を有名たらしめているのは、それが1ファイルで構成されており、設置・管理が容易だからではないでしょうか。
※1ファイルは本体(adminier.php)です。
(各種プラグインなどが提供されており、それらを含めると1ファイルでは無くなってしまいますが・・・)。

SQLite で使うとエラー!?

以前、SQLite 管理用に Adminer を導入した際は特段何も設定せずに SQLite ファイルにアクセスできたのですが、今回 SQLite ファイルのパスを入れてログインを試みると

  • Adminer does not support accessing a database without a password
    管理者は、パスワードなしでのデータベースへのアクセスをサポートしていません

と怒られてしまいました。。。

調べてみると、時代の流れで adminer で扱う DB はパスワード保護が必須になっていました。

少し悩んだので、メモとして残しておきます。

環境

  • Armbian 20.02.1
    Debian Buster
  • PHP 7.3
  • SQLite3
# cat /etc/issue
Armbian 20.02.1 Buster \l 

# php -i | grep sqlite
/etc/php/7.3/cli/conf.d/20-pdo_sqlite.ini,
/etc/php/7.3/cli/conf.d/20-sqlite3.ini,
PDO drivers => mysql, odbc, pgsql, sqlite
pdo_sqlite
sqlite3
sqlite3.defensive => 1 => 1
sqlite3.extension_dir => no value => no value

導入

前回、導入した手順を参考にインストールします。

DB管理ツール Adminer 導入 – あらいラボ

  • インストール
# apt install adminer
# whereis adminer
adminer: /etc/adminer /usr/share/adminer
  • Apache に設定を読み込ませる準備
# echo "Alias /adminer /usr/share/adminer/adminer" | sudo tee -a /etc/apache2/conf-available/adminer.conf
Alias /adminer /usr/share/adminer/adminer
  • Apache に設定を読み込ませる
# a2enconf adminer.conf
Enabling conf adminer.
To activate the new configuration, you need to run:
  systemctl reload apache2

# systemctl reload apache2.service

使い方

今までのように(パスワード無しで)SQLite へアクセスしようとしてもエラーになります。

パスワードの設定・確認

adminer から DB へアクセスする際は必ず対象 DB のパスワードが必要になります。
そのため、仮のパスワード(合言葉)を事前に設定しておく必要があります。

パスワードを記載するファイルは以下になります。

  • /usr/share/adminer/adminer/sqlite.php

なお、パスワードは初期値だと「YOUR_PASSWORD_HERE」でした。

# cat /usr/share/adminer/adminer/sqlite.php | grep password_hash
            // TODO: inline the result of password_hash() so that the password is not visible in source codes
        new AdminerLoginPasswordLess(password_hash("YOUR_PASSWORD_HERE", PASSWORD_DEFAULT)),

※必ず、パスワードは変更して運用してください。

アクセス

sqlite 用ファイルを経由してアクセスします。

  • {DocumentRoot}/adminer/sqlite.php

通常の URL で開いてから SQLite へアクセスしてもエラーになります。

  • {DocumentRoot}/adminer/
    Database does not support password.

解説

Adminer はバージョン 4.6.3 から、パスワードで保護されていない DB へアクセスすることができなくなりました。

base on Accessing a database without a password

Accessing a database without a password
Adminer 4.6.3 and newer does not support accessing a database without a password.

  1. Set up the database server to require a password. This is possible with all databases except SQLite and SimpleDB.
  2. Use the login-password-less plugin to set up a password required by Adminer but not passed to the database (example).
  3. Use the login-ip plugin to check the IP address and allow an empty password.
  4. Implement the login method to add your custom authentication.

パスワードなしでデータベースにアクセスする
Adminer 4.6.3以降は、パスワードなしでのデータベースへのアクセスをサポートしていません。

1.パスワードを要求するようにデータベースサーバーをセットアップします。これは、SQLiteとSimpleDBを除くすべてのデータベースで可能です。

  1. login-password-lessプラグインを使用して、Adminerに必要だがデータベースには渡されないパスワードを設定します(例)。
  2. login-ipプラグインを使用してIPアドレスを確認し、空のパスワードを許可します。
    1.ログイン方法を実装して、カスタム認証を追加します。

必要ファイルの確認

SQLite にはパスワード機構がないため、パスワードを代替するためのプラグインが用意されています。

Adminer - Plugins

plugin: Required to run any plugin
login-password-less: Enable login without password (example)

上記2ファイルと引用元にある example ページ(adminer/sqlite.php at master · vrana/adminer · GitHub)の計3ファイルを用意すれば、SQLite へアクセスできるようになります。

※sqlite.php がブラウザからのアクセス先で、このファイルが plugin.php, login-password-less.php をインクルードします。

なお、apt や yum などのパッケージ導入をした場合、adminer のプラグインが導入されていないか確認してみてください。
今回、apt で導入すると一緒にインストールされていました

# whereis adminer
adminer: /etc/adminer /usr/share/adminer

# ls /usr/share/adminer/plugins/ | grep -e plugin.php -e login-password-less.php
login-password-less.php
plugin.php

# ls /usr/share/adminer/adminer/ | grep sqlite
sqlite.php

ソースファイル(adminer.php)をダウンロードして設置した場合は、一手間かかります。

上記 URL から下記3ファイルをダウンロードして設置します。

  • plugin.php
  • login-password-less.php
  • sqlite.php

sqlite.php は plugin.php, login-password-less.php をインクルードするのですが、sqlite.php の方が階層が1つ下に設置する体になっているため、必要に応じて、パスを設定し直します。

# cat /usr/share/adminer/adminer/sqlite.php | head -n 4
<?php
function adminer_object() {
    include_once "../plugins/plugin.php";
    include_once "../plugins/login-password-less.php";

ブラウザからのアクセス方法は、上記パッケージ導入のときと基本的に同じです。