1. 程式人生 > >Linux系統檔案許可權管理(6)

Linux系統檔案許可權管理(6)

Linux作業系統是多工(Multi-tasks)多使用者(Multi-users)分時作業系統,linux作業系統的使用者就是讓我們登入到linux的許可權,每當我們使用使用者名稱登入作業系統時,linux都會對該使用者進行認證、授權審計等操作,本章主要內容就是圍繞著許可權來講解的,我會講解Linux系統中的所有常用許可權包括,普通許可權/隱藏許可權/特殊許可權/ACL/SUDO/SELinux,等的設定與使用技巧.



Linux 檔案普通許可權

說到許可權,首先我們先來了解一下Linux系統的基礎許可權吧,這裡的內容幾乎在使用Linux系統是經常用得到,所以請好好把握.首先,我們要來談一談,這個檔案的許可權要如何針對這些所謂的『使用者』與『群組』來設定呢,這個部分是相當重要的,因為檔案的許可權與屬性是學習Linux的一個相當重要的關卡,如果沒有這部份的概念,那麼你將老是聽不懂別人在講什麼,尤其是當你在你的螢幕前面出現了『Permission deny』的時候,不要擔心,『肯定是許可權設定錯誤』啦,好了,閒話不多聊,趕快來瞧一瞧先.

我們使用ls -l命令查詢出了一下內容,下面我們就分別介紹一下下面內容的含義吧.

[[email protected] ~]# ls -lh

d   rwxr-xr-x.  2   root   root       6   Nov 17 05:22   lyshark_dir
-   rw-r--r--.  1   root   root       0   Nov 17 05:22   lyshark_file
l   rwxrwxrwx.  1   root   root      12   Nov 17 05:22   lyshark_link -> lyshark_file
b   rw-rw----.  1   root   disk       8   Nov 17 05:21   /dev/sda
c   rw-rw-rw-.  1   root   root       1   Nov 17 05:21   /dev/zero
↑   ↑           ↑     ↑     ↑         ↑         ↑            ↑
①   ②           ③     ④     ⑤         ⑥         ⑦            ⑧

第一項:代表這個檔案的型別與許可權(permission):

當為[ d ]則是目錄,例如上為『lyshark_dir』的那一行
當為[ - ]則是檔案,例如上表名為『lyshark_file』那一行
若是[ l ]則是連結,例如上為『lyshark_link』的那一行
若是[ b ]則是裝置,表示可供儲存的介面裝置(可隨機存取裝置)
若是[ c ]則表串列埠,的串列埠裝置,例如鍵盤、滑鼠,顯示器

第二項:以三個為一組,且均為『rwx』的三個引數的組合,r=讀取,w=寫入,x=執行:

當為[ r ]則是讀取許可權,此許可權還可以用數字4代表.
當為[ w ]則是寫入許可權,此許可權還可以用數字2代表.
若是[ x ]則是執行許可權,此許可權還可以用數字1代表.

第三項:代表檔案的連結數,引用計數(檔案:硬連結數 目錄:目錄下的子目錄個數).
第四項:代表檔案的檔案的所有者(屬主)
第五項:代表檔案的檔案的所屬組(屬組)
第六項:代表檔案大小(預設單位位元組byte)
第七項:代表檔案最後一次修改時間
第八項:代表檔案的檔名

◆chmod 更改目錄許可權◆

chmod命令用來變更檔案或目錄的許可權,在UNIX系統家族裡,檔案或目錄許可權的控制分別以讀取、寫入、執行3種一般許可權來區分,另有3種特殊許可權可供運用,使用者可以使用chmod指令去變更檔案與目錄的許可權,設定方式採用文字或數字代號皆可,符號連線的許可權無法變更,如果使用者對符號連線修改許可權,其改變會作用在被連線的原始檔案.

下面,來看一下這個命令的引數.

[[email protected] ~]# chmod --help

命令語法:[ chmod [選項] [ugo][+-][rwx] 檔案或目錄 ]

        U               #屬主,可用4代表
        G               #屬組,可用2代表
        O               #其他人,可用1代表

        -c              #顯示許可權修改過程,但僅顯示改變的
        -v              #顯示許可權修改過程,顯示所有過程
        -f              #不顯示錯誤資訊
        -R              #遞迴設定許可權

例項1:使用chmod -Rv給指定目錄設定一個777的許可權.

[[email protected] ~]# ls -lh lyshark_dir
total 0
drwxr-xr-x. 2 root root  6 Nov 17 05:22 lyshark_dir

[[email protected] ~]# chmod -Rv 777 lyshark_dir/
mode of ‘lyshark_dir/’ changed from 0755 (rwxr-xr-x) to 0777 (rwxrwxrwx)

[[email protected] ~]# ls -lh lyshark_dir
total 0
drwxrwxrwx. 2 root root  6 Nov 17 05:22 lyshark_dir

