linux下sudo顯示sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
linux中一些特殊的許可權(setuid/setgid/sticky)
問題描述
今天在測試檔案系統的時候,發現新建立的檔案系統不能使用sudo命令,具體表現如下:
sudo su
sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
- 1
- 2
在網上查了一下都說是要在超級使用者許可權下執行如下兩個命令:
chown root:root /usr/bin/sudo
chmod 4755 /usr/bin/sudo
- 1
- 2
相對應的就是上述兩個錯誤:sudo的使用者屬組要屬於uid 0,即root使用者;同時sudo要設定setuid位。我首先查詢了一下我係統中sudo的資訊:
ls /usr/bin/sudo
-rwxr-xr-x 1 root root 155008 Aug 28 2015 /usr/bin/sudo
- 1
- 2
已經是輸入root使用者組了,所以按照執行sudo時的錯誤提示,應該是要設定setuid位。執行命令chmod 4755 /usr/bin/sudo
或者chmod u+s /usr/bin/sudo
,再檢視一下sudo的資訊:
ls /usr/bin/sudo
-rwsr-xr-x 1 root root 155008 Aug 28 2015 /usr/bin/sudo
- 1
- 2
發現有一位”x”已經變成了”s”。這時我想起了在學習The Linux Command Line
特殊許可權
雖然常見的八進位制許可權掩碼都是用三位數表示的,但確切地說,它是用四位數表示的,因為除了讀、寫和執行許可權以外,還有一些其他較少用到的許可權設定,其中就涉及到上面的setgid設定。
setuid
其中之一就是setuid位,八進位制表示為4000,當把它應用到一個可執行檔案時,有效使用者ID將從實際使用者ID(實際執行該程式的使用者)設定成該程式所有者的ID,大多數情況下,該許可權設定通常應用於一些由超級使用者所擁有的程式,例如本問題中的sudo。當普通使用者執行一個具有“setuid root”(已設定setuid位,由root使用者所有)屬性的程式時,該程式將以超級使用者的許可權執行。
setgid
第二個是setgid位,八進位制表示為2000,類似於setuid,它會把有效使用者組ID從該使用者的實際組ID更改為該檔案所有者的組ID。如果對一個目錄設定setgid位,那麼在該目錄下建立的檔案將由該目錄所在組所有,而不屬於檔案建立者所在組。當一個公共組下的成員需要訪問共享目錄下的所有檔案時,設定setgid位將會很有用,並不需要關注檔案所有者所在的使用者組。
sticky
第三個是sticky位,八進位制表示位1000,它是從UNIX中繼承下來的,在LINUX中將會忽略檔案的sticky位。但是對一個目錄設定sticky位,那麼將能阻止使用者刪除或者重新命名檔案,除非使用者是這個目錄的所有者、檔案所有者或者超級使用者。它通常用來控制對共享目錄(例如/tmp)的訪問。
設定方法
授予setuid許可權
chmod u+s prog1
or
chmod 4xxx prog1
- 1
- 2
- 3
具有setuid屬性的程式為-rwsr-xr-x
。
授予setgid許可權
chmod g+s dir1
or
chmod 2xxx dir1
- 1
- 2
- 3
具有setgid屬性的目錄為drwxrwsr-x
。
授予sticky許可權
chmod t dir1
or
chmod 1xxx dir1
- 1
- 2
- 3
具有sticky屬性的目錄為drwxrwxrwt
。