將 pam_exec 與 su 一起使用時,sed 權限被拒絕

將 pam_exec 與 su 一起使用時,sed 權限被拒絕

我正在使用 pam_mount.so 自動為 Ubuntu 14.04 客戶端上的使用者掛載 CIFS 共用。

pam_mount 在每個使用者主目錄中使用本地conf。我正在使用 pam_exec 運行 bash 腳本,該腳本使用 CIFS 共享的路徑更新設定檔。

我的 /etc/pam.d/common-session 檔案的結尾如下所示:

session required    pam_unix.so 
session optional    pam_exec.so log=/var/log/pamexec /usr/local/bin/mdrive_add
session optional    pam_mount.so 
session optional    pam_ldap.so 
session optional    pam_systemd.so

當使用 SSH 或透過 GUI 登入時,此方法有效,腳本在掛載之前運行,因此可以存取共用。

但是,當使用su時,腳本失敗,且本機使用者conf沒有更新,因此掛載也失敗。

使用 su 從 [accountA] 到 [accountB] 時收到的錯誤是:

/bin/sed: couldn't open temporary file /home/[accountB]/sednpoogQ: Permission denied

腳本中失敗的這一行是:

/bin/sed -i "s|\@S|${XSERVER}|g" /home/${PAM_USER}/.pam_mount.conf.xml

我嘗試從 ~/.profile 和其他地方運行腳本,這工作完美,但在 pam_mount 之前不運行。

所以我的問題是,使用 su 時如何讓 pam_exec 替換駐留在用戶主目錄中的文字檔案中的字串?

更新

根據評論,我嘗試過“sudo -u [accountb] -i”(在 /etc/pam.d/sudo 中包含 @common-session 後),這不會返回相同的錯誤,它可以工作。但是,這不是一個可接受的解決方案,因為我需要 su 才能工作(而且它會導致 pam_mount 出現密碼提示)。

更新2

我使用 ssh 登錄,將 env 轉儲到文件中,然後從另一個帳戶使用 ssh 登錄,使用 su 並將 env 轉儲到文件中。

比較兩者(帳戶名稱替換為 accounta 和 accountb,如問題所示:

$ comm -3 <(sort ssh_list.txt ) <(sort su_list.txt)
    PASSWD_FD=0
    _PMT_DEBUG_LEVEL=0
    PWD=/home/[accounta]
PWD=/home/[accountb]
SHLVL=1
    SHLVL=2
    SSH_CLIENT=10.112.9.87 58090 22
SSH_CLIENT=10.112.9.87 58695 22
    SSH_CONNECTION=10.112.9.87 58090 10.80.0.68 22
SSH_CONNECTION=10.112.9.87 58695 10.80.0.68 22
SSH_TTY=/dev/pts/13
    SSH_TTY=/dev/pts/14
    XDG_RUNTIME_DIR=/run/user/1000
XDG_RUNTIME_DIR=/run/user/10006
    XDG_SESSION_ID=6
XDG_SESSION_ID=7

更新3

新增了 pam_exec 運行的完整腳本(敏感資訊以佔位符取代):

#!/bin/bash
USERN=$PAM_USER
if grep -q @S /home/${USERN}/.pam_mount.conf.xml || grep -q @P /home/${USERN}/.pam_mount.conf.xml; then
    BASEDIR=`ldapsearch -LLL -H ldaps://dc.example.org:3269 -D "[email protected]" -b "DC=c,DC=sdu,DC=dk" -w [secretpw] "sAMAccountName=${USERN}" dn`;
    PREFIX="dn:: "
    BASEDIR=${BASEDIR#$PREFIX}
    PREFIX="dn: "
    BASEDIR=${BASEDIR#$PREFIX}
    BASEDIR=`echo $BASEDIR | tr -d ' '`
    if [[ $BASEDIR != *","* ]]
        then
               BASEDIR=`echo $BASEDIR | base64 --decode`
        fi
    BASEDIR=`echo $BASEDIR | tr -d ' \n' | awk -F "DC=" '{ st = index($0,"DC=");print substr($0,st+0)}'`;
    DOMAIN=`echo $BASEDIR | sed 's/,DC=/./g' | sed 's/DC=//'`;
    OUTPUT=`ping -c 1 -t 10 $DOMAIN | grep icmp`
    HOMEDIR='\\fallbackserver\share'
    if [[ -n "$OUTPUT" ]]
        then
            DC=`echo $OUTPUT| cut -d' ' -f 4`
            HOMEDIR=`ldapsearch -LLL -H ldaps://$DC:636 -D "[email protected]" -b "${BASEDIR}" -w [secretpw] "sAMAccountName=${USERN}" homeDirectory | grep homeDirectory | awk '{print $2}'`;
        fi
    CHOMEDIR=$(echo ${HOMEDIR} | sed 's/\\/\//g')

    XSERVER=`echo $CHOMEDIR | cut -f3 -d/`
    XPATH=`echo $CHOMEDIR | cut -f4- -d/`



    /bin/sed -i "s|\@S|${XSERVER}|g" /home/${USERN}/.pam_mount.conf.xml
    /bin/sed -i "s|\@P|${XPATH}|g" /home/${USERN}/.pam_mount.conf.xml
fi

更新4

在腳本中放置一個 whoami ,表示使用 su 從 accounta 到 accountb 時,腳本是由 accounta 執行的。

更新5

使用 pam_exec 的“seteuid”選項解決了這個問題。 session optional pam_exec.so seteuid log=/var/log/pamexec /usr/local/bin/mdrive_add

whoami 現在從 A 切換到 B 時顯示“root”,並且不存在權限問題。

我不明白 pam_exec 手冊中的術語“真實用戶 ID”和“有效用戶 ID”,但這是另一天的問題。

預設情況下,pam_exec.so 將使用呼叫程序的真實使用者 ID 執行外部命令。指定此選項表示該指令使用有效使用者 ID 運行。

答案1

問題在於,透過登入su pam_exec以「舊」使用者身分執行腳本,該使用者無權寫入「新」使用者的主目錄。

設定make 以 root 身分執行腳本seteuid中的選項,這解決了問題:session optional pam_exec.so log=/var/log/pamexec /usr/local/bin/mdrive_addpam_exec

session optional pam_exec.so seteuid log=/var/log/pamexec /usr/local/bin/mdrive_add

然而,「真正的」解決方案可能是/etc/pam.d/su充分配置,這是我仍在擺弄的事情;一旦我了解了正確的配置方法,我就會更新這個答案/etc/pam.d/su

相關內容