用戶身份與文件許可權 用戶身份與能力 Linux系統的管理員之所以是root,並不是因為它的名字叫root,而是因為該用戶的身份號碼即UID(User IDentification)的數值為0。 在Linux系統中,UID就相當於我們的身份證號碼一樣具有唯一性,因此可通過用戶的UID值來判斷用戶身份。 ...
用戶身份與文件許可權
用戶身份與能力
Linux系統的管理員之所以是root,並不是因為它的名字叫root,而是因為該用戶的身份號碼即UID(User IDentification)的數值為0。
在Linux系統中,UID就相當於我們的身份證號碼一樣具有唯一性,因此可通過用戶的UID值來判斷用戶身份。在RHEL 7系統中,用戶身份有下麵這些:
管理員UID為0:系統的管理員用戶。
系統用戶UID為1~999: Linux系統為了避免因某個服務程式出現漏洞而被黑客提權至整台伺服器,預設服務程式會有獨立的系統用戶負責運行,進而有效控制被破壞範圍。(RHEL5/6 UID:1-499)
普通用戶UID從1000開始:是由管理員創建的用於日常工作的用戶。(RHEL5/6 UID:500-65535)
需要註意的是,UID是不能衝突的,而且管理員創建的普通用戶的UID預設是從1000開始的(即使前面有閑置的號碼)。
在Linux系統中創建每個用戶時,將自動創建一個與其同名的基本用戶組,而且這個基本用戶組只有該用戶一個人。如果該用戶以後被歸納入其他用戶組,則這個其他用戶組稱之為擴展用戶組。一個用戶只有一個基本用戶組,但是可以有多個擴展用戶組。
1. useradd命令
useradd命令用於創建新的用戶,格式為“useradd [選項] 用戶名”。
使用該命令創建用戶賬戶時,預設的用戶家目錄會被存放在/home目錄中,預設的Shell解釋器為/bin/bash,而且預設會創建一個與該用戶同名的基本用戶組。
shell解釋器(/bin/bash和/sbin/nologin)創建一個普通用戶並指定家目錄的路徑、用戶的UID以及Shell解釋器。一旦用戶的解釋器被設置為nologin,則代表該用戶不能登錄到系統中(-d:指定用戶的家目錄(預設為/home/username);-u:指定該用戶的預設UID;-s:指定該用戶的預設Shell解釋器):
[root@linuxprobe ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin linuxprobe [root@linuxprobe ~]# id linuxprobe uid=8888(linuxprobe) gid=8888(linuxprobe) groups=8888(linuxprobe)
2. groupadd命令
groupadd命令用於創建用戶組,格式為“groupadd [選項] 群組名”。
為了能夠更加高效地指派系統中各個用戶的許可權,在工作中常常會把幾個用戶加入到同一個組裡面,這樣便可以針對一類用戶統一安排許可權。
[root@linuxprobe ~]# groupadd ronny
3. usermod命令
usermod命令用於修改用戶的屬性,格式為“usermod [選項] 用戶名”。
用戶的信息保存在/etc/passwd文件中,可以直接用文本編輯器來修改其中的用戶參數項目,也可以用usermod命令修改已經創建的用戶信息,諸如用戶的UID、基本/擴展用戶組、預設終端等。
將用戶linuxprobe加入到root用戶組中:
[root@linuxprobe ~]# usermod -G root linuxprobe [root@linuxprobe ~]# id linuxprobe uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)
用-u參數修改linuxprobe用戶的UID號碼值
[root@linuxprobe ~]# usermod -u 8888 linuxprobe [root@linuxprobe ~]# id linuxprobe uid=8888(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)
4. passwd命令
passwd命令用於修改用戶密碼、過期時間、認證信息等,格式為“passwd [選項] [用戶名]”。
普通用戶只能使用passwd命令修改自身的系統密碼,而root管理員則有許可權修改其他所有人的密碼。
5. userdel命令
userdel命令用於刪除用戶,格式為“userdel [選項] 用戶名”。
如果我們確認某位用戶後續不再會登錄到系統中,則可以通過userdel命令刪除該用戶的所有信息。在執行刪除操作時,該用戶的家目錄預設會保留下來,此時可以使用-r參數將其刪除。
userdel命令的參數以及作用
參數 | 作用 |
-f | 強制刪除用戶 |
-r | 同時刪除用戶及用戶家目錄 |
使用userdel命令將linuxprobe用戶刪除,其操作如下:
[root@linuxprobe ~]# id linuxprobe uid=8888(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root) [root@linuxprobe ~]# userdel -r linuxprobe [root@linuxprobe ~]# id linuxprobe id: linuxprobe: no such user
文件許可權與歸屬
儘管在Linux系統中一切都是文件,但是每個文件的類型不盡相同,因此Linux系統使用了不同的字元來加以區分,常見的字元如下所示:
-:普通文件。
d:目錄文件。
l:鏈接文件。
b:塊設備文件。
c:字元設備文件。
p:管道文件。
在Linux系統中,每個文件都有所屬的所有者和所有組,並且規定了文件的所有者、所有組以及其他人對文件所擁有的read可讀(r)、write可寫(w)、execute可執行(x)等許可權。
對於一般文件來說:
“可讀”表示能夠讀取文件的實際內容;
“可寫”表示能夠編輯、新增、修改、刪除文件的實際內容;
“可執行”則表示能夠運行一個腳本程式。
對於目錄文件來說:
“可讀”表示能夠讀取目錄內的文件列表;
“可寫”表示能夠在目錄內新增、刪除、重命名文件;
而“可執行”則表示能夠進入該目錄。
文件的讀、寫、執行許可權可以簡寫為rwx,亦可分別用數字4、2、1來表示,文件所有者,所屬組及其他用戶許可權之間無關聯。
文件的特殊許可權
在複雜多變的生產環境中,單純設置文件的rwx許可權無法滿足我們對安全和靈活性的需求,因此便有了SUID、SGID與SBIT的特殊許可權位。這是一種對文件許可權進行設置的特殊功能,可以與一般許可權同時使用,以彌補一般許可權不能實現的功能。
1. SUID
SUID是一種對二進位程式進行設置的特殊許可權,可以讓二進位程式的執行者臨時擁有屬主的許可權(僅對擁有執行許可權的二進位程式有效)。
如果原先許可權位上沒有x執行許可權,那麼被賦予特殊許可權後將變成大寫的S,否則為小寫s。
[root@linuxprobe ~]# ls -l /etc/shadow ----------. 1 root root 1004 Jan 3 06:23 /etc/shadow [root@linuxprobe ~]# ls -l /bin/passwd -rwsr-xr-x. 1 root root 27832 Jan 29 2017 /bin/passwd
2. SGID
SGID主要實現如下兩種功能:
讓執行者臨時擁有屬組的許可權(對擁有執行許可權的二進位程式進行設置);
在某個目錄中創建的文件自動繼承該目錄的用戶組(只可以對目錄進行設置)。
SGID與SUID不同點在於執行程式的用戶獲取的不再是文件所有者的臨時許可權,而是獲取到文件所屬組的許可權。
chmod和chown(chmod許可權 chown屬性)
chmod命令能夠用來設置文件或目錄的許可權,格式為“chmod [參數] 許可權 文件或目錄名稱”。
chown命令可以設置文件或目錄的所有者和所屬組,其格式為“chown [參數] 所有者:所屬組 文件或目錄名稱”。
chmod和chown命令是用於修改文件屬性和許可權的最常用命令,它們還有一個特別的共性,就是針對目錄進行操作時需要加上大寫參數-R來表示遞歸操作,即對目錄內所有的文件進行整體操作。
3. SBIT
SBIT特殊許可權位可確保用戶只能刪除自己的文件,而不能刪除其他用戶的文件。換句話說,當對某個目錄設置了SBIT粘滯位許可權後,那麼該目錄中的文件就只能被其所有者執行刪除操作了。
當目錄被設置SBIT特殊許可權位後,文件的其他人許可權部分的x執行許可權就會被替換成t或者T,原本有x執行許可權則會寫成t,原本沒有x執行許可權則會被寫成T。
文件的隱藏屬性
Linux系統中的文件除了具備一般許可權和特殊許可權之外,還有一種隱藏許可權,即被隱藏起來的許可權,預設情況下不能直接被用戶發覺。
1. chattr命令
chattr命令用於設置文件的隱藏許可權,格式為“chattr [參數] 文件”。
如果想要把某個隱藏功能添加到文件上,則需要在命令後面追加“+參數”,如果想要把某個隱藏功能移出文件,則需要追加“-參數”。
chattr命令中用於隱藏許可權的參數及其作用
參數 | 作用 |
i | 無法對文件進行修改;若對目錄設置了該參數,則僅能修改其中的子文件內容而不能新建或刪除文件 |
a | 僅允許補充(追加)內容,無法覆蓋/刪除內容(Append Only) |
S | 文件內容在變更後立即同步到硬碟(sync) |
s | 徹底從硬碟中刪除,不可恢復(用0填充原文件所在硬碟區域) |
A | 不再修改這個文件或目錄的最後訪問時間(atime) |
b | 不再修改文件或目錄的存取時間 |
D | 檢查壓縮文件中的錯誤 |
d | 使用dump命令備份時忽略本文件/目錄 |
c | 預設將文件或目錄進行壓縮 |
u | 當刪除該文件後依然保留其在硬碟中的數據,方便日後恢復 |
t | 讓文件系統支持尾部合併(tail-merging) |
x | 可以直接訪問壓縮文件中的內容 |
2. lsattr命令
lsattr命令用於顯示文件的隱藏許可權,格式為“lsattr [參數] 文件”。
[root@linuxprobe ~]# lsattr linuxprobe -----a---------- linuxprobe [root@linuxprobe ~]# chattr -a linuxprobe [root@linuxprobe ~]# lsattr linuxprobe ---------------- linuxprobe [root@linuxprobe ~]# rm linuxprobe rm: remove regular file ‘linuxprobe’? y
文件訪問控制列表
如果希望對某個指定的用戶進行單獨的許可權控制,就需要用到文件的訪問控制列表(ACL)了。
通俗來講,基於普通文件或目錄設置ACL其實就是針對指定的用戶或用戶組設置文件或目錄的操作許可權。
另外,如果針對某個目錄設置了ACL,則目錄中的文件會繼承其ACL;若針對文件設置了ACL,則文件不再繼承其所在目錄的ACL。
1. setfacl命令
setfacl命令用於管理文件的ACL規則,格式為“setfacl [參數] 文件名稱”。
文件的ACL提供的是在所有者、所屬組、其他人的讀/寫/執行許可權之外的特殊許可權控制,使用setfacl命令可以針對單一用戶或用戶組、單一文件或目錄來進行讀/寫/執行許可權的控制。
其中,針對目錄文件需要使用-R遞歸參數;針對普通文件則使用-m參數;如果想要刪除某個文件的ACL,則可以使用-b參數。
[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root [root@linuxprobe ~]# su - linuxprobe Last login: Sat Mar 21 15:45:03 CST 2017 on pts/1 [linuxprobe@linuxprobe ~]$ cd /root [linuxprobe@linuxprobe root]$ ls anaconda-ks.cfg Downloads Pictures Public [linuxprobe@linuxprobe root]$ cat anaconda-ks.cfg [linuxprobe@linuxprobe root]$ exit
怎麼查看文件上有哪些ACL呢?常用的ls命令是看不到ACL表信息的,但是卻可以看到文件的許可權最後一個點(.)變成了加號(+),這就意味著該文件已經設置了ACL了。
[root@linuxprobe ~]# ls -ld /root dr-xrwx---+ 14 root root 4096 May 4 2017 /root
2. getfacl命令
getfacl命令用於顯示文件上設置的ACL信息,格式為“getfacl 文件名稱”。
想要設置ACL,用的是setfacl命令;要想查看ACL,則用的是getfacl命令。
[root@linuxprobe ~]# getfacl /root getfacl: Removing leading '/' from absolute path names # file: root # owner: root # group: root user::r-x user:linuxprobe:rwx group::r-x mask::rwx other::---
su命令與sudo服務
su命令可以解決切換用戶身份的需求,使得當前用戶在不退出登錄的情況下,順暢地切換到其他用戶,比如從root管理員切換至普通用戶:
[root@linuxprobe ~]# id uid=0(root) gid=0(root) groups=0(root) [root@linuxprobe ~]# su - linuxprobe Last login: Wed Jan 4 01:17:25 EST 2017 on pts/0 [linuxprobe@linuxprobe ~]$ id uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
上面的su命令與用戶名之間有一個減號(-),這意味著完全切換到新的用戶,即把環境變數信息也變更為新用戶的相應信息,而不是保留原始的信息。強烈建議在切換用戶身份時添加這個減號(-)。
sudo服務中的可用參數以及作用
參數 | 作用 |
-h | 列出幫助信息 |
-l | 列出當前用戶可執行的命令 |
-u 用戶名或UID值 | 以指定的用戶身份執行命令 |
-k | 清空密碼的有效時間,下次執行sudo時需要再次進行密碼驗證 |
-b | 在後臺執行指定的命令 |
-p | 更改詢問密碼的提示語 |
總結來說,sudo命令具有如下功能:
限制用戶執行指定的命令:
記錄用戶執行的每一條命令;
配置文件(/etc/sudoers)提供集中的用戶管理、許可權與主機等參數;
驗證密碼的後5分鐘內(預設值)無須再讓用戶再次驗證密碼。
可以使用sudo命令提供的visudo命令來配置用戶許可權。這條命令在配置用戶許可權時將禁止多個用戶同時修改sudoers配置文件,還可以對配置文件內的參數進行語法檢查,併在發現參數錯誤時進行報錯。
只有root管理員才可以使用visudo命令編輯sudo服務的配置文件。
visudo: >>> /etc/sudoers: syntax error near line 111 <<< What now? Options are: (e)dit sudoers file again (x)it without saving changes to sudoers file (Q)uit and save changes to sudoers file (DANGER!)
在sudo命令的配置文件中,按照下麵的格式將第99行(大約)填寫上指定的信息:
誰可以使用 允許使用的主機=(以誰的身份) 可執行命令的列表
[root@linuxprobe ~]# visudo 96 ## 97 ## Allow root to run any commands anywhere 98 root ALL=(ALL) ALL 99 linuxprobe ALL=(ALL) ALL
在填寫完畢後記得要先保存再退出,然後切換至指定的普通用戶身份,此時就可以用sudo -l命令查看到所有可執行的命令了。