歡迎您光臨本站 註冊首頁

sudoers與用戶管理初識

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

寫在前面:
原本想從創建、修改、刪除用戶和組的相關工具與配置文件來記錄這部分內容,但是我認為這種應用層面的東西,沒有什麼理論的東西值得記錄,無非就是工具的使用。若要寫起來,也只能是以各種例子來說明各種選項的作用,就像那誰的私房裡的菜一樣,而再怎麼寫,都還不如info頁上的清晰明了。我覺得工具的學習,該是看過info頁和--help上的信息后,了解到這個命令是幹什麼工作的,等到要實現相關功能的時候,知道用什麼命令就行了,細節上的選項,到時候再查help卻也不遲。所以這篇我重點記錄sudo的配置文件的內容說明,而其它用戶管理相關的工具,我偏向一筆帶過。


出於管理與安全的需要,有時候需要切換到root賬號或其它賬號以進行相關的工作。有兩個命令可以實現用戶的切換,su與sudo。
su的使用很簡單:
su [OPTION]... [USER [ARG]...]
沒有指定用戶則是?認切換到root。su?認是非no-login shell方式執行的,若讓它以login shell方式執行,則要帶上-l或-(dash)選項執行。我現在的理解這兩種shell的區別就是login shell能得到目標用戶環境。
如果以su切換到root,需要用戶輸入root的密碼,這顯然是不合理的。而sudo允許一個在/etc/sudoers被授權的用戶以root或其它用戶的身份來執行命令,只需要自己的密碼或者不用密碼。
如果簡單的要讓一個用戶能使用sudo來執行命令,只需要在/etc/sudoers里添加這樣一行就行,建議的是用visudo命令來編輯這個文件,說是為了語法的正確:
ALL ALL = (ALL) ALL
或者更簡單寫成這樣:
ALL ALL = ALL
你可以用sudo -v來測試你是否已經在/etc/sudoers被授權。sudo為了安全,?認15分鐘之後本次的授權就會超時,若要繼續就要重新驗證身份。這條命令的作用就是更新用戶的時間戳,而不執行命令。
$ sudo -v
Sorry, user Guin may not run sudo. <==Guin未被授權
$ sudo -v
[sudo] password for Guin: <==待我『su -』到root添加上述語句之後可用

sudoers里用戶授權規則的語法形式就是上面這條語句這個樣子的。ALL是sudoers里的一個關鍵字,它匹配一切。sudoers里授權規則的基本結構可以描述為:
誰 在哪 = (代表誰) 幹什麼 <== who where = (as_whom) what
上面這個括弧是語法里的一部分,如果要這部分,就是要加上括弧的。可以知道,ALL ALL = ALL 的意思是任何人可以在任何主機上執行任何命令。顯然這非常的BUG,對於個人也許無所謂,但對於Linux這個中央集權的世界,這種讓普通人擁有無限權利的語句是讓人非常不安的。
下面是關於sudoers這個文件內容的簡單說明。一些概念的描述會用到EBNF符號集,它的規則類似於層層剝離的來解釋東西。事實上用EBNF解釋似乎使問題更複雜,我只是覺得多了解一新事物沒什麼不好。EBNF的語法規則很簡單,是這樣的:
symbol ::= definition | alternate1 | alternate2...
『::=』 這個符號的意思可以翻譯為「就是」,『|』 的意思是「或者」。這個語句解釋為:symbol這個東西就是definition,或者也可以是 alternate1, 或者也可以是 alternate2 等等。EBNF會用到一些算符,規則與正則表達式一樣:

? 前面的符號可以出現0次或1次
* 前面的符號可以出現0次以上
+ 前面的符號可以出現1次以上
() 裡面的是符號組
『』 單引號裡面的是字面引用

sudoers里的內容可以概括為主要由兩部分內容組成:別名與授權規則。
授權規則里的who where as_whom what都可以定義別名。就像定義變數那樣,用User_Alias, Host_Alias, Runas_Alias,Cmnd_Alias這四個別名類型關鍵字分別定義用戶、主機、對象、命令的別名。用EBNF表示別名如下:

別名 ::= 'User_Alias' 用戶別名 (':' 用戶別名)* |
'Runas_Alias' 對象別名 (':' 對象別名)* |
'Host_Alias' 主機別名 (':' 主機別名)* |
'Cmnd_Alias' 命令別名 (':' 命令別名)*

