「アプリパスワード」で Google OAuth2 非対応スクリプトを救済

プログラミング

はじめに

対象

  • こちらのサイト「【G Suite専用】2021年2月15日以降、Google OAuth2 非対応アプリでGoogleアカウントが使えなくなる」によると、タイトル通り、2021/2/15 以降は OAuth2 プロトコルを使用していないアプリやスクリプトからは、Gmail の送信が出来なくなる。
  • 無料で取得したアカウントは現時点では対象外であるが、私の使用しているアカウントでは、今年に入ってから「安全性の低いアプリからのログインしようとする不審な試み」と判断されて、勝手にブロックされるという事象が発生している。
  • ちゃんと「OAuth2」に対応するべきなのだが、かなり敷居が高いため、Gmail の送信が出来なくなったり、勝手にブロックされて困っている方に、スクリプトを変更せずに(パスワードのみ変更になる)使用し続ける方法を紹介する。
  • 大前提として、該当アカウントの2段階認証を有効にする必要がある。以下の手順を試してみる前に、「2段階認証」のバックアップ方法についてちゃんと考えておかないと、該当アカウントに2度とアクセス出来なくなることもあるので注意(下記「2段階認証について」を参照)

「アプリパスワード」について

  • 冒頭のサイトで「アプリ固有のパスワード」と紹介されている方法。
  • スクリプトは通常のパスワード部分を「アプリパスワード」に変更するだけで、そのまま使える。
  • 恐らく、どんなアプリでもスクリプトでも、Gmail 以外の Google のサービスにアクセスするアプリであっても、パスワードを「アプリパスワード」に変更するだけで、使用できるものと思われる。
  • この「アプリパスワード」を取得するために2段階認証が必要なので、Google としてはしばらく認めることにしているようだ。
  • 「アプリパスワード」は最初の認証に一度使用されたらもう使えないため、アカウントと「アプリパスワード」が流出しても、他の端末からログインすることは出来ない。
  • 「アプリパスワード」で認証した端末からは、その後も同じ「アプリパスワード」でログインし続けることが出来る。
  • アカウントのパスワードを変更した場合は、「アプリパスワード」を取得し直す必要がある。
  • 私は無料の Gmail アカウントでテストしたが、「G Suite」環境下でも使用出来るようである。
  • ちゃんと「OAuth認証」をしたい人はこちら「Gmailがブロックされた時の2段階認証【緊急】対応方法」を参考に。私が諦めた理由が書いてあるだけなので、あまり参考にはならないけれども。

2段階認証について

  • 大前提として、該当アカウントにて「2段階認証プロセス」を有効にする必要がある。
  • 現在は「ショートメッセージ」など、固有のスマホを利用する方法と、「USBセキュリティキー」を使用する方法しかない。
  • 個人に依存しないシステムなどで、固有のスマホを利用するのが難しい場合には、あくまでも応急対応と考えて欲しい。
  • 「2段階認証」用のスマホが壊れた場合などのために、いくつかのバックアップ方法が用意されているので、ちゃんと対策しておこう。
  • 最初に「2段階認証」でアカウントにログインする際に、「■このコンピュータでは次回から表示しない」をチェック(デフォルト)しておけば、次回からは2段階認証しなくても(スマホがなくても)ログイン出来る。
  • その端末からであれば、スマホを失くした後でも、2段階認証用の電話番号を変更することも出来るようだ。
  • 最悪の場合にそのアカウントが使用できなくなってしまっても構わない。位の備えはしておくと良いであろう。
  • メール送信のみ行いたいのであれば、別にメール送信用のアカウントを取得し、万一アカウントが使用できなくなってしまった場合には、新たにアカウントを取得して、スクリプトの「アカウント」と「アプリパスワード」を設定し直す。などの運用での対応も可能だ。

具体的な設定手順

