系统管理指南:安全性服务

第 3 部分 角色、权限配置文件和权限

本节介绍了基于角色的访问控制 (role-based access control, RBAC) 和进程权利管理。RBAC 组件包括角色、权限配置文件和授权。进程权利管理通过权限实现。在 RBAC 中使用权限可以提供一种比通过超级用户角色管理系统更为安全的管理替代方法。

第 8 章 使用角色和权限(概述)

Solaris 基于角色的访问控制 (role-based access control, RBAC) 和权限提供了更为安全的超级用户替代项。本章概述了有关 RBAC 以及相应权限的信息。

以下是本章中概述信息的列表:

基于角色的访问控制(概述)

基于角色的访问控制 (Role-based access control, RBAC) 是一种安全功能,用于控制用户访问那些通常仅限于超级用户访问的任务。通过对进程和用户应用安全属性,RBAC 可以在多个管理员之间划分超级用户的功能。进程权利管理通过权限实现。用户权利管理通过 RBAC 实现。

RBAC:超级用户模型的替代项

在传统的 UNIX 系统中,root 用户(也称为超级用户)可执行所有功能。以 root 身份运行的程序或 setuid 程序可执行所有功能。root 用户可以读取和写入任何文件,运行所有程序,以及向任何进程发送中止信号。实际上,任何可成为超级用户的用户都能够修改站点的防火墙,更改审计跟踪,读取机密记录以及关闭整个网络。被非法修改的 setuid 程序可以在系统上执行任何操作。

基于角色的访问控制 (Role-based access control, RBAC) 提供了更为安全的全有或全无型超级用户模型替代项。使用 RBAC,可以在划分更精细的级别上强制执行安全策略。RBAC 使用最低权限的安全原则。最低权限表示用户仅具有执行某项作业所需的权限。普通用户具有足够权限来使用其应用程序、检查其作业状态、列显文件、创建新文件等。超出普通用户功能以外的功能将分为多个权限配置文件。预期要执行需要某些超级用户功能的作业的用户将承担拥有相应权限配置文件的角色。

RBAC 会将超级用户功能收集到权限配置文件中。这些权限配置文件将指定给称为角色的特殊用户帐户。然后,用户可以承担执行需要某些超级用户功能的作业的角色。预定义的权限配置文件是 Solaris 软件附带的。您可以创建角色并指定相应的配置文件。

权限配置文件可以提供广泛的功能。例如,主管理员权限配置文件等效于超级用户。权限配置文件还可以从狭义范围进行定义。例如,Cron 管理权限配置文件可管理 atcron 作业。创建角色时,可以决定是创建具有广泛功能的角色,还是创建具有有限功能的角色,抑或是同时创建这两种角色。

在 RBAC 模型中,超级用户可创建一种或多种角色。这些角色基于权限配置文件。然后,超级用户会将这些角色指定给可以放心委任执行角色任务的用户。这些用户使用其用户名进行登录。登录之后,用户将承担可以运行有限管理命令和图形用户界面 (graphical user interface, GUI) 工具的角色。

由于可以灵活地设置角色,因此可启用各种安全策略。尽管 Solaris 操作系统 (Solaris OS) 没有附带任何角色,但是您可以轻松地配置三种建议的角色。这些角色基于以下同名的权限配置文件:

并不一定要实现这三种角色。角色是一种实现组织安全性需要的功能。可以为各个领域(如安全性、联网或防火墙管理)中具有特殊目的的管理员设置角色。另一种策略是创建一种功能强大的管理员角色和一种高级用户角色。高级用户角色将用于那些允许修复其自身系统的各部分的用户。

超级用户模型可以与 RBAC 模型共存。下表汇总了 RBAC 模型中可能存在的、从超级用户到受限普通用户的各个等级。该表包括可以在两种模型中跟踪的管理操作。有关权限对系统的单独影响的概述,请参见表 8–2

表 8–1 超级用户模型与具有权限的 RBAC 模型

系统上的用户功能 

超级用户模型 

RBAC 模型 

可以成为具有全部超级用户功能的超级用户 

是 

是 

可以使用具有全部用户功能的用户身份登录 

是 

是 

可以成为具有有限功能的超级用户 

否 

是 

可以使用用户身份登录,有时具有超级用户功能 

是,仅使用 setuid 程序

是,使用 setuid 程序和 RBAC

可以使用具有管理功能的用户身份登录,但是没有全部超级用户功能 

否 

是,使用 RBAC 以及直接指定的权限和授权 

可以使用功能少于普通用户的用户身份登录 

否 

是,使用 RBAC 和已删除的权限 

可以跟踪超级用户操作 

是,通过审计 su 命令

是,通过审计配置文件 shell 命令 

另外,如果禁用了 root 用户,则审计跟踪中会出现已经承担 root 角色的用户的名称

Solaris RBAC 元素和基本概念

Solaris OS 中的 RBAC 模型引入了以下元素:

下图说明了各 RBAC 元素如何协同工作。

图 8–1 Solaris RBAC 元素关系

下文对该图形进行了说明。

在 RBAC 中,将角色指定给用户。用户承担某种角色时,便可使用此角色的功能。角色从权限配置文件中获取其功能。权限配置文件可以包含授权、特权命令以及其他补充权限配置文件。特权命令是指那些使用安全属性执行的命令。

下图使用操作员角色、操作员权限配置文件以及打印机管理权限配置文件来说明 RBAC 的各种关系。

图 8–2 Solaris RBAC 元素关系的示例

下文对该图形进行了说明。

操作员角色用于维护打印机以及执行介质备份。此角色会指定给用户 jdoejdoe 通过切换到此角色然后提供角色口令,便可承担此角色。

操作员权限配置文件已指定给操作员角色。操作员权限配置文件包含两个辅助配置文件:打印机管理和介质备份。这些辅助配置文件反映了角色的主要任务。

打印机管理权限配置文件用于管理打印机、打印守护进程和假脱机程序。打印机管理权限配置文件包括三种授权:solaris.admin.printer.readsolaris.admin.printer.deletesolaris.admin.printer.modify。角色和用户可使用这些授权来处理打印机队列中的信息。打印机管理权限配置文件还包括一些具有安全属性的命令,例如 euid=lp/usr/sbin/lpshut 以及 euid=0/usr/ucb/lpq

RBAC 授权

授权是指可以授予角色或用户的单项权利。授权可在用户应用程序级别强制执行策略。可以将授权直接指定给角色或用户。通常,授权包括在权限配置文件中,而角色拥有权限配置文件,并且角色会被指定给用户。有关示例,请参见图 8–2

RBAC 兼容的应用程序可以先检查用户的授权,然后再授予访问应用程序或应用程序内特定操作的权限。此检查取代了传统的 UNIX 应用程序中对 UID=0 的检查。有关授权的更多信息,请参见以下各节:

授权和权限

权限可在内核中强制执行安全策略。授权和权限之间的差别会影响强制执行安全策略的级别。如果没有正确的权限,内核可能会阻止进程执行特权操作。如果没有正确的授权,可能会阻止用户使用特权应用程序或执行特权应用程序内与安全性相关的操作。有关权限的更全面的介绍,请参见权限(概述)

特权应用程序和 RBAC

可以覆盖系统控制的应用程序和命令被视为特权应用程序。可以使用安全属性(如 UID=0)、权限和授权将应用程序变为特权应用程序。

检查 UID 和 GID 的应用程序

在 UNIX 环境中,长期以来都存在检查 root (UID=0) 或其他某个特殊 UID 或 GID 的特权应用程序。使用权限配置文件机制,可以将需要特定 ID 的命令分离出来。您可以将具有执行安全属性的命令放在权限配置文件中,而不是针对任何用户均可访问的命令更改 ID。这样,拥有此权限配置文件的用户或角色不必成为超级用户便可运行程序。

可以指定实际 ID 或有效 ID。指定有效 ID 优先于指定实际 ID。有效 ID 等效于文件权限位中的 setuid 功能,它还可以标识 UID 以进行审计。但是,由于某些 shell 脚本和程序需要 root 的实际 UID,因此也可设置实际 UID。例如,pkgadd 命令需要实际 UID 而不是有效 UID。如果使用有效 ID 不足以运行命令,则需要将此 ID 更改为实际 ID。有关过程,请参见如何创建或更改权限配置文件

检查权限的应用程序

特权应用程序可以检查权限的使用。使用 RBAC 权限配置文件机制,可以指定特定命令的权限。您可以将具有执行安全属性的命令单独放在权限配置文件中,而无需具有使用应用程序或命令的超级用户功能。这样,拥有此权限配置文件的用户或角色便可使用成功执行命令所需的那几种权限来运行此命令。

用于检查权限的命令包括:

要向权限配置文件中添加具有权限的命令,请参见如何创建或更改权限配置文件。要确定特殊配置文件中用于检查权限的命令,请参见确定已指定的权限

检查授权的应用程序

Solaris OS 还提供了用于检查授权的命令。通过定义,root 用户可具有所有授权。因此,root 用户可以运行任何应用程序。用于检查授权的应用程序包括:

要针对授权测试脚本或程序,请参见示例 9–19。要编写需要授权的程序,请参见《Solaris 开发者安全性指南》中的“关于授权”

RBAC 权限配置文件

权限配置文件是指可以指定给角色或用户的系统覆盖值的集合。一个权限配置文件可以包括授权、具有指定安全属性的命令以及其他权限配置文件。权限配置文件信息分放在 prof_attrexec_attr 数据库中。权限配置文件的名称和授权位于 prof_attr 数据库中。权限配置文件名称和具有指定安全属性的命令位于 exec_attr 数据库中。有关权限配置文件的更多信息,请参见以下各节:

RBAC 角色

角色是一种特殊类型的用户帐户,通过此帐户可运行特权应用程序。角色与用户帐户使用相同的常规方式创建。角色具有起始目录、组指定和口令等。权限配置文件和授权可为角色提供管理功能。角色不能从其他角色或其他用户那里继承功能。各角色分配有相应的超级用户功能,因此可以实现更为安全的管理。

用户承担某种角色时,此角色的属性将替换所有用户属性。角色信息存储在 passwdshadowuser_attr 数据库中。可以将角色信息添加到 audit_user 数据库中。有关设置角色的详细信息,请参见以下各节:

可以为多个用户分配一种角色。所有可以承担同一角色的用户都具有同一角色起始目录,在同一环境中运行,并且可访问相同文件。用户可以通过从命令行运行 su 命令并提供角色名称和口令来承担角色,还可以在 Solaris Management Console 工具中承担角色。

角色无法直接进行登录。用户需要首先登录,然后才能承担角色。用户承担一种角色之后,如果不首先退出当前角色,则无法承担其他角色。用户退出此角色之后,便可承担其他角色。

可以通过将 root 用户更改为角色(如如何使 root 用户成为角色中所示),防止匿名 root 进行登录。 如果要审计配置文件 shell 命令 pfexec ,则审计跟踪需要包含登录用户的实际 UID、用户承担的角色以及相应角色执行的操作。要针对角色操作来审计系统或特定用户,请参见如何审计角色

Solaris 软件没有附带任何预定义的角色。

RBAC 中的配置文件 Shell

角色可以通过 Solaris Management Console 启动器或配置文件 shell 来运行特权应用程序。配置文件 shell 是一种特殊的 shell,可用于识别权限配置文件包括的安全属性。当用户运行 su 命令来承担角色时,便会启动配置文件 shell。配置文件 shell 包括 pfshpfcshpfksh。这些 shell 分别对应于 Bourne shell (sh)、C shell (csh) 和 Korn shell (ksh)。

已直接指定有权限配置文件的用户必须调用配置文件 shell 才能运行具有安全属性的命令。有关可用性和安全性的注意事项,请参见直接指定安全属性时的安全注意事项

可以对所有在配置文件 shell 中执行的命令进行审计。有关更多信息,请参见如何审计角色

名称服务范围和 RBAC

名称服务范围是用于了解 RBAC 的一个重要概念。角色的范围可能会限定为单独的主机。或者,此范围还可能包括所有由名称服务(如 NIS、NIS+ 或 LDAP)提供服务的主机。文件 /etc/nsswitch.conf 指定了系统的名称服务范围。遇到第一个匹配项时,查找便会停止。例如,如果某个权限配置文件存在于两个名称服务范围中,则只使用第一个名称服务范围中的各项。如果 files 是第一个匹配项,则角色的范围将限定为本地主机。

直接指定安全属性时的安全注意事项

通常,用户通过角色来获取管理功能。授权和特权命令将分组到一个权限配置文件中,而角色拥有此权限配置文件,并且角色会指定给用户。

还可以直接指定权限配置文件和安全属性:

但是,直接指定的做法并不安全。具有直接指定的权限的用户和角色可能会在内核需要此权限的情况下覆盖安全策略。如果某权限是权限配置文件中某个命令的安全属性,则此权限仅供拥有此权限配置文件的用户用于此命令。不能将此权限用于用户或角色可能运行的其他命令。

由于授权在用户级别执行,因此,与直接指定权限相比,直接指定授权的危险性会较小。但是,用户可使用授权来执行高度安全的任务,如委托设备管理。

直接指定给用户的权限配置文件存在的可用性问题要多于安全性问题。权限配置文件中具有安全属性的命令只能在配置文件 shell 中成功执行。用户必须打开配置文件 shell,然后再键入命令。指定有权限配置文件的角色会自动获取配置文件 shell。因此,命令可在此角色的 shell 中成功执行。

权限配置文件提供了一种可扩展的便捷方法,用于针对特定管理任务将安全特征进行分组。

权限(概述)

进程权利管理允许在命令、用户、角色和系统四个级别上对进程加以限制。Solaris OS 通过权限实现进程权利管理。权限可以降低与(在系统中具有完全超级用户功能的)某个用户或某个进程相关的安全风险。权限和 RBAC 为传统的超级用户模型提供了功能强大的替代模型。

权限保护内核进程

权限是进程执行某项操作所需的单项权利。权利是在内核中实施的。在 Solaris 权限基本集范围内运行的程序可在系统安全策略范围内运行。setuid 程序是在系统安全策略范围之外运行的程序示例。通过使用权限,程序可以不必调用 setuid

权限会分别枚举针对系统的可能的操作种类。程序可以使用可使其成功执行的确切权限运行。例如,用来设置日期并将其写入管理文件的程序可能需要 file_dac_writesys_time 权限。借助此功能,可以不必以 root 身份运行任何程序。

