Nextcloudの2要素認証が出来ないときに管理者が1度限りのワンタイムコードを発行できる「Two-Factor Admin Support」

Nextcloudユーザが2要素認証を出来ないときにNextcloud管理者が48時間有効な1度限りのワンタイムコードを作成することができる「Two-Factor Admin Support」を試してみました.

「Two-Factor Admin Support」install
$ sudo -u www-data php occ app:install twofactor_admin

occコマンドで導入しました.WebインターフェイスからでもOKです.

nextcloud towfactor admin01

導入後,管理者アカウントで「設定」→「管理」→「セキュリティ」の「Two-Factor Admin」が出来ています.この「User ID」のテキストボックスにワンタイムコードを発行したいユーザIDを入力して「Generate」を押すと48時間有効なワンタイムコードが発行されます.このコードをユーザに伝えてログインしてもらいます.

occコマンドでのワンタイムコードの発行
$ sudo -u www-data php occ twofactorauth:admin:generate-code $USERID
There is an existing code that will be overwritten.

Generated new one-time code for test01: 163929
This code is valid for 48 hours.

occコマンドでも発行できます.

nextcloud towfactor admin02

該当ユーザはユーザID/パスワードを入力した後の2要素認証で「Admin code」という選択肢が増えるのでそれを選びます.

nextcloud towfactor admin03

管理者に教えてもらったワンタイムコードを入力してログインします.

TOTPのデバイスを壊してしまったり家に忘れてきたとかいったときに便利そうです.(数が少なければ)

環境
$ sudo -u www-data php /var/www/files.matoken.org/occ app:list | grep twofactor_admin:
  - twofactor_admin: 3.0.0
$ sudo -u www-data php occ --version
Nextcloud 20.0.8
$ dpkg-query -W php mariadb-server apache2
apache2 2.4.38-3+deb10u4
mariadb-server  1:10.3.27-0+deb10u1
php     2:7.3+69
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64

Nextcloudの電子メール2要素認証の「Two Factor e-mail provider」

Nextcloudアプリの「A Two-Factor-Auth Provider for e-mail」を試してみました.これはNextcloud認証時にユーザID/パスワードで認証した後設定されたメールアドレスにワンタイムトークンが届いて,それを使って2要素目の認証ができるようになるものです.

$ sudo -u www-data php occ app:install twofactor_admin
twofactor_admin 3.0.0 installed
twofactor_admin enabled

まずは導入.occ コマンドでインストールしました.WebIFからでもOKです.

nextcloud towfactor email01

2要素認証を有効にしたいユーザでNextcloud Webにログインして,「右上のアイコン」→「設定」→「個人情報」の「メール」に正しいメールアドレスが設定されているのを確認して,「セキュリティ」→「二要素認証」→「Email verification」の「Enable」を押して有効にします.

Note
電子メールアドレスが未登録だと以下のようなメッセージとなりました.
Could not generate a code: user hoge does not exist

nextcloud towfactor email02

するとトークンがNextcloudに設定したメールアドレスに送信されるのでメールを確認してトークンをテキストボックスに入力して,「Veryfi」を押して確認します.

nextcloud towfactor email03

うまく行きました.
一旦ログアウトしてログインしてみます.

nextcloud towfactor email04

ユーザID/パスワードで認証した後,「Email verification」の画面になります.メールが送信されているはずかので確認してそこに書かれているトークンを入力してログインします.

2要素認証ではTOTP以外にもSMS, Telegram, Signalなどもありますがそれぞれ設定が面倒です.電子メールであればユーザの設定は少ないので良さそうです.

環境
$ sudo -u www-data php occ app:list | grep previewgenerator:
  - previewgenerator: 3.1.1
$ sudo -u www-data php occ --version
Nextcloud 20.0.8
$ dpkg-query -W php mariadb-server apache2
apache2 2.4.38-3+deb10u4
mariadb-server  1:10.3.27-0+deb10u1
php     2:7.3+69
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64

GNU socialに2要素認証を

Mastodonなどでは使える2要素認証ですが,GNU socialにはありません.
先日 GNU social を nightly にしたのでこれが利用できそうです.

Plugin形式で戻すのも簡単そうだし試してみました.

backup
dbとファイルをバックアップしておきます.

