系統(tǒng)管理員指南:使用sugroup控制su訪問(wèn)
使用 sugroup 讓系統(tǒng)管理員能夠通過(guò)組成員限制誰(shuí)可以使用 su 訪問(wèn)哪個(gè)賬戶??梢允褂?NOT 操作符對(duì)訪問(wèn)控制進(jìn)行進(jìn)一步限制。在接受審計(jì)時(shí),需要報(bào)告 sugroup 中有哪些成員以及他們可以使用 su 訪問(wèn)哪些賬戶。這包括生成 sugroup 成員訪問(wèn)報(bào)告,這一般是遵從性任務(wù)。
sugroup 概述
系統(tǒng)管理員可以向用戶提供 su 訪問(wèn)權(quán),讓用戶能夠切換為另一個(gè)用戶,而不需要注銷當(dāng)前賬戶。通常,通過(guò)設(shè)置 su 賬戶讓用戶可以臨時(shí)切換為另一個(gè)賬戶,例如 root 用戶或應(yīng)用程序所有者。但是,隨著應(yīng)用程序支持工作量的增長(zhǎng),系統(tǒng)的維護(hù)開銷也會(huì)增加??梢允褂?sugroup 簡(jiǎn)化 su 權(quán)限的管理,因?yàn)樘幚淼氖墙M而不是大量單獨(dú)的用戶。
使用 sugroup 讓系統(tǒng)管理員可以把某些用戶分組在一起,向他們授予通過(guò) su 訪問(wèn)不同賬戶的權(quán)力。用戶是否是某個(gè) AIX® 組的成員決定他是否有 su 訪問(wèn)權(quán)。在創(chuàng)建用戶時(shí),可以通過(guò)用戶屬性指定一個(gè) sugroup;只有這個(gè)組的成員才能通過(guò) su 變成這個(gè)用戶。當(dāng)然,執(zhí)行 su 的用戶需要知道密碼。不屬于指定的 sugroup 的其他用戶不能通過(guò) su 變成此用戶,即使知道用戶的密碼也不行。
某些系統(tǒng)的安全策略可能不允許向其他用戶泄露密碼。在這種情況下,可以使用 sudo。稍后討論此問(wèn)題。
#p#
需要了解的命令
可以使用以下命令判斷目前有哪些 sugroup:
lsuser
lsgroup
在下面的示例中,使用 lsuser
命令輸出所有用戶的所有 sugroup。根據(jù)系統(tǒng)上配置的用戶數(shù)量,這個(gè)列表可能非常長(zhǎng):
# lsuser -a sugroups ALL |
在創(chuàng)建用戶時(shí),如果沒(méi)有指定 sugroup,AIX 就采用默認(rèn)設(shè)置 ALL。這意味著任何組都可以通過(guò) su 變成此用戶。為了篩選出默認(rèn)的 ALL,可以使用 'grep -v
' 列出 sugroups 屬性設(shè)置為默認(rèn)值 ALL 的所有用戶。把 ALL 替換為系統(tǒng)上的默認(rèn) sugroup:
/etc/security/user: # lsuser -a sugroups ALL|grep -v ALL |
使用以下代碼列出單一用戶(在這里是用戶 pinky
)及其 sugroups 屬性:
# lsuser -a sugroups pinky pinky sugroups=wasgrp,websp |
在上面的輸出中,可以看到用戶 pinky
的 sugroup 是 wasgrp
和 websp
。
使用以下代碼列出 sugroup wasgrp
和 websp
的成員:
# lsgroup -a users wasgrp admin users=dxtans,pxcon,jgena # lsgroup -a users websp admin users=dcand, |
現(xiàn)在,我們知道用戶 pinky
的 sugroup 是 wasgrp
和 websp
,這兩個(gè)組的成員可以通過(guò) su 變成用戶 pinky
:
dxtans,pxcon,jgena,dcand |
可以使用 grep
工具在文件中搜索系統(tǒng)用戶屬性默認(rèn)值。根據(jù)在文件中放置注釋的方法不同,以下命令之一可以提取出默認(rèn)值小節(jié):
grep -p "default:" /etc/security/user grep -v ^"*" /etc/security/user| grep -p "default:" |
更好的方法是使用 grep 只提取出默認(rèn)值小節(jié)中的 sugroups 屬性:
# grep -p "default:" /etc/security/user| grep sugroups sugroups = ALL |
#p#
使用 sugroup
下面通過(guò)一個(gè)示例了解如何實(shí)現(xiàn) sugroup。
# lsuser -a sugroups dxtans dxtans sugroups=ALL |
在前面的輸出中可以看出 sugroups 屬性設(shè)置為 ALL。這意味著任何用戶(即任何組的成員)都可以通過(guò) su 變成用戶 dxtans
,只要他們知道用戶 dxtans
的密碼。現(xiàn)在,我們來(lái)修改 sugroups 屬性,讓它只包含組 smoke
:
# chuser sugroups=smoke dxtans # lsuser -a sugroups dxtans dxtans sugroups=smoke |
看看組 smoke
的成員,其中只有一個(gè)成員:papa
。
# lsgroup -a users smoke smoke users=papa |
如果不屬于組 smoke
的另一個(gè)用戶嘗試執(zhí)行 su,就會(huì)發(fā)生以下情況:
$ whoami bravo $ su – dxtans dxtans's Password: 3004-307 You are not allowed to su to this account. 3004-501 Cannot su to "dxtans" : Account is not accessible. |
如果用戶 papa
嘗試通過(guò) su 變成 dxtans
而且他知道密碼,那么授予訪問(wèn)權(quán):
$ whoami papa $ su - dxtans dxtans's Password: $ id uid=203(dxtans) gid=1(staff) |
執(zhí)行 su 的嘗試被記錄在 /var/adm/sulog
中。
經(jīng)過(guò)前面的兩次 su 操作嘗試之后,日志文件中有兩個(gè)條目。加號(hào)表示用戶 papa
通過(guò) su 變成用戶 dxtans
的嘗試成功了。減號(hào)表示用戶 bravo
通過(guò) su 變成用戶 dxtans
的嘗試失敗了:
$ tail /var/adm/sulog SU 04/17 19:51 + pts/1 papa-dxtans SU 04/17 19:52 - pts/1 bravo-dxtans |
如果用戶嘗試通過(guò) su 變成另一個(gè)用戶,但是收到了 'Account is not accessible' 消息,而您確定通過(guò) sugroups 或 su 執(zhí)行的身份驗(yàn)證是正確的,那么應(yīng)該檢查目標(biāo)用戶是否有不成功的登錄嘗試記錄??赡苁敲艽a到期了,或者沒(méi)有設(shè)置初始密碼。
#p#
在任何系統(tǒng)上都必須有的 sugroup
到目前為止,我已經(jīng)證明了創(chuàng)建 sugroup 比創(chuàng)建許多具有 su 權(quán)限的用戶更方便。即使您不打算使用 sugroup,至少應(yīng)該創(chuàng)建一個(gè) sugroup,用它管理切換為 root 賬戶的 su 操作。通常,系統(tǒng)管理員用自己的賬戶登錄,然后通過(guò) su 變成 root 用戶?,F(xiàn)在演示如何只允許以下用戶(他們是系統(tǒng)管理員)通過(guò) su 變成 root 用戶:
john,peter,jane |
第一步是創(chuàng)建一個(gè)組。我們把它命名為 sysadmin
,其成員是上面列出的用戶。只允許這個(gè)組的成員通過(guò) su 變成 root 用戶。
創(chuàng)建包含成員 john,peter,jane
的組:
# mkgroup -A users="john,peter,jane" sysadmin |
確認(rèn)組成員:
# lsgroup -a users sysadmin sysadmin users=john,peter,jane |
把 root 用戶的 sugroups 設(shè)置為 sysadmin
:
# chuser sugroups=sysadmin root # lsuser -a sugroups root root sugroups=sysadmin |
現(xiàn)在,只有 sysadmin
的成員能夠通過(guò) su 變成 root 用戶。
應(yīng)該不允許 root 用戶通過(guò) telnet 直接登錄。 root 用戶應(yīng)該只能通過(guò)直接控制臺(tái)登錄。盡管如此,當(dāng)處理更新和文件/腳本分發(fā)時(shí),需要使用 root 用戶賬戶跨系統(tǒng)執(zhí)行 ssh 操作。好方法是只允許 root 用戶從部署服務(wù)器執(zhí)行 ssh 操作。
#p#
最初拒絕
有時(shí)候,在系統(tǒng)上創(chuàng)建新用戶時(shí),希望禁止任何用戶通過(guò) su 變成此用戶。一種實(shí)現(xiàn)方法是創(chuàng)建一個(gè)沒(méi)有成員的組。然后,使用這個(gè)組名作為此用戶的 sugroups 屬性。例如,假設(shè)有一個(gè)名為 brown
的用戶。由于用戶環(huán)境的敏感性,應(yīng)該不允許任何用戶( root 用戶除外)通過(guò) su 變成此賬戶??梢詣?chuàng)建一個(gè)沒(méi)有成員的 none
組:
# mkgroup -A none # lsgroup -a users none none users= |
然后,把用戶賬戶的 sugroups 屬性改為這個(gè)組:
# chuser sugroups=none brown # lsuser -a sugroups brown brown sugroups=none |
因?yàn)闆](méi)有任何用戶屬于組 none
,而這個(gè)組作為 sugroups,所以所有普通用戶都無(wú)法通過(guò) su 變成用戶 brown
。
如果希望讓這成為持久的特性,可以編輯 /etc/security/user
文件。在默認(rèn)值小節(jié)的 sugroups 條目中,設(shè)置剛才創(chuàng)建的組:
sugroups = none |
可以在默認(rèn)值小節(jié)的 sugroups 條目中設(shè)置任何名稱。當(dāng)創(chuàng)建新用戶時(shí),AIX 會(huì)采用這個(gè)值,并不通過(guò)檢查 /etc/group 確認(rèn)組名是有效的。但是,仍然會(huì)應(yīng)用名稱長(zhǎng)度和有效字符方面的一般限制。如果以后通過(guò) smit 或 chuser 修改用戶的 sugroups 屬性,并嘗試使用不存在的組名,那么會(huì)檢查 /etc/group,命令會(huì)失敗。
現(xiàn)在,當(dāng)創(chuàng)建所有新用戶時(shí),在默認(rèn)情況下他們的 sugroups 設(shè)置為這個(gè)組(因此任何用戶都無(wú)法通過(guò) su 變成此用戶)。請(qǐng)注意,已經(jīng)把 sugroups 設(shè)置為 ALL(默認(rèn)值)的所有用戶現(xiàn)在的 sugroups 屬性值是 'none'。以后可以根據(jù)安全策略的要求逐漸放松此用戶的安全限制。
#p#
sugroup 限制
正如前面提到的,除非修改默認(rèn)的 sugroups 值,否則所有用戶都使用默認(rèn)值 (ALL)。為了進(jìn)一步限制 sugroup 訪問(wèn),AIX 提供了 NOT 操作符 '!'。規(guī)則的格式如下:
!<group_name > |
通過(guò)在 sugroups 屬性中使用這個(gè)規(guī)則,前面有 NOT 操作符的組就不允許通過(guò) su 變成此用戶。您可能會(huì)問(wèn) “為什么要這么做?” 對(duì)于普通用戶,可以通過(guò)組指定哪些用戶不允許通過(guò) su 變成特定的用戶。還可以使用這種方法臨時(shí)限制某些組。這樣就不需要通過(guò)創(chuàng)建許多個(gè)組來(lái)控制對(duì)不同賬戶的訪問(wèn),可以大大提高 su 管理的靈活性。
下面通過(guò)一個(gè)示例看看使用 NOT 操作符的 sugroups 的效果。假設(shè)有一個(gè)名為 sun
的組??梢酝ㄟ^(guò)下面的 lsgroup
輸出查明這個(gè)組的成員:
# lsgroup -a users sun sun users=alpha,bravo |
所以成員是:
alpha,bravo |
我們希望允許所有用戶通過(guò) su 變成用戶 charlie
,但是拒絕組 sun
的成員,為此使用以下命令:
# chuser sugroups="!sun,ALL" charlie |
請(qǐng)注意以上命令中 NOT 操作符的次序,我們先拒絕,然后再允許。
下面的命令列出各個(gè)用戶的 sugroups 和 groups 屬性:
alpha, bravo, charlie # lsuser -a sugroups groups alpha alpha sugroups=ALL groups=staff,sun # lsuser -a sugroups groups bravo bravo sugroups=ALL groups=staff,sun # lsuser -a sugroups groups charlie charlie sugroups=!sun,ALL groups=staff |
現(xiàn)在,如果用戶 delta
(他不是受限制的組 sun
的成員)嘗試通過(guò) su 變成用戶 charlie
而且他知道密碼,那么身份驗(yàn)證會(huì)成功:
# lsuser -a sugroups groups delta delta sugroups=ALL groups=staff,water,fire,mobgrp |
作為用戶 delta
:
$ id uid=220(delta) gid=1(staff) groups=206(water),207(fire),215(mobgrp) $ su - charlie charlie's Password: $ id uid=211(charlie) gid=1(staff) |
如果用戶 alpha
(他是受限制的組 sun
的成員)嘗試通過(guò) su 變成用戶 charlie
,那么會(huì)拒絕他訪問(wèn)。
作為用戶 alpha
:
$ id uid=209(alpha) gid=1(staff) groups=214(sun) $ su - charlie charlie's Password: 3004-307 You are not allowed to su to this account. 3004-501 Cannot su to "charlie" : Account is not accessible. |
現(xiàn)在通過(guò)另一個(gè)示例了解為什么可能要使用 NOT 操作符。假設(shè)我們有一個(gè)名為 ukflag
的賬戶。我們不希望屬于組 fire
和 cloud
的用戶通過(guò) su 變成用戶 ukflag
,應(yīng)該只允許 earth
的成員。首先修改用戶 ukflag
的 sugroups 屬性,然后確認(rèn)修改:
# chuser sugroups="!fire,!cloud,earth" ukflag # lsuser -a sugroups ukflag ukflag sugroups=!fire,!cloud,earth |
允許組 earth
的成員通過(guò) su 變成用戶 ukflag
。
# lsgroup -a users earth earth users=zulu |
現(xiàn)在看看誰(shuí)屬于組 cloud
和 fire
,我們要禁止他們通過(guò) su 變成用戶 ukflag
。
# lsgroup -a users fire fire users=plutt,echoa,golf,hotel,india,juliet,kilo # lsgroup -a users cloud cloud users=hotel,india |
現(xiàn)在可以從 lsgroup
輸出看出只允許以下用戶通過(guò) su 變成用戶 ukflag
:zulu
。還可以從 lsgroup
輸出看出拒絕以下用戶通過(guò) su 變成用戶 ukflag
:plutt,echoa,golf,hotel,india,juliet,kilo
。
現(xiàn)在,作為用戶 plutt
(fire
組的成員)操作:
$ id uid=230(plutt) gid=1(staff) groups=206(water),207(fire) $ su - ukflag ukflag's Password: 3004-307 You are not allowed to su to this account. 3004-501 Cannot su to "ukflag" : Account is not accessible. |
再作為用戶 zulu
(earth
組的成員)操作:
$ id uid=228(zulu) gid=1(staff) groups=209(earth) $ su - ukflag ukflag's Password: $ |
這說(shuō)明可以使用 NOT 操作符進(jìn)一步調(diào)整通過(guò) sugroups 實(shí)現(xiàn)的 su 訪問(wèn)控制。
#p#
不需要密碼
在提供 su 訪問(wèn)時(shí),可能不希望允許其他用戶知道要通過(guò) su 切換到的賬戶的密碼。對(duì)于應(yīng)用程序賬戶尤其如此,應(yīng)用程序的支持用戶需要獲得訪問(wèn)權(quán)以解決問(wèn)題??梢允褂?sudo 讓這些用戶得到訪問(wèn)授權(quán),而不需要知道目標(biāo)賬戶的密碼。
假設(shè)有支持用戶 alpha, bravo,charlie
,他們都屬于組 app_supp
。他們的職責(zé)要求他們能夠訪問(wèn)生產(chǎn)環(huán)境賬戶:ukflag
。編輯 /etc/sudoers
文件,設(shè)置以下條目,把 rs6000 替換為自己的主機(jī)名:
%app_supp rs6000 = NOPASSWD:/usr/bin/su – ukflag |
檢查組成員:
# lsgroup -a users app_supp app_supp users=alpha,bravo,charlie |
檢查用戶是否可以通過(guò) sudo 變成 ukflag
:
$ whoami alpha $ sudo -l User alpha may run the following commands on this host: (root) NOPASSWD: /usr/bin/su - ukflag $ sudo -u root su - ukflag $ whoami ukflag |
在 sudo 中可以有許多 su 條目,只需用逗號(hào)分隔每個(gè) su 條目即可,如下所示:
%app_supp rs6000 = NOPASSWD:/usr/bin/su – ukflag, /usr/bin/su – ieflag, /usr/bin/su - plflag |
#p#
報(bào)告 sugroup
在使用 sugroup 時(shí),檢查已經(jīng)設(shè)置的所有 sugroup 訪問(wèn)有時(shí)候很費(fèi)時(shí)間,尤其是在處理許多系統(tǒng)時(shí)。最好創(chuàng)建一個(gè)腳本,由它生成 sugroup 和成員的快照。在清單 1 中給出一個(gè)腳本,它提供現(xiàn)有的 sugroup 的概況。它原來(lái)是兩個(gè)腳本,但是我已經(jīng)把它們合并成一個(gè)腳本。此腳本使用在 “需要了解的命令” 一節(jié)中介紹的命令。
執(zhí)行此腳本時(shí),它顯示 sugroups 屬性不包含 ALL 的所有用戶。然后列出用戶的 sugroups。腳本的第二部分顯示每個(gè) sugroup 及其成員。
清單 1. su_rep1
#!/bin/sh # su_rep1 list=$(cat /etc/passwd| awk -F: '{print $1}' | sort) echo "user su groups *(Denied su access) =========================================" # # display user and sugroups for loop in $list do sugrp=$(lsuser -a sugroups $loop | sed s/ALL//g | awk -F= '{print $2}'|sed 's/,/ /g') if [ "$sugrp" != "" ] then sugrp=$(echo $sugrp|sed 's/!/*/g') printf "%-10s %-40s\n" "$loop" "$sugrp" fi done # # list sugroups and members echo "\nsugroup sugroup members ==========================" sugrp_list=$(lsuser -a sugroups ALL| sed s/ALL//g | awk -F= '{print $2}'| tr " " "\n" \ |sed 's/,/ /g' | sed 's/!//g'|tr " " "\n" |awk '!array [$0]++') for loop in $sugrp_list do sugrp_list=$(lsgroup -a users $loop | awk -F= '{print $2}') if [ "$sugrp_list" = "" ] then sugrp_list=" -- No Members --" fi printf "%-10s %-40s\n" "$loop" "$sugrp_list" done |
當(dāng)在我的系統(tǒng)上執(zhí)行清單 1 中的 su_rep1 腳本時(shí),產(chǎn)生的輸出如下:
user su groups *(Denied su access) ========================================= charlie *sun dxtans smoke papa syb root admin sysadmin ukflag *fire *cloud earth xray water earth *smoke zulu fire sugroup sugroup members ========================== admin dxtans sysadmin john,peter,jane smoke papa sun alpha,bravo water delta,echoa,golf,plutt earth zulu fire delta,echoa,golf,hotel,india,juliet,kilo,plutt syb wwpdpga1,wwpdclt2,ukflag cloud hotel,india,spoll |
結(jié)束語(yǔ)
使用 sugroup 讓系統(tǒng)管理員能夠通過(guò)組成員關(guān)系控制對(duì)各個(gè)用戶賬戶的訪問(wèn)。sugroup 提供一種在系統(tǒng)上實(shí)現(xiàn)和管理安全策略的方法。在接受審計(jì)時(shí),您必須向?qū)徲?jì)人員證明對(duì)普通、應(yīng)用程序和系統(tǒng)賬戶的訪問(wèn)控制是有效的,還要展示監(jiān)視 sugroup 策略的方法。本文演示了如何使用 sugroup,還提供了一個(gè)顯示 sugroup 訪問(wèn)概況的腳本。
【編輯推薦】