panda's tech note

macOSのsudo認証をTouch IDで行う方法

2016年以降に発売されたMacBook Proには指紋認証機能であるTouch IDが搭載されています。スリープからの復帰やブラウザ内でのパスワード入力などでパスワードを使うことなく,右上のTouch IDセンサに指を乗せるだけで認証できるので、非常に便利です。今回はこの機能をコマンドラインのsudoで使う方法を紹介します。

コマンドラインでパスワードを入力すると,認証が必要ないときに間違ってパスワードを入力してしまい履歴に残してしまうような事故が起こりえますが,Touch IDを使うことでそのような事故を回避できます。

通常,sudoの設定は/etc/sudoersで行いますが,sudoコマンドでプロンプトされるパスワード認証はPluggable Authentication Modules (PAM)により行われています。Touch IDを使うにはsudoのPAM設定ファイルである/etc/pam.d/sudoを変更します。macOSの/etc/pam.d/sudoは何も変更していなければ以下のようになっていると思います。それぞれのカラムは左から「モジュールインターフェイス」,「コントロールフラグ」,「モジュール名」,「モジュールの引数」(以下ではすべての行で省略されています)を表しています。具体的な説明はpam.dを参照してください。

# sudo: auth account password session
auth       sufficient     pam_smartcard.so
auth       required       pam_opendirectory.so
account    required       pam_permit.so
password   required       pam_deny.so
session    required       pam_permit.so

Touch IDによる認証を有効にするには以下の行を1行目に追加します。

auth       sufficient     pam_tid.so

3カラム目のpam_tid.soがTouch ID (tid)の認証モジュールです。2カラム目のsufficientは,この認証が失敗した場合には無視されるが,成功した場合にはこれより上の行にrequiredがなければ,この認証結果で認証が成功することを意味しています。

変更後の/etc/pam.d/sudoは以下のようになります。

# sudo: auth account password session
auth       sufficient     pam_tid.so
auth       sufficient     pam_smartcard.so
auth       required       pam_opendirectory.so
account    required       pam_permit.so
password   required       pam_deny.so
session    required       pam_permit.so

これでsudoコマンドを実行し,認証が必要な場合はTouch IDのプロンプトが表示されるようになります。Touch IDの認証をキャンセルするなど,失敗した場合はパスワード認証にフォールバックします。


(2022年10月29日追記)

OSのアップデートをすると /etc/pam.d/sudo の内容が戻る場合があります。現状、先祖返りを防ぐ方法は(私が知る限り)見つかっていないので、その都度追記するしかないと思います。

また、メジャーアップデートをすると、Terminal.app の Full Disk Access 権限がなくなっていていることがあり、その場合は /etc/pam.d/sudo ファイルが編集できないので、 Terminal.app に Full Disk Access 権限を付与する必要があります(Terminal.appから書き換える場合)。