計算機メモ目次 (目的のページと内容が一致しない場合, 目次から探してください)

Ubuntu 22.04 上に OAuth2 に対応した fetchmail 7 を構築して運用する


問題
  Linux 各ディストリビューションで標準パッケージとなっている fetchmail 6.X には
  OAuth2 の機能がなく, Google の2段階認証に対応できない.
  今のところアプリパスワードを設定することで利用できてはいるが,
  「安全性の低いアプリ」としてそのうち利用できなくなる恐れがある
  (G Suiteでは2021年2月に廃止される).

  2022年10月に制限が厳しくなったGoogleのOAuth2の仕様変更(oobトークンの廃止)により,
  従来の fetchmail 7 + OAuth2 の運用方法に一部変更がある.

解決方法
  最新の fetchmail 7 (開発中)は OAuth2 が付加されているので, それを利用する.
  参考: http://mmogilvi.users.sourceforge.net/software/oauthbearer.html

準備
  fetchmail 7 のソースコードを入手する.
  以下の Git から fetchmail-SNAPSHOT_7-0-0-alpha7.tar.gz をダウンロードする
  (ほかに zip, tar.bz2, tar も可).

  https://gitlab.com/fetchmail/fetchmail/tree/SNAPSHOT_7-0-0-alpha7

  ビルドには以下のものが必要.
  ・autotools
      sudo apt install autotools (Ubuntu)
  ・libssl.so.1.1.1
      sudo apt install libssl-dev (Ubuntu)
      ※ Ubuntu 20.04 から libssl1.0-dev はパッケージから消えたので
      libssl1.0 にしか対応していない fetchmail-SNAPSHOT_7-0-0-alpha6
      は Ubuntu 20.04 では利用できない

  設定に必要なスクリプト集を入手する.

  https://mmogilvi.users.sourceforge.net/downloads/oauthbearerScripts-2023-01-01.tar.bz2

fetchmailのビルド
  tar xvfz fetchmail-SNAPSHOT_7-0-0-alpha7.tar.gz
  cd fetchmail-SNAPSHOT_7-0-0-alpha7
  ./autogen.sh
  ./configure
  make
  sudo make install
    fetchmail が /usr/local/bin に, マニュアル fetchmail.1 が
    /usr/local/share/man/man1 にインストールされる.

スクリプト集のインストール
  tar xvfj oauthbearerScripts-2023-01-01.tar.bz2
  sudo mkdir /usr/local/etc/oauth2
  sudo cp oauthbearerScripts/{fetchmail-oauth2.py, cron.fetchmail, cron.oauth2} /usr/local/etc/oauth2
    必要なものをコピーすれば良いが, fetchmail-oauth2.py は必須.
    cron.* は参考として役立つ.

スクリプト fetchmail-oauth2.py の一部修正【Google OAuth2 の仕様変更への対応】
  sudo vi /usr/local/etc/oauth2/fetchmail-oauth2.py

  REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob' とあるのを
  REDIRECT_URI = 'http://127.0.0.1:8018/fetchmail' などに変更.
  なお, 8018 は使われていないポート番号であること.
  参考: https://mmogilvi.users.sourceforge.net/software/oauthbearer.html
         12: DIFFICULTY 2022 の UPDATE (2022-10-16) を参照.

設定
 (1) Google クライアントID とクライアントシークレットを取得する

  まず初めての場合(ここは自信なし)
  1. Google APIコンソールにログイン

    https://console.developers.google.com/flows/enableapi?apiid=sheets.googleapis.com

  2. 利用規約にチェック, Google Cloudからのメールを受信するかどうかを回答して「同意して続行」
  3. 「認証情報に進む」
  4. 「使用する API」を「Google Sheets API」に, 「API を呼び出す場所」を
    「その他の非UI(cronジョブ、デーモンなど)」に,
    「アクセスするデータの種類」を「アプリケーションデータ」に,
    「App Engine または Compute Engine でこの API を使用する予定はありますか? 」を
    「いいえ」に設定し,「必要な認証情報」
  5. 「サービスアカウント名」を「fetchmail」, 「役割」を「サービスアカウント ユーザー」,
    「キーのタイプ」を「JSON」に設定し, 「次へ」
  6. JSONファイルをダウンロードして保存(なんの意味があったのかわからん)

  もう一度アクセス
  1. Google APIコンソールにログイン

    https://console.developers.google.com/flows/enableapi?apiid=sheets.googleapis.com

  2. 「プロジェクトを作成」で「続行」
  3. 「認証情報に進む」
  4. 「この手順をスキップして…」とある文の中の「クライアントID」をクリック
  5. 「同意画面を設定」
  6. 「User Type」を「内部」に設定して「作成」
  7. 「アプリケーション名」を「fetchmail」, 「承認済みドメイン」を適宜設定して「保存」
  8. 左のパネルで「認証情報」
  9. 「認証情報を作成」
  10. 「OAuthクライアントID」を選択
  11. 「その他」を選び, 「名前」を「fetchmail」として「作成」
  12. 表示される「クライアントID」と「クライアントシークレット」をメモ(いつでも再表示可能)

 (2) fetchmail-oauth2.py 用の設定ファイルを作成する

 ・ホームディレクトリ上でもシステム上でもどこでもよい(例: $HOME/.fetchmail-oauth2.conf)
  このファイルは chmod 600 にしておく
 ・内容は次の通り