例項2:使用chmod -R給指定檔案的其他人設定rwx許可權.

[[email protected] ~]# ls -lh lyshark_file
-rw-r--r--. 1 root root 0 Nov 17 05:22 lyshark_file

[[email protected] ~]# chmod o+rwx lyshark_file

[[email protected] ~]# ls -lh lyshark_file
-rw-r--rwx. 1 root root 0 Nov 17 05:22 lyshark_file

◆chown 更改屬主屬組◆

chown命令改變某個檔案或目錄的所有者和所屬的組,該命令可以向某個使用者授權,使該使用者變成指定檔案的所有者或者改變檔案所屬的組,使用者可以是使用者或者是使用者ID,使用者組可以是組名或組ID,檔名可以使由空格分開的檔案列表,在檔名中可以包含萬用字元.

下面,來看一下這個命令的引數.

[[email protected] ~]# chown  --help

命令語法:[ chown [選項] [屬主].[屬組] 檔案或目錄 ]

        -c              #顯示許可權修改過程,但僅顯示改變的
        -v              #顯示許可權修改過程,顯示所有過程
        -f              #不顯示錯誤資訊
        -R              #遞迴設定屬性
        -h              #只對符號連線的檔案作修改

例項1:使用chown -Rv給指定檔案設定lyshark為屬主.

[[email protected] ~]# ls -lh lyshark_file
-rw-r--rwx. 1 root root 0 Nov 17 05:22 lyshark_file

[[email protected] ~]# chown -Rv lyshark lyshark_file
changed ownership of ‘lyshark_file’ from root to lyshark

[[email protected] ~]# ls -lh lyshark_file
-rw-r--rwx. 1 lyshark root 0 Nov 17 05:22 lyshark_file

例項2:使用chown -Rv給指定檔案設定lyshark為屬組.

[[email protected] ~]# ls -lh lyshark_file
-rw-r--rwx. 1 lyshark root 0 Nov 17 05:22 lyshark_file

[[email protected] ~]# chown -Rv .lyshark lyshark_file
changed ownership of ‘lyshark_file’ from lyshark:root to :lyshark

[[email protected] ~]# ls -lh lyshark_file
-rw-r--rwx. 1 lyshark lyshark 0 Nov 17 05:22 lyshark_file

◆umask 設定預設掩碼◆

umask命令用來設定限制新建檔案許可權的掩碼,當新檔案被建立時,其最初的許可權由檔案建立掩碼決定,使用者每次註冊進入系統時,umask命令都被執行,並自動設定掩碼mode來限制新檔案的許可權,使用者可以通過再次執行umask命令來改變預設值,新的許可權將會把舊的覆蓋掉.

下面,來看一下這個命令的引數.

[[email protected] ~]# umask --hlep

命令語法:[ umask [選項] [u=rwx] [g=rwx] [o=rwx] ]

        -p              #輸出的許可權掩碼可直接作為指令來執行
        -S              #以符號方式輸出許可權掩碼

例項1:使用umask設定系統的預設Umask值.

[[email protected] ~]# umask -S
u=rwx,g=rwx,o=rwx

[[email protected] ~]# umask u=rwx,g=rw,o=r

[[email protected] ~]# umask -S
u=rwx,g=rw,o=r


Linux 檔案特殊許可權

Linux的特殊許可權主要有,SUID,SGID,SBIG這三種,其主要作用會在下面加以說明.

◆Set UID 檔案許可權◆

SetUID:當一個具有執行許可權的檔案設定SetUID許可權後,使用者執行這個檔案時,將以檔案所有者的身份執行.

為了更加清楚的瞭解這個特性,我們打個比方,普通使用者根本沒有修改/etc/passwd和/etc/shadow的權利,但是它還是可以通過passwd命令修改自己的密碼,這就與SUID這個許可權有關啦

SetUID 許可權的特點:

1.只有可以執行的二進位制程式才能設定SUID許可權
2.命令執行者要對該程式擁有x(執行)許可權
3.命令執行者在執行該程式時獲得該程式檔案屬主的身份(在執行程式的過程中靈魂附體為檔案的屬主)
4.SetUID許可權只在該程式執行過程中有效,也就是說身份改變只在程式執行過程中有效

那麼如何設定SGID許可權呢? 很簡單,看下面的兩個小例子.

[[email protected] ~]# ls -l
total 16
-rwxr-xr-x 1 root root 8464 Jun 21 18:05 lyshark     #這是一個可執行檔案,SUID只能設定在可執行檔案上,且執行者要對此檔案擁有x許可權
-rw-r--r-- 1 root root   46 Jun 21 18:05 lyshark.c

[[email protected] ~]# chmod u+s ./lyshark              #設定方法也很簡單隻需要u+s即可
[[email protected] ~]# chmod 4755 lyshark               #或者

