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(이전 UID)를 수행하면 이 문제가 더 이상 해결되지 않습니다. ssosers
삭제 후 사용자 홈 디렉토리의 권한은 다음과 같습니다 .
drwx------ 3 50025 oinstall 1024 Feb 19 18:30 ssosers
passwd
그렇기 때문에 먼저 chown을 사용하여 가족의 권한을 업데이트해야 했습니다.nsswitch
files
ldap
답변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