用戶別名 ::= 大寫名字 '=' 用戶表
對象別名 ::= 大寫名字 '=' 對象表
主機別名 ::= 大寫名字 '=' 主機表
命令別名 ::= 大寫名字 '=' 命令表
大寫名字 ::= [A-Z]([A-Z][0-9]_)*

之上也不好解釋,理解了EBNF就自然懂了,可以解釋為:別名就是『某別名類型 某別名『這種形式的,有四種情況。某別名就是』大寫名字 = 某『這種形式的。大寫名字要大寫字母或大寫字母加上數字或加上下劃線。
每個別名用這種形式定義:

別名類型 大寫名字 = 項目1, 項目2, ...

可以把同類型的別名定義放在同一行,用冒號隔開:

別名類型 大寫名字 = 項目1, 項目2, 項目3 :大寫名字 = 項目4, 項目5

在用戶別名中的用戶表,可以直接是一個或多個用戶名。還可以是#uid,或者是%組名,+網路組,%:非unix組。也可以是另一個用戶別名。用戶表中的項目可以在其前面加上奇數個!來表示否定它,偶數個就好像沒有嘆號一樣。這些項目還可以帶上雙引號來避免特殊字元的轉義。對象別名與用戶別名本質上是一樣的,都表達的是一些用戶。

用戶表 ::= 用戶 | 用戶 ',' 用戶表
用戶 ::= '!'* 用戶名 | '!'* '#'uid | '!'* '%'組名 |
'!'* '+'網路組 | '!'* '%:'非unix組 |'!'* 用戶別名

針對上面的內容,作一些示例:
# User alias specification
User_Alias FULLTIMERS = millert, mikef, dowdy
User_Alias PARTTIMERS = bostley, jwfox, crawl
# Runas alias specification
Runas_Alias OP = root, operator
Runas_Alias DB = oracle, sybase
了解了這些可以對原來的3ALL語句通過定義用戶別名來改寫一下:
User_Alias GUIN = Guin
Runas_Alias OP = root
GUIN ALL = (OP) ALL
這條語句指別名GUIN里指定的用戶可以在任何主機上代表OP里指定的用戶執行任何命令,也就是說,Guin可以在在任何主機上代表root執行任何命令。下面這樣也是正確的:
User_Alias GUIN = Guin
User_Alias GUIN1 = GUIN
Runas_Alias OP = root
GUIN1 ALL = (OP) ALL

各種別名的定義形式上是一樣的,不用的是各自的表中所能帶的內容不同而已。主機別名中的主機可以主機名、IP地址、網路組等;命令別名中的命令可以是文件,也可以是目錄。EBNF表示如下:

主機表 ::= 主機 |
主機 ',' 主機表
主機 ::= '!'* 主機名 |
'!'* IP地址 |
'!'* network(/netmask)? |
'!'* '+'網路組 |
'!'* 主機別名

命令表 ::= 命令 | 命令 ',' 命令表
命令 ::= '!'* 命令名 |'!'* 目錄 | '!'* "sudoedit" | '!'* 命令別名
命令名 ::= 文件名 | 文件名 參數 | 文件名 '""'