[[email protected] ~]# ls -l
total 16
-rwsr-xr-x 1 root root 8464 Jun 21 18:05 lyshark    #看吧在許可權上多出一個 s
-rw-r--r-- 1 root root   46 Jun 21 18:05 lyshark.c

◆Set GID 目錄許可權◆

SetGID:如果可執行二進位制檔案需要讀取一個數據檔案,恰巧他們在一個組裡,而二進位制檔案擁有SGID屬性,則他們就可以直接訪問.

為了更加清楚的瞭解這個特性,我們打個比方,普通使用者在具有SGID的目錄裡建立檔案時,檔案的屬組都會變成父目錄的屬組,其作用是方便組內其他成員的操作.

SetGID 針對檔案的作用:

1.只有可執行的二進位制程式才能設定SGID許可權
2.命令執行者要對該程式擁有x(執行)許可權
3.命令執行在執行程式的時候,組身份升級為該程式檔案的屬組
4.SetGID許可權同樣只在該程式執行過程中有效,也就是說組身份改變只在程式執行過程中有效

SetGID 針對目錄的作用:

1.普通使用者必須對此目錄擁有r和x許可權,才能進入此目錄
2.普通使用者在此目錄中的有效組會變成此目錄的屬組
3.普通使用者對此目錄擁有w許可權時,新建的檔案的預設屬組是這個目錄的屬組

那麼如何設定SGID許可權呢? 很簡單,看下面的兩個小例子.

[[email protected] ~]# ls -l
total 4
drwxrwxrwx 2 root root 4096 Jun 21 18:19 lyshark

[[email protected] ~]# chmod g+s lyshark/        #設定SGID屬性
[[email protected] ~]# chmod 2644 lyshark/       #這樣也可以

[[email protected] ~]# ls -l
total 4
drwxrwsrwx 2 root root 4096 Jun 21 18:19 lyshark  #看吧在許可權上多出一個 s

◆Set BIT 黏著許可權◆

SetBID:黏著位只能對目錄有效,在設定了黏著位的目錄下,只能刪除自己建立的檔案,其他人建立的檔案只能瀏覽,root除外.

講白了說,就是除了Root能夠刪除別人建立的檔案,否則其他人只能刪除自己建立的檔案.

SetBID 針對目錄的作用:

1.粘著位目前只對目錄有效
2.普通使用者對該目錄擁有w和x許可權,即普通使用者可以在此目錄擁有寫入許可權
3.賦予了粘著位後除了root可以刪除所有檔案,普通使用者就算擁有w許可權,也只能刪除自己建立的檔案,但是不能刪除其他使用者建立的檔案

那麼如何設定SBIT許可權呢? 很簡單,看下面的兩個小例子.

[[email protected] ~]# ls -l
total 4
drwxr-xr-x 2 root root 4096 Jun 21 18:25 lyshark

[[email protected] ~]# chmod 1644 lyshark/

[[email protected] ~]# ls -l
total 4
drw-r--r-T 2 root root 4096 Jun 21 18:25 lyshark     #看吧在許可權上多出一個 s


Linux 檔案隱藏許可權

檔案的隱藏屬性有,chattr/lsattr,這些隱藏的屬性確實對於系統有很大的幫助的,尤其是在系統安全(Security)上面,不過要先強調的是,chattr命令只能在Ext3/Ext4的檔案系統上面生效,其他的檔案系統可能就無法支援這個命令了,接下來我們就來談一談如何配置與檢查這些隱藏的屬性吧.

◆chattr 設定隱藏屬性◆

chattr命令用來改變檔案屬性,這項指令可改變存放在ext3/ext4檔案系統上的檔案或目錄屬性,下面我們來看一下它的配置引數吧.

[[email protected] ~]# chattr --help

命令語法:[ chattr [+-=] [狀態] [選項] 檔案或目錄 ]

        p              #輸出的許可權掩碼可直接作為指令來執行
        A              #鎖定(atime)訪問時間
        S              #非同步寫入磁碟(sync)
        a              #設定只能新增資料,不能刪除和修改
        c              #自動將此檔案壓縮,需要時自動解壓縮
        d              #在dump備份時,不會備份此檔案
        i              #將檔案設定為只讀
        s              #檔案被刪除將永久移除
        u              #檔案刪除不永久移除

        -R             #遞迴處理,連同子目錄一起生效
        -V             #顯示指令執行過程

例項1:將/lyshark目錄設定為只能增加不能刪除

[[email protected] /]# chattr +a /lyshark/

[[email protected] /]# cd /lyshark/

[[email protected] lyshark]# mkdir hello
[[email protected] lyshark]# rm -fr hello/
rm: cannot remove hello/: Operation not permitted

