系统管理员指南:使用sugroup控制su访问

运维 系统运维
系统管理员可以向用户提供 su 访问权,让用户能够切换为另一个用户,而不需要注销当前账户。使用 sugroup 让系统管理员能够通过组成员限制谁可以使用 su 访问哪个账户。sugroup 可以简化 su 权限的管理,因为处理的是组而不是大量单独的用户。

使用 sugroup 让系统管理员能够通过组成员限制谁可以使用 su 访问哪个账户。可以使用 NOT 操作符对访问控制进行进一步限制。在接受审计时,需要报告 sugroup 中有哪些成员以及他们可以使用 su 访问哪些账户。这包括生成 sugroup 成员访问报告,这一般是遵从性任务。

sugroup 概述

系统管理员可以向用户提供 su 访问权,让用户能够切换为另一个用户,而不需要注销当前账户。通常,通过设置 su 账户让用户可以临时切换为另一个账户,例如 root 用户或应用程序所有者。但是,随着应用程序支持工作量的增长,系统的维护开销也会增加。可以使用 sugroup 简化 su 权限的管理,因为处理的是组而不是大量单独的用户。

使用 sugroup 让系统管理员可以把某些用户分组在一起,向他们授予通过 su 访问不同账户的权力。用户是否是某个 AIX® 组的成员决定他是否有 su 访问权。在创建用户时,可以通过用户属性指定一个 sugroup;只有这个组的成员才能通过 su 变成这个用户。当然,执行 su 的用户需要知道密码。不属于指定的 sugroup 的其他用户不能通过 su 变成此用户,即使知道用户的密码也不行。

某些系统的安全策略可能不允许向其他用户泄露密码。在这种情况下,可以使用 sudo。稍后讨论此问题。

#p#

需要了解的命令

可以使用以下命令判断目前有哪些 sugroup:

  • lsuser
  • lsgroup

在下面的示例中,使用 lsuser 命令输出所有用户的所有 sugroup。根据系统上配置的用户数量,这个列表可能非常长:

# lsuser -a sugroups ALL
 

在创建用户时,如果没有指定 sugroup,AIX 就采用默认设置 ALL。这意味着任何组都可以通过 su 变成此用户。为了筛选出默认的 ALL,可以使用 'grep -v' 列出 sugroups 属性设置为默认值 ALL 的所有用户。把 ALL 替换为系统上的默认 sugroup:

/etc/security/user:

# lsuser -a sugroups ALL|grep -v ALL
 

使用以下代码列出单一用户(在这里是用户 pinky)及其 sugroups 属性:

# lsuser -a sugroups pinky
pinky sugroups=wasgrp,websp
 

在上面的输出中,可以看到用户 pinky 的 sugroup 是 wasgrpwebsp

使用以下代码列出 sugroup wasgrpwebsp 的成员:

# lsgroup -a users wasgrp
admin users=dxtans,pxcon,jgena
# lsgroup -a users websp
admin users=dcand,
 

现在,我们知道用户 pinky 的 sugroup 是 wasgrpwebsp,这两个组的成员可以通过 su 变成用户 pinky

dxtans,pxcon,jgena,dcand
 

可以使用 grep 工具在文件中搜索系统用户属性默认值。根据在文件中放置注释的方法不同,以下命令之一可以提取出默认值小节:

grep -p "default:" /etc/security/user
grep -v ^"*" /etc/security/user| grep -p "default:"
 

更好的方法是使用 grep 只提取出默认值小节中的 sugroups 属性:

# grep -p "default:" /etc/security/user| grep sugroups
        sugroups = ALL

 

#p#

使用 sugroup

下面通过一个示例了解如何实现 sugroup。

# lsuser -a sugroups dxtans
dxtans sugroups=ALL
 

在前面的输出中可以看出 sugroups 属性设置为 ALL。这意味着任何用户(即任何组的成员)都可以通过 su 变成用户 dxtans,只要他们知道用户 dxtans 的密码。现在,我们来修改 sugroups 属性,让它只包含组 smoke

# chuser sugroups=smoke dxtans
# lsuser -a sugroups dxtans
dxtans sugroups=smoke
 

看看组 smoke 的成员,其中只有一个成员:papa

# lsgroup -a users smoke
smoke users=papa
 

如果不属于组 smoke 的另一个用户尝试执行 su,就会发生以下情况:

$ 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)
 

执行 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 执行的身份验证是正确的,那么应该检查目标用户是否有不成功的登录尝试记录。可能是密码到期了,或者没有设置初始密码。

#p#

在任何系统上都必须有的 sugroup

到目前为止,我已经证明了创建 sugroup 比创建许多具有 su 权限的用户更方便。即使您不打算使用 sugroup,至少应该创建一个 sugroup,用它管理切换为 root 账户的 su 操作。通常,系统管理员用自己的账户登录,然后通过 su 变成 root 用户。现在演示如何只允许以下用户(他们是系统管理员)通过 su 变成 root 用户:

john,peter,jane
 

第一步是创建一个组。我们把它命名为 sysadmin,其成员是上面列出的用户。只允许这个组的成员通过 su 变成 root 用户。

创建包含成员 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
 

现在,只有 sysadmin 的成员能够通过 su 变成 root 用户。

应该不允许 root 用户通过 telnet 直接登录。 root 用户应该只能通过直接控制台登录。尽管如此,当处理更新和文件/脚本分发时,需要使用 root 用户账户跨系统执行 ssh 操作。好方法是只允许 root 用户从部署服务器执行 ssh 操作。

#p#

最初拒绝

