如何在 CentOS7 上使用 cifs 和 autofs 并通过 Active Directory 身份验证挂载主目录?

如何在 CentOS7 上使用 cifs 和 autofs 并通过 Active Directory 身份验证挂载主目录?

我正在尝试将 CentOS7 客户端与 Active Directy 身份验证集成,并使用 cifs 自动挂载用户主目录。

我更愿意使用 autofs,但到目前为止,我无法使 cifs mount 在 sec=krb5 设置下工作。它总是失败并显示此消息

# mount -t cifs //fileserver.my.domain/user  /mnt/user/ -orw,noperm,sec=krb5
mount error(126): Required key not available
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

任何关于如何让 autofs 与 cifs 和 AD 协同工作的提示都非常受欢迎。

设置身份验证非常简单,只需使用这个描述来自 RedHat,只需添加列出的必要软件包即可

realm discover MY.DOMAIN

并运行命令

realm join MY.DOMAIN -U ad-admin-username

因此身份验证工作正常,但让 cifs 和 kerberos 工作却超出了我的能力范围。

答案1

我确实有一个使用 pam_exec 的解决方法,但不觉得文件共享的挂载属于 pam 框架。

通过将以下几行插入到 /etc/pam.d/password-auth,最后列出的脚本将在密码验证后挂载正确的主目录。在 session_close 时会执行延迟卸载,但这可能不是正确的做法。

将其放入 password-auth 中

auth        optional      pam_exec.so expose_authtok /usr/bin/pam_mount_cifs.s

和这个

session     optional      pam_exec.so  /usr/bin/pam_mount_cifs.sh

这两行都应插入到 realm join 命令插入的 pam_mkhomedir 行之后。

另一种方法是使用 pam_mount,如下所述这个帖子,但你必须手动编译并安装 pam_mount,因为它没有随 CentOS 提供。(或从Nux 仓库

这是脚本本身,它应该保存为 /usr/bin/pam_mount_cifs.sh

#!/bin/bash
# this script is called from pam by adding entries to /etc/pam.d/password-auth like this
#
# auth      optional      pam_exec.so expose_authtok /usr/bin/pam_mount_cifs.sh
#
# and
#
# session   optional      pam_exec.so  /usr/bin/pam_mount_cifs.sh

# the script assumes that the home dir is already created by pam_mkhomedir and pam_oddjob_mkhomedir.


DOMAIN=my.domain
FILESERVER=fileserver.my.domain
MNTPNT=/home

# turn of globbing because getent returns as string containing a *
set -f

pwstring=$(getent passwd $PAM_USER)
userinfo=(${pwstring//:/ })
USER=$PAM_USER
# strip off @my.domain from user.
SHORTUSER=${USER%@$DOMAIN}
USERUID=${userinfo[2]}
USERGID=${userinfo[3]}

USERDIR=$MNTPNT/$USER

if [ -z "$PAM_TYPE" ]; then
    echo this script should only be called from pam
    exit 1
fi



if [ $PAM_TYPE = "open_session" ]; then
    # nothing to do here, mount happened in auth.
    exit 0
fi

if [ $PAM_TYPE = "close_session" ]; then
    # this might cause problems if you have services that doesn't create procs in /home. (rstudio is one example)
    umount -l $USERDIR
    exit 0
fi

if [ ! -d $USERDIR ]; then
    mkdir -p $USERDIR
#    chown $USERID:$USERGID $USERDIR
fi

# skip if the share is already mounted.
mountpoint -q $USERDIR && exit 0

# make mount.cifs read password from stdin
export PASSWD_FD=0
mount -t cifs //$FILESERVER/$SHORTUSER $USERDIR -o user=$SHORTUSER,uid=$USERUID,gid=$USERGID,noserverino 

相关内容