Ubuntu

當 Samba 通過 PAM 為我的(互動式)使用者關閉會話時,ecryptfs 掛載的主文件夾“消失”

  • September 12, 2020

在 Ubuntu 20.04 上——我以前用(香草)GNOME 遇到過這種情況——用 KDE Plasma(不,不是 Kubuntu!),我面臨著每隔幾個小時左右就會發生一次的奇怪事情,對此我沒有任何解釋或補救措施到目前為止。

不知何故,當我登錄時安裝的 ecryptfs 加密的主文件夾突然“消失”了。我主要注意到它是因為開始出現奇怪的症狀,例如各種程序報告$HOME他們找不到的文件,他們認為這些文件已損壞,或者他們只是報告他們無法打開它們。

第一次發生這種情況時,我通常可以執行/usr/bin/ecryptfs-mount-private,輸入我的密碼並完成它。唉,這仍然不能恢復某些 KDE 桌面元素的功能。例如,從那時起,我無法搜尋已安裝的程序,因此在我註銷並重新登錄之前,所有尚未執行的程序都變得不可用。

隨後發生這種情況,我嘗試使用/usr/bin/ecryptfs-mount-private我通常會看到:

$ /usr/bin/ecryptfs-mount-private
Enter your login passphrase:
Inserted auth tok with sig [2123456789012312] into the user session keyring
mount: No such file or directory

從以下螢幕截圖中可以看出,即使在這種情況下註銷也會成為一場小噩夢。彈出對話框僅基於我選擇註銷的事實!

嘗試註銷時錯誤對話框的螢幕截圖