client_id=先ほど得たクライアントID
client_secret=先ほど得たクライアントシークレット
refresh_token_file=/home/user/.google-token/refresh_file
access_token_file=/home/user/.google-token/access_token_file
max_age_sec=1900

 ・上で指定したrefresh_token_fileとaccess_token_fileを置くディレクトリを作成する
  (ここでは例として $HOME/.google-token ; このファイルでは環境変数 $HOME は使えない).

 (3) fetchmail-oauth2.py を実行してトークンを取得する
      ※ Googleアカウントのパスワードを変更したらこれを実行すること

  1. 上で作成した設定ファイルを指定して実行

  /usr/local/etc/oauth2/fetchmail-oauth2.py -c $HOME/.fetchmail-oauth2.conf --obtain_refresh_token_file

    出力は https: から始まるURLとプロンプト「Enter verification code:」の2行

  2. 表示されたURLをブラウザで開くと
    「fetchmail が Google アカウントへのアクセスをリクエストしています」
    という画面が出てくるので「許可」をクリックする

  3. ブラウザに「正常に接続できませんでした / 127.0.0.1:8018 のサーバーへの
       接続を確立できませんでした」と表示されてエラーに終わる
       (【Google OAuth2 の仕様変更への対応】のため).
       このときブラウザのアドレスバーには
       http://127.0.0.1:8018/fetchmail?code=XXXXXXXXXXXXXXXXXXXXX&scope=https://mail.google.com/
       などと表示されているはずである.
       この code の値 XXXXXXXXXXXXXXXXXXXXX を「Enter verification code:」に
       入力して完了.
       認証の有効期限はあまり長くはないので, なるべくすぐに入力すること.

  (4) fetchmail設定ファイルを作る

  ・従来の fetchmail とは SSL 関係の記述のしかたが異なるので, すでにパッケージ版の
    fetchmail を使っていた場合には, 念のため $HOME/.fetchmailrc とは別に
    $HOME/.fetchmail7rc などとして作成する.
  ・fetchmail へはオプション -f を使ってこの設定ファイルを読み込ませる.

    /usr/local/bin/fetchmail -f $HOME/.fetchmail7rc

  ・内容はたとえば次の通り.
    自分の環境に合わせて変更すること.
    Gmailへのログイン名である「Gmailのメールアドレス」に「recent:」をつけるのがキモ

set no bouncemail

defaults
   uidl
   protocol auto
   no mimedecode
   keep
   no fetchall
   mda "/usr/bin/procmail"

poll pop.gmail.com protocol pop3
   auth oauthbearer username "recent:Gmailのメールアドレス"
   passwordfile "/home/user/.google-token/access_token_file"
   is ローカルなユーザ名 here sslmode wrapped

  (5) このままでは認証の有効期限が切れてしまうので, 先程の fetchmail-oauth2.py を
      使って自動更新するようにする

  ・自動更新のオプションは --auto_refresh

    /usr/local/etc/oauth2/fetchmail-oauth2.py -c $HOME/.fetchmail-oauth2.conf --auto_refresh

  ・次のシェルスクリプト(たとえば $HOME/bin/fetchmail-gmail.sh とする)を作って,
    これをcronに登録するなどする

#!/bin/sh
/usr/local/etc/oauth2/fetchmail-oauth2.py -c $HOME/.fetchmail-oauth2.conf --auto_refresh;
/usr/local/bin/fetchmail -f $HOME/.fetchmail7rc;
exit 0;


計算機メモ目次 (目的のページと内容が一致しない場合, 目次から探してください)
海洋大循環分野
daigo@ocg.aori.u-tokyo.ac.jp