WorkSpaces の多要素認証における QR コード生成問題とその解決方法

記事タイトルとURLをコピーする

背景

弊社の以下のブログ記事では、Radius サーバーを作成して WorkSpaces の多要素認証を実装する方法を紹介しています。

blog.serverworks.co.jp

この記事では、FREERadiusgoogle-authenticator のパッケージを使って Radius サーバーを作成しています。
そして、そのサーバー上でgoogle-authenticatorを使ってワンタイムパスワード(OTP)発行用の QR コードを表示する方法も紹介しています。

この後、2次元コードを表示するURLと2次元コードが表示されます。
Warning: pasting the following URL into your browser exposes the OTP secret to Google:
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/kamata@radius.leaf.local%3Fsecret%xxxxxx%26issuer%3Dradius.leaf.local

しかし、2024年 4月頃から、このURLにアクセスすると404エラーが返されるようになり、QRコードが表示できなくなりました。

このQRコードを表示するURLは、Googleの/chartAPIを使用していましたが、このAPIが廃止になったため、使えなくなったようです。

参考リンク:github.com

解決方法

上記の参考リンクのコミットメッセージによると、以下の方法で解決できます。

  1. libqrencodeをインストールして、ローカルでQRコードを生成し、端末に表示する。
  2. 表示されたシークレットを手動で入力する。

qrencode というライブラリ

qrencode というライブラリをインストールすることで、QRコードをシェル環境で表示できるようです。インストールは以下のコマンドで行います:

sudo yum install qrencode

インストール以降に QRコードを発行するコマンドを実行すると、QRコードがターミナル上に表示されます。

sudo -u ユーザー名 /usr/bin/google-authenticator

qrencodeをインストールすると、以降はgoogle-authenticatorが自動的にそれを使うようになります。

quickchart.ioへの置き換えはあまりお勧めできない

Google の /chart API の代わりに、 quickchart.io の /chart API を使う方法もありますが、これはあまりお勧めできません。
理由は、QRコードを作成するために、ワンタイムパスワード(OTP)の情報を含むスキーム(otpauth://)を外部のサイトに送信することになるからです。機密情報を外部に渡すリスクがあるため、注意が必要です。

参考として、以下のGitHubのIssueに同様のコメントがあります:
GitHub Issue 244 2049835137

要約すると、機密データを第三者のサイトに送信したくない場合、qrencodeをインストールして、QRコードをローカルで生成する方法が推奨されます。

まとめ

2024年4月以降、Googleの/chart APIの廃止により、QRコードの表示ができなくなりました。 この問題に対する解決策として、libqrencodeをインストールし、ローカルでQRコードを生成する方法を推奨しています。この方法では、QRコードを外部に送信することなく、機密情報を安全に扱うことができます。 また、外部サービスであるquickchart.ioを利用することも考えられますが、機密情報を第三者のサイトに送信するリスクがあるため、慎重な判断が必要です。安全性を重視する場合は、ローカルでのQRコード生成をお勧めします。

余談

トレーニングのために、丹沢の大倉尾根を1日に4往復してみました。 Yamapというアプリを使うと、平均ペースや移動距離、獲得標高、GPS情報が見えるので、とても面白いです。

山頂は夜景や紅葉が綺麗でした。

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア。2024 Japan AWS Top Engineers に選んでもらいました。

今年の目標は Advanced Networking – Specialty と Machine Learning - Specialty を取得することです。

山を走るのが趣味です。今年の目標は 100 km と 100 mile を完走することです。 100 km は Gran Trail みなかみで完走しました。OSJ koumi 100 で 100 mile 砕け散りました。どこかで 100 mile やりたいです。

基本的にのんびりした性格です。座右の銘は「いつか着く」