Unix許可權這點事

2021-09-20 08:22:05 字數 3591 閱讀 7756

unix/linux的許可權管理還是比較複雜的,別人說看高階環境程式設計得看2,3遍。我想這應該是在linux有了一定基礎上。我看的過程中覺得需要反覆推敲,有些地方得翻來覆去看上5,6遍甚至更多,下面是自己的一些對unix許可權的理解,盡量翻譯成了大白話。如果有不對的地方,歡迎討論。

關於使用者和組,對比現實生活中的例子。linux系統好比乙個大型的圖書館,裡面存放著各種書籍,檔案和一些演示裝置(像天體執行動態演示裝置等等),還有電腦,普通人想進入圖書館進行學習必須註冊(useradd)為為會員(user),成為會員後圖書館管理員(root)會給會員傳送門禁卡(password),會員進入圖書館刷門禁卡即可。會員在圖書館內可以閱讀書籍(read),也可以觸發演示裝置,操作電腦(run)來進行學習。這些書籍,檔案和裝置的擁有者(owner)都是管理員,會員的許可權由管理員指定。另外,會員是可以在書籍中記(write)筆記的,但要獲得管理員的許可。

這個圖書館比較特殊,會員可以把屬於你自己的書籍,甚至電腦放(create)到圖書館中,會員自己的書籍可以自己決定是否有讀(read)和寫(write)的許可權,可以決定自己的電腦自己是否是可執行(run)的。既然會員把圖書和裝置放到了圖書館中,管理員有權對這些書籍和裝置進行讀寫和執行。

好了,總結一下,現在圖書館中的各種書籍和裝置的擁有者分成兩類,一類是管理員,一類是會員。會員是管理員發放了門禁卡之後才能進入。到這裡你發現沒發現乙個問題,乙個會員的書籍只能夠給兩個人看,乙個人是他自己,另乙個是管理員。這樣的話就浪費了圖書館的資源,如今都講究共享,共享單車,共享充電寶,共享經濟(這個概念已經很老舊了,linux/unix中已經使用了這個概念)。。

如何才能解決資源共享的問題呢?共享也不是隨意共享的,有些會員的資源可能只願意給自己認識的人看,有的願意認識的人在自己的書籍中記筆記;有的人願意自己的資源只給對其感興趣的人讀和寫;而有的願意給所有人讀和寫。為了達到這種精確控制。管理員建立了乙個規則:設定組(group)。管理員可以建立(groupadd)乙個組,普通會員在獲得管理員許可後(sudo)也能建立組。

例如:會員a,b,c,d達成共識,咱們建立乙個組吧,以後四個人的資源就可以自由共享了,於是他們向管理員申請建立組adgroup,管理員親自建立(groupadd)或者授權給(sudo groupadd)其中某乙個人建立。建立完成之後把四個人加入(usermod)這個組即可。以後其他人可以申**入這個組。乙個人可以同時加入多個組。這裡會有個問題,既然乙個人可以屬於多個組,那麼乙個使用者往圖書管理放一本書,為這本書設定組許可權的時候,設定的許可權是哪個組的呢,好吧,我們首先設定乙個預設組,會員進入圖書館的時候,拿進去的書籍開始都是屬於預設組(有效組)的,其餘的組叫做附屬組,可以把附屬組修改為當前有效組(newgrp)。書籍放到圖書館之後,所屬組就會記錄下來,這個組可以由書籍所有者修改(chgrp),修改之後,這本書的組許可權就變成新組的許可權了。

接著上面說,四個會員可以分別指定屬於自己資源的組許可權,會員a的書籍booka屬於組adgroup,他可以指定屬於這個組的使用者可以讀寫。會員b有潔癖,他的書籍bookb屬於組adgroup,他只給組許可權設為唯讀。會員c突然發現自己的書籍中藏有寶藏密碼,立即關閉了組讀寫許可權,和管理員一起研究寶藏密碼去了。。。

我們看一下接下來的場景,會員e自己出了一本書,為了宣傳自己的新作,他想盡可能快的讓盡可能多的人看到這本書,並且得到反饋,他把這本書放到了圖書管,他加入了所有組,把這本書的所屬組設定為人數最多的乙個組,並把組許可權設定為讀寫。看到沒有,儘管他加入了所有組,他的一本書籍只能為乙個組設定組許可權。他有兩個選擇:

會員e的這種情況,我們給出乙個解決方案,再加入一種特殊的組,況且這麼叫吧,就是其它(others),它能夠設定不在資源所屬組內會員的許可權。也就是其他人的許可權。上面的問題迎刃而解,e不用再加入每個組了,也不用特定把書所屬到人數最多的組,只需要把組許可權和其他許可權設為讀寫即可。

繼續圖書館的例子,書籍是乙個檔案,我們已經知道的有關這個檔案的許可權的屬性包括:

還有其它的會在這一節裡面詳細說。看官們繼續吧。。

我們知道,書籍是放在書架上的,書架是放在某個具體的屋子內的,屋子是坐落在圖書館內的。會員找到一本書,先得進入圖書館(login),然後進入某個屋子(cd),找到某本書籍所在的書架(繼續cd),最後看到書籍,然後開啟進行讀和寫。

