Gmailがブロックされた時の2段階認証【緊急】対応方法

プログラミング

概要

  • スクリプト(PowerShell)で SMTP で Gmail の送信をしている。
  • 最近になって突然「リンクされているGoogleアカウントでログインがブロックされました」との通知が来るようになった。
  • Gmailのセキュリティポリシーが強化され、OAuth2.0認証への移行を促しているようであるが、敷居が高い。
  • 「アプリパスワード」を使用して2段階認証に対応することにより、スクリプトを変更せずに当面はクリア出来る。
  • 具体的な手順は別記事「「アプリパスワード」で Google OAuth2 非対応スクリプトを救済」を参照

経緯

ことの発端

  • サーバーで何らかの事象を検知した時に、メールの自動送信をしている。
  • メールは無料で取得した Gmail アカウントを使用。
  • PowerShell の Send-MailMessage コマンドレットで、SMTP 認証(メールアドレス + パスワード)という簡易な方法を使用。
  • 5年ほど前から使っていたのだが、今年になってから「リンクされている Google アカウントの重大なセキュリティ通知/リンクされている Google アカウントでログインがブロックされました」というメールが来るようになった。
  • 最初は良くあるフィッシングメールの類かと思ったが、文中のメアド(特に Gmail のアドレスと再設定用のアドレスがペアで)が流出しているはずがないのでサーバーをチェック。
  • イベントログを確認すると、通知が来るべき事象が記録されているが、そのメールは届いていない。
  • 本当にブロックされているようなので、かなり焦った。

最初の対応

2度目の通知

  • だが何ヶ月かして、再度同じ通知が届いたので確認すると、この項目が「無効」になっていた。
  • サーバーからの通知は月に1・2度。何ヶ月も何もない場合もある。
  • このアカウントにログインするのは、サーバーからの自動メール送信のタイミングのみであるため、しばらくログインしていないと Google が自動的に「無効」にしているようだ。
  • 良く調べてみると、Google は Gmail における「安全性の低い」ログインを廃止しようとしているようであり、企業向けの「G Suite」では 2021年2月15日以降、OAuth2 非対応アプリからのログインが出来なくなるようである。
  • 詳しくは「【G Suite専用】2021年2月15日以降、Google OAuth2 非対応アプリでGoogleアカウントが使えなくなる」を参照。

調査開始

  • しばらくは無料サービスは対象外のようであるが、「サーバーが何らかの事象を検知」して、通知しようとしているタイミングでブロックされるのは困る。
  • 幸い「ブロックされました」の通知が来るので、何らかの事象が発生してるのは解るのだが、いつでもサーバーに入れるわけではないので、少なくとも重要度が解らないのは非常に不安だ。
  • 真面目に対応しようと「Gmail + OAuth2 + PowerShell」とかで検索。
  • んー、困ったぞ。かなりメンドーだ。

最初の取り組み

  • 「Gmail + OAuth + PoerShell」で検索
  • Webアプリ系は殆ど経験がないため、あちこちで用語で躓く。
  • サイトごとに言い方が違ったり、記事作成日が違うとキャプチャした画面はもとより、Google が使用している用語すら違っていたりする。
  • 私が探した中では、検索上位にあるここが一番解り易い。「メモ的な思考的な/PowerShellを使って、Gmail APIからメールを送信する

躓きポイント

  • 話が反れるが、ちゃんとやろうと思っている人に、私が躓いたポイントを解説。
  • 私のイメージとしては、予め Google のサイトで2段階認証をして(?)、何らかの「証明書」相当を取得しておき、 Send-MailMessage-OAuth のようなコマンドを叩けば、今までのスクリプトを余り修正せずに利用できるのでは?と、思っていた。
  • だが、そもそも「OAuth2.0認証」自体が、アプリやWebサービスが、Googleアカウントを持つ全てのユーザーに代わって、そのユーザの個人情報にアクセスする許可を得るための仕組みであるので、複雑で厳格である。
  • なので、どのサイトを見ても、
    (1)予め、(承認を得る側の)アプリが使用する「サービスアカウント」にて「プロジェクト」を作成し、(アプリを利用する)ユーザーがアプリに対して(ユーザーの)Gmailデータへアクセスすることを許可するための「同意画面」を作成する。
    (2)スクリプトが(承認を与える側の)ユーザーが使用する「ユーザーアカウント」でメールを送信しようとすると、上記で作成した「同意画面」が表示されるので、スクリプトで[許可]ボタンを押す。
    (3)許可が下りたので「スクリプト」がユーザーに代わって、メールを送信する。
    の3段階の構成になっている。
  • 今話題にしてるケースでは「サービスアカウント」と「ユーザーアカウント」が同じなので、説明を読んでいても「どちらのアカウントについての説明」で「なぜそれが必要なのか?」が、釈然としない。

OAuth2 認証を諦めた理由

  • 今のスクリプトからサンプルのスクリプトに変更するのがメンドー過ぎる
  • 決定的だったのは、各種サイトに従って OAuth認証の設定を行っている途中で、
    「(i) OAuth 認証画面が確認されるまで、OAuth ではプライベートデータにかかわるスコープのログインが 100回までに制限されます。公開には確認プロセスが必要になる場合があり、確認プロセスには数日を要する場合があります。」
    のメッセージが表示されたことだ。
  • 基本的にはユーザーの個人情報にアクセスする「アプリ」なり「Webサービス」なりを公開する場合、Google の審査が必要になる。
  • これを受けなくとも「同意画面」に「認証されていないアプリ」相当のメッセージが表示されるだけで、個人使用は可能なはずなのだが、100回の制限に引っ掛かるのかどうなのか、さらには何が100回なのか(最悪100回メール送信するとブロックされる?)が不明。
  • 一日調べていたどのサイトにも、このメッセージが表示されることすら、記述されていない。(何か間違えたのか?)
  • それに「同意画面」の[許可]ボタンをスクリプトで叩くあたりも、いつの間にか Google の仕様が変わってしまうと、誤作動することにならないのか?
  • んー、これは、ちょっと手に負えない

代替案の調査

Google の認証方式

  • 自分は Gmail 以外の Google のサービスを使ったことがないので、正直「Google Cloud」「GPS(Google Cloud Platform)」「G Suite」「Google Apps」「Google Workspace」などの概念や区別が全く解っていない。
  • 今回の問題に適用できるのか良く解らないのだが、なんとなく最後の「サービスアカウントキー」を使えば、思ってた様な使い方ができるんでは?と、調査。
  • 思ってた様な使い方が出来そうなのだが、「G Suite」でしか利用できない。と、書いてあるサイトがある。
  • などなど、探しているうちに、もっと簡易な方法を発見。

アプリパスワード

  • サイトによっては「アプリ固有のパスワード」と記載されている。名前が変わったのか、サービスによって異なるのかは不明だが、機能は同じ。
  • 後で改めて、冒頭で紹介したサイト(【G Suite専用】2021年2月15日以降、Google OAuth2 非対応アプリでGoogleアカウントが使えなくなる)を見たら、ちゃんとこの方法が紹介してあった。
  • その中で
    アプリ固有のパスワードも、OAuth2 非対応であることには代わりありません。ならば、これも影響をうけるのか。G Suite管理者の一人として大きな問題なので Googleサポートに聞いてみました。結果として、「現時点では影響をうけず、対象外。しかし今後わからない」という回答でした。
    とある。
  • 素晴らしい!ちゃんと仕事してくれている人がいるおかげで、安心してその恩恵に預かれる。

設定手順

コメント

タイトルとURLをコピーしました