對struct cred新理解

2021-05-21 19:34:55 字數 1010 閱讀 9726

到現在我還沒有看到cred被加入核心的mainline,可惜啊,不過我個人認為它是很不錯的,其精髓就是補丁 上的那一句,就是將權力和授權分離,這句話看似有點不知所云,難道權力不就是授權嗎?其實是不一樣的,權力有一種與生俱來的意思,它是客觀的東西,所謂天 賦人權是也,而授權有種主觀的意思,它可能是暫時的,就是說為了使得你可以完成某項特定的工作而暫時給你一些權力,然後給你授權的實體還是可以剝奪這種暫 時給你的權力的,與之相反,權力就不能被剝奪,因為它不是別人授予的,而是與生俱來的,如果說可以剝奪或者改變,那也只能是自己來,別人可以影響的只有你 的授權。

linux的cred補丁就是將一些授權放到了乙個struct cred結構體中了,這個結構體是:

struct cred ;

這 個cred叫做什麼比較好呢?其實它就是一張認證或者令牌,cred可以被單獨製作和分發,比如可以製作一張uid為0,gid為0的root認證的 cred,如果需要檢查授權的地方只需要檢查這個cred結構體就可以了,此時執行緒本身的uid並沒有變,不會因為授權了乙個新的uid就可以胡作非為 了,授權給他的這個cred是讓它做特定的事情的,其實也僅僅是這個特定的事情才會以這個cred中的uid或者別的字段作為判斷許可權的依據。這個特性有 什麼用呢?想象一下現在的nfs的rpc實現,最後的網路傳輸和資料讀取是靠乙個守護程序完成的,普通應用nfs的使用者程序只不過是介面vfs而已,底下 就是另外的程序的事情了,於是rpc中有複雜的授權體系,如果按照這個補丁的想法,這將是多麼簡單,直接將乙個cred給了乙個底層運用rpc的使用者進 程,該cred中有必要的授權。另外再看看檔案訪問,如今在task_struct中有專門的fsuid欄位負責這個授權,雖然沒有什麼不好,但是想想總 是不是那麼直觀,我們看一下用cred怎麼實現:

void change_fsuid(struct cred *cred, uid_t uid)

然後在訪問的時候就在特定的檔案系統中判斷current的cred中的uid就可以了,而且這個cred隨時可以被任何實體更換,任何實體都可以給任何程序任何授權,並且還可以剝奪相應的授權,美妙啊!如果在核心中用上這個特性該有多好。

對struct cred新理解

到現在我還沒有看到cred被加入核心的mainline,可惜啊,不過我個人認為它是很不錯的,其精髓就是補丁 上的那一句,就是將權力和授權分離,這句話看似有點不知所云,難道權力不就是授權嗎?其實是不一樣的,權力有一種與生俱來的意思,它是客觀的東西,所謂天 賦人權是也,而授權有種主觀的意思,它可能是暫時...

對const和引用的新理解

在c語言中,const實際是乙個冒牌貨,例如,const int a 10 a是乙個唯讀的常量,通過指標可以繞過去 在c 中,通過const 修飾的東西,會變成什麼樣子?1.const int a 10 放入符號表裡,始終從符號表裡拿資料,a變成真正意義上的常量10 keyvaluea10 c 裡面...

對漢諾塔 遞迴問題的新理解

開始學c 函式是看到漢諾塔問題覺得好難理解,當時記了記 了解了些原理就跳過了.昨天時隔許久重新寫漢諾塔,錯誤百出.查閱資料,在現有的知識基礎上有了更多更深的理解.這次對漢諾塔問題的過程以及對應 有了明確認識 對遞迴或者說遞推有了進一步認識 寫這篇部落格除了加深相關認識和記錄之外,還有對以前的糾錯和反...