為了方便管理,除了書籍和裝置本身的讀寫和執行許可權之外,圖書館可能會指定一下規章制度:

為了達到這種效果,聰明的規則制定者想出了乙個辦法,給屋子和書架也分配上面的5種許可權。我們暫且把屋子和書架稱作容器(folder)。

我們把會員和管理員可以執行的操作分成一下幾種:

我們看一下上面的四種操作需要什麼許可權。

將第五條規則詳細說明

第五條規則裡面的對書籍本身要有讀寫許可權,那麼什麼情況下才會對書籍有讀寫許可權呢,我們詳細展開說明。

繼續圖書館中的例子,我們註冊成為圖書館的會員時,管理員是會給我們分配乙個id號的,這個id號用來標識我們的身份。每次進入圖書館進行圖書的讀(read)和寫(write),以及操作(run)裝置,檢查許可權的時候是通過這個id號來檢查的:會員a進入圖書館,會員a的id——r_id_a(real id)就會被記錄下來,會員a開啟書籍booka進行讀或者寫的時候,會使用id_a來進行檢查:

上面的四個步驟,如果走到其中乙個步驟的判斷是允許或者拒絕,就不會再繼續往下判斷了。例如,如果booka的owner_id=id_a,並且你設定的許可權是禁止自己讀寫。即使你所在的組設定的許可權為允許讀寫,結果也會是拒絕。

需要指出的是,上面的五條規則都是錯誤的,錯誤的地方在id_a上,我只是為了方便說明,實際上乙個會員在圖書館裡身份是可以通過某種方式進行變化的,也就是說會員在讀寫時,用來判斷許可權的id有可能不是id_a。接下來說明。

程序的概念是動態的。也就是說許可權這個東西是隨系統執行會發生變化的。繼續圖書館的例子,上一節最後我們說到了會員的身份問題。這裡詳細闡述一下,會員進入圖書館有乙個id(實際id),這個id確切標識了會員的身份,但是在會員進行活動時,操作某個裝置(run)時,他這時的身份(有效id)就有可能發生變化了。

圖書館引入了一批機械人,這些機械人可以代替人進行圖書的讀和寫。這樣會員就可以直接通過電腦操控機械人。每個會員都可以擁有乙個自己的機械人。這時候就可以把機械人看成會員的替身。當機械人進行讀寫書籍時,機械人的身份id初始情況下就是會員本身的id。會員的身份是如何通過機械人發生變化的呢?

乙個會員是可以使用別人的機械人(run乙個owner不是自己的程式)的,但是在通常情況下,e_id就是r_id。用真實身份去操控別人的機械人。許可權結果有上一節的條款而定。但是只可能通過組許可權或者其它許可權來獲得訪問權。因此有很大的侷限性。如何把會員的身份偽裝成操控機械人的owner呢?

上一節我們提到了關於檔案的5個屬性。這裡還要說兩個:

這兩個id是做什麼用的?如果機械人(機械人是可以執行的檔案)設定了設定使用者id,別的使用者在操控這個機械人時,r_id會變成機械人的ownner_id。這就可以用機械人擁有者的身份來操控機械人呢了。有人有疑問,如果有其它會員搞破壞會怎麼辦?其實管理權真正在owner手裡,替身還是替身,並不是owner本人。替身的功能是可以限制的,owner在設定替身的功能時,如果設定了設定使用者id,可以自定義機械人可以讀寫哪些書籍。

設定組id是相同的道理。

需要注意的是,如果會員結束操控別人的機械人?這時的r_id會如何變化呢?答案是會變回原來的r_id。但是原來的r_id和g_r_id儲存在什麼地方呢?這裡有另外兩個id來臨時儲存這兩個id:

上面的身份變換是機械人開始執行時就發生變化的,那麼在執行過程中可以發生變化麼?也是可以的。

個人部落格:

mount掛載這點事

一.作用 掛接目錄和檔案系統 二.mount的標準用法 mount t type device dir mount t 檔案系統型別 裝置名 掛載點 mount 192.168.86.5 share mnt三.mount的檢視 df h 可以來檢視對應裝置和目錄的掛載關係 mount命令直接回車,也...

說說晶元設計這點事

晶元設計這個行當 從大的方面講,主要分模擬和數字兩大塊,而每大塊又分前端和後端,我想大部分同學對這個肯定是非常清楚的,下面就數位電路聊聊晶元設計的一些事情,就是晶元設計有哪些活做,這並不是全面完整的系統介紹,只是個人的了解和總結,希望拋磚引玉,也許不全面,不正確,歡迎同學們指正和補充 說到數字晶元,...

談談創業這點事 1

以前,我經常勸一些牛人,特別是技術牛人創業,因為在我眼裡,這個世界機會太多,成功案例太多,總是替朋友們錯失機會而可惜。咳咳,其實我也一樣 但最近,我突然覺得,現在的環境下,對於某些型別的人才而言,創業未必是最佳選擇。兩個月前,乙個技術大牛聽說我恰好在上海,特意從杭州跑來跟我吃飯,這個傢伙曾經是一家網...