1. 程式人生 > >【Linux】 Linux權限管理與特殊權限

【Linux】 Linux權限管理與特殊權限

設置 獲取 默認值 ima ati service 選項 密碼 sbit

Linux權限管理

  權限管理這方面,非常清楚地記得剛開始實習那會兒是仔細研究過的,不知道為什麽沒有筆記留痕。。除了一些基本的知識點早就忘光了,無奈只好從頭開始學習一遍。。

■  基本權限知識

  這部分實在是比較基礎,不想多講了。主要就是9格權限的理解。搞清楚讀權限、寫權限和執行權限對於文件和目錄來說分別以為著什麽,就可以了。下面是一些以前沒怎麽註意,今天聽完培訓之後覺得有些意思的點:

  ● 管理權限的權限

  文件權限信息和其他文件信息一樣,並不屬於文件內容的一部分,而基本的權限是針對文件內容而言的。比如說:

-rwxrwxrwx  1 zabbix zabbix      0
8月 11 14:01 file1

  這個file1屬於zabbix,而其權限是最開放的777,另一個非root用戶比如user1可以讀取,修改,執行這個文件,但是user1仍然沒有權限對file1進行chmod,chown等操作。一般而言,對某個文件或目錄有chmod,chown權限的用戶只有root和該文件/目錄的所有者。所以說在linux中,應該還存在一種管理權限的權限機制,只不過這種機制沒有開放接口給用戶修改使用而已。

  ● 多層級目錄的權限按就近原則

  對於多層的目錄,可能存在這樣一種情況:one/two/three/file 對於目錄one,three和文件file,用戶都是有權限的,而對於two目錄,用戶沒有執行權限的話(即使他有讀寫權限),也是無法獲得level_three以及file的信息和內容的,甚至無法往level_two目錄下level_three目錄的同級創建刪除文件。因為系統默認,如果要讀取或修改目錄下的內容,一定要先進入目錄,這和我感覺中的是不一樣的。因為需要進入目錄,自然就要求要有x權限,否則一切都是抓瞎白談。

  可以指出的一點是,上面這個例子,如果用戶在one這個目錄下ll目錄two中的內容,會看到這樣一幅場景:

技術分享

  可以看到,three目錄和與three同級的文件testfile(再強調一次,和這兩者的具體權限無關)被顯示了出來,但是也提示了權限不夠且顯示出來兩者的信息是很有限的(僅名字而已)。至於想看three裏面的是不可能的了。

  ● passwd中的uid就代表了用戶是誰

  這點在用戶管理哪一篇文章中應該也提到過。核心要義就是,Linux中,大部分用戶識別的工作都是靠了uid這個數字,而不是用戶名。所以如果我們把passwd中的某一個用戶的uid改成0(root的uid),那麽他就成了root用戶,可以在很多地方直接按root權限幹事情了。

  ● chage命令的使用

  眾所周知passwd可以用來修改自己的密碼,如果是root的話還可以利用這個命令來修改所有用戶的密碼。但是這個密碼的很多配置選項都是默認選項。如果需要進一步細化密碼配置的話就要用到chage這個命令了。在其他地方說不定也說過了,chage命令的基礎是/etc/shadow這個文件。而通過chage獲得的信息以及chage要修改的基本上也都是這個shadow文件。shadow文件的說明寫在用戶管理那一章裏了,至於chage的基本使用如下:

$chage [-ldEImMW] <username>
參數:
-l    列出該賬號所有的密碼配置
-d    接日期 修改shadow的第三字段(最近一次更改密碼的日期)
-E    接日期  修改shadow的第八字段(賬號失效日)
-I    接天數  修改shadow的第七字段(密碼失效日期)
-m    接天數   修改shadow的第四字段(密碼最短保留天數)
-M    接天數    修改shadow的第五字段(密碼多久後需要修改)
-W    接天數    修改shadow的第六字段(密碼過期前警告日期)

■  稍微深入一點的權限知識

  基本權限知識在八成的場合下都夠用了,再權限控制需求更加復雜的權限管理手段。下面來講幾個linux常常可以聽到,偶爾也會用到的權限管理方面的內容。

  ● umask默認權限

  在用戶創建默認文件/目錄時,會自動賦這個文件/目錄一定的權限。這個默認值就由umask來控制。默認情況下的umask是0022,第一位0是留給特殊權限SUID,SBIT這些的,先不管。後三位分別對應了owner,group和others。

  需要註意的是,新文件和新目錄的umask基準值不一樣。對於用戶創建的文件,基準值是666,所以在022的umask下創建的新文件默認的權限是644。而用戶創建新目錄時基準值是777,所以在022umask下的新目錄默認權限是755。

  ● chattr,lsattr

  註意,這兩個命令只在部分文件系統上有效。且據說chattr不對/,/var,/dev等目錄下的文件起作用。

  文件可以通過chattr和lsattr來進行隱藏權限屬性的管理。所謂隱藏屬性,就是默認情況下,所有新建的文件和目錄都沒有的,需要用戶根據需要自己精細化設置的權限管理手段。之前培訓也沒有講到這塊內容,但是我一看發現還是很有用的!

  先來看下lsattr把。lsattr <文件名>可以查看一個文件/目錄的所有隱藏權限,如果不帶文件名參數,則給出當前目錄下所有文件/目錄的隱藏屬性信息。因為默認情況下隱藏權限是全空的,所以我們通常看到的是一馬平川:

