我們linux服務器上有嚴格的權限等級,如果權限過高導致誤操作會增加服務器的風險。所以對於了解linux系統中的各種權限及要給用戶,服務等分配合理的權限十分重要。
一.文件基本權限
首先看下linux下的文件權限,可以使用ll命令或者是帶-l(長列表選項)的ls命令。
文件列表信息分為:文件類型、權限、鏈接數、所屬用戶、所屬用戶組、文件大小、最后修改時間、文件名。
linux一共有7種文件類型,分別如下:
-:普通文件
我們看上面截圖第一個文件權限信息,每三位為一組
rwxr-xr-x 5 root root 94 Jun 27 2017 xdg
rwx:代表文件所有者(u表示)權限,這里是root,root對該文件擁有讀寫執行權限。
r-x : 代表所屬組(g表示)的權限,這里所屬組擁有對該文件讀和執行的權限。
r-x : 代表其他人(o表示)的權限,這里和上面權限一樣。
當然我們也可以修改文件的權限。
linux中chmod命令就可以用來變更文件或目錄的權限。
語法: chmod (選項) 模式 文件名
用法如下:
先創建一個文件a.txt,此時a.txt文件擁有者是沒有執行權限,我們可以給它加上執行權限(x),u就是代表文件擁有者。
如果想給a.txt的用戶組和其他用戶也加上執行權限,可以加上多個。
既然可以加權限,也可以減權限,加號改成減號就行。
還有更簡單的方式,直接用等於號賦予相應的權限
或者用a=的方式賦予,a就是代表all。
也可以給多個文件賦予權限,我們在創建一個文件b.txt
總結下,權限對文件及目錄的作用
對於文件:
r : 可以讀取文件內容(比如命令 cat more head tail)。
w : 可以編輯文件(比如命令 vim echo ),但是不能刪除文件,因為文件名沒有放在自己的文件空間,而是放在了上一級的目錄空間下。
x : 可以執行。
對於目錄:
r:可以查詢目錄下的文件(比如命令ls ll)。
w:具有修改目錄結構的權限,比如新建文件和目錄,刪除此目錄下文件和目錄,重命名此目錄下文件和目錄,剪切和復制(比如命令cp mv touch rm)。
x:目錄有執行權限但是不能運行,可以進入目錄(cd命令)。
對文件來說最高權限是x,對於目錄來說最高權限是w,一般給目錄賦予權限0 ,5(rx),7(rxw),賦予4 ,1, 6都是沒有意義的。對於文件能否刪除,首先要對目錄具有執行權限,同時對文件也具有執行權限。
chown命令:用來改變文件或目錄的所有者和所屬用戶組。
chgrp命令 :用來改變文件或目錄的所屬的用戶組。
示例:
[root@localhost test123]# ll 總用量 0 drwxr-x--- 2 root root 20 5月 5 11:38 abc [root@localhost test123]# chown test123:test123 abc 將abc用戶組和所屬者都改成test123 中間用:分割 [root@localhost test123]# ll 總用量 0 drwxr-x--- 2 test123 test123 20 5月 5 11:38 abc
二.默認權限
我們在linux系統中新建一個文件或者目錄,那么這個文件或目錄會有一個權限,這個權限就是默認權限。這個權限就是靠umask的值來定義的。那么什么是umask?
umask(權限掩碼) 就是指定當前用戶在建立文件或目錄時候的權限默認值。當新文件被創建時,其最初的權限由文件創建掩碼決定。用戶每次登錄系統時,umask命令都被執行, 並自動設置掩碼mode來限制新文件的權限。用戶可以通過再次執行umask命令來改變默認值,新的權限將會把舊的覆蓋掉。
我們可以執行umask命令來查看系統中文件默認權限。
[root@localhost local]# umask 0022
解釋下0022
第一位0:文件特殊權限。
022:文件默認權限。
下面創建一個文件和一個目錄。
[root@localhost tmp]# touch a.txt [root@localhost tmp]# mkdir dir [root@localhost tmp]# ll 總用量 54768 -rw-r--r-- 1 root root 0 5月 5 14:31 a.txt drwxr-xr-x 2 root root 6 5月 5 14:31 dir
我們看文件默認權限是644,而目錄的權限是755,那么是如何依靠umask來設定權限的呢。
我們先看下文件默認權限的特點:
1.文件默認不能建立為執行權限,必須手工賦予執行權限。所以文件的默認權限最大為666。這樣能保護系統安全。
2.默認權限要換算成對應的字母權限在相減而不是數字。
3.建立文件或目錄之后的默認權限,為666減去umask的值。
計算方式如下:
1. 文件默認最大權限666,umask=022
-rw-rw-rw- 減去 -----w--w- 等於 -rw-r--r-- (644)
2. 文件默認最大權限666,umask=033
-rw-rw-rw- 減去 -----wx-wx 等於 -rw-r--r-- (644)
其實是做了一個邏輯與的運算。
目錄的默認權限:
1.目錄默認權限最大是777。
2.目錄默認權限換算成字符在相減。
3.建立目錄之后的默認權限,是777減去umask的值。
修改umask的值:
使用umask + 值,比如umask 0000;
不過這樣只是臨時生效,要永久修改就要修改環境變量配置文件/etc/profile
三.ACL(Access Control List )權限
linux系統中一個文件只有一個所屬組,一個所有者,acl權限是解決用戶對文件權限不足,也就是用戶身份不夠的情況下。打算讓某個用戶對這個文件有權限,不用考慮這個用戶是哪個所有組
還是其他人。用acl給這個用戶賦予權限。ACL權限 是解決用戶對文件身份不足的問題(該用戶不屬於 擁有者 所屬組 其他人)。系統是否支持ACL是與文件系統有關的。
首先查看系統分區中ACL權限是否開啟,命令如下:
先看下分區情況
[root@localhost tmp]# df 文件系統 1K-塊 已用 可用 已用% 掛載點 /dev/mapper/centos-root 39134548 29770328 9364220 77% / devtmpfs 923152 0 923152 0% /dev tmpfs 933636 80 933556 1% /dev/shm tmpfs 933636 9128 924508 1% /run tmpfs 933636 0 933636 0% /sys/fs/cgroup /dev/mapper/centos-home 19105792 33080 19072712 1% /home /dev/sda1 508588 177692 330896 35% /boot .host:/ 127927292 118371212 9556080 93% /mnt/hgfs tmpfs 186728 12 186716 1% /run/user/42 tmpfs 186728 0 186728 0% /run/user/0 因為我安裝的是centos7,所以我的系統文件系統是xfs類型,用xfs_growfs命令查看,如果文件系統是ext2/ext3/ext4可以用dumpe2fs命令查看指定分區詳細文件系統信息。 [root@localhost tmp]# xfs_growfs /dev/sda1 meta-data=/dev/sda1 isize=256 agcount=4, agsize=32000 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 finobt=0 spinodes=0 data = bsize=4096 blocks=128000, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal bsize=4096 blocks=853, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
查看系統是否支持ACL,使用dmesg命令(可以幫助用戶了解系統的啟動信息,可以查看ACL信息)查看,發現xfs文件系統是默認支持ACL權限的。
查看ACL權限:
設定ACL權限:
setfacl 選項 文件名
選項:
-m:設定ACL權限。
-x:刪除指定的ACL權限。
-b:刪除所有的ACL權限。
-d:設定默認的ACL權限。
-k:刪除默認的ACL權限。
-R:遞歸設定ACL權限。
四.sudo權限
sudo是linux系統管理指令,操作對象是系統命令。是允許讓普通用戶執行部分或者全部的系統管理員才能執行的命令的一個工具,限制某個普通用戶有限的命令有root權限(比如說重啟,備份,添加用戶,ifconfig命令等)。sudo 執行時候不需要知道超級管理員的密碼。
sudo是超級用戶賦予普通用戶權限才能使用,sudo為系統管理員提供配置文件,使用visudo命令(這個命令可以防止兩個用戶同時修改它,也能進行有限的語法檢查)可以打開該配置文件:
[root@localhost ~]# visudo 這個命令實際是打開了/etc/sudoers文件 ## Sudoers allows particular users to run various commands as ## the root user, without needing the root password. ## ## Examples are provided at the bottom of the file for collections ## of related commands, which can then be delegated out to particular ## users or groups.
... ...
在文件98行有個例子
格式解釋: 用戶名(給哪個用戶賦予權限,這里是root) 被管理的主機地址(第一個ALL)= (可使用身份(第二個ALL),這個可以省略直接跟授權的命令) 授權的命令(要寫絕對路徑,命令寫的越簡單權限就越大,越詳細普通用戶獲得權限就越小)
使用 man 5 sudoers 命令查看配置文件詳細解釋
普通用戶沒有關閉系統的權限,如下提示。
[song@localhost ~]$ shutdown -r now ==== AUTHENTICATING FOR org.freedesktop.login1.reboot === Authentication is required for rebooting the system. Authenticating as: root Password: Failed to execute operation: 連接超時 Must be root. polkit-agent-helper-1: pam_authenticate failed: Authentication failure
在配置文件中最后一行給song用戶添加shutdown權限並保存
用song賬號登錄並用sudo -l 命令顯示出自己(執行 sudo 的使用者)的權限。
[song@localhost ~]$ sudo -l [sudo] password for song: 匹配此主機上 song 的默認條目: requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin 用戶 song 可以在該主機上運行以下命令: (ALL) /sbin/shutdown -r now 這里song身份就被切換成ALL
這里用sudo命令后面加配置文件賦予的命令去執行,不能寫錯,不然會執行不了,如下。
[song@localhost ~]$ sudo /sbin/shutdown -h now 對不起,用戶 song 無權以 root 的身份在 localhost.localdomain 上執行 /sbin/shutdown -h now。
所以寫成配置文件里一模一樣的就可以執行
[song@localhost ~]$ sudo /sbin/shutdown -r now
如果寫多個可以用逗號分開
再看下
[song@localhost ~]$ sudo -l 匹配此主機上 song 的默認條目: requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin 用戶 song 可以在該主機上運行以下命令: (ALL) /sbin/shutdown -r now, (ALL) /sbin/ls
上面的例子是給某個用戶賦予權限,當然我們也可以給一組用戶賦予權限。也是在配置文件中
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
上面wheel是組名,前面要加上%號,其它設置和用戶一樣。
sudo命令主要參數說明:
參數 | 含義 |
-V | 顯示版本編號及設置信息,下圖。 |
-l | 顯示出自己(執行 sudo 的使用者)的權限。 |
-u | username(用戶名) 不加此參數,代表要以 root 的身份執行指令, 否則是以 username 的身份執行指令。 |
-v | 延長密碼有效期限。 |
五.文件的特殊權限SetUid & SetGid & Sticky BIT
linux系統文件中除了讀(r),寫(w),執行(x)權限外,還有s和t這兩個特殊的權限。當s這個標志出現在文件所有者的x權限上時,此時就被稱為SetUid(簡稱SUID),當s出現在用戶組(g)上就是SetGid,當s出現在其他用戶(o)上就是Sticky Bit(簡稱SBIT)。
SetUid的功能:
- 只有可執行的二進制程序才能設定SUID權限,就是這個文件可以執行才可以設定,否則不起作用。
- 命令執行者要對該程序擁有x(執行)權限。
- 命令執行者在執行該程序是獲得該程序文件屬主身份,打個比方,user1用戶沒有passwd文件的讀取權限,那么user1用戶希望能看見passwd文件內容,只能將自己的身份添加到passwd文件所屬的用戶組,或 者是用root用戶登錄,或者就是修改passwd的文件權限,也就是setuid這個特殊的文件權限。
- SetUid權限只在該程序執行過程中有效,也就是說身份改變只在程序執行過程中有效。
賦SUID權限方式:
數字賦予法:chmod 4755 文件名。
字母賦予法: chmod u+s 文件名 這里s就是SUID的意思,取消可以用chmod u-s 文件名。
普通用戶不能設置SUID權限。要用root用戶執行。
[song@localhost ~]$ chmod 4755 /bin/vi chmod: 更改"/bin/vi" 的權限: 不允許的操作
下面有個文件aaa,並且用戶對該文件擁有執行權限,我們去給該文件添加SUID權限。
紅色箭頭那里之前x變成了s,表示aaa文件擁有了s權限,同時aaa文件也變成了紅色,表示不安全。
如果要是用戶對aaa沒有執行權限呢。我們創建一個新文件bbb,並修改其權限不包含執行權限。然后在賦予SUID。
這里變成了大S,這里大S表示不能正確使用的。
我們知道用戶的密碼是保存在/etc/shadow文件中,我們看下這個文件的權限
[root@localhost tmp]# ll /etc/shadow ---------- 1 root root 1696 5月 27 18:58 /etc/shadow
發現這個文件的權限是000,用戶屬主是root,那么除了root用戶能修改密碼外,用戶自己同樣也能修改密碼,為什么沒有寫入這個文件的權限去修改密碼,這是因為這個SUID功能。我們看下passwd這個命令就知道原因了。
[root@localhost tmp]# which passwd /usr/bin/passwd [root@localhost tmp]# ll /usr/bin/passwd -rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
首先passwd命令是可執行的,同時發現passwd命令默認就有SUID權限,而且任何用戶對這個命令也有執行權限(最后有x),所以普通用戶在執行這個命令的時候就會擁有這個命令所屬主的身份,變成了root,命令執行完后這個身份就消失了又變成普通用戶。
系統還有其他的命令也包含SUID權限,比如su命令。
SUID權限比較靈活,所以不能隨意設置,不然會對系統造成潛在的危害。比如vi命令,如果添加SUID權限,那么普通用戶獲取root身份就可以修改所有的文件。
所以SUID(也包括SGID)權限原則:
- 關鍵的目錄要嚴格控制寫權限,比如根目錄“/”,“/usr”目錄等。
- 用戶的密碼設置要嚴格遵守密碼三原則(復雜性,易記性,時效性)。
- 對系統中默認應該具有SUID,SGID權限的文件列表出來,定時檢查有沒有之外的文件被設置SUID,SGID權限。可以通過find命令查找。
[root@localhost tmp]# find / -type f \( -perm -04000 -o -perm -02000 \) -exec ls -lg {} \; 04000表示SUID 02000表示SGID -o表示或者的意思 find: ‘/proc/26739/task/26739/fdinfo/6’: 沒有那個文件或目錄 find: ‘/proc/26739/fdinfo/6’: 沒有那個文件或目錄 -rwsr-xr-x 1 root 0 5月 28 14:19 /root/tmp/aaa -rwSr--r-- 1 root 0 5月 28 14:30 /root/tmp/bbb -rwsr-xr-x. 1 root 32584 6月 10 2014 /usr/bin/fusermount -r-xr-sr-x. 1 tty 15344 6月 10 2014 /usr/bin/wall -rwsr-xr-x. 1 root 64200 3月 6 2015 /usr/bin/chage -rws--x--x. 1 root 23960 3月 6 2015 /usr/bin/chfn -rws--x--x. 1 root 23856 3月 6 2015 /usr/bin/chsh -rwsr-xr-x. 1 root 44232 3月 6 2015 /usr/bin/mount -rwsr-xr-x. 1 root 32064 3月 6 2015 /usr/bin/su -rwxr-sr-x. 1 tty 19536 3月 6 2015 /usr/bin/write -rwsr-xr-x. 1 root 78168 3月 6 2015 /usr/bin/gpasswd -rwsr-xr-x. 1 root 41752 3月 6 2015 /usr/bin/newgrp
在上面我們新創建一個文件系統會根據umask的設置賦予新文件一個權限,那么umask的值是四位,如下:
[root@localhost ~]# umask 0022
可是我們通過chmod命令給文件賦予權限一般都是三位數字,比如755,644等,那么這個umask后三位022是基本默認權限,第一位0就是特殊權限。
六.chattr權限(不可改變位權限)
chattr命令用於改變文件屬性,只針對root用戶有效。
格式:chattr [ + - = ] [選項] 文件或目錄,這里的[ + - = ]是控制文件的屬性。
+ : 增加權限。
- : 刪除權限。
= : 賦予/等於某權限。
常用選項:
i: 即insert,不得任意更動文件或目錄。
如果對文件設置i屬性,那么不允許對文件進行刪除,重命名,添加和修改數據,相當於鎖定這個文件。如果對目錄設置i屬性,那么只能修改目錄下的文件數據(文件數據保存在文件自己的數據塊中),不允許建立和刪除文件。
a:即append,讓文件或目錄僅供附加用途。
如果對文件設置a屬性,只能在文件中添加數據(因為vi被禁用了,所以用echo >> 輸出重定向追加的方式),不能刪除也不能修改數據。如果對目錄設置a屬性,那么只允許在目錄中新建和修改文件,不允許刪除文件,可以適用於各種日志文件。
案例:
給文件添加i屬性
[root@localhost tmp]# chattr +i aa.txt [root@localhost tmp]# lsattr aa.txt 用lsattr命令查看 ----i----------- aa.txt
不允許刪除
[root@localhost tmp]# rm -rf aa.txt rm: 無法刪除"aa.txt": 不允許的操作
給目錄添加i屬性
[root@localhost tmp]# chattr +i dir [root@localhost tmp]# lsattr -d dir ----i----------- dir [root@localhost tmp]# cd dir [root@localhost dir]# touch a.txt touch: 無法創建"a.txt": 權限不夠
七.Linux常用權限
1.600(rw------):只有root有讀寫權限。
2.644(rw-r--r--):只有root有讀寫權限;group用戶和other用戶只有讀權限。
3.755(rwxr-xr-x):root有讀、寫、執行權限;group用戶和other用戶只有讀、執行權限。