以前,系统并未遵循权限模型,而是使用超级用户模型。 在超级用户模型中,进程以 root 或用户身份运行。用户进程被限定为对用户的目录和文件执行操作,root 进程则可在系统中的任何位置创建目录和文件。需要在用户目录外部创建目录的进程将使用 UID=0(即作为 root)运行。安全策略依靠 DAC(discretionary access control,自主访问控制)来保护系统文件。设备节点受到 DAC 的保护。例如,组 sys 拥有的设备只能由 sys 组的成员打开。

但是,setuid 程序、文件权限和管理帐户很容易被误用。setuid 进程所允许的操作数比该进程完成其运行过程所需的操作数多。入侵者会破坏 setuid 程序,然后以可执行所有功能的 root 用户身份运行。同样,可访问 root 口令的任何用户都可能会破坏整个系统的安全。

与之相反,通过权限来实施策略的系统允许在用户功能和 root 功能之间划分等级。可以授予用户执行超出普通用户功能的活动,并将 root 加以限制,使 root 具有的权限比目前要少。借助 RBAC,可以将使用权限运行的命令单独放在权限配置文件中,并指定给一个用户或角色。表 8–1 汇总了 RBAC 和权限模型提供的用户功能和超级用户功能之间的等级。

权限模型比超级用户模型具有更大的安全性。已从进程中删除的权限不会被利用。进程权限防止程序或管理帐户获取对所有功能的访问权限。进程权限可为敏感文件提供额外的保护措施,而 DAC 防护功能本身可被用来获取访问权限。

之后,权限可将程序和进程限制为仅具备程序所需的功能。此功能称为最低权限原则。在实现最低权限的系统上,捕获某个进程的入侵者只能访问该进程所具有的那些权限,不会破坏其余部分的系统安全。

权限说明

可以根据权限范围对权限进行逻辑分组。

某些权限对系统具有有限的影响,而某些权限则具有广泛的影响。proc_taskid 权限的定义指明了其有限的影响:


proc_taskid

        Allows a process to assign a new task ID to the calling process.

file_setid 权限的定义指明了其广泛的影响:


net_rawaccess

        Allow a process to have direct access to  the  network layer.

privileges(5) 手册页中提供了每个权限的描述。ppriv -lv 命令会将对每个权限的描述显示在标准输出中。

具有权限的系统的管理差别

具有权限的系统与没有权限的系统之间存在多种明显差别。下表列出了部分差别。

表 8–2 具有权限的系统与没有权限的系统之间的明显差别

功能 

没有权限 

权限 

守护进程 

root 身份运行的守护进程。

以用户 daemon 身份运行的守护进程。

例如,以下守护进程已指定有相应的权限,并以 daemon 身份运行:lockdmountdnfsdrpcbind

日志文件拥有权 

日志文件由 root 拥有。

现在,日志文件由创建了此日志文件的 daemon 拥有。root 用户不拥有此文件。

错误消息 

错误消息涉及超级用户。 

例如,chroot:not superuser

错误消息反映权限的使用。 

例如,chroot 故障的等效错误消息为 chroot:exec failed

setuid 程序

程序使用 setuid 来完成不允许普通用户执行的任务。

许多 setuid 程序都已更改为使用权限运行。

例如,以下实用程序会使用权限:ufsdumpufsrestorershrloginrcprdistpingtraceroutenewtask

文件权限 

设备权限受 DAC 控制。例如,sys 组的成员可以打开 /dev/ip

文件权限 (DAC) 不会预测可以打开设备的对象。设备通过 DAC 设备策略进行保护。

例如,/dev/ip 文件具有 666 种权限,但是设备只能由具有相应权限的进程打开。原始套接字仍受 DAC 保护。

审计事件 

su 命令的使用进行审计涉及许多管理功能。

对权限的使用进行审计涉及大多数管理功能。pmas 审计类包括用于配置设备策略的审计事件以及用于设置权限的审计事件。

进程 

进程受进程属主保护。 

进程受权限保护。进程权限和进程标志可显示为 /proc/<pid> 目录中的一个新项 priv

调试 

核心转储中不引用任何权限。 

核心转储的 ELF 注释部分包括有关 NT_PRPRIVNT_PRPRIVINFO 注释中的进程权限和标志的信息。

ppriv 实用程序和其他实用程序可显示大小合适的集的正确数目。这些实用程序会将位集中的位正确映射为权限名称。

如何实现权限

每个进程都有四个权限集,用于确定进程是否可以使用特定权限。内核会自动计算权限的有效集。可以修改权限的初始可继承集。通过编码来使用权限的程序可以减小程序的权限允许集。可以缩小权限的限制集

内核可识别基本权限集。在未修改的系统上,每个用户的初始可继承集等效于登录时获取的基本集。可以修改用户的初始可继承集,但不能修改基本集。

在未修改的系统上,用户在登录时的权限集将显示以下类似信息:


E (Effective): basic

I (Inheritable): basic

P (Permitted): basic

L (Limit): all

因此,登录时所有用户在其各自的可继承集、允许集和有效集中包含基本集。用户的限制集包含所有权限。要在用户的有效集中加入更多权限,必须为该用户指定一个权限配置文件。此权限配置文件将包括已向其中添加了权限的命令。还可以将权限直接指定给用户或角色,尽管这种权限指定可能会存在风险。有关风险的介绍,请参见直接指定安全属性时的安全注意事项

进程如何获取权限

进程可以继承权限。或者,可以为进程指定权限。进程从其父进程继承权限。登录时,用户的初始可继承权限集确定可用于此用户进程的权限。用户初始登录的所有子进程都可继承此权限集。

还可以将权限直接指定给程序、用户和角色。当某个程序需要权限时,可以在权限配置文件中将权限指定给此程序的可执行文件。允许运行此程序的用户或角色会被指定包括此程序的配置文件。登录或进入配置文件 shell 时,如果在配置文件 shell 中键入程序的可执行文件,则可使用权限运行此程序。例如,拥有对象访问管理配置文件的角色可以使用 file_chown 权限运行 chmod 命令。

当某个角色或用户运行已直接指定有其他权限的程序时,指定的权限会添加到此角色或用户的可继承集中。指定有权限的程序的子进程会继承父进程的权限。如果子进程需要的权限比父进程的权限多,则必须为子进程直接指定这些权限。

通过编码来使用权限的程序称为可识别权限的程序。可识别权限的程序可在程序执行过程中启用和禁用权限。要在生产环境中成功执行,必须为程序指定其启用和禁用的权限。

有关可识别权限的代码的示例,请参见《Solaris 开发者安全性指南》中的第 2  章 “开发特权应用程序”。要为需要权限的程序指定权限,请参见如何为命令添加权限

指定权限

您作为系统管理员应负责指定权限。通常,可在权限配置文件中将权限指定给命令。然后,将权限配置文件指定给角色或用户。Solaris Management Console 提供了图形用户界面 (graphical user interface, GUI) 来指定权限。还可以使用 smusersmrole 等命令来指定权限。有关如何使用 GUI 来指定权限的更多信息,请参见第 9 章,使用基于角色的访问控制(任务)

还可以将权限直接指定给用户。如果您相信某些用户在其整个会话过程中会负责地使用某种权限,则可以直接指定此权限。适合直接指定的权限是具有有限影响的权限,如 proc_clock_highres。不适合直接指定的权限是具有广泛影响的权限,如 file_dac_write

还可以拒绝为用户或系统指定权限。从用户或系统的初始可继承集或限制集中删除权限时必须谨慎。

扩展用户或角色的权限

用户和角色具有可继承权限集以及限制权限集。限制集不能扩展,因为限制集最初包括所有权限。可以针对用户、角色和系统扩展初始可继承集。还可以将不在可继承集中的权限指定给进程。

按进程指定权限是最精确的添加权限方法。可以通过允许某用户承担某种角色,扩展此用户可执行的特权操作的数目。可以为角色指定包括具有已添加权限的命令的配置文件。用户承担角色时,便会获取此角色的配置文件 shell。通过在角色的 shell 中键入角色配置文件中的命令,便可使用已添加的权限执行这些命令。

还可以将配置文件指定给用户而不是用户承担的角色。配置文件可包括具有已添加权限的命令。用户打开配置文件 shell(如 pfksh)时,便可使用权限执行用户配置文件中的命令。在常规 shell 中,不使用权限执行命令。特权进程只能在特权 shell 中执行。

扩展用户、角色或系统的初始可继承权限集是一种风险性较高的指定权限方法。可继承集中的所有权限都位于允许集和有效集中。用户或角色在 shell 中键入的所有命令都可以使用直接指定的权限。使用直接指定的权限,用户或角色可以轻松执行可能超出其管理职责范围的操作。

向某系统上的初始可继承权限集中添加权限后,所有登录到此系统的用户都会具有更大的基本权限集。通过这种直接指定,系统的所有用户都可以轻松执行可能超出普通用户执行范围的操作。

限制用户或角色的权限

通过删除权限,可以防止用户和角色执行特定的任务。可以从初始可继承集和限制集中删除权限。分配小于缺省集的初始可继承集或限制集之前,应谨慎地对权限删除进行测试。通过从初始可继承集中删除权限,可能会使用户无法登录。从限制集中删除权限后,传统的 setuid 程序可能会失败,因为此程序需要的权限已被删除。

向脚本指定权限

脚本与命令一样,也是可执行文件。因此,在权限配置文件中,可以将权限添加到脚本中,就像将权限添加到命令中一样。已指定有配置文件的用户或角色在配置文件 shell 中执行脚本时,将会使用已添加的权限来运行脚本。如果脚本包含需要权限的命令,则具有已添加权限的命令也应该位于配置文件中。

可识别权限的程序可以限制每个进程的权限。包含可识别权限的程序的作业是指为可执行文件指定此程序所需的确切权限。然后测试此程序,查看此程序是否成功执行了其任务。还可以检查此程序是否误用了其权限。

权限和设备

权限模型使用权限来保护系统接口,这些接口在超级用户模型中单独由文件权限保护。在具有权限的系统中,文件权限太小,因此无法保护这些接口。proc_owner 等权限可以覆盖文件权限,然后提供对所有系统的完全访问权限。

因此,具有设备目录的拥有权不足以打开设备。例如,不再自动允许 sys 组的成员打开 /dev/ip 设备。/dev/ip 的文件权限为 0666,但是需要 net_rawaccess 权限才能打开设备。

设备策略受权限控制。getdevpolicy 命令可显示每个设备的设备策略。设备配置命令 devfsadm 可用于安装设备策略。devfsadm 命令可将权限集与 open 绑定,以便设备读取或写入。有关更多信息,请参见 getdevpolicy(1M)devfsadm(1M) 手册页。

使用设备策略,可以更灵活地为打开的设备授予权限。您可以要求与缺省设备策略不同的权限,或者比其更多的权限。可以针对设备策略和驱动程序适当地修改权限要求。可以在安装、添加或更新设备驱动程序时修改权限。

add_drvupdate_drv 命令可以修改设备策略项以及驱动程序特定的权限。必须使用完整的权限集运行进程才能更改设备策略。有关更多信息,请参见 add_drv(1M)update_drv(1M) 手册页。

权限和调试

Solaris OS 提供了各种工具来调试权限故障。ppriv 命令和 truss 命令可提供调试输出。有关示例,请参见 ppriv(1) 手册页。有关过程,请参见如何确定程序所需的权限

第 9 章 使用基于角色的访问控制(任务)

本章介绍与使用各种不同的角色分配超级用户功能相关的任务。角色可以使用的机制包括权限配置文件、授权和特权。以下是本章中的任务列表:

有关 RBAC 的概述,请参见基于角色的访问控制(概述)。有关参考信息,请参见第 10 章,基于角色的访问控制(参考)。要通过 RBAC 或不通过 RBAC 使用特权,请参见第 11 章,权限(任务)

使用 RBAC(任务列表)

要使用 RBAC,需要规划和配置 RBAC 以及了解如何承担角色。熟悉角色后,便可以进一步自定义 RBAC 以处理新操作。以下任务列表列出了这些主要任务:

任务 

说明 

参考 

规划和配置 RBAC  

在站点上配置 RBAC。 

配置 RBAC(任务列表)

使用角色 

通过命令行和在 Solaris Management Console GUI 中承担角色。 

使用角色(任务列表)

自定义 RBAC 

为站点自定义 RBAC。 

管理 RBAC(任务列表)

配置 RBAC(任务列表)

要有效地使用 RBAC,需要进行规划。使用以下任务列表可在站点上规划并初步实现 RBAC。

任务 

说明 

参考 

1. 规划 RBAC  

涉及检查站点的安全要求,以及确定如何在站点上使用 RBAC。 

如何规划 RBAC 实现

2. 学习使用 Solaris Management Console 

涉及熟悉 Solaris Management Console。 

《系统管理指南:基本管理》中的第 2  章 “使用 Solaris Management Console(任务)”

3. 配置第一个用户和角色 

使用 Solaris Management Console 的 RBAC 配置工具创建用户和角色,并将角色指定给用户。 

《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

4. (可选)创建可以承担角色的其他用户 

确保存在可以承担管理角色的用户。 

《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

5. (建议)创建其他角色并将其指定给用户 

使用 RBAC 工具为特定管理区域创建角色,并将这些角色指定给用户。 

如何使用 GUI 创建和指定角色

示例 9–5

使用命令行创建角色,并将这些角色指定给用户。 

如何通过命令行创建角色

如何将角色指定给本地用户

6. (建议)审计角色操作 

预先选择包括记录角色操作的审计事件的审计类。 

如何审计角色

7. (可选)使 root 用户成为角色

防止匿名 root 登录,这是一个安全漏洞。

如何使 root 用户成为角色

配置 RBAC

可以使用以下实用程序配置 RBAC:

Procedure如何规划 RBAC 实现

