PAM 模組 mkhomedir 與一個已經存在的家
我確實為 LDAP 設置了 PAM 身份驗證。一切正常,但是當我同時擁有同名但 UID 不同的本地使用者和 ldap 使用者時出現問題。
我正在研究 RH6,目前我的
system-auth
和password-auth
以這種方式配置:session required pam_mkhomedir.so skel=/etc/skel umask=0002
我的
ssosers
使用者存在於ldap
:[root@localhost pam.d]# getent -s ldap passwd ssosers ssosers:x:20100:1000:ssosers:/home/ssosers:/usr/bin/sh
並且在
/etc/passwd
:[root@localhost pam.d]# cat /etc/passwd | grep ssosers ssosers:x:50025:50025::/home/ssosers:/bin/bash
我
ssosers
可以使用本地密碼和 ldap 密碼登錄。請考慮他們有不同的UID。問題是當我刪除本地使用者強制對ldap進行身份驗證時,下次ssosers
會登錄,pam_mkhomedir.so
失敗是因為/home/ssosers
已經存在並且使用者由於缺乏權限而無法加入他的家:Last login: Mon Feb 19 17:01:00 2018 from 10.212.148.18 Could not chdir to home directory /home/ssosers: Permission denied -sh: /home/ssosers/.profile: Permission denied -sh-4.1$
$PAM_USER
如果 pam_mkhomedir 失敗,有沒有辦法更改主目錄的權限?我希望他加入他的老家目錄。更新
我想出了一個簡單的解決方案。基本上執行此腳本以通過 LDAP 查找使用者,如果找到它,我刪除使用者並更新主文件夾的 UID,如果我沒有找到它,我刪除使用者和主目錄。
#!/bin/bash getent -s ldap passwd $1 > /dev/null if [ $? -eq 0 ]; then userdel $1 chown -R $1 /home/$1 else userdel -r $1 fi
但是如何在肯定的情況下添加基於 OLD UID 的查找(查找具有 OLD uid 的其他文件)?到我做
userdel $1
本地UID(舊的)時,不再解決。這是ssosers
刪除後使用者主目錄的權限:drwx------ 3 50025 oinstall 1024 Feb 19 18:30 ssosers
這就是為什麼我必須用 chown 更新房屋的許可,因為
passwd
在nsswitch
先到files
然後再到ldap
在刪除使用者之前,您應該將使用者的舊 UID 儲存在一個變數中。
例如,這是您的腳本的改進版本:
- 可以在命令行上使用多個使用者名參數
- 正確引用所有變數
- 有兩種不同的固定所有權方法 - 僅選擇 1。
- 有一些非常原始的錯誤檢查。需要更多。嘗試考慮所有可能出錯的事情,然後想出一種方法來測試它們,並在
error()
必要時使用該函式中止。如果您有一位了解您的環境的同事,您可以向其展示您的程式碼並詢問“我錯過了什麼?”、“還有什麼可能出錯的地方?” 那將非常有用。在我認為它可以安全地在我的系統上使用之前,它仍然需要工作,但作為一個例子已經足夠了。
#!/bin/bash error() { local ec="$1" ; shift # first arg is the exit code # if there are any more args, they are the error message. print to stderr [ -n "$*" ] && echo "$@" >&2 # exit with $ec if $ec is non-zero [ "$ec" -ne 0 ] && exit "$ec" } for user in "$@" ; do OLDUID=$(getent -s files passwd "$user" | cut -d : -f 3) [ -z "$OLDUID" ] && error 1 "user '$user' is not local" NEWUID=$(getent -s ldap passwd "$user" | cut -d : -f 3) if [ -z "$NEWUID" ] ; then # user exists locally but there is no corresponding LDAP user # so delete the user and their home dir. This **definitely** needs # more sanity checking to make sure you're not deleting root or some # other important account. Maybe check that [ "$OLDUID" -ge 1000 ] # (or 500 or whatever the lowest normal-user uid is on your system) userdel -r "$user" elif [ "$OLDUID" -ne "$NEWUID" ]; then # both local and LDAP user exist. UIDs are different, so delete the local # user and change ownership of their files to the the LDAP uid. # Method 1: #homedir=$(getent -s files passwd "$user" | cut -d : -f 6) #userdel "$user" #chown -R "$user" "$homedir" #find /tmp /var/tmp -uid "$OLDUID" -exec chown "$NEWUID" {} + # Method 2: #userdel "$user" #find / -uid "$OLDUID" -exec chown "$NEWUID" {} + else # both exist, delete local user. UIDs are equal, no need to chown anything. userdel "$user" fi done
順便說一句,由於此腳本處理多個使用者名參數,您可能希望使用
error 0 ...
而不是error 1 ...
僅將問題記錄到 stderr 而不會中止,但如果 OLDUID 或 NEWUID 為空,則需要跳到下一個使用者名。例如
OLDUID=$(getent -s files passwd "$user" | cut -d : -f3) [ -z "$OLDUID" ] && error 0 "user '$user' is not local" && continue