命令表中只有文件名就表示可以帶任何參數執行;文件名 「」 表示這個命令不可以帶參數執行;目錄名要以/結尾,指定了目錄用戶就可以執行這個目錄下的所有文件,但不包括子目錄里的。主機名、路徑名和命令參數允許使用通配符。/usr/bin/* 匹配/usr/bin/who 但不匹配/usr/bin/X11/xterm 也就是說,/(slash)不會被匹配。如下對原來的sudoers文件繼續改寫:
User_Alias GUIN = Guin
Host_Alias GN = host_name <==host_name代表主機名
Runas_Alias OP = root
Cmnd_Alias RV06 = /sbin/halt, /sbin/shutdown, /sbin/reboot
Cmnd_Alias SU01 = /bin/su ""

GUIN GN = (OP) RV06 <==GUIN里的用戶可以在GN上代表OP執行RV06里的命令
GUIN GN = (OP) SU01 <==只能不帶參數執行su
%Guin GN = !/usr/bin/passwd root <==Guin這組的人將不能修改root的密碼,Guin這裡是個組名

上面的最後三條就是授權規則,由它決定什麼用戶可以在哪台主機執行什麼命令。它的EBNF表示為:
授權規則 ::= 用戶表 主機表 '=' 特定命令表 (':' 主機表 '=' 特定命令表)*
比如如上其中兩條可以寫成這樣 Guin GN = RV06 : GN = SU01
特定命令表 ::= 特定命令 | 特定命令 ',' 特定命令表
特定命令 ::= 特定對象? 特定標誌* 命令
特定對象 ::= '(' 對象表? (':' 對象表)? ')'
特定標誌 ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' |
'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' |
'NOLOG_INPUT:' |'LOG_OUTPUT:' | 'NOLOG_OUTPUT:')

特定對象可以是(對象表:對象表)這種形式的,最多只能兩個對象表。第一個指定的是運行sudo帶上-u選項時代表的對象,第二個指定的帶上-g選項時代表的對象。如果兩條都指定了,用戶就可以以任意形式代表對象表裡用戶和組來執行命令。如果沒有指定對象,那就是代表擁有高度權利的root。
特定對象指定了其後面命令的?認行為,例子:
dbg boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm
用戶dbg可以以operator的身份(代表operator)執行/bin/ls, /bin/kill, /usr/bin/lprm這些命令。就需要這樣執行命令
$ sudo -u operator /bin/ls
還可以在一條目的後面無視前面的特定對象。如:
dbg boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm
用戶dbg現在可以代表operatr執行/bin/ls,代表root執行之後的命令。
讓用戶可以代表用戶或代表組去執行命令:
dbg boulder = (operator : operator) /bin/ls

特定標誌有8個:NOPASSWD,PASSWD,NOEXEC,EXEC,NOSETENV,SETENV,NOLOG_INPUT,LOG_INPUT,NOLOG_OUTPUT,LOG_OUPUT。它們在使用的時候後面都要接上冒號。
?認下,sudo需要用戶驗證自己的身份,帶上NOPASSWD其後的命令就可以不需要密碼執行了。
ray rushmore = NOPASSWD: /bin/kill, bin/ls, /usr/bin/lprm
ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm 這樣就只有/bin/kill不需要密碼。

了解了上面的授權規則,如果想sudo的時候不輸入密碼,原本的授權規則就可以改寫為:
GUIN GN = (root) NOPASSWD: RV06, SU01,!/usr/bin/passwd root

以上內容是info頁的整理翻譯,並且省略了Defaults和sudoers option部分的內容。當我了解到一些內容讓我能正式理解某項內容是怎麼回事之後,我便不再深入。下面簡單記錄下其它用戶管理相關的內容,從添加用戶開始說起吧。

添加用戶工具:adduser。添加用戶還有另一個工具useradd。Debian系統推薦使用前者,我也發現adduser更簡單些,用它可以實現添加新用戶、添加用戶組、將一個已存在的用戶添加到另一個已存在的用戶組,可以用--help查看相關選項。與這個工具本身相關的配置文件是/etc/adduser.conf。裡邊指定了創建新用戶時用什麼shell,家目錄放哪,用戶的UID/GID範圍,系統用戶的UID/GID範圍,新建用戶時要不要建立一個同名的組等相關信息。裡面有一個變數SKEL,這個變數為用戶提供一個統一、標準的、默認的用戶環境。這個變數指定的目錄中的內容將會被複制到新建用戶的家目錄中。?認一般是SKEL=/etc/skel。
# adduser guin
正在添加用戶"guin"...
正在添加新組"guin" (1001)...
正在添加新用戶"guin" (1001) 到組"guin"...
創建主目錄"/home/guin"...
正在從"/etc/skel"複製文件...
輸入新的 UNIX 密碼:
重新輸入新的 UNIX 密碼:
passwd:已成功更新密碼
#

添加用戶時發生了這許多事情,實際上只是在幾個配置文件寫進幾條記錄而已。先看/etc/passwd這個文件,這裡面被添加了這樣一條:
# cat /etc/passwd | grep 'guin'
guin:x:1001:1001:,,,:/home/guin:/bin/bash

passwd文件是帳戶列表,給出每個帳戶一些有用的信息,比如UID,GID,家目錄,shell,等.
每行一條記錄,並且每行有這樣的格式:
account:password:UID:GID:GECOS:directory:shell
(帳號:密碼:UID:GID:一般的信息:目錄:shell)
為了安全,這個文件有一個影象文件/etc/shadow,裡面存放一些與密碼相關的信息:
# cat /etc/shadow | grep 'guin'
guin:$6$PYE7/ADe$OESsb512byQi6291bqTpACCNMIoQkh0:15100:0:99999:7:::

(login:password:last:minimum:maxmum:warning:inactivity:expiration: )
(賬號:加密密碼:上次密碼修改時間:最短密碼時效:最長密碼時效:密碼到期警告:到期延續時間:賬號終止時間:保留域)

第三欄位的上次修改密碼時間和第八欄位是從1970-1-1開始算的。第四欄位最短密碼時效表達的是在這個時間內密碼不得被再次修改,第五欄位則表達這個時間之後密碼必須修改一下。第七欄位指密碼到期之後,用戶必須在這個時間裡修改密碼,過期不候。

修改密碼用passwd命令,用passwd -S user_name可以查看與密碼相關的信息:
# passwd -S guin
guin P 05/06/2011 0 99999 7 -1
也可以使用chage命令(change age)來查看,chage -l user_name。
由於配置文件起的作用,新建用戶時建立了一個同名的組,與組相關的文件/etc/group, /etc/gshadow就被寫入了一條目:
# cat /etc/group | grep 'guin'
guin:x:1001:
這個文件是組列表文件,每行都有這樣的格式:
group_name:password:GID:user_list
(組名:密碼:GID:用戶列表)
# cat /etc/gshadow | grep 'guin'
guin:!::
這個文件是/etc/group的影像文件,每行都有這樣的格式:
(groupname:password:admin,admin_list:member_list)
(組名:密碼:組管理員:成員列表)
了解了上面的內容,就可以手工在/etc/passwd, /etc/group里添加用戶與組的數據。然後用pwconv命令將/etc/passwd數據同步到/etc/shadow。grpconv命令同步/etc/group到/etc/gshadow。也可以用pwck,grpck檢驗對應文件的完整性。

如果需要將已存在的用戶添加到其它組中,使一個用戶被多個組支持,上面提過,也可以用adduser命令,添加新組也可以用它也可以用addgroup, groupadd這兩個命令。
# adduser guin users
正在添加用戶"guin"到"users"組...
正在將用戶「guin」加入到「users」組中
完成。
如上就使guin得到了users組的支持。用groups查看用戶屬於哪些群組,第一個便是有效群組。用id命令也可以用戶的各種信息。
# groups guin
guin : guin users <==當前的有效群組是guin
# id guin
uid=1001(guin) gid=1001(guin) 組=1001(guin),100(users)
有效群組的意思就是用戶現在的行為代表著那個群組,比如用戶現在創建一個文件,文件的所屬群組是屬於有效群組的。用newgrp改變有效群組。newgrp的用途是?陸到新的用戶組中。如果沒指定組,則進入/etc/passwd里指定的那個真實群組。
# su guin
$ newgrp users
$ groups
users guin <==users組排到了前面。

usermod修改一個用戶賬號,包括初始群組、屬組、?陸名、shell、家目錄、各種密碼日期等。被修改的用戶必須當前不在線。用deluser刪除用戶,命令詳細參考--help 和 info 檔。這個工具還受文件/etc/deluser.conf支配。w 查看當前?陸用戶和他們的進程。/var/run/utmp這個文件是已?陸系統用戶的信息。who查看?陸用戶的信息。?認它查看/var/run/utmp。可以提供/var/log/wtmp以查看先前?陸的用戶。lastlog報告最近?陸的所有用戶,它查看/var/log/lastlog的內容並列印。

總結起來與用戶管理相關的內容就是對soduers, passwd, shadow, group, gshadow 這5個文件的認識。理解了它們,便完成了對用戶管理內容的初識。更進階的內容就是PAM,一個可插拔認證模塊。PAM(Pluggable Authentication Modules )是由Sun提出的一種認證機制。它涉及的內容太深,暫不了解也罷。

晚安,童鞋們。

[火星人 ] sudoers與用戶管理初識已經有559次圍觀

http://coctec.com/docs/linux/show-post-142221.html