su指令用于切換目前使用者身份到其他使用者身份,變更時須輸入所要變更的使用者帳号與密碼。以root身份切換至普通使用者則不需要輸入密碼
su
功能描述:
身份切換,替代使用者群組ID運作指令
格式:
su –l username –c ‘command‘
su username
su - username
預設:
Centos 6 指令位置 /bin/su
Centos 7 指令位置 /usr/bin/su /bin 軟連結至 usr/bin
版本
選項
說明
示例
6
- 或 -l
變更身份時,變更環境變量為使用者的
-c 指令
執行完指定的指令後,即恢複原來的身份
--session-command=COMMAND
與-c一緻,隻是不建立新的會話
-m 或 -p
變更身份時,不變更環境變量
-s
指定要執行的shell
su變更時須輸入所要變更的使用者帳号與密碼,這在實際使用中會因為密碼而導緻安全上的問題,是以,就引出了sudo的實用性。
• sudo能夠授權指定使用者在指定主機上運作某些指令。 如果未授權使用者嘗試使用 sudo,會提示聯系管理者
• sudo可以提供日志,記錄每個使用者使用sudo操作
• sudo為系統管理者提供配置檔案,允許系統管理者集中地管理使用者的使用權限和使用的主機
• sudo使用時間戳檔案來完成類似“檢票”的系統,預設存活期為5分鐘的“入場券”
sudo
授權使用指用指令
sudo [-u user] COMMAND
-u user
切換至指定使用者, 預設為root
-l 或 -ll
列出使用者在主機上可用的和被禁止的指令
-f
指定sudoers檔案
-V
顯示配置資訊
-v
再延長密碼有效期限5分鐘,更新時間戳
-k
清除時間戳(變為1970-01-01),下次需要重新輸密碼
-K
與-k一緻,同時删除時間戳檔案
-b
在後面執行指令
-p
改變詢問密碼的提示符
如:-p ”password on %h for user %p:"
sudo配置
配置檔案
/etc/sudoers
/etc/sudoers.d/
sudo 可以解析 /etc/sudoers.d/ 目錄中的檔案,這樣就不需要編輯單一的 /etc/sudoers 檔案,可以單獨修改一個設定然後放入此目錄。目錄中配置的格式和 /etc/sudoers一樣, 優點包括:
a.可以按指定分類建立檔案
b.如果新配置有問題,可以删除這個檔案,而不用編輯 /etc/sudoers.
警告: /etc/sudoers格式錯誤會導緻sudo不可用。必須使用visudo編輯該檔案防止出錯。
#visudo -f /etc/sudoers.d/hunk 讀取并編輯/etc/sudoers.d/指定檔案

#visudo –c 檢查文法
/etc/sudoers: parsed OK
出錯的時候,會提示如下資訊,按 e 可以直接定位到出現錯誤的行

#visudo -c
/etc/sudoers.d/hunk: bad permissions, should be mode 0440
/etc/sudoers配置檔案

說明 :
1:授權規則
2:授權wheel組在任何位置執行任何指令。
3:設定sudo時免密碼
4:這一行并不是注釋,在/etc/sudoers.d/目錄的檔案會一并加載,這樣做的好處是,每個使用者生成 一個配置檔案,友善管理。
配置檔案更改後,立即生效
時間戳檔案
/var/db/sudo
日志檔案
/var/log/secure
#tail /var/log/secure

配置檔案支援使用通配符glob
?: 任意單一字元
* : 比對任意長度字元
[wxc]: 比對其中一個字元
[!wxc]: 除了這三個字元的其它字元
\x : 轉義
[[alpha]] : 字母 示例: /bin/ls [[alpha]]*
更多請參考以前筆記
配置檔案規則有兩類
1、别名定義:不是必須的
2、授權規則:必須的
授權規則格式:
文法格式:
使用者 登入主機=(代表使用者) 指令
user host=(runas) command
root ALL=(ALL) ALL