[[email protected] tmp]# lsattr
---------------- ./test.py
---------------- ./demofile
---------------- ./uwsgiconfig.ini
---------------- ./libcurl-devel-7.29.0-35.el7.centos.i686.rpm
---------------- ./libcurl-devel-7.29.0-35.el7.centos.x86_64.rpm
---------------- ./systemd-private-ca6e7179ff254d749f6efc37e1a66006-httpd.service-gSl2nW
---------------- ./test.c
---------------- ./file1
---------------- ./level_one
---------------- ./test

  再來看看chattr的用法:

chattr [+-=] [ASacdistu] <文件名或目錄名>
+,- 後面跟一個字母參數,表明為目標文件增加或減去一個隱藏屬性
-R可以遞歸地設置目錄下所有文件的隱藏屬性,一定要寫在“+-屬性”前面。 A:設置了A屬性後,訪問該文件不會修改訪問時間atime,對於需要頻繁I
/O的文件而言,加上這個屬性可以提高IO效率 S:一般寫入文件都是異步的(經過緩存),如果加上這個隱藏屬性則寫入磁盤操作是同步的 a:設置了a之後,這個文件將只能增加數據,不能修改或減少數據。只有root用戶可以設置這個屬性 c:設置了c屬性的文件會自動壓縮文件,以壓縮狀態存儲在磁盤上,當讀取時自動解壓縮。對於內存充足但是磁盤捉急的情況適用 d:設置了d屬性的文件不被dump程序備份 i:設置了i屬性的文件將無法被刪除(即使是root用戶刪),也無法修改其內容,在保證重要文件的安全性方面有很大作用,只有root用戶可以設置這個屬性 u:設置了u屬性的文件被刪除之後並不會從硬盤上抹去,而是可以通過一定手段找回來(什麽手段我也不知道。。)

  其中當屬i屬性和a屬性有用,特別是保證系統安全性方面。由於是隱藏屬性,具有很大的隱蔽性,所以有時候會引起意想不到的問題。比如突然碰到了無論如何都無法刪除的文件時。。就可以想想是不是隱藏屬性的問題。這也從反面說明,在設置隱藏屬性的時候一定要慎重&留痕,別心血來潮一設置,以後想都想不起來了。

