紹介
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
導入
前回、導入した手順を参考にインストールします。
- インストール
# 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 へアクセスしようとしてもエラーになります。
- {DocumentRoot}/adminer/
Adminer does not support accessing a database without a password
【URL 例】http://192.168.0.1/adminer/
パスワードの設定・確認
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.
- Set up the database server to require a password. This is possible with all databases except SQLite and SimpleDB.
- Use the login-password-less plugin to set up a password required by Adminer but not passed to the database (example).
- Use the login-ip plugin to check the IP address and allow an empty password.
- Implement the login method to add your custom authentication.
パスワードなしでデータベースにアクセスする
Adminer 4.6.3以降は、パスワードなしでのデータベースへのアクセスをサポートしていません。1.パスワードを要求するようにデータベースサーバーをセットアップします。これは、SQLiteとSimpleDBを除くすべてのデータベースで可能です。
- login-password-lessプラグインを使用して、Adminerに必要だがデータベースには渡されないパスワードを設定します(例)。
- login-ipプラグインを使用してIPアドレスを確認し、空のパスワードを許可します。
1.ログイン方法を実装して、カスタム認証を追加します。
必要ファイルの確認
SQLite にはパスワード機構がないため、パスワードを代替するためのプラグインが用意されています。
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";
ブラウザからのアクセス方法は、上記パッケージ導入のときと基本的に同じです。