Linux系統(tǒng)中的文件除了具備一般權限和特殊權限之外,還有一種隱藏權限,即被隱藏起來的權限,默認情況下不能直接被用戶發(fā)覺。明明權限充足但卻無法刪除某個文件的情況,或者僅能在日志文件中追加內(nèi)容而不能修改或刪除內(nèi)容,這在一定程度上阻止了黑客篡改系統(tǒng)日志的圖謀。 1. chattr命令 chattr命令用于設置文件的隱藏權限,格式為“chattr [參數(shù)] 文件”。如果想要把某個隱藏功能添加到文件上,則需要在命令后面追加“+參數(shù)”,如果想要把某個隱藏功能移出文件,則需要追加“-參數(shù)”。chattr命令中可供選擇的隱藏權限參數(shù)非常豐富。 chattr命令中用于隱藏權限的參數(shù)及其作用
先來創(chuàng)建一個普通文件,然后立即嘗試刪除(這個操作肯定會成功): [root@hushenjian ~]# echo "for Test" > linuxprobe [root@hushenjian ~]# rm linuxprobe rm: remove regular file ‘linuxprobe’? y 接下來我們再次新建一個普通文件,并為其設置不允許刪除與覆蓋(+a參數(shù))權限,然后再嘗試將這個文件刪除: [root@hushenjian ~]# echo "for Test" > linuxprobe [root@hushenjian ~]# chattr +a linuxprobe [root@hushenjian ~]# rm linuxprobe rm: remove regular file ‘linuxprobe’? y rm: cannot remove ‘linuxprobe’: Operation not permitted 2. lsattr命令 lsattr命令用于顯示文件的隱藏權限,格式為“l(fā)sattr [參數(shù)] 文件”。在Linux系統(tǒng)中,文件的隱藏權限必須使用lsattr命令來查看,平時使用的ls之類的命令則看不出端倪: [root@hushenjian ~]# ls -al linuxprobe -rw-r--r--. 1 root root 9 Feb 12 11:42 linuxprobe 一旦使用lsattr命令后,文件上被賦予的隱藏權限馬上就會原形畢露。此時可以按照顯示的隱藏權限的類型(字母),使用chattr命令將其去掉: [root@hushenjian ~]# lsattr linuxprobe -----a---------- linuxprobe [root@hushenjian ~]# chattr -a linuxprobe [root@hushenjian ~]# lsattr linuxprobe ---------------- linuxprobe [root@hushenjian ~]# rm linuxprobe rm: remove regular file ‘linuxprobe’? y 文件訪問控制列表一般權限、特殊權限、隱藏權限其實有一個共性—權限是針對某一類用戶設置的。如果希望對某個指定的用戶進行單獨的權限控制,就需要用到文件的訪問控制列表(ACL)了。通俗來講,基于普通文件或目錄設置ACL其實就是針對指定的用戶或用戶組設置文件或目錄的操作權限。另外,如果針對某個目錄設置了ACL,則目錄中的文件會繼承其ACL;若針對文件設置了ACL,則文件不再繼承其所在目錄的ACL。 為了更直觀地看到ACL對文件權限控制的強大效果,我們先切換到普通用戶,然后嘗試進入root管理員的家目錄中。在沒有針對普通用戶對root管理員的家目錄設置ACL之前,其執(zhí)行結果如下所示: [root@hushenjian ~]# su - linuxprobe Last login: Sat Mar 21 16:31:19 CST 2017 on pts/0 [hushenjian@huhsenjian ~]$ cd /root -bash: cd: /root: Permission denied [hushenjian@hushenjian root]$ exit 1. setfacl命令 setfacl命令用于管理文件的ACL規(guī)則,格式為“setfacl [參數(shù)] 文件名稱”。文件的ACL提供的是在所有者、所屬組、其他人的讀/寫/執(zhí)行權限之外的特殊權限控制,使用setfacl命令可以針對單一用戶或用戶組、單一文件或目錄來進行讀/寫/執(zhí)行權限的控制。其中,針對目錄文件需要使用-R遞歸參數(shù);針對普通文件則使用-m參數(shù);如果想要刪除某個文件的ACL,則可以使用-b參數(shù)。下面來設置用戶在/root目錄上的權限: [root@hushenjian ~]# setfacl -Rm u:linuxprobe:rwx /root [root@hushenjian ~]# su - linuxprobe Last login: Sat Mar 21 15:45:03 CST 2017 on pts/1 [hushenjain@hushenjian ~]$ cd /root [hushenjian@hushenjian root]$ ls anaconda-ks.cfg Downloads Pictures Public [hushenjian@hushenjian root]$ cat anaconda-ks.cfg [hushenjain@hushenjian root]$ exit 怎么去查看文件上有那些ACL呢?常用的ls命令是看不到ACL表信息的,但是卻可以看到文件的權限最后一個點(.)變成了加號(+),這就意味著該文件已經(jīng)設置了ACL了。 [root@hushenjian ~]# ls -ld /root dr-xrwx---+ 14 root root 4096 May 4 2017 /root 2. getfacl命令 getfacl命令用于顯示文件上設置的ACL信息,格式為“getfacl 文件名稱”。想要設置ACL,用的是setfacl命令;要想查看ACL,則用的是getfacl命令。下面使用getfacl命令顯示在root管理員家目錄上設置的所有ACL信息。 [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::--- sudo命令用于給普通用戶提供額外的權限來完成原本root管理員才能完成的任務,格式為“sudo [參數(shù)] 命令名稱”。sudo服務中可用的參數(shù)以及相應的作用如表5-7所示。 sudo服務中的可用參數(shù)以及作用
sudo命令具有如下功能:
當然,如果擔心直接修改配置文件會出現(xiàn)問題,則可以使用sudo命令提供的visudo命令來配置用戶權限。這條命令在配置用戶權限時將禁止多個用戶同時修改sudoers配置文件,還可以對配置文件內(nèi)的參數(shù)進行語法檢查,并在發(fā)現(xiàn)參數(shù)錯誤時進行報錯。
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!) 使用visudo命令配置sudo命令的配置文件時,在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命令查看到所有可執(zhí)行的命令了(下面的命令中,驗證的是該普通用戶的密碼,而不是root管理員的密碼): [root@hushenjian ~]# su - linuxprobe Last login: Thu Sep 3 15:12:57 CST 2017 on pts/1 [hushenjian@hushenjian ~]$ sudo -l [sudo] password for linuxprobe:此處輸入linuxprobe用戶的密碼 Matching Defaults entries for linuxprobe on this host: 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 User linuxprobe may run the following commands on this host: (ALL) ALL 接下來,作為一名普通用戶,是肯定不能看到root管理員的/root中的文件信息的,但是,只需要在想執(zhí)行的命令前面加上sudo命令就可以了: [hushenjian@hushenjian ~]$ ls /root ls: cannot open directory /root: Permission denied [hushenjian@hushenjian ~]$ sudo ls /root anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates Desktop Downloads Music Public Videos 但是考慮到生產(chǎn)環(huán)境中不允許某個普通用戶擁有整個系統(tǒng)中所有命令的最高執(zhí)行權,因此ALL參數(shù)有些不合適。如果需要讓某個用戶只能使用root管理員的身份執(zhí)行指定的命令,切記一定要給出該命令的絕對路徑,可以先使用whereis命令找出命令所對應的保存路徑,然后把配置文件第99行的用戶權限參數(shù)修改成對應的路徑即可: [hushenjian@hushenjian ~]$ exit logout [root@hushenjian ~]# whereis cat cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz [root@hushenajian ~]# visudo 96 ## 97 ## Allow root to run any commands anywhere 98 root ALL=(ALL) ALL 99 linuxprobe ALL=(ALL) /usr/bin/cat 再次切換到指定的普通用戶,然后嘗試正常查看某個文件的內(nèi)容,此時系統(tǒng)提示沒有權限。這時再使用sudo命令就可以順利地查看文件內(nèi)容了: [root@linuxprobe ~]# su - linuxprobe Last login: Thu Sep 3 15:51:01 CST 2017 on pts/1 [linuxprobe@linuxprobe ~]$ cat /etc/shadow cat: /etc/shadow: Permission denied [linuxprobe@linuxprobe ~]$ sudo cat /etc/shadow root:$6$GV3UVtX4ZGg6ygA6$J9pBuPGUSgZslj83jyoI7ThJla9ZAULku3BcncAYF00Uwk6Sqc4E36MnD1hLtlG9QadCpQCNVJs/5awHd0/pi1:16626:0:99999:7::: bin:*:16141:0:99999:7::: daemon:*:16141:0:99999:7::: adm:*:16141:0:99999:7::: lp:*:16141:0:99999:7::: sync:*:16141:0:99999:7::: shutdown:*:16141:0:99999:7::: halt:*:16141:0:99999:7::: mail:*:16141:0:99999:7::: operator:*:16141:0:99999:7::: games:*:16141:0:99999:7::: ftp:*:16141:0:99999:7::: nobody:*:16141:0:99999:7::: ………………省略部分文件內(nèi)容……………… 每次執(zhí)行sudo命令后都會要求驗證一下密碼??梢蕴砑覰OPASSWD參數(shù),使得用戶執(zhí)行sudo命令時不再需要密碼驗證: [hushenjian@hushenjian ~]$ exit logout [root@hushenjian ~]# whereis poweroff poweroff: /usr/sbin/poweroff /usr/share/man/man8/poweroff.8.gz [root@hushenjian ~]# visudo 96 ## 97 ## Allow root to run any commands anywhere 98 root ALL=(ALL) ALL 99 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff 當切換到普通用戶后再執(zhí)行命令時,不用再頻繁地驗證密碼。 [root@hushenjian ~]# su - hushenjian Last login: Thu Sep 3 15:58:31 CST 2017 on pts/1 [hushenjian@hushenjian ~]$ poweroff User root is logged in on seat0. Please retry operation after closing inhibitors and logging out other users. Alternatively, ignore inhibitors and users with 'systemctl poweroff -i'. [hushenjian@hushenjian ~]$ sudo poweroff |
|