首頁 > 軟體

CentOS下的sudo相關設定的總結歸納

2020-06-16 17:38:53

CentOS下的sudo相關設定的總結歸納

1 基礎部分

1.1 常用的命令列

1
2
3
4
5
6
man sudoers #參閱幫助
visudo #編輯sudoers的命令
sudo -l #檢視可執行或禁止執行的命令
sudo -u user1 /bin/ls #指定user1使用者的身份執行命令
sudo -g gp1 /bin/ls #指以gp1組的身份執行
sudo -u user1 -g gp1 /bin/ls #指定使用者和組的身份執行

1.2 組態檔路徑

1
/etc/sudoers

1.3 sudoers的規則分類

sudoers的規則分為以下兩類:

1)別名定義(可選)

2)授權規則(必選)

1.4 特殊符號的用法

1
2
3
4
5
6
7
"#" 用於註釋
"x" 跳脫字元
"" 使用到物理行行尾則把下行的物理行連線成一個邏輯行
"*" 匹配零個或多個字元
"?" 匹配單個字元
"[...]" 匹配指定範圍的字元
"[!...]" 匹配非指定範圍的字元

2 Alias(別名)

2.1 別名的型別

包含以下四種別名:User_Alias,Runas_Alias,Host_Alias,Cmnd_Alias

註:以上別名型別的書寫大小寫敏感

1
2
3
4
Alias ::= 'User_Alias'  User_Alias (':' User_Alias)* |
          'Runas_Alias' Runas_Alias (':' Runas_Alias)* |
          'Host_Alias'  Host_Alias (':' Host_Alias)* |
          'Cmnd_Alias'  Cmnd_Alias (':' Cmnd_Alias)*

2.2 別名的定義格式

2.2.1 單個別名的書寫方式

1
Alias_Type NAME = item1, item2, ...

註:別名成員以“,”號分隔

2.2.2 多個別名的書寫方式

1
Alias_Type NAME = item1, item2, item3 : NAME = item4, item5

註:以“:”號分隔

2.2.3 四種書寫簡式

1
2
3
4
5
6
7
User_Alias ::= NAME '=' User_List
  
Runas_Alias ::= NAME '=' Runas_List
  
Host_Alias ::= NAME '=' Host_List
  
Cmnd_Alias ::= NAME '=' Cmnd_List

2.3 別名定義NAME的有效字元

1
NAME ::= [A-Z]([A-Z][0-9]_)*

2.4 常見的定義範例

 

2.4.1 命令列別名的定義範例

作用:定義使用者別名和別名中包含能否執行的命令

範例:

1
2
## Networking
Cmnd_Alias NETWORKING = /sbin/route/sbin/ifconfig/bin/ping/sbin/dhclient/usr/bin/net/sbin/iptables/usr/bin/rfcomm/usr/bin/wvdial/sbin/iwconfig/sbin/mii-tool

2.4.2 使用者別名的定義範例

作用:定義使用者別名和別名中包含的使用者

1
2
## User Aliases
User_Alias NETWORKINGADMINS = user1, user2, %gp1

註:

1)組前面加“%”號

2)使用者名稱必須是系統有效的使用者

2.4.3 主機別名的定義範例

作用:定義主機別名和別名中包含的主機

範例:

1
2
## Host Aliases
Host_Alias     FILESERVERS = fs1, fs2

註:

1)伺服器fs1和fs2屬於FILESERVERS組

2)主機可以是主機名稱、IP(192.168.0.8)、或網段(192.168.0.0/24)、子網掩碼(255.255.255.0)

 

3 授權規則

3.1 授權規則的格式

1
2
3
4
5
6
7
8
9
10
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere

其實就這個意思:

1
使用者名稱或%組名 主機名稱=能否執行的命令

註:以上都可以使用別名代替

3.2 授權規則的範例

3.2.1 不使用別名的定義方式

基於系統使用者名稱的定義

1
user1 fs1=/sbin/mount /mnt/cdrom/sbin/umount /mnt/cdrom

基於系統組的定義

 

1
%gp1 fs1=/sbin/mount /mnt/cdrom/sbin/umount /mnt/cdrom

使用ALL關鍵字的定義

 

1
root    ALL=(ALL)       ALL

3.2.2 使用別名的定義方式

1
NETWORKINGADMINS FILESERVERS=(NETWORKADMINS)

註:

1)NETWORKINGADMINS代表定義過的使用者或組:user1, user2, %gp1