這個命令是很重要的,尤其是在系統的資料安全上面,由於這些屬性是隱藏的性質,所以需要以 lsattr 才能看到該屬性,其中個人認為最重要的當屬 +i 與 +a 這個屬性了,+i可以讓一個檔案無法被更動,對於需要強烈的系統安全的人來說真是相當的重要,裡頭還有相當多的屬性是需要 root 才能配置的.

◆lsattr 查詢隱藏屬性◆

使用 chattr 配置後可以利用 lsattr 來查閱隱藏的屬性,lsattr經常使用的幾個選項-D,-E,-R這三個選項不可以一起使用,它們是互斥的,經常使用的還有-l,-H,使用lsattr時必須指出具體的裝置名,用-l選項指出要顯示裝置的邏輯名稱,否則要用-c,-s,-t等選項唯一的確定某個已存在的裝置.

[[email protected] ~]# lsattr --help

命令語法:[ lsattr [選項] 檔案或目錄 ]

        -R             #遞迴顯示許可權
        -V             #顯示指令的版本資訊
        -a             #列出目錄中的所有檔案,包括隱藏檔案.

例項1:顯示剛才配置的選項

[[email protected] ~]# lsattr -a /lyshark/
-----a---------- /lyshark/.
---------------- /lyshark/..
---------------- /lyshark/wang
---------------- /lyshark/hello


Linux ACL 許可權控制

ACL 是 Access Control List 的縮寫,主要的目的是在提供傳統的 owner,group,others 的 read,write,execute 許可權之外的細緻許可權配置,ACL 可以針對單一使用者,單一檔案或目錄來進行 r,w,x 的許可權規範,對於需要特殊許可權的使用狀況非常有幫助.

那 ACL 主要可以針對哪些方面來控制權限呢?他主要可以針對幾個專案:

使用屬主 (user):可以針對使用者來配置許可權
使用屬主 (group):針對群組為物件來配置其許可權
預設屬性 (mask):還可以針對在該目錄下在建立新檔案/目錄時,規範新資料的預設許可權

◆acl 許可權檢測與開啟◆

由於 ACL 是傳統的 Unix-like 作業系統許可權的額外支援專案,因此要使用 ACL 必須要有檔案系統的支援才行,目前絕大部分的檔案系統都有支援 ACL 的功能,包括 ReiserFS, EXT2/EXT3, JFS, XFS 等等,在我們的 redhat 7 當中,預設使用 ext4 是啟動 ACL 支援的,至於察看你的檔案系統是否支援 ACL 可以這樣看:

[[email protected] ~]# dumpe2fs -h /dev/vdb
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          /ghost
Filesystem UUID:          7b34e434-7e98-4480-9699-afef29afed2f
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index...
Filesystem flags:         signed_directory_hash 
--------------------------------------------------------------------
Default mount options:    user_xattr acl     #看到這句話說明開啟了
--------------------------------------------------------------------
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              1310720

如果你的系統預設不會幫你加上 acl 的支援呢,那你可以這樣做,來手動開啟ACL:

假定指定分割槽沒有開啟ACL我們可以重新掛載指定分割槽,並新增ACL許可權

[[email protected] ~]# mount -o remove,acl /dev/vdb 

以上方法只是臨時生效,如果想要永久生效則需要寫入 /etc/fstab

a.首先我們找到/dev/vdb的UUID號

[[email protected] ~]# ll /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root  9 Jun 17 15:40 7b34e434-7e98-4480-9699-afef29afed2f -> ../../vdb

b.然後將它寫入/etc/fstab檔案裡,寫入以下虛線內部分

# /etc/fstab
# Created by anaconda on Sun Oct 15 15:19:00 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
--------------------------------------------------------------------
UUID=7b34e434-7e98-4480-9699-afef29afed2f /ghost                  ext4    defaults,acl    1 1
--------------------------------------------------------------------

◆getfacl 檢視ACL許可權◆

getfacl命令主要用來查詢指定目錄的許可權,下面我們來看一下它的引數說明:

[[email protected] ~]# getfacl --help

命令語法:[ getfacl [選項] 檔案或目錄 ]

        -p              #輸出的許可權掩碼可直接作為指令來執行
        -a              #顯示訪問控制列表
        -d              #只顯示預設訪問控制列表
        -c              #忽略標題,只顯示許可權
        -R              #遞迴顯示子目錄
        -t              #以表格形式輸出
        -n              #列印屬主屬組UID/GID

接下來看一個輸出結果,具體解釋一下輸出說明.

[[email protected] /]# getfacl lyshark

# file: lyshark          #說明檔名稱
# owner: root           #說明檔案的所有者
# group: root           #說明檔案的所屬組

user::rw-               #使用者列表是空的,代表所有者的許可權
group::r--              #針對使用者組的許可權設定
other::r--              #針對其他人的許可權設定
mask::r-x               #此檔案預設有效許可權(mask)

