第十四節 用戶管理初級(下) 標簽(空格分隔): Linux實戰教學筆記 陳思齊 [更多資料點我查看][1] 1,用戶查詢相關命令id,finger,users,w,who,last,lastlog,groups 本節主要介紹在用戶管理中,查詢用戶的幾種常見工具id,finger,w,who,las ...
第十四節 用戶管理初級(下)
標簽(空格分隔): Linux實戰教學筆記-陳思齊
---更多資料點我查看
1,用戶查詢相關命令id,finger,users,w,who,last,lastlog,groups
本節主要介紹在用戶管理中,查詢用戶的幾種常見工具id,finger,w,who,last,lastlog,groups的用法。
用戶查詢工具的原理:
在用戶管理中,用戶查詢是通過幾個常用的工具來完成的,比如id,finger,groups,users....,我們都知道用戶的配置文件是/etc/passwd,用戶組的配置文件是/etc/group文件,我們對用戶的查詢除了通過查詢工具以外,我們還能直接查看用戶和用戶組的配置文件或相關的用戶日誌記錄信息來達到查詢的目的;
用戶查詢工具的原理也是讀取與用戶和用戶組有關的配置文件以及相關的用戶日誌記錄信息,然後按一定的規則和條件輸出。
1.1 id命令
id命令是用來查詢用戶的信息,比如用戶所歸屬於哪些用戶組,以及UID和GID等。id命令的用法非常簡單,我們舉例說明一下:
1)id命令語法
語法格式:id(參數)【用戶名】
如果id後面不接任何參數和任何用戶,預設顯示當前操作用戶的用戶名,所歸屬的用戶組,UID和GID等。
2)id命令實例
實例1:查詢自身的相關信息(不加任何參數和用戶名)
[root@chensiqi1 ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
說明:在不加任何參數的情況下,查詢的是當前操作用戶的用戶名,UID,GID和用戶所歸屬主用戶組(或稱做初始有效用戶組)和附屬用戶組,在本例中,用戶名是root,UID是0,所歸屬的主用戶組是root,GID為0.root同時屬於bin,daemon....等用戶組。
實例2:id後面換用戶名
如果我們想查詢系統中指定用戶屬於哪些用戶組及UID和GID相應內容,可以直接執行“id用戶名”,這裡的用戶名必須是系統中真實存在的
[root@chensiqi1 ~]# id chensiqi3
uid=808(chensiqi3) gid=801(sa) groups=801(sa)
說明:查詢用戶chensiqi3的信息,用戶chensiqi3,UID為808,所歸屬的主要用戶組為sa,主用戶組的GID是801。
正如前文所講的,用戶和用戶組的對應關係,可以是一對一,一對多,多對一,或多對多的交叉關係,本例就是一個用戶屬於多個用戶組的情況,就象一個人屬於多個組織和集體一樣,這是合法。
總結:id的命令很簡單,在生產場景中常用的方法就是“id 用戶名”或“id”的方法。
1.2 finger命令
finger命令側重於用戶信息的查詢,查詢的內容包括用戶名,家目錄,登錄shell類型,用戶真實的名字,辦公地址,辦公電話,也包括登錄終端,寫狀態,時間等;
前文我們通過useradd,chsh,chfn,usermod等命令修改的信息,都可以通過finger命令查看
finger參數選項 | 註釋說明(帶特殊顏色的,需要掌握) |
---|---|
-l | 顯示所有信息 |
-m | 禁止對用戶真實名字進行匹配 |
-p | 把.plan和project文件中內容省略 |
-s | 顯示短格式信息 |
1.3 w,who,users,last,lastlog命令
w,who和users幾個命令工具,一般是用來查詢已登錄當前主機的用戶信息:finger命令也有這個功能。而看用戶更詳細的登錄信息,不同命令的側重點略有差別,大家可以仔細對比下。
[root@chensiqi1 ~]# w #顯示已經登陸的用戶,並且都做了什麼的信息
10:28:30 up 8:55, 1 user, load average: 0.06, 0.06, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.197.1 09:41 0.00s 0.03s 0.00s w
??oot@chensiqi1 ~]# who # 顯示哪些用戶在登錄,終端及登錄時間,來源主機?
root pts/0 Feb 20 09:41 (192.168.197.1)
[root@chensiqi1 ~]# users #僅顯示哪些用戶在登錄
root
[root@chensiqi1 ~]# finger ##不加參數也表示顯示登錄用戶的相關信息,但這個命令還可以顯示其他未登錄的用戶信息
Login Name Tty Idle Login Time Office Office Phone
root root pts/0 Feb 20 09:41 (192.168.197.1)
[root@chensiqi1 ~]# last #顯示已登錄的用戶列表及登錄時間等
root pts/0 192.168.197.1 Mon Feb 20 09:41 still logged in
root pts/1 192.168.197.1 Sun Feb 19 23:24 - 05:35 (06:11)
root pts/0 192.168.197.1 Sun Feb 19 21:34 - 00:22 (02:47)
root pts/0 192.168.197.1 Sun Feb 19 11:11 - 20:43 (09:32)
以下省略....
[root@chensiqi1 ~]# lastlog #報告最近的所有系統用戶的登錄信息
Username Port From Latest
root pts/0 192.168.197.1 Mon Feb 20 09:41:51 -0500 2017
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
lp **Never logged in**
sync **Never logged in**
shutdown **Never logged in**
以下省略...
總結:
w,who,users,last,lastlog等幾個命令的功能有很多相似的地方,具體細節,上文已經解釋說明,這幾個命令我們會經常用到,但使用的方法一般就是僅僅執行命令本身而已。
2,Linux用戶身份切換命令
- 我們知道linux系統中,超級用戶root具有超級管理許可權。由於許可權太大,如果管理不好,就會對系統安全帶來嚴重隱患。在工作場景中,我們只在必要時才使用超級用戶root的許可權。一般的臨時性處理工作,都是以普通用戶的身份完成的。那麼,當普通用戶需要超級用戶的許可權時,是怎麼進行切換管理的呢?這就不得不提到兩個重要的用戶身份切換命令su和sudo。下麵我們就講解這兩個命令是如何完成用戶切換工作的,達到系統管理目的的?
- 在linux系統中,每個文件,目錄和進程,都是歸屬於某一個用戶的,沒有用戶的許可,其他的普通用戶是無法操作的,root除外。root用戶的特權還表現在root可以超越任何用戶和用戶組來對文件或目錄進行讀取,修改或刪除(在系統正常的許可範圍內);對可執行程式的執行,終止;對硬體設備的添加,創建和移除等;也可以對文件和目錄進行屬主和許可權進行修改。
2.1 su命令
2.1.1 su命令介紹
- 簡單的說,su命令就是切換用戶身份的命令。比如,我們以普通用戶chensiqi登錄到系統後,當要在系統中執行useradd添加用戶時,會發現chensiqi用戶沒有這個許可權,這個許可權只能由root許可權執行。解決方法一是退出chensiqi用戶,重新以root用戶登錄。二是我們直接在chensiqi用戶下,使用su命令來切換到root下進行添加用戶工作,等工作完成後再退出root用戶。毫無疑問,上面兩個方法,通過su命令切換是一種比較好的辦法。
- 通過su命令可以再用戶之間切換,超級許可權用戶root向普通或虛擬用戶切換不需要密碼驗證(這就是超級許可權所在),其他普通用戶之間或者普通用戶切換到root,都需要切換用戶的密碼驗證。
2.1.2 su命令用法
su 【選項參數】【用戶】
為了方便查看,用表格的方式把su命令的常用參數選項列表顯示,如下所示:
|su參數選項|註釋說明【帶特殊顏色表示重要,需要掌握】|
|--|--|
|-|使一個shell成為登錄的shell,如執行su - chensiqi時,表示該用戶想改變身份為chensiqi,並且使用chensiqi用戶的環境變數配置,如,/home/chensiqi/.bash_profile等
|
|-c|臨時切換到某一個用戶,執行一個命令,執行完,自動返回到當前用戶;切換到一個shell,執行一個命令,然後退出所切換的用戶環境
|
|-m|切換用戶時,不重置用戶環境比納涼,-p的功能同-m這個參數為su預設值。|
|-s|如果/etc/shells允許,則運行指定的shell|
2.1.3 su命令實例
當不加任何參數執行su命令時,表示要切換到root用戶,但這樣執行,會遇到一些問題。因為雖然是切換到root用戶了,但並沒有改變為root用戶登錄環境,用戶預設的登錄環境,可以在/etc/passwd中查得到,包括家目錄,shell類型等。比較規範的操作方法是su -。
實例1:由普通用戶chensiqi切換到root用戶。
[chensiqi@chensiqi1 ~]$ whoami #確認當前用戶為chensiqi root
chensiqi
[chensiqi@chensiqi1 ~]$ su #不加用戶就表示切換到root,當然也可以su root root
Password:
[root@chensiqi1 chensiqi]# env
HOSTNAME=chensiqi1
SHELL=/bin/bash
HISTSIZE=500
USER=chensiqi
MAIL=/var/spool/mail/chensiqi
PWD=/home/chensiqi
HOME=/root
LOGNAME=chensiqi
以下省略無關內容...
提示:細心的同學應該已經看到了,如果使用su而不加上“-”這個參數,那麼,切換前的用戶的相關信息還會存在,這會引起很多麻煩,甚至出現意想不到的結果。因此,切換用戶時,最好是“su - 用戶名”。這是生產場景中標準的切換用戶的操作方法。
[root@chensiqi1 chensiqi]# exit #退出當前用戶,這個命令也可以用ctrl+d
[chensiqi@chensiqi1 ~]$ su - root
Password:
[root@chensiqi1 ~]# env | egrep "USER|MALL|PWD|LOGNAME"
USER=root
PWD=/root
LOGNAME=root
提示:這次和上次就不同了,所有的環境變數信息都切換到了root下。因此,請大家在切換用戶時一定要加上“su - 用戶名”,這裡提醒下,不光是切換到root,切換到其他用戶也是一樣。
2.1.4 su命令總結
1)普通用戶切換到root用戶,可使用su -或su - root.必須輸入root的密碼才能完成切換。
2)root用戶切換到普通用戶,可使用“su - 普通用戶”的寫法。不需要輸入任何密碼就能完成切換。切換到普通用戶後,在執行一些命令如ifconfig時,可能會遇到環境變數PATH路徑問題而找不到某些系統命令(一般/sbin,/usr/sbin等下麵的命令),這時就需要將普通用戶的PATH,配置成root的PATH內容,前面的文章已講解過這個配置方法,不清楚的同學,可以查詢一下。提示:Centos6.4以上系統不存在這個問題
3)如果僅希望以某用戶的角色執行命令,而不直接切換到該用戶下操作,可以使用su - 用戶名 -c “命令”的方式.
實例2:由root切換到普通用戶chensiqi
[root@chensiqi1 ~]# su - chensiqi ##從root切換到任何普通用戶,不需要輸入密碼
[chensiqi@chensiqi1 ~]$ env | egrep "USER|MATL|PWD|LOGNAME"
USER=chensiqi
PWD=/home/chensiqi
LOGNAME=chensiqi
實例3:chensiqi用戶使用root身份執行一個命令。
[chensiqi@chensiqi1 ~]$ ls -l /root
ls: cannot open directory /root: Permission denied
[chensiqi@chensiqi1 ~]$ su - root -c "ls -l /root" #這是su的參數組合,表示切換到root用戶,並且改變到root環境,然後列出root家目錄的文件,然後退出root用戶
Password: #需要輸入root密碼
total 44
-rw-r--r--. 1 root root 4 Feb 20 01:31 111
-rw-------. 1 root root 1144 Jan 11 22:26 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4096 Feb 19 08:41 chen
-rw-r--r--. 1 root root 237 Feb 20 03:02 chen2017-02-20.tar.gz
drwxr-xr-x. 3 808 root 4096 Feb 20 00:14 chensiqi
-rw-r--r--. 1 root root 21764 Jan 11 22:26 install.log
-rw-r--r--. 1 root root 0 Feb 20 00:21 stu1
-rw-r--r--. 1 root root 0 Feb 20 00:21 stu2
-rw-r--r--. 1 root root 0 Feb 20 00:21 stu3
-rw-r--r--. 1 root root 0 Feb 20 00:21 stu4
-rw-r--r--. 1 root root 0 Feb 20 00:21 stu5
-rw-r--r--. 1 root root 0 Jan 11 22:26 ww.etiantian.org
實例4:有關su命令參數生產環境應用案例
在生產場景中,為了安全起見,我們一般會使用普通用戶來啟動伺服器進程(如:apache,nginx,resin,tomcat等),比如,下麵例子:
[chensiqi@chensiqi ~]$ ps -ef | grep chensiqi #查看包含chensiqi用戶的服務進程
tddoc 9042 1 0 Jan16 ? 00:00:02 java -server -XMN125M -Xmn125M -Xms512M -Xmx512M -Xss2048k -Djava.rmi.server.logCalls=false -Dsun.rmi.transport.tcp.logLevel=WARNING -Xlogge:/home/tddoc/run/resin/logs/gc.log -jar /home/tddoc/run/resin/lib/resin.jar -server a
提示:這是一個resin(提供java服務的軟體)的服務進程,當前服務用戶是chensiqi
這個時候我們就面臨一個問題,如何讓系統在每一次開機時也要自動以普通用戶啟動指定的服務腳本呢?答案在下麵
[root@chensiqi1 ~]# tail -5 /etc/rc.local #把要執行的腳本防禦開機自啟動配置文件/etc/rc.local中
#######分用戶方案啟動服務命令#######
su - chensiqi -c '/bin/sh /homechensiqi/bin/deloy.sh'
提示:大家註意了,這裡就是在系統開機時,通過su - 用戶名 -c “命令”,執行的啟動服務的命令,其中,/bin/sh /home/chensiqi/bin/deploy.sh就是僅限在chensiqi用戶下啟動的服務命令腳本。通過普通用戶跑服務是個很好的提升系統安全的好方法,在生產環境中,大多數服務(如,apache,nginx,resin,tomcat,rsync,lvs,haproxy,heartbeat,squid)等都可以通過普通用戶來啟動,而不用root。這樣做,使得系統安全又提高了一個等級。目前,taobao支持寶等大公司均有採用。
[root@chensiqi1 ~]# su - chensiqi -c "touch a.txt"
[root@chensiqi1 ~]# ls -l /home/chensiqi/
total 0
-rw-rw-r--. 1 chensiqi chensiqi 0 Feb 21 00:11 a.txt
- 1,從安全形度,普通用戶啟動服務安全些
- 2,管理,用普通用戶即可管理對應的服務/軟體
2.1.5 su命令的優缺點
- 毫無疑問,切換用戶身份的su命令為我們管理linux系統帶來了很多方便,通過切換到root下,可以完成各種系統管理工作,只要任何一個普通用戶知道了root用戶的密碼,都可以以普通用戶的身份切換到root來完成本來無法完成的系統管理工作。
- 但是,這樣通過su命令切換到root後,也帶來了很大安全管理問題,比如系統有8個普通用戶,都可以通過切換到root身份進行系統管理,甚至還可以改掉root的密碼,讓其他的普通用戶無法再實現系統管理,還有,這麼多用戶中,有任何一人對系統操作的重大失誤,都可以導致整個系統崩潰或數據損失。這樣的非集權式管理,在一定程式上就對系統的安全造成了較大威脅。在工作中,幾乎有一半的問題來自於內部。
- 所以使用su命令切換身份在多個系統管理員共同管理的場合,並不是最好的選擇,因此,我建議如果是一般的中小公司不超過3個管理員時,為了管理方便,使用su來共同管理是可以接受的。
- 我們既希望超級用戶root密碼掌握在少數或唯一的管理員手中,又希望多個系統管理員能夠完成更多更複雜的系統管理工作。那麼,如何解決多個系統管理員都能管理系統而又不讓超級許可權泛濫的需求呢?這就需要sudo命令來替代或結合su命令來完成這樣的苛刻且必要的管理需求。
1,必須知道root用戶的密碼
2,我們希望普通用戶可以臨時做回皇帝,但是我們不想給root用戶的密碼,--sudo解決
3,大部分企業故障,在工作中幾乎有一半的問題來自於內部。
3,sudo命令
3.1 sudo命令的用法
sudo 【參數選項】命令
為了方便,我們用表格把sudo命令常用參數選項列表顯示,如下所示:
|sudo參數選項|註釋說明(帶特殊顏色的表示重要,需要掌握)|
|--|--|
|-l|列出用戶在主機上可用的和被禁止的命令:當配置好sudo許可權規則後,可用這個參數來查看授權情況
|
|-v|驗證用戶的時間戳,當用戶運行sudo,輸入用戶的密碼後,在短時間內可以不用輸入口令直接進行sudo操作;用-v可以跟蹤最新的時間戳|
|-u|指定以某個用戶身份執行特定的命令操作,chensiqi ALL=(ALL) /bin/cp|
|-k|同-K,刪除時間戳,下一個sudo命令要求提供密碼,前提是該用戶授權中不能有NOPASSWD參數。時間戳預設5分鐘也會時效。|
3.2 sudo命令實例
實例1:使用chensiqi用戶在/root目錄下建立文件
[chensiqi@chensiqi1 ~]$ whoami #查看當前用戶
chensiqi
[chensiqi@chensiqi1 ~]$ sudo touch /root/ett #這是sudo生產場景的標準用法
[sudo] password for chensiqi: #提示輸入密碼,密碼為當前用戶的密碼
Sorry, user chensiqi is not allowed to execute '/bin/touch /root/ett' as root on chensiqi1. #因為沒有sudo許可權,所以不讓操作
接下來我們進行許可權配置
[root@chensiqi1 ~]# whoami #查看當前用戶
root
[root@chensiqi1 ~]# grep chensiqi /etc/sudoers
chensiqi ALL=(ALL) /bin/touch #給chensiqi用戶授權/bin/touch命令
[root@chensiqi1 ~]# su - chensiqi #切換賬戶
[chensiqi@chensiqi1 ~]$ sudo touch /root/ett #申請授權在/root下創建一個文件
[chensiqi@chensiqi1 ~]$ exit
logout
[root@chensiqi1 ~]# ls -l ett
-rw-r--r--. 1 root root 0 Feb 21 01:17 ett
實例2:配置sudoers文件,對chensiqi進行授權,然後在實踐上例的操作
[root@chensiqi1 ~]# whoami #查看當前用戶
root
[root@chensiqi1 ~]# sed -n '92p' /etc/sudoers #讀取授權信息
chensiqi ALL=(ALL) ALL
[root@chensiqi1 ~]# visudo -c #檢查sudo配置文件是否有錯誤
/etc/sudoers: parsed OK
實例3:sudo與su兩個命令結合使用的案例
特別說明:這個案例操作,再生產環境中經常用到
[chensiqi@chensiqi1 ~]$ whoami
chensiqi
[chensiqi@chensiqi1 ~]$ sudo su - #切換root
[sudo] password for chensiqi: #輸入當前用戶密碼
[root@chensiqi1 ~]# whoami
root
[root@chensiqi1 ~]# exit
logout
[chensiqi@chensiqi1 ~]$ sudo su - chensiqi2 #切換chensiqi2用戶,因為是基於root進行切換,所以不需要密碼了
[chensiqi2@chensiqi1 ~]$ whoami
chensiqi2
實例4:chensiqi用戶通過sudo切換到chensiqi2用戶下創建目錄
[chensiqi@chensiqi1 ~]$ whoami
chensiqi
[chensiqi@chensiqi1 ~]$ sudo -u chensiqi2 mkdir /home/chensiqi2/tmpdir #臨時用chensiqi2的身份在其家目錄下創建一個文件夾
[chensiqi@chensiqi1 ~]$ ls -l /home/chensiqi2 #直接查看是不被允許的
ls: cannot open directory /home/chensiqi2: Permission denied
[chensiqi@chensiqi1 ~]$ sudo -u chensiqi2 ls -l /home/chensiqi2 #申請臨時切換chensiqi2查看
total 4
-rw-r--r--. 1 chensiqi2 chensiqi2 0 Feb 11 02:21 readme
drwxr-xr-x. 2 chensiqi2 chensiqi2 4096 Feb 21 01:51 tmpdir
[chensiqi@chensiqi1 ~]$ whoami #當前用戶還是chensiqi
chensiqi
3.2 更改授權/etc/sudoers文件的幾個方法:
1)方法一:執行visudo命令直接編輯/etc/sudoers文件(推薦)
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
chensiqi ALL=(ALL) ALL
#前面sudo實例2的授權,同樣可以設置。當然,位置未必非要在原有的配置文件root這裡。
特別說明:在沒有特殊需求的前提下,請大家一定要使用這個方法,這也是我建議同學們使用的方法,這種授權方法,缺點就是必須和系統交互才能完成授權。
2)方法二:直接修改/etc/sudoers文件方法(不推薦)
[root@chensiqi1 ~]# echo "chensiqi ALL=(ALL) ALL" >> /etc/sudoers
#通過echo命令追加一行授權規則,讓chensiqi用戶對所有的主機,可以切換所有用戶,執行所有命令。
#特別提示:對於新手,請不要使用這個命令,如果配置出錯,會導致所有普通用戶無法使用;
#下麵的很多命令做法實際上都是在為我們前面的不規範的操作再檢查處理,看看是不是有些得不償失?
[root@chensiqi1 ~]# tail -1 /etc/sudoers
chensiqi ALL=(ALL) ALL
[root@chensiqi1 ~]# visudo -c #檢測sudo配置文件語法錯誤
/etc/sudoers: parsed OK
[root@chensiqi1 ~]# ls -l /etc/sudoers
-r--r-----. 1 root root 3756 Feb 21 02:40 /etc/sudoers
提示:查看sudoers文件的許可權是否被更改了,許可權必須為440(-r--r----)否則會出現問題。
Centos5.8 sudoers有許可權屬性問題:
[root@C58 ~]# ll /etc/sudoers
-rw-r--r-- 1 root root 3403 Aug 30 02:41 /etc/sudoers
[root@C58 ~]# sudo su -
sudo:/etc/sudoers is mode 0644 ,should be 0440
sudo:no valid sudoers sources found,quitting
Centos6.4 sudoers 許可權不對也可以登錄:
[root@C64 ~]# ll /etc/sudoers
-rw-r--r-- 1 root root 4089 Aug 23 01:26 /etc/sudoers
[root@C64 ~]# su - chensiqi
[chensiqi@C64 ~]$ sudo su -
為什麼我在這裡提出並強調這個配置方法呢?就是因為這個方法雖然比較危險,但是也有優點,最主要的優點就是不需要和系統做交互,可以通過shell等腳本批量快速的添加,修改授權。
3.2.1 但以上直接修改sudoers的配置文件方法有以下需要註意的幾點:
1,echo命令是追加“>>”,不是重定向“>”,除了echo外,可以用cat,sed等命令實現類似的功能。
2,修改操作完成一定要執行visudo -c進行語法檢查,這彌補了直接修改沒有語法檢查的不足。
3,確保/etc/sudoers許可權是正確的(-r--r----),許可權不對會導致sudo功能異常(Centos6許可權不對也可以登錄,但是/etc/sudoers是440是最安全的)
4,及時對授權的操作進行測試,驗證是否正確(最好不要退出當權授權視窗,以便發現問題及時恢復)。
5,確保知道正確的root用戶密碼,以便在sudo出現問題時可以通過普通用戶等執行su - 命令切換到root進行恢復
看到了吧,有這麼多需要註意的問題,如果不註意,很可能會帶來災難性後果,因此沒有特殊緊急批量增加sudoers文件內容的需求,建議通過visudo來編輯修改,畢竟系統安全是相當重要的。
3)方法三:使用用戶組的方式實現sudo授權
通過授權一個用戶組的方式來配置/etc/sudoers,如:授權sa組具備以上所有主機的管理許可權,這樣以後有增加用戶需要相同許可權時,直接將用戶加入到sa組就可以享受sa組的sudo授權了,是不是更簡單了呢。
#這是個單用戶授權
root ALL=(ALL) ALL
#這是組授權
# %wheel ALL=(ALL) ALL
%sa ALL=(ALL) ALL
#註意用戶組授權和普通用戶的區別,開頭為“%”百分號。sa組同用戶一樣必須是已經存在的,是系統用戶組。
使用用戶組實際授權的操作過程如下:
[root@chensiqi1 ~]# echo "%sa ALL=(ALL) ALL" >> /etc/sudoers
[root@chensiqi1 ~]# visudo -c #檢查語法
/etc/sudoers: parsed OK
[root@chensiqi1 ~]# tail -1 /etc/sudoers #查看一下
%sa ALL=(ALL) ALL
3.3 /etc/sudoers的規則大致可分為兩類:
1,別名定義
2,授權規則
別名定義並不是必須的,只是在授權規則多的時候更方便授權,但授權規則是必須的。
|用戶名|主機別名=(身份別名)|授權命令|
|--|--|--|
|root|ALL=(ALL)|ALL|
|User Aliases|HOST_Alias=(Runas_Alias)|cmd_Alias|
3.3.1 HOST_Alias 定義主機別名
實際語法為:
## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhap using)
## wildcards for entire domains or IP addresses instead.
Host_Alias FILESERVERS = fs1,fs2 #請註意定義範圍,‘=’號兩邊有空格
Host_Alias MAILSERVERS = smtp,smtp2 #請註意定義規範,每個成員用逗號分隔,逗號後面有空格。
說明:
1,在生產場景中,一般情況下不需要設置主機別名,在定義授權規則時可以通過ALL來匹配所有的主機。
2,請註意上面定義的規範,有些規範雖然不是必須的,但我們還是要求能夠按照系統的標準來配置,這樣可以避免意外的問題發生。
3,以上Host Aliases內容截取自/etc/sudoers文件,最後兩行取消了註釋。
4,其實就是一個邏輯上的主機組,當多台伺服器共用一個/etc/sudoers時候會用到這個主機別名。
=========================================
## user MACHINE=COMMANDS
## The COMMANDS section may have other options added to it
## Allow root to run any commands anywhere
root | ALL=(ALL) ALL #第一個ALL就是主機別名的應用位置
例:
chensiqi 192.168.0.101=(ALL) ALL #這個的意思就是只允許在192.168.0.108這臺電腦遠程登錄的chensiqi用戶才能需有root的所有許可權。
3.3.2 User_Alias 定義用戶別名
別名成員可以是用戶,用戶組(用戶組前面要加%號)
實際語法為:
## User Aliases
## These aren't often neccessary,as you can use regular groups
## (ie,from files,LDAP,NIS,etc)in this file - just use #groupname
## rather than USERALIAS
User_Alias ADMINS = jsmith,mikem,%groupname
提示:
1,設置用戶別名也不是必須的,更多的情況,我們可以通過%groupname的方式來作為成員。
2,以上User Aliases 內容截取自/etc/sudoer文件,最後一行取消了註釋
===========================================
## user MACHINE=COMMANDS
## The COMMANDS section may have other options added to it
## Allow root to run any commands anywhere
## which machines (the sudoers file can be shared between multiple systems)
root ALL=(ALL) ALL #root用戶的位置就是用戶別名的應用位置
3.3.3 Runas_Alias 定義runas別名
這個別名指定的是“用戶身份”,即sudo允許切換到的用戶身份
實際語法為:
Runas_Alias OP = root
==========================================
## user MACHINE=COMMANDS
## The COMMANDS section may have other options added to it
## Allow root to run any commands anywhere
## which machines (the sudoers file can be shared between multiple systems)
root ALL=(ALL) ALL #小括弧中得第二個ALL位置就是Runas_Alias別名的應用位置。
實例如下:
[chensiqi@chensiqi1 ~]$ whoami
chensiqi
[chensiqi@chensiqi1 ~]$ sudo -l
User chensiqi may run the following commands on this host:
(chensiqi2) /bin/mkdir, (chensiqi2) /bin/ls #小括弧里是被授權的身份,也就是說可以sudo -u chensiqi2
[chensiqi@chensiqi1 ~]$ sudo -u root ls /root #root身份未被授權,因此被拒絕
Sorry, user chensiqi is not allowed to execute '/bin/ls /root' as root on chensiqi1.
[chensiqi@chensiqi1 ~]$ sudo -u chensiqi2 ls /home/chensiqi2 #申請以chensiqi2身份查看其家目錄,成功
ccccc
[chensiqi@chensiqi1 ~]$ ls /home/chensiqi2 #直接查看失敗
ls: cannot open directory /home/chensiqi2: Permission denied
[chensiqi@chensiqi1 ~]$
3.3.4 Cmd_Alias 定義命令別名
命令別名就是定義一個別名,包含一堆命令,即一組相關命令的集合。
提示:
1,命令別名就是設置用可以執行哪些命令。
2,以上Command Alias 內容截取自/etc/sudoer文件,最後一行取消了註釋。
==========================================
## user MACHINE=COMMANDS
## The COMMANDS section may have other options added to it
## Allow root to run any commands anywhere
## which machines (the sudoers file can be shared between multiple systems)
root ALL=(ALL) ALL #最後一個ALL的位置就是cmd_Alias命令別名
3.3.5 回顧下別名和具體授權配置的關係
用戶或組 | 主機(可以執行sudo的機器) | 可以切換的用戶角色 | |
---|---|---|---|
root | ALL= | (ALL) | ALL |
User_Alias | Host_Alias | Runas_Alias | Cmd_Alias |
用戶別名的位置 | 主機別名的位置(可以在哪個主機上執行sudo) | Runas別名的位置(以誰的身份執行sudo授權命令) | 命令別名的位置 |
什麼情況下使用上述別名?
工作中一般有多個系統用戶,需要分類,分層次管理用戶的時候
定義別名的實踐例子:
由於主機別名,在工作中使用的不多,這裡我們就不講解了,如果同學們感興趣,可以查看man sudoers或less /etc/sudoers自行查看
生產環境實例:
實例1:定義用戶別名
sa ===> system administrator
User_Alias ADMINS = chensiqi,chensiqi2,%sa #註意定義的規範
#定義系統管理用戶別名ADMINS,包含成員chensiqi,chensiqi2及sa組成員
User_Alias NETADMINS = leo,maya
#定義用戶別名NETADMINS來管理網路,包含成員leo,maya
User_Alias USERADMINS = zuma
#定義用戶別名USERADMINS來管理用戶,包含成員zuma
特別說明:為了方便管理,要儘可能使用有意義的名稱作為別名。另外,所有包含成員都必須是系統中存在的用戶或存在的組。
檢查並創建上述用戶及用戶組
[root@chensiqi1 ~]# id chensiqi
uid=500(chensiqi) gid=802(chensiqi) groups=802(chensiqi)
[root@chensiqi1 ~]# grep "^sa:" /etc/group
sa:x:801:
[root@chensiqi1 ~]# useradd leo && echo 123|passwd --stdin leo
[root@chensiqi1 ~]# useradd maya && echo 123|passwd --stdin maya
[root@chensiqi1 ~]# useradd zuma && echo 123|passwd --stdin zuma
[root@chensiqi1 ~]# useradd chensiqi2 && echo 123|passwd --stdin chensiqi2
實例2:定義命令別名
Cmd_Alias USERCMD = /usr/sbin/useradd,/user/sbin/userdel,/user/bin/passwd [A-Za-z]*,/bin/chown,/bin/chmod, ! /usr/bin/passwd root
Cmd_Alias DISKCMD = /sbin/fdisk,/sbin/parted
Cmd_Alias NETMAGCMD = /sbin/ifconfig,/etc/init.d/network
Cmd_Alias CTRLCMD = /usr/sbin/reboot,/usr/sbin/halt
特別說明:
1)所有的命令別名下的成員必須是文件或目錄的絕對路徑
2)命令別名超過一行時,可以通過“\”號換行。
3)定義時,可以通過通配符,如/usr/bin/passwd [A-Za-z]*
上述用戶和命令別名實際上就是整理如下對應關係:
實例3:定義runas別名
Runas_Alias OP = root,chensiqi
特別說明:runas別迷ing的定義不多見,不常用,瞭解即可
3.4 /etc/sudoers配置文件中的授權規則
- /etc/sudoers的授權規則就是分配許可權的執行規則,前面我們講到的定義別名主要為了更方便授權引用別名。如果系統中的普通用戶不多,在授權時可以不用定義別名,而是針對系統用戶直接授權,所以在授權規則中別名並不是必須的,這一點大家要知道下,畢竟別名的技術理解和配置還是有點難。
- 關於授權規則,通常我們可以man sudoers來查看/etc/sudoers文件的配置信息,配置文件中的例子其實已經演示的很清楚了,這裡我僅給大家做一些必要的說明,如果想詳細瞭解授權規則寫法的,可執行man sudoers或man /etc/sudoers查詢。
3.4.1 sudo授權規則實例
下麵我們結合別名授權和用戶授權規則舉幾個綜合應用的例子
實例1:對chensiqi的授權規則如下:
chensiqi ALL=/usr/sbin/useradd,/usr/sbin/userdel
在測試之前,為了防止已有的配置干擾,我們把所有配置恢復到預設情況,我們通過比速凍命令在/etc/sudoers里的內容,表示chensiqi可以在所有系統中,切換到root用戶下以root身份執行/usr/sbin/useradd和/usr/sbin/userdel命令,切換到chensiqi用戶下查看授權的結果如下:
[chensiqi@chensiqi1 ~]$ sudo -l #查看授權結果
[sudo] password for chensiqi: #輸入密碼
User chensiqi may run the following commands on this host:
(root) /usr/sbin/useradd #授權的命令
(root) /usr/sbin/userdel #授權的命令
值得註意的是,本例省略了指定切換到哪個用戶下執行/usr/sbin/useradd和/usr/sbin/userdel命令,根據之前所講,User_Alias預設情況下是切換到root用戶下執行:同時,授權時未加NOPASSWD:配置,因此預設情況下,第一次執行是需要密碼的。
實例2:對chensiqi的授權規則更改為如下:
chensiqi ALL=(root) /usr/sbin/useradd,/usr/sbin/userdel
###上面一行表示chensiqi可以在所有的主機中,切換到root下執行useradd和userdel命令,和實例1的功能是等價的。
實例3:用戶組的配置例子
在前面已經講解過了,如果用戶組出現在/etc/sudoers中,前面要加%sa
%sa ALL=/usr/sbin/*,/sbin/*
如果我們在/etc/sudoers中間加入如上一行,表示sa用戶組下的所有成員,在所有主機下,可切換到root執行/usr/sbin和/sbin目錄下所有命令,*為正則表達式寫法,表示所有。
實例4:禁止某個命令的執行
禁止某個命令的執行,要在命令動作前面加上!號:本例中也使用了通配符的*的用法:
chensiqi ALL=(ALL) /usr/sbin/*,/sbin/*,!/sbin/fdisk
這個規則表示chensiqi用戶在所有主機上可以切換到任何身份,可以運行/usr/sbin和/sbin目錄下所有命令,但fdisk命令除外。
3.4.2 sudo配置文件/etc/sudoers授權規則註意事項總結:
1)授權規則中的所有ALL字元串必須為大寫字母。
2)Cmd_ALias(命令別名):允許執行的命令是有順序的。命令的順序是從後向前,即把禁止執行的命令放在允許執行的命令的後邊。再強調下,禁止的命令儘量放在後邊
3)一行內容超長可以用“\”斜線換行。
4)“!”嘆號表示非,就是命令取反的意思,即禁止執行的命令
5)根據實際情況,來分類製作命令別名,用什麼給什麼。
3.4.3 [Centos6.7之前]關於遠程執行sudo命令
在預設情況下,我們是無法通過ssh遠程執行sudo命令的,這是因為,遠程執行sudo,那麼密碼是明文的,這是被禁止的。可是在實際生產場景中我們經常需要這樣的需求,怎麼解決呢?
localhost:~ chensiqi$ ssh chensiqi@chensiqi cat /etc/redhat-release #用普通賬號鏈接查看遠程伺服器系統版本
chensiqi@chensiqi's password:
CentOS release 6.8 (Final)
localhost:~ chensiqi$ ssh root@chensiqi sed -n '92p' /etc/sudoers #查看普通賬戶授權情況
root@chensiqi's password:
chensiqi ALL=(chensiqi2) /bin/mkdir,/bin/ls
localhost:~ chensiqi$ ssh chensiqi@chensiqi sudo ls /root #ssh遠程執行sudo命令
chensiqi@chensiqi's password:
sudo:沒有終端存在,且未指定 askpass 程式
提示:
為何會有這樣的錯誤呢?我們之所以用ssh來執行sudo其實為的就是可以免交互方式來得到我們想得到的結果。但是普通用戶sudo在申請授權的時候,是需要輸入密碼的,因此,我們想要成功,需要先進行免密碼操作。
localhost:~ chensiqi$ ssh chensiqi@chensiqi cat /etc/redhat-release #查看版本
chensiqi@chensiqi's password:
CentOS release 6.8 (Final)
localhost:~ chensiqi$ ssh root@chensiqi "sed -n '92p' /etc/sudoers" #查看授權資料
root@chensiqi's password:
chensiqi ALL=(ALL) NOPASSWD: /bin/mkdir,/bin/ls #進行了免密碼配置
localhost:~ chensiqi$ ssh chensiqi@chensiqi "sudo ls /root" #遠程執行sudo。成功!
chensiqi@chensiqi's password:
111
anaconda-ks.cfg
chen
chen2017-02-20.tar.gz
chensiqi
dsfds
ett
gsdgdsfg
install.log
sdfsdf
stu1
stu2
stu3
stu4
stu5
ww.etiantian.org
zzzz
特別提示:
設置了免密碼之後,之所以能成功,是因為linux系統版本為Centos6.8,如果是之前的系統版本。那麼我們需要做特殊處理。我們可以通過“ssh -t hostname sudo
4,項目實戰經驗:配置sudo命令用戶行為日誌審計
說明:所謂sudo命令日誌審計,並不記錄普通用戶的普通操作。而是記錄那些執行sudo命令的用戶的操作。
項目實戰:簡歷中的經驗說明模版
伺服器日誌審計項目提出與實施 20xx.0x - 20xx.xx
1,許可權方案實施後,許可權得到了細化控制,接下來進一步實施對所有用戶日誌記錄方案。
2,通過sudo和syslog(rsyslog)配合實現對所有用戶進行日誌審計並將記錄集中管理(發送到中心日誌伺服器)
3,實施後讓所有運維和開發的所有執行的sudo管理命令都有記錄可查,杜絕了內部人員的操作安全隱患。
生產環境企業日誌審計解決方案:
所謂日誌審計,就是記錄所有系統及相關用戶行為信息,並且可以自動分析,處理,展示(包括文本或者錄像)
方法一:通過環境變數命令及rsyslog服務進行所有用戶的所有操作的全部日誌審計(信息量太大,不推薦)。
方法二:sudo配合rsyslog服務,進行日誌審計(審計信息較少,效果不錯)
方法三:在bash解釋器程式里嵌入一個監視器,讓所有被審計的系統用戶使用修改過的增加了監視器的特殊bash程式作為工作環境
方法四:齊治的堡壘機:商業產品
我們今天要學習的是:sudo日誌審計:專門對使用sudo命令的系統用戶記錄其執行的命令相關信息。
方法五:python開發的開源產品
方法六:
方法七:
shell跳板機:
1)安裝sudo命令,rsyslog服務
一般情況下系統都是預設安裝了的。(Centos5為syslog)
2)配置/etc/sudoers
增加配置“Defaults logfile=/var/log/sudo.log”到/etc/sudoers中,註意:不包含引號。
[root@chensiqi ~]# echo "Defaults logfile=/var/log/sudo.log">>/etc/sudoers
一行搞定sudo日誌審計
[root@chensiqi1 ~]# tail -1 /etc/sudoers
Defaults logfile=/var/log/sudo.log
[root@chensiqi1 ~]# visudo -c #檢查sudoers文件語法
/etc/sudoers: parsed OK
提示:下麵的3),4)可以不執行,直接切換到普通操作,然後查看/var/log/sudo.log有無記錄
[root@chensiqi1 ~]# cat /var/log/sudo.log
Feb 21 11:30:55 : chensiqi : TTY=pts/0 ; PWD=/home/chensiqi ; USER=root ;
COMMAND=/bin/ls /root
3)配置系統日誌/etc/rsyslog.conf(這裡可以不配)
增加配置local2.debug到/etc/rsyslog.conf中
[root@chensiqi1 ~]# echo "local2.debug /var/log/sudo.log" >> /etc/rsyslog.conf #這裡可以不配
[root@chensiqi1 ~]# tail -1 /etc/rsyslog.conf #查看配置結果
local2.debug /var/log/sudo.log
提示:如果是Centos5系列,那麼路徑為/etc/syslog.conf
4)重啟rsyslog內核日誌記錄器
[root@chensiqi1 ~]# /etc/init.d/rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
提示:
如果是Centos5系列,啟動命令為/etc/init.d/syslog restart
此時,會自動建立一個/var/log/sudo.log文件並且文件許可權為600,所有者和組均為root
[root@chensiqi1 ~]# ll /var/log/sudo.log #確保只有root才能查看
-rw-------. 1 root chensiqi 100 Feb 21 11:30 /var/log/sudo.log
5)測試sudo日誌審計配置結果
[root@chensiqi1 ~]# whoami
root
[root@chensiqi1 ~]# su - chensiqi
[chensiqi@chensiqi1 ~]$ sudo -u chensiqi2 mkdir /home/chensiqi2/ggggg #執行sudo操作
[chensiqi@chensiqi1 ~]$ exit
logout
[root@chensiqi1 ~]# cat /var/log/sudo.log #查看日誌記錄
Feb 21 11:30:55 : chensiqi : TTY=pts/0 ; PWD=/home/chensiqi ; USER=root ;
COMMAND=/bin/ls /root
Feb 21 11:43:21 : chensiqi : TTY=pts/0 ; PWD=/home/chensiqi ; USER=chensiqi2 ;
COMMAND=/bin/mkdir /home/chensiqi2/ggggg
知識擴展:日誌集中管理(瞭解)
- rsync + inotify或定時任務+rsync,推送到日誌管理伺服器上,10.0.0.7_20170201.sudo.log
- rsyslog服務來處理
- 日誌收集解決方案:scribe,Flume,stom,logstash ELK