Nextcloud 14 の Telegram を使った2要素認証

先日ファイル共有ソフトの Nextcloud 14がリリースされました．

Nextcloud 14 now available with Video Verification, Signal/Telegram 2FA support, Improved Collaboration and GDPR compliance – Nextcloud

新機能のうちSignal/Telegram/SMS による2要素認証のサポートが気になります．

Signal/Telegram/SMS 2FA support
A new 2-factor authentication provider named ‘gateway’ was introduced which allows users to use the secure messaging apps Signal and Telegram as well as various SMS gateways as second factor to secure their authentication.

SMSはplaySMS, websms.deを利用するようです．SignalもTelegramもセキュアなメッセージングサービスなのでこういう用途に向いていそうです．どちらも公式でLinux x86_64のデスクトップアプリが提供されています．アプリの出来は今の所Telegramのほうが上だと思います．Arm Linuxだと公式のものはないのですが，TelegramについてはCLIのアプリがあり，Raspberry Pi の Raspbian stretch でも要patchで動作しました．(Webアプリもあるのでそちらでも動作すると思うが未確認)

Free and Open Source SMS Gateway

Professionelle Business Messaging Produkte – websms| Mobile Messaging Deutschland

Signal >> Home

Telegram Messenger

vysheng/tg: telegram-cli

Telegram の非公式cli client の telegram-cli を試す – matoken’s meme

SMSはやったことがあるし，Telegram が使いやすい．てことでTelegramの設定をしてみました．まだ未実装な機能が多くちょっと面倒なのでメモしておきます．

Table of Contents

Two-Factor Gateway の導入

Telegram Bot の作成

BotFather と会話してbot作成

occ コマンドで Telegram bot のトークン設定

Telegram bot の chat_id を調べて登録する

Telegram 認証を試す

めんどくさい……

環境

Two-Factor Gateway の導入

Nextcloud 14に Two-Factor Gateway アプリを導入します．管理者アカウントで「アプリ」の「セキュリティ」から導入するのが楽でしょう．

Two-Factor Gateway – アプリ – App Store – Nextcloud

導入するとNextcloudの「設定」の「セキュリティ」の中に「Message gateway second-factor auth」という項目が現れますが，設定が出来ません．

GitHubのドキュメントをみると未だ未実装の機能が多いようです．

nextcloud/twofactor_gateway: Second factor provider using an external messaging gateway (SMS, Telegram, Signal)

twofactor_gateway/doc/admin at master · nextcloud/twofactor_gateway

Telegram Bot の作成

TOTPコードの送信する Telegram Bot を作成します．作成はTelegram のドキュメントを参照して作成します．

Bots: An introduction for developers

Telegram Bot API

BotFather と会話してbot作成

BotFather という bot 管理用の bot が居るので，会話してbot を作成します．

アイコンちょっと怖い

/newbot コマンドで新しい bot の作成が始まります．botの名前を効かれるので答えます．続いて bot の username を求められます．この username は最後に bot とつける必要があります．
成功するとアクセストークンが表示されるのでメモして次の手旬に移ります．以下の例では 640093430:AAFTa_pSAcKCZWeFoVDt-l7h7ewqzNe0Luo がトークンです．

Done! Congratulations on your new bot. You will find it at t.me/matoken_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API:
640093430:AAFTa_pSAcKCZWeFoVDt-l7h7ewqzNe0Luo

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

occ コマンドで Telegram bot のトークン設定

Nextcloud のインストールされている場所に Nextcloud 管理用の occ コマンドがあります．このコマンドで Telegram bot のトークンを設定します．
トークンの 640093430: 部分は省いてその後ろだけを入力します．

$ sudo -u www-data php ./occ twofactorauth:gateway:configure telegram
Please enter your Telegram bot token: AAFTa_pSAcKCZWeFoVDt-l7h7ewqzNe0Luo
Using AAFTa_pSAcKCZWeFoVDt-l7h7ewqzNe0Luo.
$ sudo -u www-data php ./occ twofactorauth:gateway:status
Signal gateway: not configured
SMS gateway: not configured
Telegram gateway: configured