格式說明:
user: 運作指令者的身份
host: 允許在哪些主機
(runas):以哪個使用者的身份,此使用者應當有權限運作後面的指令,否則沒有意義。
command: 運作哪些指令,這裡建議使用絕對路徑。使用 逗号; 實作多行指令
其中,command一欄中的sudoedit比較特别,是授權使用者編輯檔案,而且在普通使用者執行時,隻需要這樣使用:$sudoedit /etc/sudoers.d/hunk
示例:
一個普通使用者并沒有權限挂載CD光牒
[hunk@centos7 ~]$mount /dev/sr0 /dvd
mount: only root can do that
設定sudo授權指定使用者可以挂載CD光牒和解除安裝CD光牒
# visudo
#hunk ALL=(root) /usr/bin/mount /dev/cdrom /dvd,/usr/bin/umount /dvd
這種寫法也可以,runas為空時,預設以root身份
#hunk ALL= /usr/bin/mount /dev/cdrom /dvd,/usr/bin/umount /dvd
支援通配符
#hunk ALL=/usr/bin/mount /dev/sr* /dvd,/usr/bin/mount /dev/cdrom /dvd,/usr/bin/umount /dvd
普通使用者使用方式:
# sudo mount /dev/sr0 /dvd
第一次的時候,會驗證密碼,以後每隔5分鐘會重新驗證密碼

$sudo mount /dev/sr0 /dvd
mount: /dev/sr0 is write-protected, mounting read-only
注意:
sudo的字元串必須與sudoers配置檔案要一模一樣,否則就是不比對
一些特殊的寫法:
rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm
NOPASSWD:不需要輸入密碼
PASSWD:需要輸入密碼
Defaults:hunk runas_default=user10
#1004 ALL=(root) /usr/sbin/,!/usr/sbin/ifconfig
! 排除或者了解為不能執行
Defaults:預設行為
Defaults@Host_List
Defaults:User_List
Defaults!Cmnd_List
Defaults>Runas_List
Defaults syslog=auth
Defaults>root !set_logname
Defaults:FULLTIMERS !lecture
Defaults:hunk !authenticate 不進行身份驗證
Defaults@SERVERS log_year, logfile=/var/log/sudo.log 指定這些主機的日志相關
Defaults!PAGERS noexec
sudo别名
别名有四種類型:
别名關鍵字
指派示例
User_Alias
User_Alias ADMINS = hunk, tom
Host_Alias
Host_Alias FILESERVERS = fs1, fs2
Host_Alias DNSSERVERS = 114.114.114.114,8.8.8.8
Runas_Alias
Runas_Alias OP = root
Cmnd_Alias
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
Cmnd_Alias SERVICES = /sbin/chkconfig, /usr/bin/systemctl start
别名格式:[A-Z]([A-Z][0-9]_)*
為sudo指令定義PATH環境變量
當你使用sudo去執行一個程式時,處于安全的考慮,這個程式将在一個新的、最小化的環境中執行,也就是說,諸如PATH這樣的環境變量,在sudo指令下已經被重置成預設狀态了。是以當一個剛初始化的PATH變量中不包含你所要運作的程式所在的目錄,用sudo去執行,你就會得到"command not found"的錯誤提示。
要想改變PATH在sudo會話中的初始值,用文本編輯器打開/etc/sudoers檔案,找到"secure_path"一行,當你執行sudo 指令時,"secure_path"中包含的路徑将被當做預設PATH變量使用。
Defaults secure_path = $PATH:/sbin:/bin:/usr/sbin:/usr/bin
一些示例
授權 ls /usr/local/protected
$ sudo ls /usr/local/protected
以www的身份編輯指定的檔案
$ sudoedit -u www ~www/htdocs/index.html
以組成員身份adm的檢視日志
$ sudo -g adm more /var/log/syslog
以jim的身份且使用主組為audio的身份編輯指定檔案
$ sudoedit -u jim -g audio ~jim/sound.txt
允許關機
$ sudo shutdown -r +15 "quick reboot"
在使用*号時,要特别注意安全問題
%operator ALL = /bin/cat /var/log/messages*
當以上規則時,可以比對為
$ sudo cat /var/log/messages.1
也可以比對為
$ sudo cat /var/log/messages /etc/shadow
是不是相當的危險?
可以這麼設定
%operator ALL = /bin/cat /var/log/messages*,!/bin/cat /var/log/message* *
本文轉自 ljpwinxp 51CTO部落格,原文連結:http://blog.51cto.com/191226139/2059648