KeePassXC の Steam TOTP を試す

Steam ガードというスマートフォンアプリを使ったValve独自TOTPな多要素認証があります．これは通常のTOTP(rfc6238)と違い独自実装で数字だけではなくアルファベットも利用しているのでOATH ToolkitやGoogle Authenticatorでは認証できません．

OATH Toolkit

Install Google Authenticator – Android – Google Account Help

RFC 6238 – TOTP: Time-Based One-Time Password Algorithm

Steam ガードのTOTPはValve独自ですが一応いくつかの実装はあります．(未検証)

GitHub – dyc3/steamguard-cli: A linux utility for generating 2FA codes for Steam and managing Steam trade confirmations.

GitHub – seishun/node-steam: Interface directly with Steam servers from Node.js

KeepassXC にも TOTP(KeePassXC 2.2.0以降)と Steam ガードの TOTP(KeePassXC 2.3.0以降)がサポートされています．今回これを試してみました．

KeePassXC 2.2.0 released – KeePassXC

a generator for time-based one-time passwords (TOTP)

KeePassXC 2.3.0 released – KeePassXC

Add support for Steam one-time passwords [#1206]

しかし，これらを試すにはSteam Guard Mobile Authenticatorを設定したスマートフォンの中からTOTPの秘密鍵を入手する必要があります．以前のAndroidではadb backup するだけで鍵の書かれたファイルが入手できていたらしいのですが現在は暗号化されていてこの手順では入手できないようです．
GitHubにAPKにpatchするscriptが公開されていたのでまずはこれを試してみました．

Steam Guard: How to set up a Steam Guard Mobile Authenticator – How To’s – ナレッジベース – Steam Support

GitHub – steamguard-totp/steamguard-shared-secret: Obtain Steam Guard Mobile Authenticator shared secret from Android phone without root

これがうまく行けば以前のようにadb backupが出来るようになるはずです．しかし，バージョンの問題か失敗しました．

別の方法としてAndroidのroot取得済み端末にSteam Guard Mobile Authenticatorを導入してこちらの端末を有効にして秘密鍵を取得しました．

rooted端末から設定ファイルを抜き出してトークン取得

$ adb shell #Android shellを起動してファイル名を確認
1|shell@MK16i:/ $ su
root@MK16i:/ # ls -l /data/data/com.valvesoftware.android.steam.community/files/
-rw-rw---- u0_a59 u0_a59 448 2018-08-31 22:25 Steamguard-76561198085918260
root@MK16i:/ # exit
root@MK16i:/ $ exit #AndroidからexitしてPCに戻る
$ adb root #rootになる
$ adb pull /data/data/com.valvesoftware.android.steam.community/files/Steamguard-76561198085918260 #ファイル取得
$ adb kill-server #adb server終了
$ file Steamguard-76561198085918260
Steamguard-76561198085918260: ASCII text, with very long lines, with no line terminators
$ lv Steamguard-76561198085918260
$ jq .uri Steamguard-76561198085918260 | sed -e 's/^.*=\(.*\)&.*$/\1/' #鍵表示
OXYBZQLEOB7KKFAPERMN8EGNOLJWEDYZ
$ shred -uz Steamguard-76561198085918260 #ファイル消去

取得した鍵をKeePassXCに登録してみます．
Steamの設定上で右クリック，「タイムベースワンタイムパスワード」→「TOTP の設定…」から「キー」に設定します．
登録した後Steamの設定上で右クリック，「タイムベースワンタイムパスワード」→「TOTP を表示」でトークンが表示できます．

Androidスマートフォンアプリと見比べてみると同じトークンが表示され，Steamにもloginできます :)

Steam Guard Mobile Authenticatorは同時に1端末しか登録できず，2台目を設定すると1台目の端末の鍵が無効にされます．なのでKeePassXCを利用する場合はroot端末と併用するか，root端末から消してKeePassXCのみで運用するしかなさそうです．

複数の携帯電話で Steam アカウントを認証できますか?

いいえ、ひとつのアカウントで一度に有効化できる認証機器はひとつだけです。

Steam Guard Mobile Authenticator – Managing Your Account Features – ナレッジベース – Steam Support

もう一つ問題が．KeePassXCにはcli版が同梱されているのですが，バージョン2.3.4時点ではTOTPのオプションが見当たりません．GUIのみの利用となりそうです．

$ keepassxc-cli -h
Usage: keepassxc-cli [options] command
KeePassXC command line interface.

Available commands:
add Add a new entry to a database.
clip Copy an entry's password to the clipboard.
diceware Generate a new random diceware passphrase.
edit Edit an entry.
estimate Estimate the entropy of a password.
extract Extract and print the content of a database.
generate Generate a new random password.
locate Find entries quickly.
ls List database entries.
merge Merge two databases.
rm Remove an entry from the database.
show Show an entry's information.

Options:
-h, --help Displays this help.
-v, --version Displays version information.

Arguments:
command Name of the command to execute.
$ keepassxc-cli -v
2.3.4

環境

$ dpkg-query -W keepassxc
keepassxc 2.3.4+dfsg.1-1
$ lsb_release -d
Description: Debian GNU/Linux unstable (sid)
$ uname -m
x86_64