上面的資料非常容易查閱吧,顯示的資料前面加上 # 的,代表這個檔案的預設屬性,包括檔名、檔案擁有者與檔案所屬群組,底下出現的 user,group,mask,other 則是屬於不同使用者、群組與有效許可權(mask)的配置值.

◆setfacl 設定ACL許可權◆

setfacl命令是用來在命令列裡設定ACL (訪問控制列表) 在命令列裡,一系列的命令跟隨以一系列的檔名.

setfacl命令主要用來設定指定目錄的許可權,下面我們來看一下它的引數說明:

[[email protected] ~]# setfacl --help

命令語法:[ setfacl [選項][ugo]:[使用者][rwx] 檔案或目錄 ]

        -m              #新增ACL許可權,不可與-x合用
        -x              #刪除某使用者的ACL許可權,不可與-m合用
        -b              #清空所有ACL許可權

        -R              #遞迴配置ACL,實現目錄上ACL許可權的遞迴
        -d              #設定預設ACL許可權(傳承)
        -k              #刪除預設ACL許可權引數

◆acl 許可權配置小例子◆

新增ACL許可權:新增lyshark使用者對root目錄的rwx許可權

[[email protected] ~]# setfacl -m u:lyshark:rwx /root/
[[email protected] ~]# 
[[email protected] ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:lyshark:rwx    #此處可以看到,使用者這裡多出來了lyshark使用者,此時lyshark使用者可以任意操作/root目錄下的檔案
group::r-x
mask::rwx
other::---

刪除ACL許可權:刪除lyshark使用者對root目錄的rwx許可權

[[email protected] ~]# setfacl -x u:lyshark /root/
[[email protected] ~]# 
[[email protected] ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x           #此處可以看到,使用者lyshark的許可權已被撤銷了,此時再次訪問/root目錄會出現許可權拒絕
group::r-x
mask::r-x
other::---

清空所有ACL許可權:清空指定目錄或檔案的所有ACL配置

[[email protected] ~]# setfacl -b /root/
[[email protected] ~]# 
[[email protected] ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
group::r-x
other::---

遞迴設定ACL許可權:實現對目錄上的ACL許可權的遞迴設定(目錄)

[[email protected] ~]# setfacl -R -m u:lyshark:rwx /root/
[[email protected] ~]# 
[[email protected] ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:lyshark:rwx
group::r-x
mask::rwx
other::---

#註釋:如果不遞迴設定,那麼普通使用者無法在子目錄下進行讀寫執行

對空目錄設定預設ACL:新增lyshark使用者對/root目錄的rwx許可權,並且在/root目錄下新建的檔案lyshark使用者都有rwx許可權

[[email protected] ~]# setfacl -d -m u:lyshark:rwx /root/
[[email protected] ~]# setfacl -m d:u:lyshark:rwx /root/
[[email protected] ~]# 
[[email protected] ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
group::r-x
mask::r-x
other::---
default:user::r-x
default:user:lyshark:rwx   #這邊可以看到lyshark的預設許可權是rwx,root使用者不管建立什麼檔案都有許可權
default:group::r-x
default:mask::rwx
default:other::---

對非空目錄設定預設ACL:新增lyshark使用者對/root目錄的rwx許可權,並且在/root目錄下新建的檔案lyshark使用者都有rwx許可權

[[email protected] ~]# setfacl -R -m u:lyshark:rwx /root/   #遞迴設定ACL許可權
[[email protected] ~]# setfacl -d -m u:lyshark:rwx /root/   #設定預設ACL許可權
[[email protected] ~]# 
[[email protected] ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:lyshark:rwx
group::r-x
mask::rwx
other::---
default:user::r-x
default:user:lyshark:rwx
default:group::r-x
default:mask::rwx
default:other::---

設定最大有效許可權mask(目錄):為/root目錄設定新增最大預設許可權為rx,其他ACL許可權不得超出此許可權

[[email protected] ~]# setfacl -m m:rx /root/
[[email protected] ~]# 
[[email protected] ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:lyshark:rwx        #effective:r-x    #雖然lyshark對root目錄有rwx許可權,但是我們設定了最大有效許可權,所以lyshark使用者只能讀和執行
group::r-x
mask::r-x                                 #最大有效許可權r-x
other::---
default:user::r-x
default:user:lyshark:rwx
default:group::r-x
default:mask::rwx
default:other::---


Linux Sudo 使用者授權

sudo是linux系統管理指令,是允許系統管理員讓普通使用者執行一些或者全部的root命令的一個工具,如halt,reboot,su等,這樣不僅減少了root使用者的登入,和管理時間,同樣也提高了安全性,sudo不是對shell的一個代替,它是面向每個命令的.

sudo命令用來以其他身份來執行命令,預設的身份為root,在/etc/sudoers中設定了可執行sudo指令的使用者,若其未經授權的使用者企圖使用sudo,則會發出警告的郵件給管理員,使用者使用sudo時,必須先輸入密碼,之後有5分鐘的有效期限,超過期限則必須重新輸入密碼.

為什麼會出現sudo授權?

首先在Linux的管理中,不是每一個系統管理員都能用root來管理伺服器

Sudo的優缺點是什麼?

平時使用普通使用者管理作業系統,降低誤操作機率,需要時su切換到root.
su使用者身份的切換,普通管理員要使用root的許可權必須知道root的密碼,這樣會造成很多普通使用者需要知道root的密碼,導致系統的安全性降低.
sudo可以為普通使用者賦予一定許可權,使普通使用者能使用一些root才能執行的命令和操作,來完成正常的伺服器管理工作,這種按需分配許可權的方式可以讓我們工作在一個相對安全的環境下,並且普通使用者不需要知道root的密碼.

Sudo工作步驟,或者說執行流程?

a.通過visudo命令或者vim /etc/sudoers 來對某使用者授權
b.當普通使用者執行/sbin或/usr/sbin下的命令時,系統會查詢/etc/sudoers檔案中是否有root對其的授權
c.當查詢普通使用者已擁有授權後,需要輸入普通使用者的密碼來確認使用者身份
d.若密碼輸入成功後,則執行對應已經授權的命令

下面來看一下sudo命令的常用引數吧:

[[email protected] ~]# sudo --help

命令語法:[ sudo [選項] 授權使用者 ]

        -b              #在後臺執行指令
        -H              #將HOME環境變數設為新身份的HOME環境變數
        -k              #結束密碼的有效期限,也就是下次再執行sudo時便需要輸入密碼
        -l              #列出目前使用者可執行與無法執行的指令
        -p              #改變詢問密碼的提示符號
        -s shell        #執行指定的shell
        -u 使用者         #以指定的使用者作為新的身份,若不加上此引數,則預設以root作為新的身份
        -v              #延長密碼有效期限5分鐘

例項1:給lyshark使用者授予root的所有命令

vim /etc/sudoers

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere 
root    ALL=(ALL)       ALL     
lyshark ALL=(ALL)       ALL   #寫入以下引數

## Allows members of the 'sys' group to run networking, software,

例項2:授權lyshark使用者只可以重啟伺服器

vim /etc/sudoers

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
lyshark ALL=(ALL)       /sbin/shutdown -r now   #寫入以下引數

## Allows members of the 'sys' group to run networking, software,

例項3:授權lyshark使用者僅可以管理192.168.1.10的伺服器:可以使用Apache管理指令碼

vim /etc/sudoers

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
lyshark 192.168.1.10=(ALL)  /etc/rc.d/init.d/httpd reload,/etc/rc.d/init.d/httpd configtest   #寫入以下引數

## Allows members of the 'sys' group to run networking, software,

例項4:授權lyshark使用者,可以修改Apache配置檔案

vim /etc/sudoers

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
lyshark ALL=(ALL)       /bin/vim,/etc/httpd/conf/httpd.conf   #寫入以下引數

## Allows members of the 'sys' group to run networking, software,

例項5:授權lyshark使用者可以新增普通使用者並能修改密碼

vim /etc/sudoers

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
lyshark ALL=(ALL)       /usr/sbin/useradd                                              #讓lyshark使用者可以建立普通使用者
lyshark ALL=(ALL)       /usr/bin/passwd,!/usr/bin/passwd root,!/usr/bin/passwd ""      #讓lyshark使用者可以給新使用者改密碼,但不允許修改root使用者的密碼

## Allows members of the 'sys' group to run networking, software,


Linux PAM 模組簡介

PAM 可以說是一套應用程式程式設計介面(Application Programming Interface,API)他提供了一連串的驗證機制,只要使用者將驗證階段的需求告知 PAM 後,PAM 就能夠回報使用者驗證的結果(成功或失敗),由於 PAM 僅是一套驗證的機制,又可以提供給其他程式所呼叫引用,因此不論你使用什麼程式,都可以使用 PAM 來進行驗證,如此一來,就能夠讓賬號口令或者是其他方式的驗證具有一致的結果,也讓程式設計師方便處理驗證的問題.

PAM 是一個獨立的 API 存在,只要任何程式有需求時,可以向 PAM 發出驗證要求的通知, PAM 經過一連串的驗證後,將驗證的結果回報給該程式,然後該程式就能夠利用驗證的結果來進行可登陸或顯示其他無法使用的資訊.

PAM 用來進行驗證的資料稱為模組 (Modules) 每個 PAM 模組的功能都不太相同,舉例來說,使用 passwd 命令時,如果隨便輸入字典上面找的到的字串 passwd 就會回報錯誤資訊了,這就是 PAM 的 pam_cracklib.so 模組的功能,他能夠判斷該口令是否在字典裡面,並回報給口令修改程式,此時就能夠了解你的口令強度了.

以執行passwd命令為例,我們來說明一下,系統是如何呼叫PAM驗證的.

1.使用者開始執行 /usr/bin/passwd 程式,並輸入口令.
2.passwd 呼叫PAM模組進行驗證.
3.PAM 模組會到 /etc/pam.d/ 找尋與程式 (passwd) 同名的配置檔案.
4.依據 /etc/pam.d/passwd 內的配置,引用相關的 PAM 模組逐步進行驗證分析.
5.將驗證結果 (成功、失敗以及其他資訊) 回傳給 passwd 這個程式
6.passwd 程式會根據 PAM 回傳的結果決定下一個動作 (重新輸入新口令或者通過驗證)

從上面的說明,我們會知道重點其實是 /etc/pam.d/ 裡面的配置檔案,以及配置檔案所呼叫的 PAM 模組進行的驗證工作,既然一直談到 passwd 這個口令修改命令,那我們就來看看 /etc/pam.d/passwd 這個配置檔案的內容是怎樣吧

[[email protected] ~]# cat /etc/pam.d/passwd
#%PAM-1.0

[驗證類別] [控制標準]   [PAM 模組與該模組的引數]
auth       include      system-auth            <==每一行都是一個驗證的過程
account    include      system-auth
password   substack     system-auth
-password   optional    pam_gnome_keyring.so use_authtok
password   substack     postlogin

在這個配置檔案當中,除了第一行 PAM 版本之外,其他任何『 # 』開頭的都是批註,而每一行都是一個獨立的驗證流程,每一行可以區分為三個欄位,分別是驗證類別(type)、控制標準(flag)、PAM的模組與該模組的引數,在我們上面的表格當中出現的是『 include (包括) 』這個關鍵詞,他代表的是『使用後面的檔案作為驗證方式』 所以,上述的每一行都要重複呼叫 /etc/pam.d/system-auth 那個檔案來進行驗證的意思.

Linux SELinux 許可權配置

SELinux 是由美國國家安全域性 (NSA) 開發的,當初開發這玩意兒的目的是因為很多企業界發現,通常系統出現問題的原因大部分都在於『內部員工的資源誤用』所導致的,實際由外部發動的攻擊反而沒有這麼嚴重,面對這樣的處境NSA開始著手研究了這個專案,由於是在Linux上做的研發,因此它們便把自己的研究成果整合到了Linux裡面來了,SELinux 是整合到核心的一個模組這也就是說:其實 SELinux 是在進行程式、檔案等許可權配置依據的一個核心模組.

傳統的檔案許可權與帳號關係:自主訪問控制,DAC

系統的帳號主要分為系統管理員(root)與一般使用者,而這兩種身份能否使用系統上面的檔案資源則與rwx的許可權配置有關,不過你要注意的是,各種許可權配置對root是無效的,因此當某個程式想要對檔案進行存取時,系統就會根據該程式的許可權並比對檔案的許可權,若通過許可權檢查,就可以存取該檔案了,這種存取檔案系統的方式被稱為 『自主式存取控制 (Discretionary Access Control,DAC)』 ,基本上就是依據程式的擁有者與檔案資源的rwx許可權來決定有無存取的能力,不過這種 DAC 的存取控制有幾個困擾,那就是:

1.root具有最高的許可權:如果不小心某個程式被有心人士取得,且該程式屬於root的許可權,那麼這個程式就可以在系統上進行任何資源的存取,可想而知它的危險性.

2.使用者可以取得程式來變更檔案資源的存取許可權:如果你不小心將某個目錄的許可權配置為 777,由於對任何人的許可權會變成rwx,因此該目錄就會被任何人所任意存取.

這些問題是非常嚴重的 ! 尤其是當你的系統是被某些漫不經心的系統管理員所掌控時,她們甚至覺得目錄許可權調為 777 也沒有什麼了不起的.

以策略規則制定特定程式讀取特定檔案:委託訪問控制,MAC

委託訪問控制 (MAC) 他可以針對特定的程式與特定的檔案資源來進行許可權的控制,也就是說,即使你是root那麼在使用不同的程式時,你所能取得的許可權並不一定是root,而得要看當時該程式的配置而定,如此一來,我們針對控制的『主體』變成了『程式』而不是使用者.

下面呢,我們來看一下Selinux的幾個欄位,並且分別解釋一下它的含義吧.

[[email protected] ~]# ls -lZ

drwxr-xr-x. root root root:object_r:admin_home_t:s0 lyshark_dir
-rw-r--r--. root root system_u:object_r:passwd_file_t:s0 passwd
                        ↑           ↑         ↑
                        Identify    Role      Type(最重要)

身份識別 (Identify)

root:表示 root 的帳號身份
system_u:表示系統程式方面的標識,通常是程序
user_u:代表一般使用者賬號相關身份

角色段 (Role)

object_r:代表的是檔案或目錄等檔案資源
system_r:代表的就是程序,不過一般使用者也會被指明system_r

型別 (Type)

type:在檔案資源(Object)上面稱為型別(Type)
domain:在主體程式(Subject)則稱為域(domain)

◆SeLinux的啟動關閉與查詢◆

查詢SeLinux狀態

查詢我們可以使用以下命令,首先老樣子,先看一下命令可用引數吧.

[[email protected] ~]# sestatus --help

命令語法:[ sestatus [選項] ]

        -v              #檢查位於/etc/sestatus.conf內檔案的安全上下文
        -b              #將目前策略規則的布林值列出

臨時開啟SeLinux

[[email protected] ~]# getenforce
Enforcing
[[email protected] ~]# setenforce 1

永久開啟SeLinux

[[email protected] ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX= permissive   ← 改成enforcing
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

◆設定與恢復SeLinux安全上下文◆

chcon 設定上下文

chcon命令是修改物件(檔案)的安全上下文,比如:使用者、角色、型別、安全級別,也就是將每個檔案上下文變更為指定的上下文,chcon命令位於/usr/bin/chcon,下面就來看一下它的引數吧.

[[email protected] ~]# chcon --help

命令語法:[ chcon [選項] [上下文] 檔案或目錄 ]

        -R              #遞迴設定目錄的許可權
        -t              #設定安全上下文,例如(httpd_sys_content_t)
        -u              #後面接身份標識,例如(system_u)
        -r              #後面接角色,例如(system_r)

例項1:給指定檔案設定一個amba_share_t安全上下文.

[[email protected] ~]# ls -lZ
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 lyshark_dir

[[email protected] ~]# chcon -R -t samba_share_t lyshark_dir/

[[email protected] ~]# ls -lZ
drwxr-xr-x. root root unconfined_u:object_r:samba_share_t:s0 lyshark_dir

例項2:依照/etc/passwd為模板,修改lyshark_dir目錄的安全上下文.

[[email protected] ~]# ls -lZ
drwxr-xr-x. root root unconfined_u:object_r:samba_share_t:s0 lyshark_dir

[[email protected] ~]# chcon -R --reference=/etc/passwd lyshark_dir/

[[email protected] ~]# ls -lZ
drwxr-xr-x. root root system_u:object_r:passwd_file_t:s0 lyshark_dir

restorecon 恢復上下文

restorecon命令用來恢復SELinux檔案屬性即恢復檔案的安全上下文,當我們配置錯誤時,可以使用此命令恢復一下,看一下引數吧.

[[email protected] ~]# restorecon --help

命令語法:[ restorecon [選項] 檔案或目錄 ]

        -R              #遞迴設定目錄的許可權
        -v              #顯示執行過程

例項1: 將上面的檔案上下文,全部恢復到預設狀態.

[[email protected] ~]# ls -lZ
drwxr-xr-x. root root system_u:object_r:passwd_file_t:s0 lyshark_dir

[[email protected] ~]# restorecon -R lyshark_dir/

[[email protected] ~]# ls -lZ
drwxr-xr-x. root root system_u:object_r:admin_home_t:s0 lyshark_dir

◆SeLinux策略查詢與布林值管理◆

如果我們不知道策略的規則,那我們也很難設定規則,下面我們就來看一下如何查詢到我們想要的策略吧.

seinfo 查詢策略

通過Yum倉庫,快速安裝seinfo

[[email protected] ~]# yum install -y setools-libs setools-console

Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager.
Package setools-libs-3.3.8-2.el7.x86_64 already installed and latest version
Package setools-console-3.3.8-2.el7.x86_64 already installed and latest version
Nothing to do

其次我們來看一下它的配置引數吧.

[[email protected] ~]# seinfo --help

命令語法:[ seinfo [選項] ]

        -A              #列出所有,規則布林值,角色,型別等.
        -t              #列出所有型別(type)
        -r              #列出所有角色(role)
        -u              #列出所有身份標識(user)
        -b              #列出所有規則種類(布林值)

例項:利用seinfo -b命令查詢所有與httpd相關的規則.

[[email protected] ~]# seinfo -b |grep httpd_use
   httpd_use_fusefs
   httpd_use_openstack
   httpd_use_nfs
   httpd_use_sasl
   httpd_use_gpg
   httpd_use_cifs

布林值的查詢與修改

查詢:通過getsebool -a查詢httpd_use_openstack的狀態.

[[email protected] ~]# getsebool -a |grep httpd_use_openstack
httpd_use_openstack --> off

修改:通過setsebool -P [0|1]開啟httpd_use_openstack狀態.

[[email protected] ~]# getsebool -a |grep httpd_use_openstack
httpd_use_openstack --> off

[[email protected] ~]# setsebool -P httpd_use_openstack=1

[[email protected] ~]# getsebool -a |grep httpd_use_openstack
httpd_use_openstack --> on