已撤銷存取權限,對方卻還在裡面:工作階段不等於權限

權限已經移除,甚至帳號也已停用,那個人卻還能操作。並沒有東西壞掉:撤銷存取權限和結束工作階段是兩個不同的動作。

AtlasPVE ·

本條目涵蓋以下問題

  • proxmox 刪除使用者 還能登入
  • proxmox 移除權限 仍可存取
  • proxmox 一直被登出
  • proxmox 工作階段 多久過期
  • proxmox 撤銷 api token

某位使用者的權限已經移除,也許連帳號都整個停用了。接著卻發現那個人仍然能夠操作。

並沒有東西壞掉。登入和權限檢查是兩個不同的時刻,兩者之間存在落差。

登入只發生一次,權限卻每次都要詢問

登入時,系統會發出一張票證。票證上寫著:此人已證明自己的身分,而這張票證在某某時間之前有效。

權限是另一個問題,每次發出請求時都會重新詢問。但實務上,許多系統為了速度,會在登入時取得一份權限對照表的副本,並在一段時間內使用這份副本。

由此產生兩種延遲。

第一種:移除某項權限時,已開啟的工作階段可能仍帶著那份副本。這項變更要等到工作階段續期時才會傳到它那裡。

第二種,也是更重要的一種:刪除或停用使用者,並不會撕毀對方手上握著的票證。票證是自成一體的,在到期之前都持續有效。

規則:撤銷存取權限不等於結束工作階段

這是兩個不同的動作,只做第一個,就等於在身後留下一扇開著的窗。

這扇窗不會永遠開著;票證的有效期不是一整天。但也不是零,在緊急情況下,很快就會關上並不是一個夠好的答案。

有人離職,或密碼可能外洩時

依序做三件事。

移除權限。如有必要,也一併停用帳號。

變更密碼。這會封住取得新票證來取代手上那張的途徑。只移除權限做不到這一點。

另外移除存取權杖。這是最常被跳過的一步。權杖不是工作階段:它不會自行過期,會一直存在,直到被刪除為止。變更使用者的密碼,並不會讓該使用者的權杖失效。移除使用者時,要另外確認這些權杖後來怎麼了。

還要澄清一個誤解:雙重驗證在這裡幫不上忙。它守護的是登入的那一刻。對於已經開啟的工作階段,它無能為力。

另一個方向:為什麼一直被登出

這是同一個機制的另一面。

票證的壽命有限,只要分頁開著,介面就會定期為它續期。關掉分頁,幾個小時後再回來,期間沒有發生續期,票證已經失效,於是系統要求重新登入。這不是故障。

第二個比較少人知道的原因更有意思:機器的時鐘。票證帶有時間戳記。如果伺服器的時鐘漂移,一張剛發出的票證可能看起來像是來自未來,或早已過期。症狀令人困惑:密碼正確,登入似乎也被接受,但工作階段隨即中斷。很少有人會想到在身分驗證這一側找時鐘的問題,但確實值得一查。

Atlas 的做法

在 Atlas 中,送到瀏覽器的 cookie 並不是真正的票證。瀏覽器只帶著一個沒有意義的隨機識別碼;真正的票證留在伺服器上。

差別很具體:即使瀏覽器的漏洞讀到了這個 cookie,也拿不到票證本身,因此無法把它帶到別處使用。它唯一能做的,是在該工作階段存續期間,從那個瀏覽器進行操作。這不是零風險,但縮小了威脅的範圍。

開啟中的工作階段會寫入磁碟,所以產品更新時不會有人被踢出去。寫入刻意以單一步驟完成:如果檔案被留在寫到一半的狀態,即使讀取端能夠容忍,所有開啟中的工作階段都會中斷。

真正值得一提的,是在這裡透過實測發現的一個缺陷。

過期的工作階段記錄原本只從記憶體中清除,而沒有從檔案中清除。檢查一台實際運作的機器後發現:檔案裡躺著五筆過期記錄,每一筆裡面都有一張票證。它們會一直留在那裡,直到下一次登入,因為沒有其他任何東西會寫入那個檔案。

程式碼的意圖本來就是不保留它們。唯一缺少的,只是寫入那一步。

這個教訓適用於每個撰寫安全相關程式碼的人:遺忘有兩個地方。從記憶體移除的東西,並沒有從磁碟移除,而兩者之中,磁碟上的那份總是活得更久。決定某樣東西不能保留時,第二個問題永遠一樣:它被保存在哪裡?

資料來源

Proxmox 官方文件。內容為英文,且在此主題上以官方文件為準。

相關條目

這項工作在 Atlas 中是什麼樣子?

前往產品頁面