RBAC 可以作为组织管理其信息资源方式的组成部分。进行规划时,需要全面了解 RBAC 功能以及组织的安全要求。

  1. 了解 RBAC 基本概念。

    请阅读基于角色的访问控制(概述)。使用 RBAC 来管理系统与使用常规的 UNIX 管理做法完全不同。开始实现之前,应先对 RBAC 概念进行了解。有关更详细的信息,请参见第 10 章,基于角色的访问控制(参考)

  2. 检查安全策略。

    您组织的安全策略应详细说明系统面临的潜在威胁,衡量每种威胁的风险并制订应对这些威胁的策略。通过 RBAC 隔离与安全相关的任务可以作为该策略的一部分。虽然可以按照缺省设置安装系统建议的角色及其配置,但是您可能需要自定义 RBAC 配置以符合安全策略。

  3. 确定组织需要 RBAC 的程度。

    根据安全需要,选择如何使用 RBAC,如下所述:

    • 无 RBAC-您可以以 root 用户身份执行所有任务。在此配置中,您将以自己的身份登录。然后,在选择 Solaris Management Console 工具时,键入 root 作为用户。

    • 仅单一角色-此方法添加一个角色。该角色会被指定主管理员权限配置文件。此方法与超级用户模型类似,因为该角色具有超级用户功能。但是,通过此方法可以跟踪已承担该角色的用户。

    • 建议的角色-此方法创建三个基于以下权限配置文件的角色:主管理员、系统管理员和操作员。这些角色适用于管理员具有不同责任级别的组织。

    • 自定义角色-您可以创建自己的角色以满足组织的安全要求。新角色可以基于现有或自定义的权限配置文件。

    • 使超级用户成为角色-此方法可防止任何用户以 root 身份登录。相反,在承担 root 角色之前,用户必须以普通用户身份登录。有关详细信息,请参见如何使 root 用户成为角色

  4. 确定适用于组织的建议角色。

    请查看建议的角色的功能和缺省的权限配置文件。通过缺省的权限配置文件,管理员可以使用单个配置文件配置建议的角色。以下三个缺省的权限配置文件可用于配置建议的角色:

    • 主管理员权限配置文件-用于配置可以执行所有管理任务、为其他用户授予权限以及编辑与管理角色关联的权限的角色。该角色中的用户可将该角色指定给其他用户,并可为其他用户授予权限。

    • 系统管理员权限配置文件-用于配置可执行大多数与安全无关的管理任务的角色。例如,系统管理员可以添加新的用户帐户,但不能设置口令或为其他用户授予权限。

    • 操作员权限配置文件-用于配置可以执行介质备份和打印机维护等简单管理任务的角色。

    要进一步检查权限配置文件,请阅读以下内容之一:

    • /etc/security 目录中,阅读 prof_attr 数据库和 exec_attr 数据库的内容。

    • 在 Solaris Management Console 中,使用“权限”工具显示权限配置文件的内容。

    • 在本书中,参阅权限配置文件的内容以了解某些典型的权限配置文件的摘要。

  5. 确定是否有任何其他角色或权限配置文件适用于组织。

    请在站点上查找可能从受限制访问中受益的其他应用程序或应用程序系列。合适的 RBAC 候选对象包括:影响安全的应用程序、可能导致服务被拒绝的应用程序,或需要对管理员进行特殊培训的应用程序。您可以自定义角色和权限配置文件,以处理组织的安全要求。

    1. 确定新任务所需的命令。

    2. 确定适用于此任务的权限配置文件。

      检查现有权限配置文件是否可以处理此任务,或是否需要创建单独的权限配置文件。

    3. 确定适用于此权限配置文件的角色。

      确定是否应将此任务的权限配置文件指定给现有角色,或是否应创建新角色。如果使用现有角色,请检查其他权限配置文件是否适用于将被指定该角色的用户。

  6. 确定应将哪些用户指定给可用角色。

    根据最低特权的原则,应将用户指定给适合其信任级别的角色。如果禁止用户访问用户无需执行的任务,则可以减少潜在的问题。

Procedure如何使用 GUI 创建和指定角色

您可以以超级用户身份,也可以使用主管理员角色来创建新角色。 在此过程中,新角色的创建者会承担主管理员的角色。

开始之前
  1. 启动 Solaris Management Console。


    # /usr/sbin/smc &
    

    有关登录说明,请参见如何在 Solaris Management Console 中承担角色

  2. 单击“管理角色”图标。

  3. 从“操作”菜单中选择“添加管理角色”。

  4. 填写一系列对话框中的字段以创建新角色。

    有关可能的角色,请参见示例 9–1示例 9–4


    提示 –

    Solaris Management Console 中的所有工具都会在页面底部或向导面板的左侧显示信息。您可随时选择“帮助”,以查找有关在此界面中执行任务的其他信息。


  5. 将角色指定给用户。


    提示 –

    填写角色的属性后,最后一个对话框将提示您为该角色指定一个用户。


  6. 在终端窗口中,重新启动名称服务高速缓存守护进程。


    # svcadm restart system/name-service-cache
    

    有关更多信息,请参见 svcadm(1M)nscd(1M) 手册页。


示例 9–1 为系统管理员权限配置文件创建角色

在本示例中,新角色可以执行与安全无关的系统管理任务。该角色是通过执行上述过程创建的,其参数如下:



示例 9–2 为操作员权限配置文件创建角色

操作员权限配置文件可以管理打印机并将系统备份到脱机介质。您可能希望将该角色指定给各个班次上的某个用户。为此,可在“步骤 1:进入‘角色名’对话框”中选择角色邮件列表选项。该角色是通过执行上述过程创建的,其参数如下:



示例 9–3 为与安全相关的权限配置文件创建角色

缺省情况下,仅有主管理员配置文件包含与安全相关的命令和权限。如果要创建功能不如主管理员强大,但可处理某些与安全相关的任务的角色,则必须创建该角色。

在以下示例中,该角色可保护设备。该角色是通过执行上述过程创建的,其参数如下:

在以下示例中,该角色可确保系统和主机在网络上的安全。该角色是通过执行上述过程创建的,其参数如下:



示例 9–4 为具有有限范围的权限配置文件创建角色

许多权限配置文件的范围都是有限的。在本示例中,该角色的唯一任务是管理 DHCP。该角色是通过执行上述过程创建的,其参数如下:



示例 9–5 修改用户的角色指定

在本示例中,将向现有用户添加角色。您可以修改用户的角色指定,方法是在 Solaris Management Console 的“用户”工具中单击“用户帐户”图标,双击相应用户,然后按照联机帮助的说明将角色添加到该用户的功能。


故障排除

如果角色不具有应有的功能,请检查以下情况:

Procedure如何通过命令行创建角色

Solaris Management Console GUI 是管理 RBAC 的首选方法。要使用该 GUI,请参见如何使用 GUI 创建和指定角色。另外,还可以使用命令行界面,如此过程中所述。


注 –

请勿尝试同时使用命令行和图形用户界面来管理 RBAC。这样可能会导致对配置所做的更改出现冲突,从而使得行为不可预测。您可以使用这两种工具来管理 RBAC,但是不能同时使用二者。


开始之前

要创建角色,必须承担具有主管理员权限配置文件的角色,或切换到用户 root

  1. 承担主管理员角色,或成为超级用户。

    主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2  章 “使用 Solaris Management Console(任务)”

  2. 选择以下命令之一,在命令行上创建角色。

    • 对于本地名称服务范围内的角色,请使用 roleadd 命令。


      注 –

      与 Solaris Management Console GUI 或命令行界面相比,roleadd 命令的限制更多。运行 roleadd 命令后,还必须运行 usermod 命令才能将角色指定给用户。然后,用户还必须为角色设置口令,如如何将角色指定给本地用户中所述。



      # roleadd -c comment \
      
      -g group -m homedir -u UID -s shell \
      
      -P profile rolename
      
      -c comment

      描述 rolename 的注释。

      -g group

      rolename 的组指定。

      -m homedir

      rolename 的起始目录的路径。

      -u UID

      rolename 的 UID。

      -s shell

      rolename 的登录 shell。此 shell 必须是配置文件 shell。

      -P profile

      rolename 的一个或多个权限配置文件。

      rolename

      新本地角色的名称。

    • 使用 smrole add 命令。

      此命令可在 NIS、NIS+ 或 LDAP 等分布式名称服务中创建角色。此命令将作为 Solaris Management Console 服务器的客户机运行。


      $ /usr/sadm/bin/smrole -D domain-name \ 
      
      -r admin-role -l <Type admin-role password> \
      
      add -- -n rolename -a rolename -d directory\
      
      -F full-description -p profile
      
      -D domain-name

      要管理的域的名称。

      -r admin-role

      可以修改角色的管理角色的名称。管理角色必须具有 solaris.role.assign 授权。如果要修改已承担的角色,则该角色必须具有 solaris.role.delegate 授权。

      -l

      admin-role 的口令输入提示。

      --

      验证选项和子命令选项之间必需的分隔符。

      -n rolename

      新角色的名称。

      -c comment

      描述角色功能的注释。

      -a username

      可以承担 rolename 的用户的名称。

      -d directory

      rolename 的起始目录。

      -F full-description

      rolename 的完整说明。此说明显示在 Solaris Management Console GUI 中。

      -p profile

      rolename 的功能中包括的权限配置文件。此选项可为角色提供具有管理功能的命令。您可以指定多个 -p profile 选项。

  3. 要使更改生效,请参见如何将角色指定给本地用户


示例 9–6 使用 smrole 命令创建自定义操作员角色

smrole 命令可在名称服务中指定新角色及其属性。在以下示例中,主管理员创建了一个新版本的操作员角色。该角色具有标准的操作员权限配置文件以及介质恢复权限配置文件。请注意,此命令会提示您输入新角色的口令。


% su primaryadm

Password: <键入 primaryadm 的口令> 

$ /usr/sadm/bin/smrole add -H myHost -- -c "Backup and Restore Operator" \

-n operadm2 -a janedoe -d /export/home/operadm \

-F "Backup/Restore Operator" -p "Operator" -p "Media Restore"

Authenticating as user: primaryadm



Type /? for help, pressing <enter> accepts the default denoted by [ ]

Please enter a string value for: password :: <键入 primaryadm 的口令>



Loading Tool: com.sun.admin.usermgr.cli.role.UserMgrRoleCli from myHost

Login to myHost as user primaryadm was successful.

Download of com.sun.admin.usermgr.cli.role.UserMgrRoleCli from myHost was successful.



Type /? for help, pressing <enter> accepts the default denoted by [ ]

Please enter a string value for: password ::<键入 operadm2 的口令>



$ svcadm restart system/name-service-cache

包含 list 子命令的 smrole 命令用于显示新角色:


$ /usr/sadm/bin/smrole list --

Authenticating as user: primaryadm



Type /? for help, pressing <enter> accepts the default denoted by [ ]

Please enter a string value for: password :: <键入 primaryadm 的口令>



Loading Tool: com.sun.admin.usermgr.cli.role.UserMgrRoleCli from myHost

Login to myHost as user primaryadm was successful.

Download of com.sun.admin.usermgr.cli.role.UserMgrRoleCli from myHost was successful.

root                    0             Superuser

primaryadm            100             Most powerful role

sysadmin              101             Performs non-security admin tasks

operadm               102             Backup Operator

operadm2              103             Backup/Restore Operator

Procedure如何将角色指定给本地用户

此过程会将本地角色指定给本地用户、重新启动名称高速缓存守护进程,然后说明用户如何承担该角色。

要将角色指定给分布式名称服务中的用户,请参见如何通过命令行创建角色如何更改角色的属性

开始之前

您已按照如何通过命令行创建角色中所述添加了本地角色。您必须已承担主管理员角色或已切换到超级用户。

  1. 将角色指定给本地用户。

    如果已使用 roleadd 命令添加了本地角色,则必须执行此步骤。使用 smrole 命令和 Solaris Management Console 创建角色时,此步骤为可选步骤。


    # usermod -u UID -R rolename
    
    -u UID

    用户的 UID。

    -R rolename

    指定给用户的角色。

  2. 要使更改生效,请重新启动名称服务高速缓存守护进程。


    # svcadm restart system/name-service-cache

    如果已使用 Solaris Management Console 界面添加了角色,请转至使用角色(任务列表)。否则,请继续执行下一步。

  3. (可选的)要解除锁定角色帐户,用户必须创建口令。

    如果已使用 roleadd 命令添加了本地角色,则必须执行此步骤。


    % su rolename
    
    Password: <键入 rolename 的口令>
    
    Confirm Password: <重新键入 rolename 的口令>
    
    $

示例 9–7 通过命令行创建和指定本地角色

在本示例中,将创建管理 Solaris 加密框架的角色。加密管理权限配置文件中包含用于管理本地系统中的硬件和软件加密服务的 cryptoadm 命令。


# roleadd -c "Cryptographic Services manager" \

-g 14 -m /export/home/cryptoadm -u 104 -s pfksh \

-P "Crypto Management" cryptomgt

# usermod -u 1111 -R cryptomgt

# svcadm restart system/name-service-cache

% su cryptomgt

Password: <键入 cryptomgt 的口令>

Confirm Password: <重新键入 cryptomgt 的口令>

$ /usr/ucb/whoami

cryptomgt

$

有关 Solaris 加密框架的信息,请参见第 13 章,Solaris 加密框架(概述)。要管理该框架,请参见管理加密框架(任务列表)


Procedure如何审计角色

可以审计角色执行的操作。审计记录中包括承担角色的用户的登录名、角色名和角色执行的操作。 6180:AUE_prof_cmd:profile command:ua,as 审计事件用于收集该信息。通过预先选择 as 类或 ua 类,可以审计角色操作。

  1. 规划审计并编辑审计配置文件。

    有关更多信息,请参见Solaris 审计(任务列表)

  2. audit_control 文件的 flags 行中包括 ua 类或 as 类。


    # audit_control file
    
    dir:/var/audit
    
    flags:lo,as
    
    minfree:20
    
    naflags:lo

    ua 类和 as 类包括其他审计事件。要查看类中包括的审计事件,请阅读 audit_event 文件。另外,还可以使用 bsmrecord 命令,如示例 29–22 中所示。

  3. 完成审计服务的配置,然后启用审计。

    有关更多信息,请参见配置和启用审计服务

Procedure如何使 root 用户成为角色

此过程说明如何将 root 从登录用户更改为角色。完成此过程后,将无法再以 root 身份登录到系统,但在单用户模式下除外。如果已为您指定 root 角色,则可以对 root 执行 su

通过将 root 用户更改为角色,可以防止匿名 root 登录。由于用户必须首先登录,然后才能承担 root 角色,因此用户的登录 ID 将提供给审计服务并位于 sulog 文件中。

开始之前