所以我的問題(是的,複數……因為我目前不知道如何開始診斷這個):

  1. 哪個實體可能導致我的自動刪除$HOME?…我想起了奇怪的行為,比如當你註銷時會話被清除,所以突然你的 Screen 或 Tmux 會話也被殺死(除非你使用loginctlwith enable-linger
  2. 解決此類問題的步驟是什麼?(請記住,發生這種情況時桌面的行為很奇怪!)。我嘗試journalctl使用 ripgrep 查看輸出和日誌,但我真的不知道要查找哪些術語…
  3. 假設這是一個已知的錯誤,如果有解決方法是什麼?

它讓我想起了一些 Tmux/Screen 在註銷時被殺死的情況,這是我通常不會想到的,只有在登錄 SSH(即單獨的登錄會話)或啟用會話延遲後啟動 Tmux/Screen 才能防止這種情況。


我發現的一件journalctl看起來很奇怪並且與“失去”的主目錄相關的東西如下:

Sep 01 23:39:11 machine smbd[220424]: pam_unix(samba:session): session closed for user johndoe
Sep 01 23:39:11 machine systemd[1]: home-johndoe.mount: Succeeded.
-- Subject: Unit succeeded
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
--
-- The unit home-johndoe.mount has successfully entered the 'dead' state.
Sep 01 23:39:11 machine systemd[1977]: home-johndoe.mount: Succeeded.
-- Subject: Unit succeeded
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
--

…但這表明由 Samba 守護程序代表我的互動式使用者帳戶引起的某些事情會導致系統的另一部分假設我註銷並解除安裝我的$HOME… 這聽起來極不可能,不是嗎?

上述模式pam_unix(samba:session)為我的使用者名關閉會話,然後$HOME文件夾變得無法訪問是確鑿的證據,但也是迄今為止唯一的一個。目前正在閱讀整個會話業務應該如何工作以及為什麼該掛載單元“認為”它可以在我仍然以互動方式登錄時“獲取”我掛載的主文件夾。

**編輯#1:**因為註釋表明 Samba 的配置可能是相關的,所以我在這裡添加它。johndoe我在轉儲中替換了我的實際使用者名testparm

# Global parameters
[global]
debug uid = Yes
dns proxy = No
guest account = johndoe
log file = /var/log/samba/log.%m
map to guest = Bad Password
max log size = 1000
obey pam restrictions = Yes
panic action = /usr/share/samba/panic-action %d
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
passwd program = /usr/bin/passwd %u
security = USER
server role = standalone server
server string = %h server (Samba, Ubuntu)
syslog = 7
syslog only = Yes
workgroup = NULL
idmap config * : backend = tdb

[sharename]
force create mode = 0660
force directory mode = 0770
guest ok = Yes
guest only = Yes
path = /data/sharedir
read only = No

正如您所說的那樣,沒有什麼特別的,但我的猜測是,我通過全域設置將自己的使用者“預設”為來賓使用者這一事實不知何故導致登錄會話出現在我的使用者面前。

samba:session除了像上面複製的日誌行這樣的少數條目之外,沒有帶有標記的條目。

**編輯#2:**我的/etc/pam.d/samba樣子是這樣的:

@include common-auth
@include common-account
@include common-session-noninteractive

…因此我嘗試編輯那些引用的文件並在引用或debug的每一行上添加(用空格分隔)。結果 - 重新啟動後 - 我根本無法再登錄 KDE。它只是停滯不前。所以我使用其他終端之一登錄並恢復我的更改(多虧了這很簡單)。pam_unix``pam_ecryptfs``root``etckeeper

編輯#3:KillExcludeUsers=root johndoe臨時解決方法是通過設置/etc/systemd/logind.conf或“本地”通過loginctl. 這使得這看起來越來越像一個缺陷。…編輯4:解決方法結果無效。

好吧,這當然很愚蠢,因為我在幾個小時前“浪費”了 200 名聲望,但我似乎已經解決了這個難題。任何提供比我更直接的提示和嘗試的人都將獲得賞金。

好吧,事實證明,pam_unix從日誌中是一個重要的線索。我最終能夠引發這種情況,從而可靠地再現解除安裝。

我所做的也在launchpad.net 上的相應票證中進行了描述,但我將在此處複製上述問題中沒有的相關部分。

根據輸出,我在研究這個問題smb.conf 之前看起來像這樣testparm

# Global parameters
[global]
debug uid = Yes
dns proxy = No
guest account = johndoe
log file = /var/log/samba/log.%m
map to guest = Bad Password
max log size = 1000
obey pam restrictions = Yes
panic action = /usr/share/samba/panic-action %d
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
passwd program = /usr/bin/passwd %u
security = USER
server role = standalone server
server string = %h server (Samba, Ubuntu)
syslog = 7
syslog only = Yes
workgroup = NULL
idmap config * : backend = tdb

[sharename]
force create mode = 0660
force directory mode = 0770
guest ok = Yes
guest only = Yes
path = /data/sharedir
read only = No

我選擇了一種蠻力試錯法。在 Tmux 中,我打開了幾個窗格,同時嘗試為缺陷報告生成 MWE。這實際上是我正在執行的:

  1. while mountpoint /home/johndoe; do sudo service smbd restart; date; sleep 2s ; done
  2. watch 'mount|grep ecryptfs'
  3. sudo tail -F /var/log/auth.log|grep samba:session

…在另一個 Tmux 視窗中,我隨後編輯/保存了/etc/samba/smb.conf.

砰!

顯示auth.log日誌條目 ( smbd[144802]: pam_unix(samba:session): session closed for user johndoe) 並且掛載點消失了。

我終於找到瞭如何重現令人討厭的情況。

鑑於它的名字,我的第一個選擇確實是obey pam restrictions設置。所以我將它設置為no(但我可以簡單地將其註釋掉,因為它預設為no)。

重新啟動smbd服務,註銷並重新登錄並嘗試再次重現錯誤情況。

這一次無法複製。很明顯,obey pam restrictions環境影響了這一切pam_unixsamba:session業務。

**編輯#1:**在提到的票證中要求提供更多資訊。特別是在pam-auth-update我被要求停用除Unix 身份驗證設置之外的所有設置。像這樣:

[*] Unix authentication
[ ] Register user sessions in the systemd control group hierarchy
[ ] Create home directory on login
[ ] eCryptfs Key/Mount Management
[ ] Inheritable Capabilities Management

事實證明,問題不是第二個與 systemd 相關的設置,而是第四個:eCryptfs Key/Mount Management

得到教訓

  1. 如果您要自己調查,請不要懸賞😉
  2. 貨物邪教垃圾真的會傷害你正在做的事情……這個特殊的設置是我在我的配置管理中隨身攜帶的一個,smb.conf雖然很明顯它現在可能已經被扔掉了……哦,好吧
  3. 如果一切都失敗了,蠻力和反複試驗似乎是尋找根本原因的可行方法

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