■外出時に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
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
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
@include common-auth
@include common-account
@include common-session-noninteractive
auth sufficient pam_rootok.so
auth sufficient pam_wheel.so group=sudo trust use_uid
$ cat /etc/pam.d/sudo
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」グループには所属しているけど、パス無しで使用させるほど信頼しているアカウントでなければ、
分けることも出来るということ。