Touch ID搭載のMacでsudo実行時のパスワード入力をTouch ID化

# 2024/10/4更新 macOS 14.x Sonoma以降のOSの場合
macOS 14.x Sonoma以降のOSでは`sudo_local.template`というファイルが追加されました。このファイルをsudo本体から読み込む仕様が追加された様です。これで、OSのアップグレード後も内容が初期化されなくなりました。この方法はとても便利なので以下に追記します。

## テンプレートのコピー
まずは`sudo_local.template`を`sudo_local`ファイルとして`/etc/pam.d`配下にコピーします。

```bash
sudo cp /etc/pam.d/sudo_local.template /etc/pam.d/sudo_local
```

## 最終行のコメントを解除
`sudo_local`ファイルを開いて編集します。最終行のコメントを解除します。解除後、保存します。

```bash:オリジナル
# sudo_local: local config file which survives system update and is included for sudo
# uncomment following line to enable Touch ID for sudo
#auth       sufficient     pam_tid.so
```

```bash:編集後
# sudo_local: local config file which survives system update and is included for sudo
# uncomment following line to enable Touch ID for sudo
auth       sufficient     pam_tid.so
```

## 動作検証
新しいターミナルを起動して`sudo`コマンドを実行します。

```bash:実行例(rootユーザーに切り替え)
sudo su -
```

以下の様なウィンドウが表示されたら成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/c17ea524-ca87-3255-8417-a28f2aba728f.png)

## sudoの中身を見てみる
`sudo`の中身を見てみました。`sudo_local`が`include`されていることが分かります。

```bash
# sudo: auth account password session
auth       include        sudo_local
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
```

# macOS 13.x以前のバージョンの場合

:warning: 以下の操作はApple Silicon版のMacでも有効です．
:warning: OSアップデート時は再度以下の処理をやり直す必要が有ります．

近年のApple製品には指紋センサー(通称: Touch ID)が搭載されていますが、Macの場合デフォルトではロックの解除や一部設定変更のみでTouch IDが利用出来るのみです。`Touch ID`を`sudo`実行時に使用出来る様にする設定は[参考記事](https://qiita.com/kazuooooo/items/80678d890623f79dc599)を参考に設定しました。但し、参考記事ではファイル権限に関する設定については一切触れられていなかったので、ファイル権限の設定についても説明を行った記事を投稿しました。以下の操作は全てターミナル上で実施します。

## 設定ファイルの権限の確認
`sudo`で`Touch ID`を利用出来る様にする為に`/etc/pam.d/sudo`というファイルに設定を追記します。まずは、このファイルの権限を確認します。

```bash
$ ls -l /etc/pam.d/sudo
-r--r--r--  1 root  wheel   246B  2 23  2019 /etc/pam.d/sudo
```

書き込み権限が無い為、このままでは設定を追記出来ません。

# 書き込み権限の追加
`chmod`コマンドで権限を追記します。

```bash
sudo chmod +w /etc/pam.d/sudo
```

```bash
$ ls -l /etc/pam.d/sudo 
-rw-r--r--  1 root  wheel   283B  5  1 11:40 /etc/pam.d/sudo
```

## ファイルに設定を追記
`/etc/pam.d/sudo`を開き、設定を追記します。(2020/7/14修正)
@chajka@github さんからコメントを頂いた内容を反映しました。御指摘頂きありがとう御座いました。
:warning: **以下の行程は慎重に実施して下さい。<font color="RED">最悪`sudo`コマンドが動作しなくなってしまいます。**</font>
:warning: **<font color="RED">以下の行程はMac標準のTerminalで実施しています。一部の外部アプリのTerminalでは有効化出来ない場合が有るようです。</font>**

```bash
sudo vim /etc/pam.d/sudo
```

* 以下が編集前(デフォルト)の`/etc/pam.d/sudo`の内容です。

```config:編集前
# 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
```

* TouchIDによるsudoを有効化する為に、`auth sufficient pam_tid.so`を追記します。追記後のファイルの内容は以下の通りです。

```config:編集後
# 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
```

:warning: 追記が完了したら、ファイルを上書きします。<font color="RED">**この時エディタを閉じずに`/etc/pam.d/sudo/`を開いたままにしておきます。**</font>以下の動作検証が完了してからファイルを閉じて下さい。

## 動作検証
新しいターミナルを起動して`sudo`コマンドを実行します。

```bash:実行例(rootユーザーに切り替え)
sudo su -
```

以下の様なウィンドウが表示されたら成功です。

<img width="447" alt="root.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/86dd9eb0-a619-35b8-cba8-dc90d78050a7.png">

検証が完了したら、エディタを終了します。(`/etc/pam.d/sudo`を閉じる。)

## 書き込み権限の削除
本来書き込み権限は無いファイルなので権限を取り除きます。

```bash
sudo chmod -w /etc/pam.d/sudo
```

```bash
$ ls -l /etc/pam.d/sudo 
-r--r--r--  1 root  wheel   283B  5  1 11:40 /etc/pam.d/sudo
```

:warning: 本記事で編集した`/etc/pam.d/sudo`ファイルはOSアップデート毎に初期化されてしまいます。編集済のファイルはコピーを取っておくと、OSアップデート後に復旧出来ます。

# Reference

https://applech2.com/archives/macos-14-sonoma-touch-id-update.html