ひとまずこれで管理者側の設定は終了です．

Telegram bot の chat_id を調べて登録する

ここからはNextcloud の利用アカウントでの操作になります．

Telegram
In order to receive authentication codes via Telegram, you first have to start a new chat with the bot set up by your admin.
Secondly, you have to obtain your Telegram ID via the ID Bot. Enter this ID to receive your verification code below.

You are not using Telegram for two-factor authentication at the moment. Enable

Telegram アプリを利用して，Telegram の bot から TOTPコードを受け取りたい Telegram アカウントに適当なメッセージを投げます．

@matoken hello

その後，Telegram API を利用してメッセージを取得して chat_id を調べます．
以下の例では 475721977 です．

$ curl https://api.telegram.org/bot640093430:AAHu9u_c12KC2PY8g22QZoA94u4tAJvxsvY/getUpdates | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 358 100 358 0 0 315 0 0:00:01 0:00:01 --:--:-- 315
{
"ok": true,
"result": [
{
"update_id": 612249686,
"message": {
"message_id": 9,
"from": {
"id": 475721977,
"is_bot": false,
"first_name": "matoken",
"username": "matoken",
"language_code": "En"
},
"chat": {
"id": 475721977,
"first_name": "matoken",
"username": "matoken",
"type": "private"
},
"date": 1537282406,
"text": "@matoken hello",
"entities": [
{
"offset": 0,
"length": 8,
"type": "mention"
}
]
}
}
]
}

試しに送信してみて Telegram アプリに bot からメッセージが飛んできたら chat id が正しいはず．

$ curl -X POST "https://api.telegram.org/bot640093430:AAHu9u_c12KC2PY8g22QZoA94u4tAJvxsvY" -d "chat_id=475721977&text=hello" | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 274 100 246 100 28 179 20 0:00:01 0:00:01 --:--:-- 200
{
"ok": true,
"result": {
"message_id": 15,
"from": {
"id": 640093430,
"is_bot": true,
"first_name": "matoken_bot",
"username": "matoken_bot"
},
"chat": {
"id": 475721977,
"first_name": "matoken",
"username": "matoken",
"type": "private"
},
"date": 1537312183,
"text": "hello"
}
}

Nextcloud にログインして，「設定」→「セキュリティ」の下部に「Message gateway second-factor auth」という項目が出来ているので「Enable」を押す．

Telegram
In order to receive authentication codes via Telegram, you first have to start a new chat with the bot set up by your admin.
Secondly, you have to obtain your Telegram ID via the ID Bot. Enter this ID to receive your verification code below.

You are not using Telegram for two-factor authentication at the moment. Enable

以下のメッセージが表示されたら chat_id を入力して Verify します．

Enter your identification (e.g. phone number to start the verification):
Verify

Telegram で TOTPコードが飛んで来るのでそれを入力したらOKです．
一旦ログアウトして試してみましょう．

Telegram 認証を試す

いつものようにユーザ名，パスワードで認証すると以下のような画面に遷移します．
「Authenticate via Telegram」を押します．

Telegram から認証コードが飛んでくるのでそれを入力して認証完了です．

めんどくさい……

未だ手順が面倒で一般ユーザに試してくれと言える状態ではないですね．でも次のリリースあたりでは簡単になるんじゃないでしょうか．

環境

$ sudo -u www-data php ./occ app:list|grep twofactor_|grep :
- twofactor_backupcodes: 1.3.1
- twofactor_gateway: 0.9.0
- twofactor_totp: 1.5.0
$ sudo -u www-data php ./occ -V
Nextcloud 14.0.0
$ lsb_release -d
Description: Ubuntu 16.04.5 LTS
$ uname -m
x86_64