Linux的文件權限表示其實仍是比較簡單的。 對於任意一個文件,均可以經過ls -l filename
來查看ta的權限序列。 例如:shell
-rwxr-xr-x 1 wgjak47 wgjak47 221287 11月 16 2010 aliedit.sh安全
權限序列的第一位是文件類型:工具
上例中的文件爲-,表示普通文件。ui
是而後三組rwx,r表示可讀,w可寫,x可執行,-表示沒有權限。code
舉個例子,若是一個文件屬性是754,也就是(rwxr-xr-)。遞歸
可使用chmod改變文件的權限。基本用法以下:接口
<!-- lang: shell --> chmod XXXX filename
其中X是8進制數,第一位通常省略,緣由下面會說,轉化爲2進制就正好對應rwx,例如7(111)表示rwx,而5(101)表示r-x。對於目錄,可使用-R選項遞歸修改其子目錄和子文件的屬性。另外XXXX也可使用操做符+符號來改變格式:three
- 操做符'+'使得用戶選擇的權限被追加到每一個指定文件,(操做給 指定文件添加所選權限)
字符串'rwxXstugo':給用戶選擇新的屬性進程
- (r)讀權限
(w)寫權限crontab
(x)執行權(或對目錄的訪問權)
(X)只有目標文件對某些用戶是可執行的或該目標文件是目錄時才追加x屬性
(s)同時設定用戶或組ID
(t)粘滯位(保存程序的文本到交換設備上)
(u)目標文件屬主
(g)目標文件屬主所在的組
(o)其餘用戶
所以,'chmod g-s file' 撤消sgid位,'chmod ug+s file'同時設置了suid和sgid位,'chmod o+s file' 則沒有進行任何設置
##Linux的特殊權限
從chmod的man Page當中,咱們能夠發現,除了rwx三個基本權限,還有s,t兩個權限。 展開來講是:setuid、setgid、stick bit (粘貼位)
舉個例子:/etc/passwd文件,用於儲存用戶密碼的文件。
-rw-r--r-- 1 root root 2090 12月 23 20:29 /etc/passwd
咱們知道這是儲存用戶密碼的文件,但權限是root才能讀寫,其它用戶只讀。而讀寫這個文件的passwd屬性以下:
-rwsr-xr-x 1 root root 47032 2月 17 2014 /usr/bin/passwd
第三個字母s表示的就是setuid,表示提權執行,也就是普通用戶運行passwd的時候會以root身份去運行passwd: 在tty1以普通用戶啓動passwd,tty2執行ps -aux | grep passwd
將獲得以下結果:
root 20174 0.0 0.0 64680 1584 pts/23 S+ 23:37 0:00 passwd
執行者爲root。 setpid這種權限通常就是爲了應對像密碼修改這種敏感,要求權限高可是許多普通用戶卻須要執行的操做而誕生的。
setgid同理,只不過變成了用戶組。
stick bit(t)屬性暫時只用於目錄,主要是/tmp目錄,tmp屬於root,屬性爲drwxrwxrwt, 可是任何人均可以往裏寫文件。可是每一個用戶對於其餘人的文件沒法刪除(root除外)。 簡單的說就是當用戶在擁有該屬性的目錄下創建文件或目錄時,僅有本身與 root纔有權力刪除。
##setuid與sudo 在Linux中,因爲root用戶的權利過大,常常容易誤操做形成沒法挽回的損失。爲了限制root權限,有人提出讓普通用戶僅在必要的時候獲取root權限執行一些操做,平時以普通用戶權限工做。因而sudo工具誕生。 sudo的簡述:
在sudo於1980年先後被寫出以前,通常用戶管理系統的方式是利用su切換爲超級用戶。可是使用su的缺點之一在於必需要先告知超級用戶的密碼。 sudo使通常用戶不須要知道超級用戶的密碼便可得到權限。首先超級用戶將普通用戶的名字、能夠執行的特定命令、按照哪一種用戶或用戶組的身份執行等信息,登記在特殊的文件中(一般是**/etc/sudoers**),即完成對該用戶的受權(此時該用戶稱爲「sudoer」);在通常用戶須要取得特殊權限時,其可在命令前加上「sudo」,此時sudo將會詢問該用戶本身的密碼(以確認終端機前的是該用戶本人),回答後系統即會將該命令的進程以超級用戶的權限運行。以後的一段時間內(默認爲5分鐘,可在/etc/sudoers自定義),使用sudo不須要再次輸入密碼。 因爲不須要超級用戶的密碼,部分Unix系統甚至利用sudo使通常用戶取代超級用戶做爲管理賬號,例如Ubuntu、Mac OS X等。
sudo的原理就是利用了setuid屬性:
-rwsr-xr-x 1 root root 155008 2月 11 2014 /usr/bin/sudo
sudo的工做流程大體以下:
sudo在執行時,系統會讀取/var/run/sudo/%HOME%/下是否有用戶的時間戳文件,若存在的並文件過時的話,系統則會提示用戶輸入自身的密碼
驗證成功後,系統會繼續查找/etc/sudoers的相關配置,來判斷用戶的sudo具體權限
若權限存在,會自動會由當前用戶切換到其餘或root用戶下,執行權限操做
執行完成後,再返回當前用戶。
##sudo的配置和使用: sudo的配置文件編輯方式有些相似與crontab,sudoers並不能直接編輯,而是經過visudo來編輯的。visudo相似於crontab -e,也是先複製一個副本(/etc/sudoer.tmp),保存副本以後在更新/etc/sudoer。
sudoers的語法:
root ALL=(ALL) ALL
第一項是用戶名,表示哪個用戶可使用sudo。
第二項是登錄者的主機名,表示能夠接受的遠程登錄的主機名。ALL表示root能夠從從任何一臺主機以root身份登錄到本機並使用sudo。
第三項表示能夠經過sudo切換的身份,ALL表示能夠經過sudo切換任何身份執行命令。 第四項表示能夠執行的命令,ALL表示全部命令,若是要特別聲明命令,必須使用絕對路徑,並且還支持參數和通配符。不一樣的命令使用**','**分割。 鳥哥書上的例子:
myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root # ! 表示不能執行(黑名單)
若是要添加一個可使用sudo的用戶,那麼就另起一行,便可。 例如wgjak47 ALL=(ALL) ALL
%sudo ALL=(ALL) ALL
這樣配置的化,只要在sudo用戶組內的用戶均可以使用sudo。
2、免密碼操做 sudo默認是須要密碼的,並且只支持交互式的輸入,固然能夠經過expect或者有名管道模擬這個過程。可是將密碼明文寫在腳本中是很不安全的(索尼就是這麼死的),並且咱們通常只但願對於某些操做免密碼,而不是全部操做。
sudoer支持NOPASSWD關鍵字:例如你但願運行service操做時面密碼,能夠這樣配置:
username ALL=(ALL) NOPASSWD:/sbin/service
這樣你在腳步中以sudo運行service就不須要密碼了。
3、主機,用戶,命令管理(alias) 爲了方便管理,能夠將用戶,主機名,和命令打包成別名,方便管理: 鳥哥的例子改一下
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2 Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root Host_Alias THO = *.threebody.com ADMPW THO=(root) ADMPWCOM
注意Linux是嚴格區分大小寫的,必定要注意開頭的字母大寫。