2)FILESERVERS代表定義過的伺服器:fs1, fs2

3)NETWORKADMINS代表定義過的命令:/sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

 

3.2.3 關閉密碼驗證提示

在命令列前加入關鍵字“NOPASSWD: ”,詳細如下:

1
%wheel        ALL=(ALL)       NOPASSWD: ALL

1
%wheel        ALL=(ALL)       NOPASSWD: /sbin/route

4 其他指令

4.1 匯入子規則

1
includedir /etc/sudoers.d

使定義於/etc/sudoers.d目錄下的子規則生效

4.2 關閉sudo命令的提示

此選項適用於使用shell中呼叫sudo執行命令時候遮蔽以下提示:

1
sudo: sorry, you must have a tty to run sudo

4.2.1 方法一

注釋掉以下行:

1
#Defaults    requiretty

4.2.2 方法二

新增以下行:

1
Defaults:user1 !requiretty

4.3 指定安全的執行路徑

1
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

5 開啟監視紀錄檔

5.1 建立紀錄檔檔案

1
touch /var/log/sudo.log

5.2 開啟sudo的紀錄檔功能

1
visudo

加入如下行:

1
2
3
Defaults logfile=/var/log/sudo.log
Defaults loglinelen=0
Defaults !syslog

5.3 設定系統紀錄檔

5.3.1 修改紀錄檔組態檔

1
vim /etc/rsyslog.conf

“local7.*”行後加入如下行:

1
local2.debug                                            /var/log/sudo.log

5.3.2 重新啟動系統紀錄檔服務

1
service rsyslog restart

5.4 測試紀錄檔

5.4.1 命令列監視紀錄檔

1
tail -f /var/log/sudo.log

5.4.2 執行指令測試

1
sudo /usr/bin/ssh root@127.0.0.1

6 應用場景

6.1 排除部分使用的情景

6.1.2 設定要求

1
2
禁止某使用者使用:su命令
允許某使用者使用:su除外命令

註:禁止的原因是因為使用者可以使用此命令提權

1
sudo su - root

6.1.2 解決方案

1) 查詢使用者的所屬組

1
 id mail

顯示如下:

1
uid=8(mail) gid=12(mail) groups=12(mail)

2) 定義方法

1
2
%mail ALL=(root) NOPASSWD: ALL
mail ALL=(root) NOPASSWD: !/bin/su

註:定義所屬組允許執行所有命令,但拒絕使用者執行su命令

3) 相對好的定義方法

1
2
%mail ALL=(root) NOPASSWD: /sbin/*,/bin/*,/usr/sbin/*,/usr/bin/*
mail ALL=(root) NOPASSWD: !/bin/su

可防止使用者使用如下方法破解:

1
2
sudo cp /bin/su assu
sudo ./assu - root

4) 相對更好的定義方法

1
2
3
%mail ALL=(root) NOPASSWD: /sbin/*,/bin/*,/usr/sbin/*,/usr/bin/*
mail ALL=(root) NOPASSWD: !/*/* /sbin/*,!/*/* /bin/*,!/*/* /usr/sbin/*,!/*/* /usr/bin/*,
                             !/bin/su

註:禁止使用者使用允許的命令操作執行命令的目錄的檔案

可防止使用者使用如下方法破解:

1
2
3
4
5
 sudo mv /bin/su /bin/assu
 #或者
 sudo cp /bin/su /bin/assu
 #然後
 sudo assu - root

5)實際上,我建議做如下設定

1
2
3
%mail ALL=(root) NOPASSWD: /sbin/*,/bin/*,/usr/sbin/*,/usr/bin/*
mail ALL=(root) NOPASSWD: !/*/* /sbin/*,!/*/* /bin/*,!/*/* /usr/sbin/*,!/*/* /usr/bin/*,
                             !/bin/su,!/usr/bin/passwd *root*,!/*/* */root/*

可防???使用者使用passwd命令操作root使用者:

1
2
3
 sudo su - root
 sudo passwd -l root
 sudo passwd -u root

或使用其他命令去操作root的家目錄

1
2
 sudo ls /root/
 sudo ls -l /root/

怎樣?腦洞大開吧?sudo是相對安全的對吧?O(∩_∩)O哈哈~

註:以上個人總結,如有錯漏歡迎指正,在下感激不盡。

 本文永久更新連結地址http://www.linuxidc.com/Linux/2016-06/132596.htm


IT145.com E-mail:sddin#qq.com