Permissions

PAM 模組 mkhomedir 與一個已經存在的家

  • February 22, 2018

我確實為 LDAP 設置了 PAM 身份驗證。一切正常,但是當我同時擁有同名但 UID 不同的本地使用者和 ldap 使用者時出現問題。

我正在研究 RH6,目前我的system-authpassword-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 更新房屋的許可,因為passwdnsswitch先到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

引用自:https://unix.stackexchange.com/questions/425216