Skip to content

Instantly share code, notes, and snippets.

@kawaz
Last active September 20, 2024 06:18
Show Gist options
  • Save kawaz/d95fb3b547351e01f0f3f99783180b9f to your computer and use it in GitHub Desktop.
Save kawaz/d95fb3b547351e01f0f3f99783180b9f to your computer and use it in GitHub Desktop.
macOSの sudo で TouchID が使えるようにする(tmux内の利用も対応)
#!/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
@kawaz
Copy link
Author

kawaz commented Feb 12, 2019

↓こんな感じで実行してやれば pam_tid.so と pam_reattach.so をワンライナーでいい感じに設定してくれます。

curl -sL https://gist.githubusercontent.com/kawaz/d95fb3b547351e01f0f3f99783180b9f/raw/beec8c942e68cc43ff7b9bcde344c2b76a95199b/install-pam_tid-and-pam_reattach.sh | bash

※いきなり実行するのが不安な方は、実行前にソースコードを確認することを推奨します。

@kawaz
Copy link
Author

kawaz commented Dec 24, 2019

上記スクリプトを実行すると、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

@kawaz
Copy link
Author

kawaz commented Oct 6, 2022

もし何か問題が発生して /etc/pam.d/sudo が壊れて sudo が利用出来なくなると、sudo を利用して /etc/pam.d/sudo を編集する事も出来なくなってしまい困ります。万が一の際に備えて、sudo 以外の手段でこのファイルを編集する方法を知っておくことは重要です。以下は実際に自分が試して上手くいった、Finderを使って回復する方法です。

  1. Finder で /etc/pam.d/ を開く(open -R /etc/pam.d/sudo
  2. sudo ファイルを選択してコンテキストメニューの「情報を見る」を開く
  3. 情報ダイアログの下の方にある「共有とアクセス」の + ボタンを押して自分のユーザで書き込み可能になるようアクセス権を追加する(アクセス権の変更の為には情報ダイアログの右下に表示された鍵マークをクリックして解除する必要があります)
  4. アクセス権を付けたら適当なエディタで騙取出来るようになるので問題が起きる前の内容に書き換えて保存する
  5. sudo が無事使えるようになった事を確認し、問題なければ 3 の手順で追加した不要なアクセス権を削除しておく

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment