系統(tǒng)管理員指南:使用sugroup控制su訪問
使用 sugroup 讓系統(tǒng)管理員能夠通過組成員限制誰可以使用 su 訪問哪個賬戶。可以使用 NOT 操作符對訪問控制進行進一步限制。在接受審計時,需要報告 sugroup 中有哪些成員以及他們可以使用 su 訪問哪些賬戶。這包括生成 sugroup 成員訪問報告,這一般是遵從性任務。
sugroup 概述
系統(tǒng)管理員可以向用戶提供 su 訪問權,讓用戶能夠切換為另一個用戶,而不需要注銷當前賬戶。通常,通過設置 su 賬戶讓用戶可以臨時切換為另一個賬戶,例如 root 用戶或應用程序所有者。但是,隨著應用程序支持工作量的增長,系統(tǒng)的維護開銷也會增加。可以使用 sugroup 簡化 su 權限的管理,因為處理的是組而不是大量單獨的用戶。
使用 sugroup 讓系統(tǒng)管理員可以把某些用戶分組在一起,向他們授予通過 su 訪問不同賬戶的權力。用戶是否是某個 AIX® 組的成員決定他是否有 su 訪問權。在創(chuàng)建用戶時,可以通過用戶屬性指定一個 sugroup;只有這個組的成員才能通過 su 變成這個用戶。當然,執(zhí)行 su 的用戶需要知道密碼。不屬于指定的 sugroup 的其他用戶不能通過 su 變成此用戶,即使知道用戶的密碼也不行。
某些系統(tǒng)的安全策略可能不允許向其他用戶泄露密碼。在這種情況下,可以使用 sudo。稍后討論此問題。
#p#
需要了解的命令
可以使用以下命令判斷目前有哪些 sugroup:
lsuser
lsgroup
在下面的示例中,使用 lsuser
命令輸出所有用戶的所有 sugroup。根據(jù)系統(tǒng)上配置的用戶數(shù)量,這個列表可能非常長:
# lsuser -a sugroups ALL |
在創(chuàng)建用戶時,如果沒有指定 sugroup,AIX 就采用默認設置 ALL。這意味著任何組都可以通過 su 變成此用戶。為了篩選出默認的 ALL,可以使用 'grep -v
' 列出 sugroups 屬性設置為默認值 ALL 的所有用戶。把 ALL 替換為系統(tǒng)上的默認 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
,這兩個組的成員可以通過 su 變成用戶 pinky
:
dxtans,pxcon,jgena,dcand |
可以使用 grep
工具在文件中搜索系統(tǒng)用戶屬性默認值。根據(jù)在文件中放置注釋的方法不同,以下命令之一可以提取出默認值小節(jié):
grep -p "default:" /etc/security/user grep -v ^"*" /etc/security/user| grep -p "default:" |
更好的方法是使用 grep 只提取出默認值小節(jié)中的 sugroups 屬性:
# grep -p "default:" /etc/security/user| grep sugroups sugroups = ALL |
#p#
使用 sugroup
下面通過一個示例了解如何實現(xiàn) sugroup。
# lsuser -a sugroups dxtans dxtans sugroups=ALL |
在前面的輸出中可以看出 sugroups 屬性設置為 ALL。這意味著任何用戶(即任何組的成員)都可以通過 su 變成用戶 dxtans
,只要他們知道用戶 dxtans
的密碼。現(xiàn)在,我們來修改 sugroups 屬性,讓它只包含組 smoke
:
# chuser sugroups=smoke dxtans # lsuser -a sugroups dxtans dxtans sugroups=smoke |
看看組 smoke
的成員,其中只有一個成員:papa
。
# lsgroup -a users smoke smoke users=papa |
如果不屬于組 smoke
的另一個用戶嘗試執(zhí)行 su,就會發(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
嘗試通過 su 變成 dxtans
而且他知道密碼,那么授予訪問權:
$ whoami papa $ su - dxtans dxtans's Password: $ id uid=203(dxtans) gid=1(staff) |
執(zhí)行 su 的嘗試被記錄在 /var/adm/sulog
中。
經過前面的兩次 su 操作嘗試之后,日志文件中有兩個條目。加號表示用戶 papa
通過 su 變成用戶 dxtans
的嘗試成功了。減號表示用戶 bravo
通過 su 變成用戶 dxtans
的嘗試失敗了:
$ tail /var/adm/sulog SU 04/17 19:51 + pts/1 papa-dxtans SU 04/17 19:52 - pts/1 bravo-dxtans |
如果用戶嘗試通過 su 變成另一個用戶,但是收到了 'Account is not accessible' 消息,而您確定通過 sugroups 或 su 執(zhí)行的身份驗證是正確的,那么應該檢查目標用戶是否有不成功的登錄嘗試記錄。可能是密碼到期了,或者沒有設置初始密碼。
#p#
在任何系統(tǒng)上都必須有的 sugroup
到目前為止,我已經證明了創(chuàng)建 sugroup 比創(chuàng)建許多具有 su 權限的用戶更方便。即使您不打算使用 sugroup,至少應該創(chuàng)建一個 sugroup,用它管理切換為 root 賬戶的 su 操作。通常,系統(tǒng)管理員用自己的賬戶登錄,然后通過 su 變成 root 用戶。現(xiàn)在演示如何只允許以下用戶(他們是系統(tǒng)管理員)通過 su 變成 root 用戶:
john,peter,jane |
第一步是創(chuàng)建一個組。我們把它命名為 sysadmin
,其成員是上面列出的用戶。只允許這個組的成員通過 su 變成 root 用戶。
創(chuàng)建包含成員 john,peter,jane
的組:
# mkgroup -A users="john,peter,jane" sysadmin |
確認組成員:
# lsgroup -a users sysadmin sysadmin users=john,peter,jane |
把 root 用戶的 sugroups 設置為 sysadmin
:
# chuser sugroups=sysadmin root # lsuser -a sugroups root root sugroups=sysadmin |
現(xiàn)在,只有 sysadmin
的成員能夠通過 su 變成 root 用戶。
應該不允許 root 用戶通過 telnet 直接登錄。 root 用戶應該只能通過直接控制臺登錄。盡管如此,當處理更新和文件/腳本分發(fā)時,需要使用 root 用戶賬戶跨系統(tǒng)執(zhí)行 ssh 操作。好方法是只允許 root 用戶從部署服務器執(zhí)行 ssh 操作。
#p#
最初拒絕
有時候,在系統(tǒng)上創(chuàng)建新用戶時,希望禁止任何用戶通過 su 變成此用戶。一種實現(xiàn)方法是創(chuàng)建一個沒有成員的組。然后,使用這個組名作為此用戶的 sugroups 屬性。例如,假設有一個名為 brown
的用戶。由于用戶環(huán)境的敏感性,應該不允許任何用戶( root 用戶除外)通過 su 變成此賬戶。可以創(chuàng)建一個沒有成員的 none
組:
# mkgroup -A none # lsgroup -a users none none users= |
然后,把用戶賬戶的 sugroups 屬性改為這個組:
# chuser sugroups=none brown # lsuser -a sugroups brown brown sugroups=none |
因為沒有任何用戶屬于組 none
,而這個組作為 sugroups,所以所有普通用戶都無法通過 su 變成用戶 brown
。
如果希望讓這成為持久的特性,可以編輯 /etc/security/user
文件。在默認值小節(jié)的 sugroups 條目中,設置剛才創(chuàng)建的組:
sugroups = none |
可以在默認值小節(jié)的 sugroups 條目中設置任何名稱。當創(chuàng)建新用戶時,AIX 會采用這個值,并不通過檢查 /etc/group 確認組名是有效的。但是,仍然會應用名稱長度和有效字符方面的一般限制。如果以后通過 smit 或 chuser 修改用戶的 sugroups 屬性,并嘗試使用不存在的組名,那么會檢查 /etc/group,命令會失敗。
現(xiàn)在,當創(chuàng)建所有新用戶時,在默認情況下他們的 sugroups 設置為這個組(因此任何用戶都無法通過 su 變成此用戶)。請注意,已經把 sugroups 設置為 ALL(默認值)的所有用戶現(xiàn)在的 sugroups 屬性值是 'none'。以后可以根據(jù)安全策略的要求逐漸放松此用戶的安全限制。
#p#
sugroup 限制
正如前面提到的,除非修改默認的 sugroups 值,否則所有用戶都使用默認值 (ALL)。為了進一步限制 sugroup 訪問,AIX 提供了 NOT 操作符 '!'。規(guī)則的格式如下:
!<group_name > |
通過在 sugroups 屬性中使用這個規(guī)則,前面有 NOT 操作符的組就不允許通過 su 變成此用戶。您可能會問 “為什么要這么做?” 對于普通用戶,可以通過組指定哪些用戶不允許通過 su 變成特定的用戶。還可以使用這種方法臨時限制某些組。這樣就不需要通過創(chuàng)建許多個組來控制對不同賬戶的訪問,可以大大提高 su 管理的靈活性。
下面通過一個示例看看使用 NOT 操作符的 sugroups 的效果。假設有一個名為 sun
的組。可以通過下面的 lsgroup
輸出查明這個組的成員:
# lsgroup -a users sun sun users=alpha,bravo |
所以成員是:
alpha,bravo |
我們希望允許所有用戶通過 su 變成用戶 charlie
,但是拒絕組 sun
的成員,為此使用以下命令:
# chuser sugroups="!sun,ALL" charlie |
請注意以上命令中 NOT 操作符的次序,我們先拒絕,然后再允許。
下面的命令列出各個用戶的 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
的成員)嘗試通過 su 變成用戶 charlie
而且他知道密碼,那么身份驗證會成功:
# 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
的成員)嘗試通過 su 變成用戶 charlie
,那么會拒絕他訪問。
作為用戶 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)在通過另一個示例了解為什么可能要使用 NOT 操作符。假設我們有一個名為 ukflag
的賬戶。我們不希望屬于組 fire
和 cloud
的用戶通過 su 變成用戶 ukflag
,應該只允許 earth
的成員。首先修改用戶 ukflag
的 sugroups 屬性,然后確認修改:
# chuser sugroups="!fire,!cloud,earth" ukflag # lsuser -a sugroups ukflag ukflag sugroups=!fire,!cloud,earth |
允許組 earth
的成員通過 su 變成用戶 ukflag
。
# lsgroup -a users earth earth users=zulu |
現(xiàn)在看看誰屬于組 cloud
和 fire
,我們要禁止他們通過 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
輸出看出只允許以下用戶通過 su 變成用戶 ukflag
:zulu
。還可以從 lsgroup
輸出看出拒絕以下用戶通過 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: $ |
這說明可以使用 NOT 操作符進一步調整通過 sugroups 實現(xiàn)的 su 訪問控制。
#p#
不需要密碼
在提供 su 訪問時,可能不希望允許其他用戶知道要通過 su 切換到的賬戶的密碼。對于應用程序賬戶尤其如此,應用程序的支持用戶需要獲得訪問權以解決問題。可以使用 sudo 讓這些用戶得到訪問授權,而不需要知道目標賬戶的密碼。
假設有支持用戶 alpha, bravo,charlie
,他們都屬于組 app_supp
。他們的職責要求他們能夠訪問生產環(huán)境賬戶:ukflag
。編輯 /etc/sudoers
文件,設置以下條目,把 rs6000 替換為自己的主機名:
%app_supp rs6000 = NOPASSWD:/usr/bin/su – ukflag |
檢查組成員:
# lsgroup -a users app_supp app_supp users=alpha,bravo,charlie |
檢查用戶是否可以通過 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 條目,只需用逗號分隔每個 su 條目即可,如下所示:
%app_supp rs6000 = NOPASSWD:/usr/bin/su – ukflag, /usr/bin/su – ieflag, /usr/bin/su - plflag |
#p#
報告 sugroup
在使用 sugroup 時,檢查已經設置的所有 sugroup 訪問有時候很費時間,尤其是在處理許多系統(tǒng)時。最好創(chuàng)建一個腳本,由它生成 sugroup 和成員的快照。在清單 1 中給出一個腳本,它提供現(xiàn)有的 sugroup 的概況。它原來是兩個腳本,但是我已經把它們合并成一個腳本。此腳本使用在 “需要了解的命令” 一節(jié)中介紹的命令。
執(zhí)行此腳本時,它顯示 sugroups 屬性不包含 ALL 的所有用戶。然后列出用戶的 sugroups。腳本的第二部分顯示每個 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 |
當在我的系統(tǒng)上執(zhí)行清單 1 中的 su_rep1 腳本時,產生的輸出如下:
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 |
結束語
使用 sugroup 讓系統(tǒng)管理員能夠通過組成員關系控制對各個用戶賬戶的訪問。sugroup 提供一種在系統(tǒng)上實現(xiàn)和管理安全策略的方法。在接受審計時,您必須向審計人員證明對普通、應用程序和系統(tǒng)賬戶的訪問控制是有效的,還要展示監(jiān)視 sugroup 策略的方法。本文演示了如何使用 sugroup,還提供了一個顯示 sugroup 訪問概況的腳本。
【編輯推薦】