G Suiteの2段階認証を自作Webアプリと連携させた話

新型コロナウイルスの影響で、企業がテレワークに本腰を入れ始めた。
会社貸与のPCから安全にGmailが使えるよう、G Suite Basicで2段階認証を導入した話をする。

従業員アカウントごとの秘密鍵を情報システム部門で厳重に保管し、その秘密鍵からワンタイムパスワード（TOTP）を計算して社内イントラに表示する形にすれば、**社外ネットワークからはGmailにログインできない**というソリューションになる。

ワンタイムパスワード（TOTP）を計算してWebサイトに表示する方法は[前回の記事](https://qiita.com/mindwood/items/3c329d4a24bc8a3ab765)を参照して欲しい。

# Google Cloud Supportに聞いてみた
従業員アカウントごとの秘密鍵を、G Suite管理者が効率良く、できれば一括で、発行できるようにしたかった。

スマートフォン、SMS、音声通話、セキュリティキーを**一度も**使わずに、認証システムアプリのQRコードを取得できないかGoogleに問い合わせたが、無いとのこと。初期設定では、スマートフォン、SMS、音声通話、セキュリティキーいずれか必須となり、その**予備**として認証システムアプリが表示される仕様。その後、スマートフォン、SMS、音声通話、セキュリティキーを削除するのはOKで、認証システムアプリを唯一の2段階認証とすることはできる。

従業員数が多いので、G Suite管理者が一括で組織内アカウントのQRコード（シークレットキーでも良いが）を生成できないかも聞いてみたが、それも出来かねる仕様とのこと。G Suite Business や G Suite Enterprise なら出来るという話も出てこなかったので、多分すべてのエディションで同じ仕様だと思う。組織の一員であっても認証は本人が行うものというポリシーなのだろう。

また、初期設定時の確認コードを音声通話で受け取る方法として、会社貸与携帯やBYODも無いので、同じ電話番号（会社代表番号）を繰り返し使えるのかも聞いてみたが、同じ電話番号の使用回数には一定の制限があるとのこと（不正利用防止のため回数は非公開）。使用回数の上限に達した旨のメッセージが表示された場合は、別の電話番号にて認証を行う必要があるとのことだった。

ということで、**セキュリティキー**をひとつ購入し、組織内アカウントごとの初期設定時にこれを使いまわすことで、ワンタイムパスワード（TOTP）による2段階認証方式（Googleからみると認証システムアプリ）に移行することにした。

# セキュリティキー
FIDO（ファイド）U2F の **Security Key by Yubico** を Amazon で購入。「2」の刻印がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/486915aa-0451-b07e-d2ad-706e786d23fb.png)
Yubiという名前とその形状から指紋認証のように見えるが、実体はUSBキーボードであり頑丈な作り。指紋認証の **YubiKey Bio** とは別物。専用のソフトウェアやドライバをインストールせずに使うことができる。
ちなみに Yubikey の語源は、「あなたが常に身につけている鍵」、**Y**our **UBI**quitous **Key** の略だそうだ。

# 移行手順
Google Chromeから行う。
## セキュリティメニューから2段階認証プロセスをクリック
[Googleアカウントを管理] :arrow_forward: [セキュリティ] :arrow_forward: [2段階認証プロセス] の順にクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/8435ae8a-d7ea-8bf5-d375-19dfd594de6b.png)

## セキュリティキーをクリック
[使ってみる] :arrow_forward: [別の方法を選ぶ] :arrow_forward: [セキュリティキー] の順にクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/63d2985f-c010-ca17-17af-01fd213eb8df.png)

## セキュリティキーをUSBポートに挿入
表裏に注意すること。どちらの向きでも入ってしまう。
デスクトップPCでもノートPCでも、鍵マークが上になるよう挿入すれば、たいがいOK。
縦置きデスクトップなら、足の反対側に鍵マークが来る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/c681cd71-9308-cec1-39aa-7f8e807c2a17.png)

## デバイスが準備できるまで待つ
Windowsがセキュリティキーを認識すると、右下にバナー通知される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/6d60a54d-e8de-ac38-8e9b-b234a42e2a40.png)

## 鍵マークをタッチする
セキュリティキーを認識すると、表示が「セキュリティキーにタッチしてください」に変わる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/5ec5feb6-b45b-7db1-e541-e67a224b54c1.png)
青白く点滅するのでタッチする。

## セキュリティキーのメーカーとモデルの読み取りを許可
Chromeからのメッセージに対し、[許可] をクリックする。セキュリティキーはあとで削除するため、名前は付けなくて良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/e2d0c7a3-2dc3-3629-88ea-49f027e45fa2.png)

## バックアップコードの取得
必須では無いが、何かの間違いがあったときのために、ここで取得しておいた方が安心である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/972389f2-8e74-b5ce-2968-9a98d8f296c5.png)
ダウンロードし、システム管理者が保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/f00193b7-75c2-fe28-41c9-fc502a3cd1aa.png)

## 認証システムアプリを有効化
[設定] :arrow_forward: [次へ] の順にクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/bdfab1d4-89ce-0671-51a7-6566bbe93ef4.png)

## QRコードを印刷し、QRコードリーダで読む
画像ファイルにして、[Web便利ツール@ツールタロウ](https://tool-taro.com/qr_code_decode)などでデコードしても良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/3a68e204-e266-5cd2-e0b5-d549b8aefa16.png)

## 秘密鍵をシステムに登録
otpAuth URI の形式でデコードされるので、`accountname`と`secret`を[自作Webアプリ](https://qiita.com/mindwood/items/3c329d4a24bc8a3ab765)に登録する。

```:otpAuthURI
otpauth://totp/[issuer]:[accountname]?secret=[secret]
```

## ワンタイムパスワードを入力
[自作Webアプリ](https://qiita.com/mindwood/items/3c329d4a24bc8a3ab765)にアクセスし、ワンタイムパスワード（TOTP）をコピペする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/fb2f64cf-d2eb-c9aa-8976-67d63db88bb5.png)

## セキュリティキーを削除する
セキュリティキーを削除し、認証システムアプリ（TOTP）を唯一の2段階認証の手段とする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/5f5b2c82-3df8-dfa1-d80c-f1252be20bbc.png)

# 確認
いったんログアウトする。
シークレットモードで起動したChromeから、ワンタイムパスワードでログインできることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/02c1a477-15f3-d8bd-03fe-a85882abd12b.png)