テスト環境

  • テスト用に新たに無料の Gmail アカウントを取得した。
  • 「アプリパスワード」を使用するには、GCPに加入する必要はない(お試しで無料登録する必要もないし、Always Free を利用する訳でもない)ので、課金は発生しない。(2020/12/01 現在)
  • ブラウザで Google にアクセスすると右上に表示される「ログイン中のアカウント」の「Google アカウントを管理」から設定出来る。
  • 該当のアカウントで「2段階認証プロセス」を有効にする必要がある。以下の手順ではショートメッセージを使用している。他の方法については「アカウントを 2 段階認証プロセスで保護する」などを参照。
  • 以下の手順でも説明するが、「アプリパスワード」を取得すると「安全性の低いアプリの許可」が設定出来なくなるので、同じアカウントを複数のアプリやスクリプトで使用している場合には、全部一度に対応する必要がある。
  • やはり以下の手順で説明するが、「アプリパスワード」の設定を削除すれば、また「安全性の低いアプリの許可」が設定出来るようになる。

アカウントの取得

  • 対象のアカウントが「2段階認証」を有効にしていない場合、いきなりそのアカウントで実施せずに、テスト用のアカウントを新たに取得することをお勧めする。
  • 実際の運用で使用する場合には、「2段階認証」を有効にした後で、2段階認証用のスマホが壊れたり失くしたりした場合のバックアップを準備しておこう。

Google にログイン

  • ブラウザで Google にアクセスすると、既にログインしている場合には、右上に該当アカウントのイニシャルがアイコン表示されているのでそれをクリック。
  • 他のアカウントにてログインしている場合には、アイコンをクリックした後で「別のアカウントを追加」をクリックして、「アカウントの選択」画面で別のアカウントを選択するか、「別のアカウントを使用」をクリックして新たなアカウントでログインし直す。
  • 「Google アカウントを管理」をクリックすると「Google アカウント」画面が表示される。

安全性の低いアプリの有効方法

  • 本題からそれるが、SMTP認証で Gmail を送信していると、ある日突然「リンクされている Google アカウントの重大なセキュリティ通知」というメールが再設定用のメアド宛に届くと共に、アカウントが勝手にブロックされることがある。(トップの画像参照)
  • その場合には「Google アカウント」画面から「安全性の低いアプリの許可」を有効にすることにより、解除することが出来る。
  • 新規に作成したアカウントの場合、「安全性の低いアプリの許可」はデフォルトで無効になっている。
  • この状態で試しに SMTP認証を利用したスクリプト(一番下に掲載)で、Gmail を送信するとエラーになる。
  • 左側メニューの「セキュリティ」をクリック。
  • 右側を下にスクロールし、「安全性の低いアプリのアクセス」を表示。
  • 「アクセスを有効にする(非推奨)」をクリック。
  • 「安全性の低いアプリの許可:無効」欄のスイッチを右にスライドする。
  • 「更新しました」のメッセージが表示される。
  • 先ほどのスクリプトを実行すると、今度は正しく送信される。

2段階認証の設定方法

  • 「Google アカウント」画面の左側メニューから「セキュリティ」をクリック。
  • 右側をスクロールし「Google へのログイン」を表示。
  • 「2段階認証プロセス」をクリック
  • [使ってみる]をクリック
  • 「2段階認証」を設定しようとしているアドレスであることを確認する。
  • パスワード(アカウントのパスワード)を入力する。
  • [次へ]ボタンをクリック。
    ※これが「2段階認証」の「1つ目の手順」
  • 「2段階認証」の「2つ目の手順」に使用するスマホの電話番号を入力。アカウント取得時に設定していれば、デフォルトで表示される。
  • 「+81」は日本の国際コードで、「090」「070」などの電話番号の頭の「0」1桁は削除する。
  • 「●テキストメッセージ」をチェック。
  • 「次へ」をクリック。
  • 表示されている(先ほど入力した)電話番号宛に送られて来たショートメッセージ
    「G-526xxx があなたの Google 確認コードです。」
    の「G-」の後の6桁の数字を入力。
  • 「次へ」をクリック。
  • 若干解り辛いが「2段階認証プロセス」の「2つ目の手順」が正しく設定されていること(入力された電話番号が間違っていないか?ショートメッセージを受信出来るか?など)を確認するために、Google が「2段階認証を有効にする」前に「2つ目の手順」を確認している。その確認が(確認コードを入力したことにより)完了したので、改めて「2段階認証プロセスを有効にしますか?」と聞かれている。
  • 「有効にする」をクリック。
  • 「2段階認証」が有効なった旨が表示される。
  • その下の「利用できる2つ目の手順」欄には、登録されている「2つ目の手順」が表示されている。
  • 今登録した「ショートメッセージ」による確認手順が表示されている。
  • さらに下にスクロールする。
  • テストや一時的に使用するのであれば、「2段階認証の2つ目の手順」は1つだけ(先ほど登録したスマホによるもの)で十分であるが、長期的な運用を行う場合には、スマホが壊れた場合などに備えて、2つ以上の「2つ目の手順」を追加する。
  • 説明は省略するが、
    バックアップコード
    Google からのメッセージ
    認証システムアプリ
    バックアップ用の電話(2台めの電話)
    セキュリティキー
    などがある。
  • さらに下にスクロールする。
  • 一度「2段階認証」を実施した端末(PC/スマホなど)は「信頼できるデバイス」として登録され、それ以降その端末からログインする場合には「2つ目の手順」が不要となる。(アカウントとアカウントのパスワードのみでログイン出来る。)
  • スマホやPCを失くした場合など、アカウントをブラウザが覚えているとログイン出来てしまうので、ここで「信頼できる」というステータスを取り消すことが出来る。