如果将 root 用户更改为角色,但未将该角色指定给有效用户,或当前没有与 root 用户等效的现有角色,则任何用户都不能成为超级用户。

  1. 以普通用户身份登录到目标主机。

  2. 承担主管理员角色,或成为超级用户。

    主管理员角色拥有主管理员配置文件。要创建该角色并将其指定给用户,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  3. 创建可承担 root 角色的本地用户。


    $ useradd -c comment -d homedir username
    
    -c comment

    描述用户的注释。

    -d homedir

    用户的起始目录。此目录应位于本地系统中。

    username

    新本地用户的名称。


    # useradd -c "Local administrative user" -d /export/home1 admuser
    
  4. 为用户指定口令。


    # passwd -r files admuser
    
    New Password:    <键入口令>
    
    Re-enter new Password: <重新键入口令>
    
    passwd: password successfully changed for admuser
    
    #
  5. 确保您未以 root 身份登录。


    # who
    
    jdoe    console      May 24 13:51    (:0)
    
    jdoe    pts/5        May 24 13:51    (:0.0)
    
    jdoe    pts/4        May 24 13:51    (:0.0)
    
    jdoe    pts/10       May 24 13:51    (:0.0)
    
  6. root 用户更改为角色。


    # usermod -K type=role root
    
  7. 验证 root 是否为角色。

    user_attr 文件中 root 项的显示应与以下内容类似:


    root::::type=role;auths=solaris.*,solaris.grant;profiles=Web Console 
    
    Management,All;lock_after_retries=no
  8. root 角色指定给本地管理用户。


    # usermod -R root admuser
    
  9. 配置在失败时返回的名称服务。

    1. 打开新的终端窗口并承担 root 角色。


      % whoami
      
      jdoe
      
      % su admuser
      
      Enter password:   <键入 admuser 的口令>
      
      % roles
      
      root
      
      % su root
      
      Enter password:   <键入 root 的口令>
      
      #
    2. 编辑 nsswitch.conf 文件。

      例如,nsswitch.conf 文件中的以下各项将允许返回名称服务。


      passwd:  files nis [TRYAGAIN=0 UNAVAIL=return NOTFOUND=return]
      
      group:  files nis [TRYAGAIN=0 UNAVAIL=return NOTFOUND=return]
  10. root 角色指定给名称服务中选定的用户帐户。

    有关过程,请参见如何更改用户的 RBAC 属性

使用角色(任务列表)

以下任务列表列出了用于在指定角色后使用角色的过程:

任务 

说明 

参考 

使用 Solaris Management Console 

以角色身份对自身进行验证,以便在 Solaris Management Console 中执行管理任务。 

如何在 Solaris Management Console 中承担角色

在终端窗口中承担角色 

在配置文件 shell 中执行命令行管理任务。 

如何在终端窗口中承担角色

使用角色

使用缺省的 Solaris 权限配置文件设置角色并将其指定给用户后,便可以使用这些角色。可以通过命令行来承担角色。在 Solaris Management Console 中,还可使用角色以本地方式和通过网络来管理系统。

Procedure如何在终端窗口中承担角色

开始之前

必须已为您指定了角色,并且必须使用该信息更新名称服务。

  1. 在终端窗口中,确定可以承担的角色。


    % roles
    
    Comma-separated list of role names is displayed
    
  2. 使用 su 命令承担角色。


    % su rolename
    
    Password: <键入 rolename 的口令>
    
    $

    带有角色名的 su 命令会将 shell 更改为该角色的配置文件 shell。配置文件 shell 可识别安全性属性(授权、特权和集 ID 位)。

  3. 验证您现在是否已承担某种角色。


    $ /usr/ucb/whoami
    
    rolename
    

    您现在可在此终端窗口中执行角色任务。

  4. (可选的)查看角色的功能。

    有关过程,请参见如何确定角色可以运行的特权命令


示例 9–8 承担主管理员角色

在以下示例中,用户承担主管理员角色。在缺省配置中,该角色与超级用户等效。然后,该角色会查看哪些特权可供在角色的配置文件 shell 中键入的任何命令使用。


% roles

sysadmin,oper,primaryadm

% su primaryadm

Password: <键入 primaryadm 口令>

$ /usr/ucb/whoami 提示符更改为角色提示符

primaryadm

$ ppriv $$

1200:   pfksh

flags = <none>

        E (Effective): all

        I (Inheritable): basic

        P (Permitted): all

        L (Limit): all

有关特权的信息,请参见权限(概述)



示例 9–9 承担 root 角色

在以下示例中,用户承担 root 角色。该角色是在如何使 root 用户成为角色中创建的。


% roles

root

% su root

Password: <键入 root 的口令>

# /usr/ucb/whoami 提示符更改为角色提示符

root

$ ppriv $$

1200:   pfksh

flags = <none>

        E: all

        I: basic

        P: all

        L: all

有关特权的信息,请参见权限(概述)



示例 9–10 承担系统管理员角色

在以下示例中,用户承担系统管理员的角色。与主管理员角色相反,系统管理员角色在其有效集中具有基本的特权集。


% roles

sysadmin,oper,primaryadm

% su sysadmin

Password: <键入 sysadmin 的口令>

$ /usr/ucb/whoami 提示符更改为角色提示符

sysadmin

$ ppriv $$

1200:   pfksh

flags = <none>

        E: basic

        I: basic

        P: basic

        L: all

有关特权的信息,请参见权限(概述)。有关该角色功能的简短说明,请参见系统管理员权限配置文件


Procedure如何在 Solaris Management Console 中承担角色

要在 Solaris Management Console GUI 中更改信息,需要具有管理功能。角色可为您提供管理功能。如果要查看信息,则必须具有 solaris.admin.usermgr.read 授权。基本 Solaris 用户权限配置文件包括此授权。

开始之前

必须已为您指定了可以更改用户或角色属性的管理角色。例如,主管理员角色可更改用户或角色的属性。

  1. 启动 Solaris Management Console。


    % /usr/sbin/smc &
    

    有关详细说明,请参见《系统管理指南:基本管理》中的“使用 RBAC 和 Solaris 管理工具(任务图)”

  2. 根据任务选择工具箱。

    导航至包含相应名称服务范围内的工具或集合的工具箱,然后单击该图标。这些范围包括文件(本地)、NIS、NIS+ 和 LDAP。如果导航窗格中未显示相应的工具箱,请从“控制台”菜单中选择“打开工具箱”并装入相关的工具箱。

  3. 选择要使用的工具。

    导航到该工具或集合,然后单击相应图标。用于管理 RBAC 元素的工具位于“用户”工具中,如下图所示:

    标题为 "Management Tools" 的窗口在左侧显示“导航”窗格,在右侧显示“工具”窗格,并在下方显示具有“关联说明”的“信息”窗格。
  4. 在“登录:用户名”对话框中键入用户名和口令。

  5. 在“登录:角色”对话框中对自身进行验证。

    该对话框中的“角色”选项菜单显示了为您指定的角色。请选择角色并键入角色口令。

管理 RBAC(任务列表)

以下任务列表列出了用于在初步实现基于角色的访问控制 (role-based access control, RBAC) 后自定义 RBAC 的过程。

任务 

说明 

参考 

修改角色的属性 

修改角色的功能(特权、特权命令、配置文件或授权)。 

如何更改角色的属性

创建或更改权限配置文件 

创建权限配置文件。或修改授权、特权命令或权限配置文件中的补充权限配置文件。 

如何创建或更改权限配置文件

更改用户的管理功能 

向普通用户添加角色、权限配置文件、授权或特权。 

如何更改用户的 RBAC 属性

确保传统应用程序安全 

为传统应用程序启用集 ID 权限。脚本可以包含具有集 ID 的命令。传统应用程序可检查授权(如果适用)。 

如何为传统应用程序添加 RBAC 属性

这些过程可用于管理 RBAC 中使用的元素。有关用户管理的过程,请参阅《系统管理指南:基本管理》中的第 5  章 “管理用户帐户和组(任务)”

管理 RBAC

Solaris Management Console GUI 是管理 RBAC 的首选方法。


注 –

请勿尝试同时使用命令行和图形用户界面来管理 RBAC。这样可能会导致对配置所做的更改出现冲突,从而使得行为不可预测。这两种工具都可以管理 RBAC,但是不能同时使用二者。


Procedure如何更改角色的属性

开始之前

要更改角色属性,您必须已承担主管理员角色或已切换到超级用户。角色属性包括口令、权限配置文件和授权。

    使用以下方法之一更改角色属性。

    • 使用 Solaris Management Console 中的“用户”工具。

      要启动该控制台,请参见如何在 Solaris Management Console 中承担角色。请按照左侧窗格中的说明在“管理角色”中修改角色。有关更详细的信息,请参见联机帮助。

    • 使用 rolemod 命令。

      此命令可修改本地名称服务中定义的角色的属性。


      $ rolemod -c comment -P profile-list rolename
      
      -c comment

      描述角色功能的新注释。

      -P profile-list

      角色具有的配置文件的列表。此列表将替换当前的配置文件列表。

      rolename

      要修改的现有本地角色的名称。

      有关更多命令选项,请参见 rolemod(1M) 手册页。

    • 使用包含 modify 子命令的 smrole 命令。

      此命令可修改 NIS、NIS+ 或 LDAP 等分布式名称服务中的角色的属性。此命令将作为 Solaris Management Console 服务器的客户机运行。


      $ /usr/sadm/bin/smrole -D domain-name \ 
      
      -r admin-role -l <Type admin-role password> \
      
      modify -- -n rolename  -r username -u username
      
      -D domain-name

      要管理的域的名称。

      -r admin-role

      可以修改角色的管理角色的名称。管理角色必须具有 solaris.role.assign 授权。如果要修改已承担的角色,则该角色必须具有 solaris.role.delegate 授权。

      -l

      admin-role 的口令输入提示。

      --

      验证选项和子命令选项之间必需的分隔符。

      -n rolename

      新角色的名称。

      -r username

      无法再承担 rolename 的用户的名称。

      -u username

      现在可以承担 rolename 的用户的名称。

      有关更多命令选项,请参见 smrole(1M) 手册页。


示例 9–11 使用 rolemod 命令更改本地角色的属性

在本示例中,将修改 operadm 角色以使其具有介质恢复权限配置文件。


$ rolemod -c "Handles printers, backup, AND restore" \

-P "Printer Management,Media Backup,Media Restore,All" operadm


示例 9–12 使用 smrole modify 命令更改本地角色的属性

在以下示例中,将修改 operadm 角色以添加介质恢复权限配置文件。


$ /usr/sadm/bin/smrole -r primaryadm -l <Type primaryadm password> \

modify -- -n operadm -c "Handles printers, backup, AND restore" \

-p "Media Restore"


示例 9–13 使用 smrole modify 命令更改域中的角色

在以下示例中,将更改 clockmgr 角色。ID 为 108 的 NIS 用户无法再承担该角色。ID 为 110 的 NIS 用户可以承担 clockmgr 角色。


$ /usr/sadm/bin/smrole -D nis:/examplehost/example.domain \

-r primaryadm -l <Type primaryadm password> \

modify -- -n clockmgr -r 108 -u 110

Procedure如何创建或更改权限配置文件

权限配置文件是一种角色属性。如果 prof_attr 数据库不包含满足您需求的权限配置文件,则应创建或更改权限配置文件。要了解有关权限配置文件的更多信息,请参见RBAC 权限配置文件

开始之前

要创建或更改权限配置文件,您必须已承担主管理员的角色或已切换到超级用户。

    使用以下方法之一更改角色的属性。

    • 使用 Solaris Management Console 中的“用户”工具。

      要启动该控制台,请参见如何在 Solaris Management Console 中承担角色。请按照左侧窗格中的说明在“权限”中创建或更改权限配置文件。有关更详细的信息,请参见联机帮助。

    • 使用 smprofile 命令。

      使用此命令可以添加、修改、列出或删除权限配置文件。此命令可在文件以及 NIS、NIS+ 或 LDAP 等分布式名称服务中运行。smprofile 命令将作为 Solaris Management Console 服务器的客户机运行。


      $ /usr/sadm/bin/smprofile -D domain-name \ 
      
      -r admin-role -l <Type admin-role password> \
      
      add | modify -- -n profile-name \
      
      -d description  -m help-file -p supplementary-profile
      
      -D domain-name

      要管理的域的名称。

      -r admin-role

      可以修改角色的管理角色的名称。管理角色必须具有 solaris.role.assign 授权。如果要修改已承担的角色,则该角色必须具有 solaris.role.delegate 授权。

      -l

      admin-role 的口令输入提示。

      --

      验证选项和子命令选项之间必需的分隔符。

      -n profile-name

      新配置文件的名称。

      -d description

      配置文件的简短说明。

      -m help-file

      已创建并放置在 /usr/lib/help/profiles/locale/C 目录中的 HTML 帮助文件的名称。

      -p supplementary-profile

      此权限配置文件中包括的现有权限配置文件的名称。您可以指定多个 -p supplementary-profile 选项。

      有关更多命令选项,请参见 smprofile(1M) 手册页。


示例 9–14 通过命令行修改权限配置文件

在以下示例中,网络管理权限配置文件充当网络安全权限配置文件的补充配置文件。包含网络安全配置文件的角色现在可以配置网络和主机,而且还可以运行与安全相关的命令。


$ /usr/sadm/bin/smprofile -D nisplus:/example.host/example.domain \

-r primaryadm -l <Type primaryadm password> \

modify -- -n "Network Security" \

-d "Manage network and host configuration and security" \

-m RtNetConfSec.html -p "Network Management"

运行此命令之前,管理员创建了一个新的帮助文件 RtNetConfSec.html,并将其放置在 /usr/lib/help/profiles/locale/C 目录中。



示例 9–15 使用权限工具创建新的权限配置文件

下表列出了名为“生成管理员”的假设的权限配置文件的样例数据。此权限配置文件包括子目录 /usr/local/swctrl/bin 中的命令。这些命令的有效 UID 为 0。生成管理员权限配置文件适用于管理软件开发的生成和版本控制的管理员。

选项卡 

字段 

示例 

一般 

名称 

生成管理员 

 

说明 

用于管理软件生成和版本控制。 

 

帮助文件名称 

BuildAdmin.html

命令 

添加目录 

单击“添加目录”,在对话框中键入 /usr/local/swctrl/bin,然后单击“确定”。

 

