NextCloud のパスワードを CLI から再設定する

ときどきしか使わない NextCloud 環境のログインパスワードの変更のしかた。 なお、ホストしているサーバーにはログインできる必要がある。

パスワードの変更のみ

NextCloud には、サーバー管理用の occ というツールが付属している。これを php で動かすことによってパスワードをリセットすることができる。
この場合、ユーザー名はわかっている必要がある。

cd /var/www/nextcloud
php occ user:resetpassword 管理者ユーザー名
Enter a new password:

ユーザー名が分からない場合

ユーザー名が分からない場合、 DB に直接アクセスしてユーザー名を確認する必要がある。

DB接続情報の確認

NextCloud のインストールディレクトリの config/config.php に、 DB サーバーに関する情報が記載されている。

<?php
$CONFIG = array (
  'instanceid' => 'xxxxxxxxxxxxxx',
  /* 中略 */
  'dbname' => 'nextcloud',
  'dbhost' => 'localhost',
  'dbtableprefix' => 'oc_',
  'dbuser' => 'oc_admin',
  'dbpassword' => 'xxxxxxxxxxxxx'
);

DB に接続してユーザー名を確かめる

設定ファイルで知り得た情報をもとに DB の中を調べる。

$ mysql -u oc_admin -p

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| nextcloud          |
+--------------------+
MariaDB [(none)]> use nextcloud;
Database changed

SQL を発行し、テーブル内のユーザー名 (uid) を調べる。

MariaDB [nextcloud]> select * from oc_users;
+---------------+---------------+--------------------------------------------------------------+---------------+
| uid           | displayname   | password                                                     | uid_lower     |
+---------------+---------------+--------------------------------------------------------------+---------------+
| admin         | Admin         | $2y$12$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | admin         |
| xxxxxx        | xxxxxx        | $2y$12$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | xxxxxx        |
| xxxxxx        | xxxxxx        | $2y$12$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | xxxxxx        |
+---------------+---------------+--------------------------------------------------------------+---------------+

知り得たユーザー名を利用して前述のパスワード変更を行う。

DB を直接編集してパスワードを変更する

何らかの理由で occ が使えないとき、最終手段として DB を直接編集してパスワードを再設定することができる。

パスワードハッシュの作成

以下のコマンドを実行して、新しいパスワードハッシュを作成する。

$ php -r 'echo password_hash("新しいパスワード", PASSWORD_BCRYPT) . PHP_EOL;'
$2y$10$5xIBS7Ua20AbNc3K13hJHOps8jbupNb/F5kDiNcDS5DZlTilDqH7m

DB に接続し、パスワードを更新する

上記「ユーザー名が分からない場合」を実施したのち、以下の SQL を使用してパスワードを更新する。

UPDATE oc_users
SET password = '$2y$10$5xIBS7Ua20AbNc3K13hJHOps8jbupNb/F5kDiNcDS5DZlTilDqH7m'
WHERE uid = '管理者ユーザー名';

ログインし、正規の方法でパスワードを再更新する

先ほど再設定したパスワードはソルトが適用されていない脆弱なパスワードなので、正規の方法で NextCloud にログインし、パスワードを再変更する。