アプリパスワードの設定方法

  • 「Google アカウント」画面の左側メニューから「セキュリティ」をクリック。
  • 右側を下にスクロールし「Google へのログイン」を表示する。
  • 「2段階認証プロセス」が「オン」になっているのを確認する。
  • 「アプリパスワード」をクリック。
  • 「パスワード」を入力し、[次へ]をクリック。
  • 「このパスワードは一度入力すれば、以降は覚えておく必要はありません。」と表示されているが、スクリプトに組み込む場合などは、パスワードの値を取得した「アプリパスワード」に変更しておけば、2回目以降のログイン時もちゃんと認証される。
  • この後選択する「アプリ」と「デバイス」は、「アプリパスワード」画面に一覧表示される「アプリパスワード」を識別するために使用するだけのようで、選択内容によって機能が変わる訳ではないようだ。
  • 「アプリを選択」をクリック。
  • 一覧から「メール」をクリック。
  • 「メール」が選択されるので、続けて「デバイスを選択」をクリック。
  • 一覧から「Windows パソコン」をクリック。
  • 「Windowsパソコン」が選択されるので、[生成]をクリック。
  • 黄色い枠内に表示された16桁のパスワードを控える。(使用する場合は4文字ごとに区切らずに、連続した16文字で使用する)
  • 「このパスワードを覚えておく必要はない」と説明されているが、それはパスワードを設定した後の話で、この画面を閉じてしまうと後から「アプリパスワード」の値を確認する方法がないので、必ず控えておく。
  • もし解らなくなってしまった場合には、一度該当の「アプリパスワード」削除してから、再度生成し直す。
  • 「完了」をクリック。
  • 「アプリパスワード」の画面に戻る。
  • 一覧に今作成した「アプリパスワード」の情報が表示されている。
  • この画面に来てしまうと、もう先ほど表示されていた「アプリパスワード」の値を確認することが出来ないので、解らなくなってしまった場合には「ゴミ箱」アイコンをクリックして削除してから、再度生成し直す。
  • 「アプリパスワード」を生成すると「安全性の低いアプリ」のアクセスが無効になる。
  • 試しに先ほどのスクリプトをそのまま(1段階のSMTP認証)で実効する。
  • メール送信時にエラーとなる。
  • 続いてスクリプトのパスワードの値を先ほど取得した「アプリパスワード」に変更する。
  • 再度、スクリプトを実行する。
  • 正常にメールが送信された。
  • 同じ「アプリパスワード」のままでも、それ以降もログイン出来ることを確認するために、再度スクリプトを実行する。
  • 正常にメールが送信された。
  • スクリプトのパスワードを一度「アプリパスワード」に変更すれば、それ以降はそのまま(「アプリパスワード」を再設定したりせずに)使用出来ることが確認出来た。
  • 「アプリパスワード」を作成すると「 安全性の低いアプリのアクセス 」は自動的に無効となる。
  • 「安全性の低いアプリのアクセス」画面 も表示されなくなり、有効に設定することが出来なくなる。
  • 元に戻したい場合には次の手順のように、「2段階認証プロセスを無効」にしてから、「安全性の低いアプリのアクセス」を有効にし直す必要がある。