命令遭拒/许可的命令 

/usr/local/swctrl/bin 移动到“许可的命令”列。

 

设置安全性属性 

选择 /usr/local/swctrl/bin,单击“设置安全性属性”,然后将“有效 UID”设置为 root

授权 

排除的授权/包括的授权 

无授权。

辅助权限 

排除的权限/包括的权限 

无补充权限配置文件。


故障排除

如果权限配置文件没有为角色提供所需的功能,请检查以下情况:

Procedure如何更改用户的 RBAC 属性

用户属性包括口令、权限配置文件和授权。为用户提供管理功能的最安全的方法是将角色指定给用户。有关说明,请参见直接指定安全属性时的安全注意事项

开始之前

要更改用户属性,您必须已承担主管理员角色或已切换到超级用户。

    使用以下方法之一更改用户的 RBAC 属性。

    • 使用 Solaris Management Console 中的“用户”工具。

      要启动该控制台,请参见如何在 Solaris Management Console 中承担角色。请按照左侧窗格中的说明在“用户帐户”中修改用户。有关更详细的信息,请参见联机帮助。


      提示 –

      为用户直接指定授权、特权或权限配置文件并不是一个好的做法。首选方法是将角色指定给用户。然后,用户承担角色以执行特权操作。


    • 使用 usermod 命令。

      此命令可修改本地名称服务中定义的用户的属性。


      $ usermod -R rolename username
      
      -R rolename

      现有本地角色的名称。

      username

      要修改的现有本地用户的名称。

      有关更多命令选项,请参见 usermod(1M) 手册页。

    • 使用包含 modify 子命令的 smuser 命令。

      此命令可修改 NIS、NIS+ 或 LDAP 等分布式名称服务中的用户的属性。此命令将作为 Solaris Management Console 服务器的客户机运行。


      $ /usr/sadm/bin/smuser -D domain-name \ 
      
      -r admin-role -l <Type admin-role password> \
      
      modify -- -n username -a rolename
      
      -D domain-name

      要管理的域的名称。

      -r admin-role

      可以修改角色的管理角色的名称。管理角色必须具有 solaris.role.assign 授权。如果要修改已承担的角色,则该角色必须具有 solaris.role.delegate 授权。

      -l

      admin-role 的口令输入提示。

      --

      验证选项和子命令选项之间必需的分隔符。

      -n username

      指定了 rolename 的用户的名称。

      -a rolename

      将指定给 username 的角色的名称。您可以指定多个 -a rolename 选项。

      有关更多命令选项,请参见 smuser(1M) 手册页。


示例 9–16 通过命令行修改本地用户的 RBAC 属性

在本示例中,用户 jdoe 现在可以承担系统管理员的角色。


$ usermod -R sysadmin jdoe


示例 9–17 使用 smuser 命令修改用户的 RBAC 属性

在本示例中,为用户 jdoe 指定了两个角色:系统管理员和操作员。由于该用户和这两个角色是在本地定义的,因此不必使用 -D 选项。


$ /usr/sadm/bin/smuser -r primaryadm -l <Type primaryadm password> \

modify -- -n jdoe -a sysadmin -a operadm

在以下示例中,该用户是在 NIS 名称服务中定义的。因此,需要使用 -D 选项。两个角色是在名称服务中定义的。角色 root 是在本地定义的。


$ /usr/sadm/bin/smuser -D nis:/examplehost/example.domain \

-r primaryadm -l <Type primaryadm password> \

modify -- -n jdoe -a sysadmin -a operadm -a root

Procedure如何为传统应用程序添加 RBAC 属性

传统应用程序是一个命令或一组命令。先针对权限配置文件中的每个命令设置安全性属性。然后,在角色中包括该权限配置文件。承担该角色的用户便可以运行具有安全性属性的传统应用程序。

要将传统应用程序添加到 Solaris Management Console,请参见《系统管理指南:基本管理》中的“向 Solaris Management Console 中添加工具”

开始之前

要更改权限配置文件中命令的安全性属性,您必须已承担主管理员角色或已切换到超级用户。

  1. 使用 Solaris Management Console 中的“用户”工具。

    要启动该控制台,请参见如何在 Solaris Management Console 中承担角色。请按照左侧窗格中的说明在“权限”中修改权限配置文件。有关更详细的信息,请参见联机帮助。

  2. 向实现传统应用程序的命令添加安全性属性。

    向传统应用程序添加安全性属性的方式与为任何命令添加安全性属性的方式相同。您必须将具有安全性属性的命令添加到权限配置文件。对于传统命令,请为命令指定 euid=0uid=0 安全性属性。有关该过程的详细信息,请参见如何创建或更改权限配置文件

  3. 将传统应用程序添加到权限配置文件后,在角色的配置文件列表中包括该权限配置文件。

    要向角色添加权限配置文件,请参见如何更改角色的属性


示例 9–18 向脚本中的命令添加安全性属性

如果某个脚本中的命令需要设置 setuid 位或 setgid 位才能成功运行,则将必须在权限配置文件中为该脚本的可执行脚本命令添加安全性属性。然后,在角色中包括该权限配置文件,并将该角色指定给用户。当用户承担该角色并执行该脚本时,此命令便会以安全性属性运行。

要将安全性属性添加到命令或 shell 脚本,请参见如何创建或更改权限配置文件



示例 9–19 检查脚本或程序中的授权

要检查脚本授权,需要添加一项基于 auths 命令的测试。有关此命令的详细信息,请参见 auths(1) 手册页。

例如,以下行会测试用户是否具有作为 $1 参数提供的授权:


if [ `/usr/bin/auths|/usr/xpg4/bin/grep $1` ]; then

        echo Auth granted

else

        echo Auth denied

fi

要使测试更加完整,应在测试中包括检查其他使用通配符的授权的逻辑。例如,要测试用户是否具有 solaris.admin.usermgr.write 授权,需要检查以下字符串:

如果您要编写程序,请使用函数 getauthattr() 对授权进行测试。


第 10 章 基于角色的访问控制(参考)

本章介绍了有关 RBAC 的参考资料。以下是本章中参考信息的列表:

有关使用 RBAC 的信息,请参见第 9 章,使用基于角色的访问控制(任务)。有关概述信息,请参见基于角色的访问控制(概述)

权限配置文件的内容

本节介绍了一些典型的权限配置文件。权限配置文件可以包括授权、带有安全属性的命令,以及补充权限配置文件。权限配置文件根据功能的强弱从高到低列出。有关如何将权限配置文件分配给站点中角色的建议,请参见如何规划 RBAC 实现

每个权限配置文件都具有关联的帮助文件。帮助文件以 HTML 形式提供,是可自定义的。这些文件驻留在 /usr/lib/help/auths/locale/C 目录中。

主管理员权限配置文件

将主管理员权限配置文件指定给系统上功能最强的角色。拥有主管理员权限配置文件的角色具有超级用户功能。

如有必要,可以为站点自定义帮助文件 RtPriAdmin.html。帮助文件存储在 /usr/lib/help/auths/locale/C 目录中。

另请注意,如果主管理员权限配置文件与站点的安全策略不一致,则可以修改配置文件或者根本就不指定配置文件。但是,需要在一个或多个其他权限配置文件中处理主管理员权限配置文件中的安全功能。然后将这些权限配置文件指定给角色。

表 10–1 主管理员权限配置文件的内容

目的 

内容 

执行所有管理任务 

命令*:uid=0;gid=0

授权solaris.*solaris.grant

帮助文件RtPriAdmin.html

系统管理员权限配置文件

系统管理员权限配置文件适用于系统管理员角色。由于系统管理员不具有主管理员具有的广泛功能,因此不使用通配符。相反,此配置文件是一组不涉及安全性的独立的补充管理权限配置文件。显示其中一个补充权限配置文件中带有安全属性的命令。

请注意,将在补充权限配置文件列表的末尾指定所有权限配置文件。

表 10–2 系统管理员权限配置文件的内容

目的 

内容 

执行大多数非安全性的管理任务 

补充权限配置文件:审计查看、打印机管理、计时程序管理、设备管理、文件系统管理、邮件管理、维护和修复、介质备份、介质恢复、名称服务管理、网络管理、对象访问管理、进程管理、软件安装、用户管理、所有

帮助文件RtSysAdmin.html

补充配置文件之一中的命令 

对象访问管理权限配置文件solaris 策略: /usr/bin/chgrp:privs=file_chown /usr/bin/chmod:privs=file_chown/usr/bin/chown:privs=file_chown /usr/bin/setfacl:privs=file_chown

suser 策略: /usr/bin/chgrp:euid=0/usr/bin/chmod:euid=0/usr/bin/chown:euid=0 /usr/bin/getfacl:euid=0/usr/bin/setfacl:euid=0

操作员权限配置文件

操作员权限配置文件是一个功能较弱的配置文件,提供执行备份和打印机维护的功能。恢复文件的功能与安全性相关更密切。因此,在此配置文件中,缺省值将不包括恢复文件的功能。

表 10–3 操作员权限配置文件的内容

目的 

内容 

执行简单的管理任务 

补充权限配置文件:打印机管理、介质备份、所有

帮助文件RtOperator.html

打印机管理权限配置文件

打印机管理是适用于特定任务区域的典型权限配置文件。此配置文件包括授权和命令。下表显示了部分命令列表。

表 10–4 打印机管理权限配置文件的内容

目的 

内容 

管理打印机、守护进程和假脱机 

授权solaris.admin.printer.deletesolaris.admin.printer.modifysolaris.admin.printer.read

命令/usr/bin/cancel:euid=lp;uid=lp , /usr/bin/lpset:egid=14, /usr/bin/lpstat:euid=0 , /usr/lib/lp/local/lpadmin:uid=lp;gid=8, /usr/lib/lp/lpsched:uid=0 , /usr/sbin/lpadmin:egid=14;uid=lp;gid=8, /usr/sbin/lpfilter:euid=lp;uid=lp, /usr/ucb/lprm:euid=0

帮助文件RtPrntMngmnt.html

基本 Solaris 用户权限配置文件

缺省情况下,会通过 policy.conf 文件将基本 Solaris 用户权限配置文件自动指定给所有用户。此配置文件提供了正常操作中有用的基本授权。请注意,基本 Solaris 用户权限配置文件提供的便利必须与站点的安全要求平衡。需要更严格安全性的站点可能希望从 policy.conf 文件中删除此配置文件。

表 10–5 基本 Solaris 用户权限配置文件的内容

目的 

内容 

自动将权限指定给所有用户 

授权solaris.profmgr.readsolaris.jobs.userssolaris.mail.mailqsolaris.admin.usermgr.readsolaris.admin.logsvc.readsolaris.admin.fsmgr.readsolaris.admin.serialmgr.readsolaris.admin.diskmgr.readsolaris.admin.procmgr.usersolaris.compsys.readsolaris.admin.printer.readsolaris.admin.prodreg.readsolaris.admin.dcmgr.readsolaris.snmp.readsolaris.project.readsolaris.admin.patchmg.readsolaris.network.hosts.readsolaris.compsys.readsolaris.admin.volmgr.read

补充权限配置文件:所有

帮助文件RtDefault.html

所有权限配置文件

所有权限配置文件使用通配符包括所有命令。此配置文件提供了可访问未在其他权限配置文件中显式指定的所有命令的角色。如果没有所有权限配置文件或使用通配符的其他权限配置文件,则角色只能访问显式指定的命令。如此有限的命令集不是很实用。

所有权限配置文件(如果使用)应该是指定的最终权限配置文件。此最后一个位置可确保不会意外覆盖其他权限配置文件中的显式安全属性指定。

表 10–6 所有权限配置文件的内容

目的 

内容 

以用户或角色的身份执行任何命令 

命令: *

帮助文件RtAll.html

权限配置文件的顺序

权限配置文件中的命令按顺序进行解释。第一次出现的命令版本是用于此角色或用户的命令的唯一版本。不同的权限配置文件可以包括相同命令。因此,配置文件列表中权限配置文件的顺序至关重要。应该首先列出具有最多功能的权限配置文件。

权限配置文件在 Solaris Management Console GUI 和 prof_attr 文件中列出。在 Solaris Management Console GUI 中,具有最多功能的权限配置文件应该是指定权限配置文件列表中最顶部的配置文件。在 prof_attr 文件中,具有最多功能的权限配置文件应该是补充配置文件列表中的第一个配置文件。此放置方法可确保带有安全属性的命令列在不带安全属性的相同命令之前。

查看权限配置文件的内容

Solaris Management Console 权限工具提供了一种检查权限配置文件内容的方法。

prof_attrexec_attr 文件提供了划分更细的视图。prof_attr 文件包含在系统上定义的每个权限配置文件的名称。此文件还包括每个配置文件的授权和补充权限配置文件。 exec_attr 文件包含权限配置文件的名称及其带有安全属性的命令。

授权命名和委托

RBAC 授权是可以授予角色或用户的独立权限。在用户获取对应用程序或应用程序内特定操作的访问权限之前,将通过 RBAC 兼容应用程序检查授权。此检查替换了常规 UNIX 应用程序中对 UID=0 的测试。

授权命名约定

授权具有在内部以及文件中使用的名称。例如,solaris.admin.usermgr.pswd 是一个授权的名称。授权具有简短说明,此说明出现在图形用户界面 (graphical user interface, GUI) 中。例如,Change Passwordssolaris.admin.usermgr.pswd 授权的说明。

根据约定,授权名称由顺序颠倒过来的供应商 Internet 名称、主题区域(任何子区域)和功能组成。授权名称的各个部分以点分隔。com.xyzcorp.device.access 便是一个示例。此约定的例外是 Sun Microsystems, Inc. 的授权,它使用前缀 solaris 代替 Internet 名称。使用命名约定,管理员可以用分层方式应用授权。通配符 (*) 可以表示点右侧的所有字符串。

授权粒度示例

可将以下情况视为如何使用授权的示例:操作员角色中的用户可能限于 solaris.admin.usermgr.read 授权,此授权只提供可对用户配置文件的读取访问,不提供写入访问。系统管理员角色自然地具有 solaris.admin.usermgr.readsolaris.admin.usermgr.write 授权,以对用户文件进行更改。但是,如果没有 solaris.admin.usermgr.pswd 授权,系统管理员就不能更改口令。主管理员具有所有这三个授权。