有时候,在系统上创建新用户时,希望禁止任何用户通过 su 变成此用户。一种实现方法是创建一个没有成员的组。然后,使用这个组名作为此用户的 sugroups 属性。例如,假设有一个名为 brown 的用户。由于用户环境的敏感性,应该不允许任何用户( root 用户除外)通过 su 变成此账户。可以创建一个没有成员的 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 文件。在默认值小节的 sugroups 条目中,设置刚才创建的组:

sugroups  =  none
 

 

可以在默认值小节的 sugroups 条目中设置任何名称。当创建新用户时,AIX 会采用这个值,并不通过检查 /etc/group 确认组名是有效的。但是,仍然会应用名称长度和有效字符方面的一般限制。如果以后通过 smit 或 chuser 修改用户的 sugroups 属性,并尝试使用不存在的组名,那么会检查 /etc/group,命令会失败。

 

现在,当创建所有新用户时,在默认情况下他们的 sugroups 设置为这个组(因此任何用户都无法通过 su 变成此用户)。请注意,已经把 sugroups 设置为 ALL(默认值)的所有用户现在的 sugroups 属性值是 'none'。以后可以根据安全策略的要求逐渐放松此用户的安全限制。

#p#

sugroup 限制

正如前面提到的,除非修改默认的 sugroups 值,否则所有用户都使用默认值 (ALL)。为了进一步限制 sugroup 访问,AIX 提供了 NOT 操作符 '!'。规则的格式如下:

!<group_name >
 

通过在 sugroups 属性中使用这个规则,前面有 NOT 操作符的组就不允许通过 su 变成此用户。您可能会问 “为什么要这么做?” 对于普通用户,可以通过组指定哪些用户不允许通过 su 变成特定的用户。还可以使用这种方法临时限制某些组。这样就不需要通过创建许多个组来控制对不同账户的访问,可以大大提高 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
 

现在,如果用户 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.
 

现在通过另一个示例了解为什么可能要使用 NOT 操作符。假设我们有一个名为 ukflag 的账户。我们不希望属于组 firecloud 的用户通过 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
 

现在看看谁属于组 cloudfire,我们要禁止他们通过 su 变成用户 ukflag

# lsgroup -a users fire
fire users=plutt,echoa,golf,hotel,india,juliet,kilo

# lsgroup -a users cloud
cloud users=hotel,india
 

现在可以从 lsgroup 输出看出只允许以下用户通过 su 变成用户 ukflagzulu。还可以从 lsgroup 输出看出拒绝以下用户通过 su 变成用户 ukflagplutt,echoa,golf,hotel,india,juliet,kilo

现在,作为用户 pluttfire 组的成员)操作:

$ 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.
 

再作为用户 zuluearth 组的成员)操作:

$ id
uid=228(zulu) gid=1(staff) groups=209(earth)
$ su - ukflag
ukflag's Password:
$
 

这说明可以使用 NOT 操作符进一步调整通过 sugroups 实现的 su 访问控制。

#p#

不需要密码

在提供 su 访问时,可能不希望允许其他用户知道要通过 su 切换到的账户的密码。对于应用程序账户尤其如此,应用程序的支持用户需要获得访问权以解决问题。可以使用 sudo 让这些用户得到访问授权,而不需要知道目标账户的密码。

假设有支持用户 alpha, bravo,charlie,他们都属于组 app_supp。他们的职责要求他们能够访问生产环境账户: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 访问有时候很费时间,尤其是在处理许多系统时。最好创建一个脚本,由它生成 sugroup 和成员的快照。在清单 1 中给出一个脚本,它提供现有的 sugroup 的概况。它原来是两个脚本,但是我已经把它们合并成一个脚本。此脚本使用在 “需要了解的命令” 一节中介绍的命令。

执行此脚本时,它显示 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
 

当在我的系统上执行清单 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 让系统管理员能够通过组成员关系控制对各个用户账户的访问。sugroup 提供一种在系统上实现和管理安全策略的方法。在接受审计时,您必须向审计人员证明对普通、应用程序和系统账户的访问控制是有效的,还要展示监视 sugroup 策略的方法。本文演示了如何使用 sugroup,还提供了一个显示 sugroup 访问概况的脚本。

原文:IBMDeveloperWorks中国

【编辑推荐】

  1. FreeBSD下配置vsftpd虚拟用户
  2. Linux用户管理安全宝典:密码防破解与帐号文件保护
  3. Linux查看用户的7个命令
责任编辑:yangsai 来源: IBMDW
相关推荐

2018-08-15 14:00:18

LinuxBash系统管理员

2018-08-01 08:12:34

Linux管理员网络管理

2019-08-13 19:34:45

容器镜像DockerLinux

2013-04-17 14:37:39

Linux系统管理员susudo

2013-12-09 16:15:08

系统管理员WebminLinux服务

2010-12-28 13:22:46

2010-08-11 17:11:15

2010-05-06 18:07:33

Unix命令

2013-03-30 21:59:13

系统管理员必备工具iftop

2010-08-10 09:13:52

Unix系统管理员Ubuntu

2019-09-09 14:45:29

系统管理员SRE

2010-11-10 09:36:38

系统管理员守则

2010-04-12 09:33:58

系统管理员

2013-06-26 09:29:30

系统管理员

2013-08-20 10:11:20

Go系统管理员

2012-06-06 10:41:37

系统管理员运维

2013-09-29 09:50:21

系统管理员Ubuntu JujuJuju

2011-10-20 10:29:22

VMwareVMworld虚拟化

2009-10-22 16:53:08

2010-12-30 14:59:44

点赞
收藏

51CTO技术栈公众号