$ sudo -u www-data rsync -avv /var/www/gnusocial.matoken.org
rsync --stats -av --delete --link-dest=/export/backup/micro/gs/www/`/bin/date -d '1 day ago' +%Y%m%d`/ /var/www/gnusocial.matoken.org /export/backup/micro/gs/www/`/bin/date +\%Y\%m\%d`/
$ sudo -u www-data tar cvf - /export/backup/micro/gs/www/`/bin/date +\%Y\%m\%d`/ > /export/backup/micro/gs/www/`/bin/date +\%Y\%m\%d`-2fa.tar.xz
$ umask 0266 && /usr/bin/mysqldump --defaults-file=/export/backup/micro/gs/db/.my-backup.cnf --opt --all-databases --events | /usr/bin/xz -9 > /export/backup/micro/gs/db/`date +\%Y-\%M-\%d_\%H:\%m:\%S_\%s_$$`-master2nightly.sql.xz

GNU social の source ディレクトリに移動して 2fa を marge する

$ cd gnu-social
$ git fetch https://git.gnu.io/sstjohn/gnu-social.git 2fa-beta
$ git checkout -b sstjohn/gnu-social-2fa-beta FETCH_HEAD
$ git checkout nightly
$ git merge --no-ff sstjohn/gnu-social-2fa-beta
$ git push origin nightly

動いているGNU social環境にcopy

$ sudo -u www-data rsync -avv --omit-dir-times --exclude=".git*" ./ <GNUSOCIAL_PATH>/

config.phpに以下の行を追加してTwoFactorAuth pluginを有効にする

addPlugin('TwoFactorAuth');

動作確認
設定画面の左側に 2FA という項目が増える.

https://farm5.staticflickr.com/4588/39554232041_1d85c51a91_n.jpg

「Require secondary authentication upon login」のチェックボックスにチェックを付けて SAVE で2FAが有効になる.
Default provider で常用する2FA方式を選択しておくと便利です.

https://farm5.staticflickr.com/4633/39524857262_899ae15086_n.jpg

認証には,「FIDO 2.0」「TOTP」「U2F」が利用できます.
自分はTOTPを利用しています.TOTPの場合スマホアプリのGoogle Autharicatorなどが使えます.QR CodeやKEYを使ってアプリに登録します.

https://farm5.staticflickr.com/4589/38845402154_14ac40b77a_n.jpg

自分は信頼できるスマホを持っていないのでoathtoolを使って適当なscriptを書いて使っています.

$ oathtool --totp -b YJVHGFLJBWJAEROQVQ5MTIAKA2XVCUAH
148825

バックアップコードも保存しておきましょう.

https://farm5.staticflickr.com/4730/39554339271_99efd6658b_n.jpg

この状態で一旦GNU socialをログアウト,いつものID/PASSWORDでログインすると2FAの認証画面になるので,認証情報を入力してログインします.
既定値以外の認証情報を用いたい場合は「Try another way to sign in.」から選択可能です.

https://farm5.staticflickr.com/4587/39555314441_9b42544cc8_n.jpg

bug?
認証後真っ白な画面若しくは「Aythentication success!」と表示されるけど認証画面になります.多分バグです.URLを手動で編集したらログインできています.

https://farm5.staticflickr.com/4736/38658168725_4c15bc2765.jpg

サードパーティアプリケーションの対応
スマホアプリなどを利用している場合はパスワードを変更しなければいけません.
2FAの設定画面の「Application Passwords」の「ADD APPLICATION」ボタンから追加します.「Application name」に識別用の適当な名前を入れて,「Generate」ボタンでパスワードが生成されます.必要が無くなったら「Revoke」で消しましょう.

https://farm5.staticflickr.com/4637/27779332399_189cde7bdc_n.jpg
https://farm5.staticflickr.com/4590/27779333139_0753ed2c8e_n.jpg
https://farm5.staticflickr.com/4588/27779333639_68495ef93b_n.jpg

AndroidアプリのTwidereでは認証情報の変更画面が見当たりませんでした,アカウントの追加をして何時ものhost/id/新しい2faアプリケーションパスワードを設定するとすでにアカウントがあるとか言われて認証情報が書き換わりました.

という感じでとりあえず利用できるようになりました.
GNU socialでは結構長く放置されているので暫くは入らないような感じですかね.
バグはTOTP利用してる人が居ない?Ubico YubiKeyとかほしいですね.