需要 solaris.admin.usermgr.pswd 授权才能在 Solaris Management Console 用户工具中更改口令。使用 smusersmmultiusersmrole 命令中的口令修改选项时也需要此授权。

授权中的授权委托

使用以后缀 grant 结束的授权,用户或角色可将以相同前缀开头的任何指定授权委托给其他用户。

例如,具有授权 solaris.admin.usermgr.grantsolaris.admin.usermgr.read 的角色可将 solaris.admin.usermgr.read 授权委托给其他用户。具有 solaris.admin.usermgr.grantsolaris.admin.usermgr.* 授权的角色可将具有 solaris.admin.usermgr 前缀的任何授权委托给其他用户。

支持 RBAC 的数据库

以下四个数据库存储 RBAC 元素的数据:

policy.conf 数据库包含应用于所有用户的授权、权限和权限配置文件。有关更多信息,请参见policy.conf 文件

RBAC 数据库关系

每个 RBAC 数据库都使用 key=value 语法存储属性。此方法可以适应将来的数据库扩展。此外,使用此方法,系统可以在遇到其策略未知的关键字时继续运行。key=value 内容将文件链接起来。四个数据库中的以下链接项说明了 RBAC 数据库协同工作的方式。


示例 10–1 显示 RBAC 数据库连接

在以下示例中,通过为用户 jdoe 指定角色 filemgr,使此用户获取文件系统管理配置文件的功能。

  1. user_attr 数据库的 jdoe 用户项中为用户 jdoe 指定角色 filemgr


    # user_attr - user definition
    
    jdoe::::type=normal;roles=filemgr
    
  2. user_attr 数据库的角色项中为角色 filemgr 指定权限配置文件文件系统管理。


    # user_attr - role definition
    
    filemgr::::profiles=File System Management;type=role

    用户和角色在本地系统上的 passwd shadow 文件中(或者在分布式名称服务的等效数据库中)唯一定义。

  3. 文件系统管理权限配置文件在 prof_attr 数据库中定义。此数据库还为文件系统管理项指定了三组授权。


    # prof_attr - rights profile definitions and assigned authorizations
    
    File System Management:::Manage, mount, share file systems:
    
    help=RtFileSysMngmnt.html;
    
    auths=solaris.admin.fsmgr.*,solaris.admin.diskmgr.*,solaris.admin.volmgr.*
  4. 这些授权在 auth_attr 数据库中定义。


    # auth_attr - authorization definitions
    
    solaris.admin.fsmgr.:::Mounts and Shares::help=AuthFsmgrHeader.html
    
    solaris.admin.fsmgr.read:::View Mounts and Shares::help=AuthFsmgrRead.html
    
    solaris.admin.fsmgr.write:::Mount and Share Files::help=AuthFsmgrWrite.html
  5. exec_attr 数据库中为文件系统管理权限配置文件指定带有安全属性的命令。


    # exec_attr - rights profile names with secured commands
    
    File System Management:suser:cmd:::/usr/sbin/mount:uid=0
    
    File System Management:suser:cmd:::/usr/sbin/dfshares:euid=0
    
    …
    
    File System Management:solaris:cmd:::/usr/sbin/mount:privs=sys_mount
    
    …

RBAC 数据库和名称服务

RBAC 数据库的名称服务范围只能应用于本地主机。此范围还可以包括由 NIS、NIS+ 或 LDAP 之类的名称服务提供服务的所有主机。在 /etc/nsswitch.conf 文件中为每个数据库设置具有优先级的名称服务。

user_attr 数据库

user_attr 数据库包含补充 passwdshadow 数据库的用户和角色信息。user_attr 数据库包含授权、权限配置文件和指定角色之类的扩展用户属性。 user_attr 数据库中的字段以冒号分隔,如下所示:


user:qualifier:res1:res2:attr

这些字段具有以下含义:

user

passwd 数据库中指定的用户或角色的名称。

qualifier:res1:res2

保留这些字段供将来使用。

attr

以分号 (;) 分隔的关键字-值对的可选列表,用于说明将在用户运行命令时应用的安全属性。四个有效关键字为 typeauthsprofilesroles

  • 如果此帐户属于普通用户,则可以将 type 关键字设置为 normal。如果此帐户属于角色,则 typerole

  • auths 关键字指定从 auth_attr 数据库中定义的名称中选择的以逗号分隔的授权名称列表。授权名称可以包括星号 (*) 字符作为通配符。例如,solaris.device.* 表示所有的 Solaris 设备授权。

  • profiles 关键字指定 prof_attr 数据库中排序的逗号分隔权限配置文件名称列表。权限配置文件的排序方式与 UNIX 搜索路径的排序方式类似。列表中包含要执行的命令的第一个配置文件定义将应用于命令的安全属性(如果存在)。

  • 可以通过以逗号分隔的角色名称列表将 roles 关键字指定给用户。请注意,角色在同一 user_attr 数据库中定义。通过将类型值设置为 role 来表示角色。不能将角色指定给其他角色。

以下示例演示了如何在典型的 user_attr 数据库中定义操作员角色。此示例显示了如何将角色指定给用户 jdoe。通过 type 关键字区分角色和用户。


% grep operator /etc/user_attr 

jdoe::::type=normal;roles=operator

operator::::profiles=Operator;type=role

auth_attr 数据库

所有授权都存储在 auth_attr 数据库中。可以将授权指定给用户、角色或权限配置文件。首选方法是将授权放置在权限配置文件中,将配置文件包括在角色的配置文件列表中,然后将角色指定给用户。

auth_attr 数据库中的字段以冒号分隔,如下所示:


authname:res1:res2:short_desc:long_desc:attr

这些字段具有以下含义:

authname

用于以 prefix.[suffix] 格式标识授权的唯一字符串。Solaris OS 的授权使用 solaris 作为前缀。所有其他授权应使用与创建授权的组织的 Internet 域名顺序相反的名称开头的前缀(例如,com.xyzcompany)。后缀指示要授权的内容,通常是功能区域和操作。

authname 由前缀和功能区域组成并以句点结束时,authname 将用作应用程序 GUI 中使用的标题。由两部分组成的 authname 不是实际授权。authname 的值 solaris.printmgr. 便是一个标题示例。

authname 以单字 "grant" 结束时,authname 将用作授予授权。使用授予授权,用户可以将具有相同前缀和功能区域的授权委托给其他用户。authname 的值 solaris.printmgr.grant 便是一个授予授权示例。solaris.printmgr.grant 授予用户将 solaris.printmgr.adminsolaris.printmgr.nobanner 之类的授权委托给其他用户的权限。

res1:res2

保留以供将来使用。

short_desc

授权的短名称。此短名称适于在用户界面中(如 GUI 中的滚动列表中)显示。

long_desc

详细说明。此字段标识授权的目的、使用授权的应用程序以及可能使用授权的用户类型。可以在应用程序的帮助文本中显示详细说明。

attr

以分号 (;) 分隔的关键字-值对的可选列表,用于说明授权属性。可以指定零个或多个关键字。

关键字 help 标识 HTML 形式的帮助文件。可以通过 /usr/lib/help/auths/locale/C 目录中的 index.html 文件访问帮助文件。

以下示例显示了带有一些典型值的 auth_attr 数据库:


% grep printer /etc/security/auth_attr 

solaris.admin.printer.:::Printer Information::help=AuthPrinterHeader.html

solaris.admin.printer.delete:::Delete Printer Information::help=AuthPrinterDelete.html

solaris.admin.printer.modify:::Update Printer Information::help=AuthPrinterModify.html

solaris.admin.printer.read:::View Printer Information::help=AuthPrinterRead.html

请注意,solaris.admin.printer. 被定义为标题,这是因为授权名称以点 (.) 结束。GUI 使用标题组织授权系列。

prof_attr 数据库

prof_attr 数据库存储名称、说明、帮助文件的位置以及指定给权限配置文件的授权。指定给权限配置文件的命令和安全属性存储在 exec_attr 数据库中。有关更多信息,请参见exec_attr 数据库prof_attr 数据库中的字段以冒号分隔,如下所示:


profname:res1:res2:desc:attr

这些字段具有以下含义:

profname

权限配置文件的名称。权限配置文件名称区分大小写。user_attr 数据库也使用此名称指示指定给角色和用户的配置文件。

res1:res2

保留以供将来使用。

desc

详细说明。此字段应介绍权限配置文件的目的,包括有兴趣使用此配置文件的用户类型。详细说明适于在应用程序的帮助文本中显示。

attr

以分号 (;) 分隔的关键字-值对的可选列表,用于说明在执行时应用于对象的安全属性。可以指定零个或多个关键字。两个有效关键字为 helpauths

关键字 help 标识 HTML 形式的帮助文件。可以通过 /usr/lib/help/auths/locale/C 目录中的 index.html 文件访问帮助文件。

关键字 auths 指定从 auth_attr 数据库中定义的那些名称中选择的以逗号分隔的授权名称列表。可以使用星号 (*) 字符作为通配符来指定授权名称。

以下示例显示了两个典型的 prof_attr 数据库项。请注意,打印机管理权限配置文件是操作员权限配置文件的补充权限配置文件。根据显示的需要,另起一行来显示此示例。


% grep 'Printer Management' /etc/security/prof_attr

Printer Management:::         权限配置文件的名称

Manage printers, daemons, spooling: 说明

help=RtPrntAdmin.html;              帮助文件

auths=solaris.admin.printer.read, 授权

solaris.admin.printer.modify,solaris.admin.printer.delete

...

Operator:::                         权限配置文件的名称

Can perform simple administrative tasks: 说明

profiles=Printer Management,  补充权限配置文件

Media Backup,All;

help=RtOperator.html               帮助文件

exec_attr 数据库

exec_attr 数据库定义需要安全属性才能成功运行的命令。这些命令是权限配置文件的一部分。具有安全属性的命令可以由为其指定了此配置文件的角色运行。

exec_attr 数据库中的字段以冒号分隔,如下所示:


name:policy:type:res1:res2:id:attr

这些字段具有以下含义:

profname

权限配置文件的名称。权限配置文件名称区分大小写。该名称指的是 prof_attr 数据库中的配置文件。

policy

与此项相关联的安全策略。目前,susersolaris 是有效项。solaris 策略可识别权限,而 suser 策略则不能。

type

指定的实体类型。目前,唯一有效的实体类型是 cmd(命令)。

res1:res2

保留以供将来使用。

id

标识实体的字符串。命令应该具有全路径或带有通配符 (*) 的路径。要指定参数,请编写具有这些参数的脚本并使 id 指向此脚本。

attr

以分号 (;) 分隔的关键字-值对的可选列表,用于说明将在执行时应用于实体的安全属性。可以指定零个或多个关键字。有效关键字的列表取决于强制执行的策略。

对于 suser 策略,四个有效关键字为 euiduidegidgid

  • euiduid 关键字包含单个用户名或数字用户 ID (user ID, UID)。通过 euid 指定的命令使用提供的 UID 运行,这与在可执行文件上设置 setuid 位类似。通过 uid 指定的命令使用实际 UID 和有效 UID 运行。

  • egidgid 关键字包含单个组名或数字组 ID (group ID, GID)。通过 egid 指定的命令使用提供的 GID 运行,这与在可执行文件上设置 setgid 位类似。通过 gid 指定的命令使用实际 GID 和有效 GID 运行。

对于 solaris 策略,有效关键字为 privs。值由以逗号分隔的权限列表组成。

以下示例显示了 exec_attr 数据库中的一些典型值:


% grep 'File System Management' /etc/security/exec_attr

File System Management:suser:cmd:::/usr/sbin/ff:euid=0

File System Management:solaris:cmd:::/usr/sbin/mount:privs=sys_mount

…

policy.conf 文件

policy.conf 文件提供了向所有用户授予特定权限配置文件、特定授权和特定权限的方法。文件中的相关项由 key=value 对组成:

以下示例显示了 policy.conf 数据库中的一些典型值:


# grep AUTHS /etc/security/policy

AUTHS_GRANTED=solaris.device.cdrw



# grep PROFS /etc/security/policy

PROFS_GRANTED=Basic Solaris User



# grep PRIV /etc/security/policy



#PRIV_DEFAULT=basic

#PRIV_LIMIT=all

有关权限的更多信息,请参见权限(概述)

RBAC 命令

本节列出了用于管理 RBAC 的命令,还提供了一个命令表,其中命令的访问可以由授权控制。

管理 RBAC 的命令

虽然可以手动编辑本地 RBAC 数据库,但是强烈建议不要进行此类编辑。以下命令可用于管理对具有 RBAC 的任务进行访问。

表 10–7 RBAC 管理命令

命令的手册页 

说明 

auths(1)

显示用户的授权。

makedbm(1M)

生成 dbm 文件。

nscd(1M)

名称服务高速缓存守护进程,适用于高速缓存 user_attrprof_attr exec_attr 数据库。使用 svcadm 命令重新启动守护进程。

pam_roles(5)

PAM 的角色帐户管理模块。检查承担角色的授权。

pfexec(1)

由配置文件 shell 使用以执行在 exec_attr 数据库中指定的带有安全属性的命令。

policy.conf(4)

系统安全策略的配置文件。列出授予的授权、授予的权限和其他安全信息。

profiles(1)

显示指定用户的权限配置文件。

roles(1)

显示指定用户可以承担的角色。

roleadd(1M)

向本地系统中添加角色。

roledel(1M)

从本地系统中删除角色。

rolemod(1M)

在本地系统上修改角色的属性。

smattrpop(1M)

将源安全属性数据库合并到目标数据库。用于需要将本地数据库合并到名称服务的情况。还用于未提供转换脚本的升级。

smexec(1M)

管理 exec_attr 数据库中的项。要求验证。

smmultiuser(1M)

管理对用户帐户的批量操作。要求验证。

smprofile(1M)

管理 prof_attr exec_attr 数据库中的权限配置文件。要求验证。

smrole(1M)

管理角色帐户中的角色和用户。要求验证。

smuser(1M)

管理用户项。要求验证。

useradd(1M)

向系统中添加用户帐户。-P 选项将角色指定给用户帐户。

userdel(1M)

从系统中删除用户的登录。

usermod(1M)

修改系统上的用户帐户属性。

要求授权的命令

下表提供了在 Solaris 系统上如何使用授权限制命令选项的示例。有关授权的更多介绍,请参见授权命名和委托

表 10–8 命令和关联的授权