2段階認証を無効化する方法

  • 「Google アカウント」画面の左側メニューから「セキュリティ」をクリック。
  • 右側を下にスクロールし「Google へのログイン」を表示する。
  • 「2段階認証プロセス」が「オン」になっているのを確認して、クリック。
  • 表示されているアドレスを確認し、パスワードを入力。
  • [次へ]をクリック。
  • まだ「2段階認証」が有効であるので、新規のPCでアクセスすると「2段階認証の2つ目の手順」が実行されるが、既に一度「2段階認証」にてログインしたことがある端末であれば、そのまま「2段階認証プロセス」画面が表示される。
  • [オフにする]をクリック。
  • 「オフにする」をクリック。
  • 「2段階認証プロセスによるログインがオフになりました」のログが記録される。
  • 「Google へのログイン」欄では、「2段階認証プロセス」が「オフ」になり、「アプリパスワード」の項目も消えている。
  • 前述の手順にて、「安全性の低いアプリのアクセス」を「オン」にする。(「オン」であればそのまま)
  • スクリプトのパスワード部分を「アプリパスワード」から、元の「アカウントのパスワード」に戻して実行する。
  • 正常にメールが送信されることが、確認出来た。

アプリパスワードの再発行

  • 前述の手続に従い、再度「2段階認証」を有効にして「アプリパスワード」を生成すると、新しい「アプリパスワード」が発行される。
  • スクリプトのパスワード部分を新しく取得した「アプリパスワード」に変更して実行する。
  • 正常にメールが送信されることが、確認出来た。

テスト用メール送信スクリプト

はじめに

  • サンプルは Windows10 + PowerShell で実行している。
  • サンプルの3ファイルを同じフォルダに格納し、SendMailTest.ps1 内の
    $addrFrom = “XXXXXX@gmail.com“ (テストしているアカウントのアドレス)
    $addrTo = “YYYY@yyy.ne.jp“ (送信先の任意のメールアドレス)
    $pwd = “ZZZ” | … (「アカウントのパスワード」または「アプリパスワード」)
    の部分を適宜変更する。

実行方法

  • スタートメニューから「Windows アクセサリ」の一つ上にある「Windows PowerShell」のフォルダ内の、一番上の「Windows PowerShell」をクリック。
  • PowerShell が起動したら、ファイルの保存されているフォルダに移動する。
    “cd” + 半角スペース + フォルダのフルパス を入力し、[Enter]キーを押す。
    cd <フォルダの名前>
  • 実行するスクリプトファイルの名前を、先頭に “./” を付けて入力し、[Enter]キーを押す。
    ./MailTest.ps1

PowerShell スクリプト

MailTest.ps1

# ■ MailTest ■ テストメールを送信する
# ■ 送信本文は、"MailTest.txt" に記述
# ■ "MailTest.txt" の 1行目にメールタイトル
$fnm = "MailTest.txt"

./SendMailTest.ps1 $fnm

MailTest.txt

■テスト■メール送信テスト

メールの設定を変更したので、テストメールを送信しています。

SendMailTest.ps1

#Settings
$MailSv = "smtp.gmail.com"
$Port = 587
$Encode = "UTF8"
$addrFrom = "XXXXXX@gmail.com"
$addrTo = "YYYY@yyy.ne.jp"
$Subject = "Send Mail"

$fnm = $args[0]

$Body = ""
$f = (Get-Content $fnm) -as [string[]]
$i=1
foreach ($l in $f) {
    if ($i -eq 1){
      $Subject = $l
    }else{
      $Body = $Body + $l + "`r`n"
    }
    $i++
}

#Credential
$pwd = "ZZZ" | ConvertTo-SecureString -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential $addrFrom,$pwd

#Send Mail
Send-MailMessage `
    -To $addrTo `
    -From $addrFrom `
    -SmtpServer $MailSv `
    -Credential $cred `
    -UseSsl `
    -Encoding $Encode `
    -Port $Port `
    -Subject $Subject `
    -Body $Body

コメント

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