1. 程式人生 > >linux下sudo顯示sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set

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

的時候,提到了一些特殊的使用者許可權,其中就包括設定setuid位。翻出來看看,學而時習之嘛~

特殊許可權

雖然常見的八進位制許可權掩碼都是用三位數表示的,但確切地說,它是用四位數表示的,因為除了讀、寫和執行許可權以外,還有一些其他較少用到的許可權設定,其中就涉及到上面的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