命令的手册页 

授权要求 

at(1)

所有选项所需的 solaris.jobs.userat.allowat.deny 文件都不存在时)

atq(1)

所有选项所需的 solaris.jobs.admin

cdrw(1)

所有选项所需的 solaris.device.cdrw,缺省情况下在 policy.conf 文件中授予

crontab(1)

选项提交作业所需的 solaris.jobs.usercrontab.allow crontab.deny 文件都不存在时)

选项列出或修改其他用户的 crontab 文件所需的 solaris.jobs.admin

allocate(1)

分配设备所需的 solaris.device.allocate(或在 device_allocate 文件中指定的其他授权)

将设备分配给其他用户(-F 选项)所需的 solaris.device.revoke(或在 device_allocate 文件中指定的其他授权)

deallocate(1)

解除其他用户的设备分配所需的 solaris.device.allocate(或在 device_allocate 文件中指定的其他授权)

强制解除指定设备(-F 选项)或所有设备的分配(-I 选项)所需的 solaris.device.revoke(或在 device_allocate 中指定的其他授权)

list_devices(1)

列出其他用户的设备(-U 选项)所需的 solaris.device.revoke

sendmail(1M)

访问邮件子系统功能所需的 solaris.mail;查看邮件队列所需的 solaris.mail.mailq

第 11 章 权限(任务)

本章提供了在系统上管理和使用权限的逐步说明。以下是本章中信息的列表:

有关权限的概述,请参见权限(概述)。有关参考信息,请参见第 12 章,权限(参考)

管理和使用权限(任务列表)

以下任务列表介绍了管理权限和使用权限的任务列表。

任务 

说明 

参考 

在站点使用权限 

涉及指定、删除、添加和调试权限的使用。 

管理权限(任务列表)

运行命令时使用权限 

涉及使用已指定给您的权限。 

确定权限(任务列表)

管理权限(任务列表)

以下任务列表介绍了查看权限、指定权限以及运行包含特权命令的脚本的过程。

任务 

说明 

参考 

确定进程中的权限 

列出进程的有效权限集、可继承权限集、允许权限集和限制权限集。 

如何确定进程的权限

确定进程缺少的权限 

列出失败进程成功运行所需的权限。 

如何确定程序所需的权限

为命令添加权限 

为权限配置文件的命令添加权限。可以将权限配置文件指定给用户或角色。然后,用户可以在配置文件 shell 中运行具有指定权限的命令。 

如何为命令添加权限

为用户指定权限 

扩展用户或角色的可继承权限集。使用此过程时应谨慎。 

如何将权限指定给用户或角色

限制用户的权限 

限制用户的基本权限集。使用此过程时应谨慎。 

如何限制用户或角色的权限

运行特权 shell 脚本 

为 shell 脚本和 shell 脚本中的命令添加权限。然后,在配置文件 shell 中运行此脚本。 

如何运行具有特权命令的 Shell 脚本

管理权限

管理用户和角色权限的最安全的方法是将权限使用限制在权限配置文件内的命令中。然后,此权限配置文件就包括在某个角色中。此角色会指定给某个用户。当此用户承担指定的角色时,特权命令便可在配置文件 shell 中运行。以下过程显示了如何指定权限、删除权限以及调试权限的使用。

Procedure如何确定进程的权限

此过程说明如何确定可用于进程的权限。列出内容不包括已经指定给特定命令的权限。

    列出可用于 shell 进程的权限。


    % ppriv pid
    
    $ ppriv -v pid
    
    pid

    进程号。使用双美元符号 ($$) 将父 shell 的进程号传递到命令。

    -v

    提供权限名称的详细列表。


示例 11–1 确定当前 shell 中的权限

在以下示例中,列出了用户 shell 进程的父进程中的权限。在下面第二个示例中,列出了权限的全名。输出中的单个字母指代以下权限集:

E

有效权限集。

I

可继承权限集。

P

允许权限集。

L

限制权限集。


% ppriv $$

1200:   -csh

flags = <none>

        E: basic

        I: basic

        P: basic

        L: all

% ppriv -v $$

1200:   -csh

flags = <none>

        E: file_link_any,proc_exec,proc_fork,proc_info,proc_session

        I: file_link_any,proc_exec,proc_fork,proc_info,proc_session

        P: file_link_any,proc_exec,proc_fork,proc_info,proc_session

        L: cpc_cpu,dtrace_kernel,dtrace_proc,dtrace_user,…,sys_time


示例 11–2 确定可承担的角色的权限

角色使用管理 shell 或配置文件 shell。必须承担角色并使用此角色的 shell 列出已直接指定给此角色的权限。在以下示例中,角色 sysadmin 不具有直接指定的权限。


% su sysadmin

Password: <键入 sysadmin 的口令>

$ /usr/ucb/whoami

sysadmin

$ ppriv -v $$

1400:   pfksh

flags = <none>

        E: file_link_any,proc_exec,proc_fork,proc_info,proc_session

        I: file_link_any,proc_exec,proc_fork,proc_info,proc_session

        P: file_link_any,proc_exec,proc_fork,proc_info,proc_session

        L: cpc_cpu,dtrace_kernel,dtrace_proc,dtrace_user,…,sys_time

Procedure如何确定程序所需的权限

此过程确定成功运行命令或进程所需的权限。

开始之前

命令或进程必须已经失败,才执行此过程。

  1. 键入失败的命令作为 ppriv 调试命令的参数。


    % ppriv -eD touch /etc/acct/yearly
    
    touch[11365]: missing privilege "file_dac_write" 
    
         (euid = 130, syscall = 224) needed at ufs_direnter_cm+0x27c
    
    touch: /etc/acct/yearly cannot create
  2. 通过在 /etc/name_to_sysnum 文件中查找 syscall 编号来确定失败的系统调用。


    % grep 224 /etc/name_to_sysnum
    
    creat64                 224

示例 11–3 使用 truss 命令检查权限使用

truss 命令可以在常规 shell 中调试权限的使用。例如,以下命令调试失败的 touch 进程:


% truss -t creat touch /etc/acct/yearly

creat64("/etc/acct/yearly", 0666)            

                       Err#13 EACCES [file_dac_write]

touch: /etc/acct/yearly cannot create

扩展的 /proc 接口在 truss 输出中的错误代码后面报告缺少的权限。



示例 11–4 使用 ppriv 命令检查配置文件 Shell 中的权限使用

ppriv 命令可以在配置文件 shell 中调试权限的使用。如果将权限配置文件指定给用户,并且此权限配置文件包括具有权限的命令,则必须在配置文件 shell 中键入这些命令。在常规 shell 中键入特权命令时,这些命令执行时不使用特权。

在此示例中,jdoe 用户可以承担角色 objadminobjadmin 角色拥有对象访问管理配置文件。使用此权限配置文件,objadmin 角色可以更改不属于 objadmin 的文件的权限。

在以下摘录中,jdoe 无法更改 useful.script 文件的权限:


jdoe% ls -l useful.script

-rw-r--r--  1 aloe  staff  2303 Mar 11 05:29 useful.script

jdoe% chown objadmin useful.script

chown: useful.script: Not owner

jdoe% ppriv -eD chown objadmin useful.script

chown[11444]: missing privilege "file_chown" 

            (euid = 130, syscall = 16) needed at ufs_setattr+0x258

chown: useful.script: Not owner

jdoe 承担 objadmin 角色时,更改了该文件的权限:


jdoe% su objadmin

Password: <键入 objadmin 的口令>

$ ls -l useful.script

-rw-r--r--  1 aloe  staff  2303 Mar 11 05:29 useful.script

$ chown objadmin useful.script

$ ls -l useful.script

-rw-r--r--  1 objadmin  staff  2303 Mar 11 05:29 useful.script

$ chgrp admin useful.script

$ ls -l objadmin.script

-rw-r--r--  1 objadmin  admin  2303 Mar 11 05:31 useful.script


示例 11–5 更改 root 用户拥有的文件

此示例说明防止权限升级的方法。有关说明,请参见防止权限升级。此文件归 root 用户所有。由于权限较低的 objadmin 角色需要所有权限才能更改文件的拥有权,因此操作失败。


jdoe% su objadmin

Password: <键入 objadmin 的口令>

$ cd /etc; ls -l system

-rw-r--r--  1 root  sys   1883 Mar 20 14:04 system

$ chown objadmin system

chown: system: Not owner

$ ppriv -eD chown objadmin system

chown[11481]: missing privilege "ALL" 

     (euid = 101, syscall = 16) needed at ufs_setattr+0x258

chown: system: Not owner

Procedure如何为命令添加权限

应在将命令添加到权限配置文件时为此命令添加权限。使用这些权限,拥有权限配置文件的角色可以运行管理命令,但不会获取任何其他超级用户功能。

开始之前

命令或程序必须可识别权限。有关更全面的介绍,请参见进程如何获取权限

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见配置 RBAC(任务列表)

  2. 打开 Solaris Management Console GUI。

    有关说明,请参见如何在 Solaris Management Console 中承担角色

  3. 使用权限工具更新相应的配置文件。

    选择要包括的命令。对于每个包括的命令,添加此命令所需的权限。


    注意 – 注意 –

    在权限配置文件中添加命令并向命令中添加权限后,这些命令在配置文件 shell 中运行时会使用这些权限执行。

    配置文件的顺序很重要。配置文件 shell 使用帐户配置文件列表内的最早配置文件中指定的安全属性执行命令或操作。例如,如果 chgrp 命令位于具有权限的对象访问管理权限配置文件中,并且对象访问管理配置文件是包含 chgrp 命令的第一个配置文件,则 chgrp 命令执行时使用在对象访问管理配置文件中指定的权限。


Procedure如何将权限指定给用户或角色

您可能始终信任某些具有特定权限的用户。只有对系统影响非常小的仅有的几个特定权限才适合指定给用户。有关直接指定权限所涉及内容的介绍,请参见直接指定安全属性时的安全注意事项

用户 jdoe 可以通过以下过程使用高分辨率计时器。

  1. 承担主管理员角色,或成为超级用户。

    主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2  章 “使用 Solaris Management Console(任务)”

  2. 将影响高分辨率时间的权限添加到用户的初始可继承权限集。


    $ usermod -K defaultpriv=basic,proc_clock_highres jdoe
    
  3. 读取产生的 user_attr 项。


    $ grep jdoe /etc/user_attr
    
    jdoe::::type=normal;defaultpriv=basic,proc_clock_highres

示例 11–6 创建具有权限的角色来配置系统时间

此示例创建了一个角色,其唯一任务是处理系统上的时间。


$ /usr/sadm/bin/smrole -D nisplus:/examplehost/example.domain \

-r primaryadm -l <Type primaryadm password> \

add -- -n clockmgr \

-c "Role that sets system time" \

-F "Clock Manager" \

-s /bin/pfksh \

-u 108 \

-P <Type clockmgr password> \

-K defaultpriv=basic,proc_priocntl,sys_cpu_config,

proc_clock_highres,sys_time

-K 行换行以便显示。

如果角色在本地创建,则此角色 user_attr 项的显示可能与以下信息类似:


clockmgr:::Role that sets system time:

type=role;defaultpriv=basic,proc_priocntl,sys_cpu_config,

proc_clock_highres,sys_time

Procedure如何限制用户或角色的权限

可以通过减少基本集或减少限制集来限制用户或角色可用的权限。由于此类限制可能产生预料不到的副作用,因此不是非常必要时不要使用此方法限制用户权限。


注意 – 注意 –

为某个用户修改了基本集或限制集时,应该彻底测试任何用户的功能。


  1. 确定用户基本集和限制集中的权限。

    有关过程,请参见如何确定进程的权限

  2. (可选的)从基本集中删除一项权限。


    $ usermod -K defaultpriv=basic,!priv-name username
    

    通过删除 proc_session 权限,可以防止用户检查其当前会话以外的任何进程。通过删除 file_link_any 权限,可以防止用户生成指向不归其所有的文件的硬链接。


    注意 – 注意 –

    请勿删除 proc_forkproc_exec 权限。如果没有这些权限,用户将无法使用系统。事实上,只能从不对其他进程执行 fork()exec() 操作的守护进程中删除这两个权限。


  3. (可选的)从限制集中删除一项权限。


    $ usermod -K limitpriv=all,!priv-name username
    
  4. 测试 username 的功能。

    username 的身份登录,并尝试执行 username 必须在系统上执行的任务。


示例 11–7 从用户的限制集中删除权限

在以下示例中,防止所有源自 jdoe 初始登录的会话使用 sys_linkdir 权限。也就是说,即使在用户运行 su 命令之后,也不能生成指向目录的硬链接,并且也不能解除目录链接。


$ usermod -K limitpriv=all,!sys_linkdir jdoe

$ grep jdoe /etc/user_attr

jdoe::::type=normal;defaultpriv=basic;limitpriv=all,!sys_linkdir


示例 11–8 从用户的基本集中删除权限

在以下示例中,防止所有源自 jdoe 初始登录的会话使用 proc_session 权限。也就是说,即使在用户运行 su 命令之后,也不能检查此用户会话以外的任何进程。


$ usermod -K defaultpriv=basic,!proc_session jdoe

$ grep jdoe /etc/user_attr

jdoe::::type=normal;defaultpriv=basic,!proc_session;limitpriv=all

Procedure如何运行具有特权命令的 Shell 脚本


注 –

创建运行具有继承权限的命令的 shell 脚本时,相应的权限配置文件必须包含具有指定权限的命令。


  1. /bin/pfsh 或任何其他配置文件 shell 作为此脚本的第一行。


    #!/bin/pfsh
    
    # Copyright (c) 2003 by Sun Microsystems, Inc.
  2. 确定脚本中的命令所需的权限。


    % ppriv -eD script-full-path
    
  3. 打开 Solaris Management Console GUI。

    有关说明,请参见如何在 Solaris Management Console 中承担角色。选择可以创建权限配置文件的角色,如主管理员。

  4. 使用权限工具创建或更新相应的配置文件。

    选择脚本,并在此权限配置文件中包括需要权限才能运行的 shell 脚本中的每个命令。对于每个包括的命令,添加此命令所需的权限。


    注意 – 注意 –

    权限配置文件的顺序很重要。配置文件 shell 执行配置文件列表中最早的命令实例。例如,如果 chgrp 命令位于对象访问管理权限配置文件中,并且对象访问管理配置文件是包含 chgrp 命令的第一个配置文件,则执行 chgrp 命令时使用在对象访问管理配置文件中指定的权限。


  5. 向角色中添加权限配置文件并将此角色指定给用户。

    为了执行此配置文件,用户会承担角色并在此角色的配置文件 shell 中运行脚本。