■  SUID,SGID和SBIT

  這方面內容在雜亂筆記中有簡單說明過。現在再來明確一下。

  ● SUID

  SUID,表現在文件所有者的執行權限位上顯示為s。SUID權限只對二進制文件有效(判斷是不是二進制文件可以通過file <filename>來查看,像我之前認為的.py,.sh什麽的加上x權限就是二進制文件了是不對的。。像用gcc編譯出來的東西才是真的二進制文件)。

  s權限的具體含義是,當某個文件的擁有者執行權限位是s的話,其他用戶執行這個二進制時,在執行期間,用戶獲得文件擁有者的權限。需要註意的是,執行程序的用戶本身要對這個程序有x權限。如果一個屬於root:root的文件的權限是-rws------,那麽讓一般用戶來執行還是沒有權限的。必須改成-rws-----x才可。

  使用SUID的場景比較經典的有“有限制地對文件進行讀寫”。比如我有一個屬於root的文件file,我希望其他用戶可以在一定限制下對其進行讀寫。顯然不能開放rw給他們。那麽我可以這麽做,將這個文件設置成只有root可讀可寫,然後寫一個二進制程序(程序所有者得是root),在程序中做出讀寫的控制,而後把這個程序的所屬者執行位設置為s。這樣其他用戶可以通過這個程序來對文件讀寫,做到了“有限制的讀寫”。這種做法有點類似於面向對象編程中的私有變量。不允許直接改變變量,但是留出setVar方法作為接口來改變變量值。事實上,linux中用戶改密碼的機制就是通過SUID來實現的。一般用戶可以執行/usr/bin/passwd來改變自己的密碼,不過密碼信息都放在/etc/shadow裏面,這個文件只有root可讀可強制寫。普通用戶修改密碼,即修改這個文件不能直接修改,只能通過/usr/bin/passwd這個二進制文件來進行,所以/usr/bin/passwd是具有SUID權限的一個文件。

  增加SUID權限可以通過chmod 4xxx <文件名> 來進行。可以看到權限碼的第四位出現了。也可以用chmod u+s <文件名> 的方法來添加SUID權限。

  ● SGID

  SGID權限和SUID是類似的,無非是把“執行中具有文件所有者權限”改成了“執行中具有文件所有組的組員的權限”。也就是說SGID是類似於-rwxr-sr-x這種地方有個s權限。

  另外SGID有一個挺大的不同在於它可以應用在目錄上。對於目錄而言其效果是:首先用戶要有對這個目錄的讀和執行權限,這樣才能保證他能夠進到目錄中,然後用戶在此目錄下的所有動作,其有效用戶組都是該目錄的用戶組;再次,如果用戶對該目錄有w權限,那麽用戶創建的所有新文件的用戶組都和這個目錄的用戶組相同。

  ● SBIT

  SBIT權限只對目錄有效,設置了SBIT的目錄的效果是:前提條件還是一樣的,用戶需要對目錄有w和x權限,也就是說用戶有在這個目錄下新建和刪除文件的權限,然後特別的地方在於,用戶在這個目錄下只能刪除自己創建的文件和目錄,對於別人創建的是不能刪除的。SBIT權限體現在10位權限符的第11位上是t。。比如這樣的就是有SBIT權限的目錄:drwxrwxrwxt。

  以上三種特殊權限也有特別的編碼方式,SUID是4,SGID是2,SBIT是1。把特殊權限放在權限符的第一位,就可以得到完整的權限符了比如chmod 4711就會把權限改成-rws--x--x。

■  更精細的權限規劃

  以上的所有權限管理都還是基於用戶和用戶組的,而文件只能隨之而動,不能做到不同文件間的權限的精細化。比如大多文件都適應group1中的user1,user2,user3的三個用戶的權限,但是現有一個新文件要求即使在group1中也要細分,讓user1,user2可讀,user3不可讀,這時就需要更加精細的權限管理工具了。這個工具就是ACL。

  首先需要指出的是,ACL需要在掛載文件系統時指出該文件系統應該加入ACL支持。

  和chattr,lsattr類似的,ACL有getfacl和setfacl來進行ACL權限的獲取和設置。下面來詳細看下兩個命令的用法:

#setfacl [-bkRd] [{-m|-x} acl 參數]  <文件名>
-m    賦予文件相關的acl參數,不能與-x同時設置
-x    刪除文件相關的acl參數,不能與-m同用
-b    刪除所有acl參數
-k    刪除默認的acl參數
-R    遞歸設置ACL參數
-d    為一個目錄設置默認的ACL參數,之後目錄下新建的所有子目錄(不包括文件)都會適用這個參數

  上面也說過了,ACL是針對一個個用戶精細設置權限的,所以也需要在使用命令時指出針對的用戶或者用戶組。一般而言,這個命令可以有以下幾種比較常見的使用方法:

  setfacl -m u:user1:rx file  這個命令意義就是設置文件file針對用戶user1的權限是r-x。設置成功之後,在ll文件的時候給出的權限界面在權限符的最後一位多出一個“+”,比如-rwxr-xr-x+。如果在ACL參數中以u開頭( 表示針對單個用戶)而後面又沒有寫用戶名的話比如u::rwx,那就是默認針對文件所有者設置。當然,如果是針對文件所有者,通過ACL設置了權限的話,文件最終可能也不會展現那個+號,因為文件所有者的權限信息和管理通過傳統的9格權限符已經可以得到展現,改變那部分就可以了。另外除了針對單個用戶,還可以針對某個用戶組來設置ACL權限。用法只不過是把ACL權限中的u:xx:xx改成g:xx:xx這樣子。 再另外,除了u和g這兩個ACL參數的開頭之外,還有一種m開頭的ACL參數。m是mask的意思,且用法是類似於m:rwx,中間不用接任何具體的用戶或用戶組,它的意思是為某個文件的ACL權限設置一個天花板,超出這個天花板的部分的權限將不被承認。比如某個文件被m:r 設置過了之後,後續再設置u:user:rwx,雖然可以設置成功,但是用戶仍然對這個文件只有讀權限(當然如果你是root用戶,可以強制寫就另當別論了)

  對於權限信息中有+號的這些文件,我們可以用getfacl <filename>來獲取它的ACL詳細權限。對於設置的權限和mask沖突的,系統還會給出沖突的提示,告訴你實際上有效的權限是什麽。

【Linux】 Linux權限管理與特殊權限