Last active
September 20, 2024 06:18
-
-
Save kawaz/d95fb3b547351e01f0f3f99783180b9f to your computer and use it in GitHub Desktop.
macOSの sudo で TouchID が使えるようにする(tmux内の利用も対応)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Qiita記事 https://qiita.com/kawaz/items/0593163c1c5538a34f6f | |
set -e | |
set -o pipefail | |
# pam_tidの存在チェック(間違えてLinux環境などで実行されたら中断する) | |
[[ -f /usr/lib/pam/pam_tid.so.2 ]] || exit 1 | |
[[ "${OSTYPE:0:6}" == "darwin" ]] || exit 1 | |
# /etc/pam.d/sudo の修正 | |
## include sudo_localが無かったら追加する(macOS Squoia 14以降はデフォである) | |
if ! grep -Eq '^auth[ \t]+include[ \t/]+sudo_local$' /etc/pam.d/sudo; then | |
# /etc/pam.d/sudo を念のためターミナルに出力しておく(似非バックアップ) | |
echo "### /etc/pam.d/sudo (original)" | |
cat /etc/pam.d/sudo | |
echo | |
( set -e; set -o pipefail; | |
# 最初の auth として pam_tid.so を追加 | |
pam_sudo=$( | |
awk ' | |
!fixed && /^auth[ \t]/ { | |
print "auth include sudo_local"; | |
fixed=1 | |
} | |
{ print } | |
' /etc/pam.d/sudo | |
) | |
echo "### /etc/pam.d/sudo (include sudo_local was added)" | |
sudo tee /etc/pam.d/sudo <<<"$pam_sudo" | |
echo | |
) | |
fi | |
# /etc/pam.d/sudo_local の修正(無ければ作る) | |
if [[ ! -f /etc/pam.d/sudo_local ]]; then | |
{ echo '# sudo_local: local config file which survives system update and is included for sudo' | |
echo '# uncomment following line to enable Touch ID for sudo' | |
} | sudo tee /etc/pam.d/sudo_local | |
fi | |
## /etc/pam.d/sudo_local を念のためターミナルに出力しておく(似非バックアップ) | |
echo "### /etc/pam.d/sudo_local (original)" | |
cat /etc/pam.d/sudo_local | |
echo | |
## TouchIDが使えるようにする | |
if ! grep -Eq '^auth[ \t].*[ \t/]pam_tid\.so$' /etc/pam.d/sudo_local; then | |
( set -e; set -o pipefail; | |
# 最初の auth として pam_tid.so を追加 | |
pam_sudo=$( | |
awk ' | |
!fixed && /^auth[ \t]/ { | |
print "auth sufficient pam_tid.so"; | |
fixed=1 | |
} | |
{ print } | |
END { | |
# auth が1つも見つからなかった場合も追加 | |
if(!fixed) { | |
print "auth sufficient pam_tid.so"; | |
} | |
} | |
' /etc/pam.d/sudo_local | |
) | |
echo "### /etc/pam.d/sudo_local (pam_tid.so was added)" | |
sudo tee /etc/pam.d/sudo_local <<<"$pam_sudo" | |
echo | |
) | |
fi | |
## pam_reattach.so を有効にする | |
if ! grep -Eq '^auth[ \t].*[ \t/]pam_reattach\.so$' /etc/pam.d/sudo_local; then | |
( set -e; set -o pipefail; | |
# pam_reattach.so の場所は Intel Mac と Apple Silicon Mac で異なるので brew を元にパスを決定 | |
pam_reattach_so="$(brew --prefix)/lib/pam/pam_reattach.so" | |
# pam_reattach.so が無ければ入れる | |
if [[ ! -f $pam_reattach_so ]]; then | |
brew install pam-reattach | |
fi | |
# pam_tid.so の手前に pam_reattach.so を追加 | |
pam_sudo=$( | |
awk ' | |
!fixed && /^auth[ \t].*[ \t\/]pam_tid\.so$/ { | |
print "auth optional '"$pam_reattach_so"'"; | |
fixed=1 | |
} | |
{ print } | |
' /etc/pam.d/sudo_local | |
) | |
echo "### /etc/pam.d/sudo_local (pam_reattach.so was added)" | |
sudo tee /etc/pam.d/sudo_local <<<"$pam_sudo" | |
echo | |
) | |
fi | |
echo -en "\x1b[1m" # bold | |
echo "If you have problems, please see the comments at this URL to try to recover." | |
echo -en "\x1b[4m" # underline | |
echo "https://gist.github.com/kawaz/d95fb3b547351e01f0f3f99783180b9f?permalink_comment_id=4325824#gistcomment-4325824" | |
echo -en "\x1b[0m" # reset |
上記スクリプトを実行すると、PAMモジュールのインストール前後で /etc/pam.d/sudo
はこんな感じに変化する筈。
diff --git a/etc/pam.d/sudo.bak b/etc/pam.d/sudo #
index 1869df8..3e6f2e2 100644
--- a/etc/pam.d/sudo.bak
+++ b/etc/pam.d/sudo
# sudo: auth account password session
+auth optional /opt/homebrew/lib/pam/pam_reattach.so
+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
もし何か問題が発生して /etc/pam.d/sudo
が壊れて sudo が利用出来なくなると、sudo を利用して /etc/pam.d/sudo を編集する事も出来なくなってしまい困ります。万が一の際に備えて、sudo 以外の手段でこのファイルを編集する方法を知っておくことは重要です。以下は実際に自分が試して上手くいった、Finderを使って回復する方法です。
- Finder で /etc/pam.d/ を開く(
open -R /etc/pam.d/sudo
) - sudo ファイルを選択してコンテキストメニューの「情報を見る」を開く
- 情報ダイアログの下の方にある「共有とアクセス」の
+
ボタンを押して自分のユーザで書き込み可能になるようアクセス権を追加する(アクセス権の変更の為には情報ダイアログの右下に表示された鍵マークをクリックして解除する必要があります) - アクセス権を付けたら適当なエディタで騙取出来るようになるので問題が起きる前の内容に書き換えて保存する
sudo
が無事使えるようになった事を確認し、問題なければ 3 の手順で追加した不要なアクセス権を削除しておく
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
↓こんな感じで実行してやれば pam_tid.so と pam_reattach.so をワンライナーでいい感じに設定してくれます。
※いきなり実行するのが不安な方は、実行前にソースコードを確認することを推奨します。