PAM 모듈 mkhomedir 및 기존 홈 디렉토리

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_USERpam_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(이전 UID)를 수행하면 이 문제가 더 이상 해결되지 않습니다. ssosers삭제 후 사용자 홈 디렉토리의 권한은 다음과 같습니다 .

drwx------   3    50025 oinstall   1024 Feb 19 18:30 ssosers

passwd그렇기 때문에 먼저 chown을 사용하여 가족의 권한을 업데이트해야 했습니다.nsswitchfilesldap

답변1

사용자를 삭제하기 전에 사용자의 이전 UID를 변수에 저장해야 합니다.

예를 들어 다음은 향상된 스크립트 버전입니다.

  • 명령줄에서 여러 사용자 이름 매개변수를 사용할 수 있습니다.
  • 모든 변수를 올바르게 인용하세요.
  • 소유권을 결정하는 방법에는 두 가지가 있습니다. 하나만 선택하세요.
  • 매우 원시적인 오류 검사가 있습니다. 더 필요합니다. 잘못될 수 있는 모든 사항을 생각한 다음 이를 테스트하고 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 ...그런데 이 스크립트는 여러 사용자 이름 인수를 처리하므로 중단하지 않고 stderr에 문제를 기록하는 대신 사용하고 싶을 수도 있지만 error 1 ...OLDUID 또는 NEWUID가 비어 있으면 다음 사용자 이름으로 이동해야 합니다.

예를 들어

  OLDUID=$(getent -s files passwd "$user" | cut -d : -f3)
  [ -z "$OLDUID" ] && error 0 "user '$user' is not local" && continue

관련 정보