Linux權限與sudo

Linux的rwx權限

Linux的文件權限表示其實仍是比較簡單的。 對於任意一個文件,均可以經過ls -l filename來查看ta的權限序列。 例如:shell

-rwxr-xr-x 1 wgjak47 wgjak47 221287 11月 16 2010 aliedit.sh安全

權限序列的第一位是文件類型:工具

  • 當爲[ d ]則是目錄
  • 當爲[ - ]則是文件
  • 如果[ l ]則表示爲連結檔(link file);
  • 如果[ b ]則表示爲裝置文件裏面的可供儲存的接口設備(可隨機存取裝置);(例如/dev/sda)
  • 如果[ c ]則表示爲裝置文件裏面的串行端口設備,例如鍵盤、鼠標(一次性讀取裝置)。常見於/dev

上例中的文件爲-,表示普通文件。ui

是而後三組rwx,r表示可讀,w可寫,x可執行,-表示沒有權限。code

  • 第一組rwx表示文件擁有者的權限
  • 第二組rwx表示文件擁有者所在組中其餘人的權限
  • 第三組rwx表示其餘人的權限。

舉個例子,若是一個文件屬性是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 (粘貼位)

  1. setuid、setgid 簡單的說就是如其名字同樣,set uid,set gid。當普通用戶使用這重屬性的文件時會以root/root組的權限執行。

舉個例子:/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同理,只不過變成了用戶組。

  1. stick bit 在Linux中,文件夾的權限做用以下:
  • r(read):能夠讀取文件夾內容列表,但若是沒有x權限,就只能看到文件名而沒法查看其餘內容(大小、權限等)
  • w(write):因爲文件夾記錄的是其中內容的列表,所以具備w權限便可修改這個列表,前提是擁有x權限能夠進入這個目錄內。w具體擁有如下幾項權限: 創建新的文件或文件夾、 刪除已存在的文件或文件夾(無視該文件或文件夾的權限)、 對已存在的文件或文件夾更名、 更改目錄內文件或文件夾的位置
  • x(execute):能夠進入該文件夾,沒有x權限便沒法執行該目錄下的任何命令

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的工做流程大體以下:

  1. sudo在執行時,系統會讀取/var/run/sudo/%HOME%/下是否有用戶的時間戳文件,若存在的並文件過時的話,系統則會提示用戶輸入自身的密碼

  2. 驗證成功後,系統會繼續查找/etc/sudoers的相關配置,來判斷用戶的sudo具體權限

  3. 若權限存在,會自動會由當前用戶切換到其餘或root用戶下,執行權限操做

  4. 執行完成後,再返回當前用戶。


##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

  • 高級配置 1、羣組功能,爲了方便管理,sudo支持根據用戶羣組受權。 例如:

%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是嚴格區分大小寫的,必定要注意開頭的字母大寫。

相關文章
相關標籤/搜索