确定权限(任务列表)

以下任务列表介绍了有关使用已指定给您的权限的过程。

任务 

说明 

参考 

以用户的身份在任何 shell 中查看权限 

显示已直接指定给您的权限。由您运行的所有进程都将以这些权限运行。 

如何确定已直接指定给您的权限

确定可以使用权限运行的命令 

将权限指定给权限配置文件中的可执行文件后,必须在配置文件 shell 中键入此可执行文件。 

如何确定可以运行的特权命令

确定角色可以使用权限运行的命令 

承担此角色来确定其可以使用权限运行的命令。 

如何确定角色可以运行的特权命令

确定已指定的权限

直接将权限指定给用户时,这些权限在每个 shell 中都有效。未直接将权限指定给用户时,则此用户必须打开一个配置文件 shell。例如,当具有指定权限的命令位于用户权限配置文件列表内的权限配置文件中时,此用户必须在配置文件 shell 中执行此命令。

Procedure如何确定已直接指定给您的权限

以下过程显示如何确定是否已直接为您指定权限。


注意 – 注意 –

不当使用直接指定的权限可能导致无意的安全性破坏。有关介绍,请参见直接指定安全属性时的安全注意事项


  1. 列出进程可以使用的权限。

    有关过程,请参见如何确定进程的权限

  2. 在任何 shell 中调用操作并运行命令。

    有效集中列出的权限在整个会话中都有效。如果已为您直接指定了除基本集之外的权限,则会在有效集中列出这些权限。


示例 11–9 确定直接指定给您的权限

如果已经为您直接指定权限,则基本集包含的权限会多于缺省基本集。在此示例中,用户始终能够访问 proc_clock_highres 权限。


% /usr/ucb/whoami

jdoe

% ppriv -v $$

1800:   pfksh

flags = <none>

        E: file_link_any,…,proc_clock_highres,proc_session

        I: file_link_any,…,proc_clock_highres,proc_session

        P: file_link_any,…,proc_clock_highres,proc_session

        L: cpc_cpu,dtrace_kernel,dtrace_proc,dtrace_user,…,sys_time

% ppriv -vl proc_clock_highres

        Allows a process to use high resolution timers.


示例 11–10 确定直接指定给角色的权限

角色使用管理 shell 或配置文件 shell。承担角色的用户可以使用此角色的 shell 列出已直接指定给此角色的权限。在以下示例中,已经直接将处理日期和时间程序的权限指定给角色 realtime


% su realtime

Password: <键入 realtime 的口令>

$ /usr/ucb/whoami

realtime

$ ppriv -v $$

1600:   pfksh

flags = <none>

        E: file_link_any,…,proc_clock_highres,proc_session,sys_time

        I: file_link_any,…,proc_clock_highres,proc_session,sys_time

        P: file_link_any,…,proc_clock_highres,proc_session,sys_time

        L: cpc_cpu,dtrace_kernel,dtrace_proc,dtrace_user,…,sys_time

Procedure如何确定可以运行的特权命令

未直接将权限指定给用户时,此用户可通过权限配置文件获取特权命令的访问权限。必须在配置文件 shell 中执行权限配置文件中的命令。

开始之前

验证到 Solaris Management Console 的用户或角色必须具有 solaris.admin.usermgr.read 授权。基本 Solaris 用户权限配置文件包括此授权。

  1. 确定已指定给您的权限配置文件。


    $ /usr/sadm/bin/smuser list -- -n username -l
    
    Authenticating as user: admin
    
    … Please enter a string value for: password :: 
    
    …
    
    User name:      username
    
    User ID (UID):  130
    
    Primary group:  staff
    
    Secondary groups: 
    
    Comment: object mgt jobs
    
    Login Shell: /bin/sh
    
    Home dir server: system
    
    Home directory: /export/home/username
    
    AutoHome setup: True
    
    Mail server: system
    
    Rights: Object Access Management
    
    Assigned Roles:
  2. 找到以 "Rights:" 开头的行。

    "Rights" 行列出已直接指定给您的权限配置文件的名称。

  3. exec_attr 数据库中查找权限配置文件的名称。


    $ cd /etc/security
    
    $ grep "Object Access Management" exec_attr 
    
    Object Access Management:solaris:cmd:::/usr/bin/chgrp:privs=file_chown
    
    Object Access Management:solaris:cmd:::/usr/bin/chown:privs=file_chown
    
    Object Access Management:suser:cmd:::/usr/bin/chgrp:euid=0
    
    Object Access Management:suser:cmd:::/usr/bin/chmod:euid=0
    
    …

    具有已添加权限的命令列在 solaris 策略项的末尾。

  4. 在配置文件 shell 中键入需要权限的命令。

    在常规 shell 中键入这些命令时,它们不会使用权限运行,因而不会成功运行。


    % pfsh
    
    $

示例 11–11 在配置文件 Shell 中运行特权命令

在以下示例中,用户 jdoe 不能从其常规 shell 中更改文件的组权限。但是,在配置文件 shell 中键入命令时,jdoe 可以更改这些权限。


% whoami

jdoe

% ls -l useful.script

-rwxr-xr-- 1 nodoe eng 262 Apr 2 10:52 useful.script

chgrp staff useful.script

chgrp: useful.script: Not owner

% pfksh

$ /usr/ucb/whoami

jdoe

$ chgrp staff useful.script

$ chown jdoe useful.script

$ ls -l useful.script

-rwxr-xr-- 1 jdoe staff 262 Apr 2 10:53 useful.script

Procedure如何确定角色可以运行的特权命令

角色通过包含具有指定权限的命令的权限配置文件来获取特权命令的访问权限。为用户提供特权命令访问权限的最安全的方法是为用户指定一个角色。承担此角色之后,用户便可执行所有包括在此角色权限配置文件中的特权命令。

开始之前

验证到 Solaris Management Console 的用户或角色必须具有 solaris.admin.usermgr.read 授权。基本 Solaris 用户权限配置文件包括此授权。

  1. 确定可以承担的角色。


    $ /usr/sadm/bin/smuser list -- -n username -l
    
    Authenticating as user: primadmin
    
    …
    
    User name:      username
    
    User ID (UID):  110
    
    Primary group:  staff
    
    Secondary groups: 
    
    Comment: Has admin roles
    
    Login Shell: /bin/sh
    
    …
    
    Rights: 
    
    Assigned Roles: primadmin, admin
  2. 找到以 "Assigned Roles:" 开头的行。

    "Assigned Roles" 行列出可以承担的角色。

  3. 确定角色之一拥有的权限配置文件。


    $ /usr/sadm/bin/smuser list -- -n admin -l
    
    Authenticating as user: primadmin
    
    …
    
    User name:      admin
    
    User ID (UID):  101
    
    Primary group:  sysadmin
    
    Secondary groups:
    
    Comment: system administrator
    
    Login Shell: /bin/pfksh
    
    …
    
    Rights: System Administrator
    
    Assigned Roles:
  4. 在 "Rights:" 行中找到该角色的权限配置文件的名称。

  5. prof_attr 数据库中查找权限配置文件。

    由于系统管理员配置文件是配置文件的集合,因此需要在系统管理员配置文件中列出这些配置文件。


    $ cd /etc/security
    
    $ grep "System Administrator" prof_attr 
    
    System Administrator:::Can perform most non-security administrative
    
    tasks:profiles=Audit Review,Printer Management,Cron Management,
    
    Device Management,File System Management,Mail Management,Maintenance
    
    and Repair,Media Backup,Media Restore,Name Service Management,Network
    
    Management,Object Access Management,Process Management,Software
    
    Installation,User Management,All;help=RtSysAdmin.html
  6. 对于每个权限配置文件,在 exec_attr 数据库中查找与其相关的权限配置文件。

    例如,Network Management 配置文件是 System Administrator 配置文件的补充配置文件。Network Management 配置文件包括一些特权命令。


    $ cd /etc/security
    
    $ grep "Network Management" exec_attr 
    
    Network Management:solaris:cmd:::/usr/sbin/ifconfig:privs=sys_net_config
    
    Network Management:solaris:cmd:::/usr/sbin/route:privs=sys_net_config

    这些命令及其指定权限是 solaris 策略项的最后两个字段。可以在角色的配置文件 shell 中运行这些命令。


示例 11–12 在角色中运行特权命令

当用户承担角色时,其 shell 成为配置文件 shell。因此,将使用指定给命令的权限来执行这些命令。在以下示例中,admin 角色可以更改 useful.script 文件的权限。


% whoami

jdoe

% ls -l useful.script

-rwxr-xr-- 1 elsee eng 262 Apr 2 10:52 useful.script

chgrp admin useful.script

chgrp: useful.script: Not owner

% su admin

Password: <键入 admin 的口令>

$ /usr/ucb/whoami

admin

$ chgrp admin useful.script

$ chown admin useful.script

$ ls -l useful.script

-rwxr-xr-- 1 admin admin 262 Apr 2 10:53 useful.script

第 12 章 权限(参考)

以下是本章中参考信息的列表:

有关如何使用权限的信息,请参见第 11 章,权限(任务)。有关概述信息,请参见权限(概述)

用于处理权限的管理命令

下表列出了可用于处理权限的命令。

表 12–1 用于处理权限的命令

目的 

命令 

手册页 

检查进程权限 

ppriv -v pid

ppriv(1)

设置进程权限 

ppriv -s spec

 

列出系统上的权限 

ppriv -l

 

列出权限及其说明 

ppriv -lv priv

 

调试权限故障 

ppriv -eD failed-operation

 

为新的本地用户指定权限 

useradd

useradd(1M)

为现有本地用户添加权限 

usermod

usermod(1M)

为名称服务中的用户指定权限 

smuser

smuser(1M)

将权限指定给新的本地角色 

roleadd

roleadd(1M)

为现有本地角色添加权限 

rolemod

rolemod(1M)

为名称服务中的角色指定权限 

smrole

smrole(1M)

查看设备策略 

getdevpolicy

getdevpolicy(1M)

设置设备策略 

devfsadm

devfsadm(1M)

在打开的设备上更新设备策略 

update_drv -p policy driver

update_drv(1M)

向设备中添加设备策略 

add_drv -p policy driver

add_drv(1M)

Solaris Management Console GUI 是用于为命令、用户和角色指定权限的首选工具。有关更多信息,请参见如何在 Solaris Management Console 中承担角色

包含权限信息的文件

以下文件包含权限信息。

表 12–2 包含权限信息的文件

文件和手册页 

关键字 

说明 

/etc/security/policy.conf

policy.conf(4)

PRIV_DEFAULT

系统的可继承权限集 

PRIV_LIMIT

系统的限制权限集 

/etc/user_attr

user_attr(4)

用户项或角色项中的 defaultpriv 关键字

其值通常在 Solaris Management Console GUI 中设置 

用户或角色的可继承权限集 

用户项或角色项中的 limitpriv 关键字

其值通常在 Solaris Management Console GUI 中设置 

用户或角色的限制权限集 

/etc/security/exec_attr

exec_attr(4)

命令的配置文件项中的 privs 关键字

命令的策略必须是 solaris

为权限配置文件中的命令指定的权限列表 

syslog.conf

syslog.conf(4)

调试消息的系统日志文件 

priv.debug 项中设置的路径

权限调试日志 


注 –

请勿直接编辑 exec_attruser_attr 数据库。要管理权限,请使用 Solaris Management Console 或诸如 smuser 的命令。有关更多信息,请参见 smc(1M)smuser(1M) 手册页。有关过程,请参见管理权限(任务列表)


权限和审计

可以审计权限的使用。当进程使用权限时,将在审计跟踪中记录权限的使用。权限将在其文本说明中记录。以下审计事件记录权限的使用:

不会审计基本集中权限的成功使用。尝试使用已从用户基本集中删除的基本权限时会进行审计。

防止权限升级

Solaris 内核可防止权限升级。权限升级是指某项权限使进程执行的操作多于其原本能够执行的操作。要防止进程获取的权限超出其应该获得的权限,必须具有完整的权限集才能进行特定系统修改。例如,只有具有完整权限集的进程才能更改 root (UID=0) 拥有的文件或进程。root 用户不需要权限就能更改 root 拥有的文件。但是,非超级用户必须具有所有权限才能更改 root 拥有的文件。

同样,提供设备访问权限的操作需要有效集中的所有权限。

file_chown_selfproc_owner 权限可进行权限升级。file_chown_self 权限允许进程放弃其文件。proc_owner 权限允许进程检查不归其拥有的进程。

可通过 rstchown 系统变量限制 file_chown_self 权限。将 rstchown 变量设置为零时,会从系统和所有用户的初始可继承集中删除 file_chown_self 权限。有关 rstchown 系统变量的更多信息,请参见 chown(1) 手册页。

file_chown_self 权限以最安全的方式指定给特定命令,放置在配置文件中,并指定给角色以在配置文件 shell 中使用。

proc_owner 权限不足以将进程 UID 切换为 0。将进程从任何 UID 切换为 UID=0 需要所有权限。由于 proc_owner 权限授予无限制读取系统上所有文件的权限,因此可以非常安全地将该权限指定给特定命令,将其放置在配置文件中,指定给角色以在配置文件 shell 中使用。


注意 – 注意 –

可修改用户帐户,以便在该用户的初始可继承集中包含 file_chown_self 权限或 proc_owner 权限。您应当有充分的安全理由将这些功能强大的权限放置在任何用户、角色或系统的可继承权限集中。


有关如何针对设备防止权限升级的详细信息,请参见权限和设备

传统应用程序和权限模型

为了适应传统应用程序,权限的实现使用超级用户模型和权限模型。内核会自动跟踪 PRIV_AWARE 标志,此标志指示已指定某个程序使用权限。请考虑不能识别权限的子进程。从父进程继承的所有权限均可在子进程的允许集和有效集中找到。如果子进程将 UID 设置为 0,则其可能不具有全部超级用户功能。进程的有效集和允许集会被限制为子进程限制集中包含的那些权限。这样,可识别权限进程的限制集会限制不能识别权限的子进程的超级用户权限。