WheezyでPAMを使ってあるグループをパスワードなしでsudoする

■外出時にWheezyでPAMを使ってあるグループをパスワードなしでsudoする。
 普段はパスワードあり。
 パスワード入力を見られたくない場合に使用する。

■PAMのマニュアル

$ apropos ^pam_ | awk '{print $1}' | column
pam_access		pam_lastlog		pam_selinux
pam_ck_connector	pam_limits		pam_sepermit
pam_debug		pam_listfile		pam_shells
pam_deny		pam_localuser		pam_succeed_if
pam_echo		pam_loginuid		pam_tally
pam_env			pam_mail		pam_tally2
pam_env.conf		pam_mkhomedir		pam_time
pam_exec		pam_motd		pam_timestamp
pam_faildelay		pam_namespace		pam_timestamp_check
pam_filter		pam_nologin		pam_umask
pam_ftp			pam_permit		pam_unix
pam_getenv		pam_pwhistory		pam_userdb
pam_group		pam_rhosts		pam_warn
pam_issue		pam_rootok		pam_wheel
pam_keyinit		pam_securetty		pam_xauth

■PAMモジュールの場所

$ ls /lib/i386-linux-gnu/security/
pam_access.so        pam_group.so      pam_namespace.so  pam_succeed_if.so
pam_cap.so           pam_issue.so      pam_nologin.so    pam_tally.so
pam_ck_connector.so  pam_keyinit.so    pam_permit.so     pam_tally2.so
pam_debug.so         pam_lastlog.so    pam_pwhistory.so  pam_time.so
pam_deny.so          pam_limits.so     pam_rhosts.so     pam_timestamp.so
pam_echo.so          pam_listfile.so   pam_rootok.so     pam_umask.so
pam_env.so           pam_localuser.so  pam_securetty.so  pam_unix.so
pam_exec.so          pam_loginuid.so   pam_selinux.so    pam_userdb.so
pam_faildelay.so     pam_mail.so       pam_sepermit.so   pam_warn.so
pam_filter.so        pam_mkhomedir.so  pam_shells.so     pam_wheel.so
pam_ftp.so           pam_motd.so       pam_stress.so     pam_xauth.so

■簡単に説明。

typeについて

auth		ユーザ認証の設定
account		アカウントの制限、有効性のチェック
password	パスワード認証の設定
session		接続時の動作設定

controlについて

optional	ステータスを無視
required	失敗時はログインに失敗、処理は続行
requisite	失敗時は処理を終了
sufficient	成功時はアクセス許可

■今回は「type auth」で「control sufficient」で制御する。

■sudoersの確認。
 rootユーザかsudoグループが実行可能。
 ここでも「NOPASSWORD」で設定出来るが、ここでの変更はしない。

$ sudo grep -v "^#\|^\$" /etc/sudoers
Defaults	env_reset
Defaults	mail_badpass
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
root	ALL=(ALL:ALL) ALL
%sudo	ALL=(ALL:ALL) ALL

■include文の前に記述する。
 rootユーザか、かwheel(sudo)グループを信頼、パスワード不要とする。
 上記、sudoersに設定したユーザ以外は sudo の実行はsudoersで拒否する。
 debianの場合、「group=sudo」でwheelグループとしている。

$ cat /etc/pam.d/sudo 
#%PAM-1.0

auth sufficient pam_rootok.so
auth sufficient pam_wheel.so group=sudo trust use_uid

@include common-auth
@include common-account
@include common-session-noninteractive

■上記をtoggleで有効、無効に切り替える。
 ※上記を入力しなくても初回は無効の状態で設定される。

 Redhat用に/etc/redhat-releaseを見て、
 「group=sudo」の箇所を書き換える処理も分岐出来るが、
 変数を書き換えた方が早いので、今回はやらない。

$ cat nopass_sudo.sh 
#!/bin/bash

if [ `id -u` -ne "0" ];then
  echo "Sorry, Not Permit User!" >&2
  exit 1
fi

TARGET="/etc/pam.d/sudo"
ROOTOK='auth sufficient pam_rootok.so'
WHEELOK='auth sufficient pam_wheel.so group=sudo trust use_uid'

FLAG=1
grep "$ROOTOK" "$TARGET" > /dev/null && FLAG=0

if [ "$FLAG" -eq "1" ];then
  sed -i s/'#%PAM-1.0'/"&\n\n${ROOTOK}\n${WHEELOK}"/ "$TARGET"
fi

FLAG=1
grep "^$ROOTOK" "$TARGET" > /dev/null && FLAG=0

if [ "$FLAG" -eq "0" ];then
  sed -i s/"$ROOTOK"/"# &"/ "$TARGET" 
  sed -i s/"$WHEELOK"/"# &"/ "$TARGET"
else
  sed -i s/"# $ROOTOK"/"$ROOTOK"/ "$TARGET" 
  sed -i s/"# $WHEELOK"/"$WHEELOK"/ "$TARGET"
fi

grep "rootok\|wheel" "$TARGET"
unset TARGET ROOTOK WHEELOK FLAG

exit 0

■実行
 ※一度ログオフして再度入り直せば有効になる。

$ cat /etc/pam.d/sudo 
#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive

# sudo ./nopass_sudo.sh 
# auth sufficient pam_rootok.so
# auth sufficient pam_wheel.so group=sudo trust use_uid

# sudo ./nopass_sudo.sh 
auth sufficient pam_rootok.so
auth sufficient pam_wheel.so group=sudo trust use_uid

$ cat /etc/pam.d/sudo 
#%PAM-1.0

auth sufficient pam_rootok.so
auth sufficient pam_wheel.so group=sudo trust use_uid

@include common-auth
@include common-account
@include common-session-noninteractive

■確認方法は以下で十分。

$ sudo echo "hello"

■include文の前に記述しているので、「sudo」でなく、「labunix+sudo」グループなら、パスなしでOKにも出来る。
 「sudo」グループには所属しているけど、パス無しで使用させるほど信頼しているアカウントでなければ、
 分けることも出来るということ。