
我正在 Joyent 的 Base64 1.8.1 SmartOS 映像上的 SMF(伺服器管理工具)下執行伺服器進程。
對於不熟悉 SmartOS 的人來說,它是帶有 KVM 的基於雲端的 IllumOS 發行版。但本質上它就像 Solaris 並且繼承自 OpenSolaris。因此,即使您沒有使用過 SmartOS,我也希望能夠了解一些關於 ServerFault 的 Solaris 知識。
我的問題是我希望允許非特權用戶重新啟動他們擁有的服務。我已經弄清楚如何透過使用 RBAC 並向我的用戶添加授權/etc/security/auth_attr
並將該授權與我的用戶關聯起來來實現這一點。
然後,我將以下內容新增至該服務的 SMF 清單:
<property_group name='general' type='framework'>
<!-- Allow to be restarted-->
<propval name='action_authorization' type='astring'
value='solaris.smf.manage.my-server-process' />
<!-- Allow to be started and stopped -->
<propval name='value_authorization' type='astring'
value='solaris.smf.manage.my-server-process' />
</property_group>
這在導入時效果很好。我的非特權用戶可以重新啟動、啟動和停止自己的伺服器進程(這用於自動程式碼部署)。
但是,如果我匯出 SMF 清單,此配置資料就會消失...我在該部分中看到的只是以下內容:
<property_group name='general' type='framework'>
<property name='action_authorization' type='astring'/>
<property name='value_authorization' type='astring'/>
</property_group>
有人知道為什麼會發生這種情況?是我的語法錯誤,還是我只是錯誤地使用了 SMF?
答案1
因為svccfg(1M)壞了,我把它壞了。
早在 2007 年,我就為 SMF 添加了一項功能,允許屬性組包含敏感訊息,只有具有適當權限的用戶才能讀取。這個想法是,您可以將“read_authorization”屬性新增至屬性群組,任何既沒有特權(基本上是 root)也不擁有該屬性指定的授權之一的人將無法讀取任何屬性的值在群組中。這被整合在這次提交,(至少)Sun ZFS 儲存產品使用它來儲存 LDAP 密碼等內容。
作為這項工作的一部分,我們希望確保即使是可以讀取這些值的特權用戶也不會透過匯出服務狀態或建立 SMF 儲存庫的存檔而意外暴露它們。因此,我將“-a”標誌新增至 svccfg 中的匯出和存檔命令中,該命令將明確匯出所有屬性值,並更改預設值以排除任何受讀保護的屬性值。
不幸的是,這個限制沒有被正確地應用;在這種情況下,我們只是拒絕導出「常規」屬性組中除了少數幾個具有值的屬性之外的任何屬性。其餘的導出時沒有任何值,這就是您所看到的。不幸的是,使用 -a 選項在這裡沒有幫助,因為當我們到達相關點時,我們不再擁有知道您已通過該點所需的上下文。甚至可以質疑是否需要此標誌來公開這些值:允許更改服務狀態的授權身分確實很敏感,並且對攻擊者有用。毫無疑問,當我寫這篇文章時,我就想到了這一點,除非明確要求,否則從其他人的角度限制這一點是合理的。但在 S10 的早期版本中,導出的 XML 和存檔包含它,因此這絕對是一個不相容的變更。你對此感到不安是可以原諒的。但這裡真正的問題是,當相關屬性組是「通用」時,-a 不起作用。我不知道你是如何成為第一個做到這一點的人。
您可以在此處關注此問題的頁面。同時,您可以考慮透過在產生的 XML 中手動新增屬性值來解決這個問題。請注意,如果需要,您也可以透過 svcprop(1) 讀取它們。我向你道歉。感謝迪爾德麗·斯特勞恩讓我注意到這個問題。