Oracle® Solaris Cluster 参考手册

退出打印视图

更新时间: 2014 年 7 月,E51743-01
 
 

scha_check_app_user (1HA )

名称

scha_check_app_user - 获取应用程序用户名并检查所有权和权限

用法概要

scha_check_app_user [-R resource] [-U username] [-Z 
     zoneclustername] cmd-path

描述

scha_check_app_user 命令可获取供特定资源(受资源组管理器 (Resource Group Manager, RGM) 控制的资源)使用的配置应用程序用户名。它还可检查 cmd-path 指定的可执行文件的所有权和权限。此可执行文件通常是要由资源方法或监视器(使用 su(1M) 之类的包装将用户 ID 设置为配置的用户)执行的应用程序。资源方法或监视器在执行应用程序之前调用 scha_check_app_user。根据 scha_check_app_user 的输出,方法或监视器可能会在检测到与安全有关的问题时返回错误或输出警告消息。

scha_check_app_user 命令将配置用户的名称写入到标准输出(文件描述符 1),将任何安全警告或错误消息写入到标准错误(文件描述符 2)。退出代码指示配置的安全策略是否允许执行命令。如果退出代码为 0,调用者可以尝试以应用程序用户身份执行命令。如果退出代码非零,调用者不应尝试以应用程序用户身份执行命令,而应返回错误。

用法

调用 scha_check_app_user 的脚本可以使用该命令的输出来确定以下情况:

  • 应以什么用户 ID 执行命令

  • 是允许执行命令还是抛出错误

  • 发现安全问题时向用户传递回什么错误或警告消息

scha_check_app_user 命令与 r_properties(5) 手册页中介绍的 Resource_security 和 Application_user 属性一起工作。

scha_check_app_user 命令的行为取决于 Resource_security 属性的设置。Resource_security 属性在全局群集和每个区域群集中可能具有不同的值。scha_check_app_user 使用的 Resource_security 值是该属性在执行命令的群集中的值。

应当在要执行应用程序的相同环境中调用 scha_check_app_user 命令。例如,如果应用程序在全局区域中执行,则 scha_check_app_user 也应当在全局区域中执行。

通常的使用案例为下面的一种:

  • 资源及其资源组配置在全局群集中,scha_check_app_user 程序在全局群集中执行。

  • 资源及其资源组配置在区域群集中,scha_check_app_user 程序在该区域群集的某个区域中执行。

在这两种使用案例中,均无需在命令中指定 –Z zoneclustername 选项。

当应用程序要在全局区域中执行,但该应用程序与区域群集中的某个资源关联时,需要使用 –Z zoneclustername 选项。通常,这并不是必需的,但对于将 Global_zone 属性设置为 TRUE 的资源类型,则可能是必需的。有关更多信息,请参见 rt_properties(5)

有关使用 –Z 以及其他命令选项的详细信息,请参见“选项”部分。

选项

支持以下选项:

–Z zoneclustername

指定资源配置在哪个群集中。仅当命令在全局区域中执行但需要访问区域群集中某个资源的 Application_user 属性时,才需要指定此选项。无法在某一区域群集中使用 –Z 选项来访问其他区域群集。

如果省略 –Z 选项,则认为资源存在于执行 scha_check_app_user 命令的群集(全局群集或区域群集)中。

如果 scha_check_app_user 命令在全局区域中执行,并且同时指定了 –Z–R 选项,则使用 –R 指定的 resource 位于 –Z 指定的区域群集中而不在全局群集中。在这种情况下,代理开发者应当提醒最终用户注意以下情况:即使资源配置在区域群集中,Application_user 属性指定的用户名也需要在全局区域中有效。

如果 scha_check_app_user 命令在全局区域中执行,并且指定了 –Z 选项,则 cmd-path 参数标识的是全局区域(而不是 –Z 指定的区域)中的文件路径名。

–U username

如果指定了该选项,则采用此用户名作为应用程序用户名,而不考虑可执行文件所有者、Application_user 属性设置或 Resource_security 属性设置。当调用者有自己的应用程序用户名确定机制并且调用者只想检查可执行程序的所有权和权限时,可以使用 –U 选项。 如果调用者的实际用户 ID 为非 root 用户,而 –U 选项指定了 root 用户,则会产生错误。

如果将 –U 选项与 –Z 选项一起使用,则指定的 username 必须在执行命令的区域中有效,而不一定要在 –Z 选项指定的 zoneclustername 中有效。

–R resource

与此命令执行关联的 RGM 资源的名称。如果未同时指定 –U 选项,则从此资源的 Application_user 属性获取应用程序用户名。如果该资源没有 Application_user 属性,或者未设置该属性,则应用程序用户名是可执行文件的所有者。

如果未指定 –U 而 Resource_security 设置为 COMPATIBILITY,则无论 Application_user 属性设置为何值,应用程序用户名都将设置为调用进程的实际用户 ID。如果未指定 –U 而 Resource_security 属性设置为 OVERRIDE,则无论 Application_user 属性设置为何值,应用程序用户名都将设置为可执行文件的所有者。

如果同时指定了 –R 选项与 –Z,则资源的 Application_user 属性指定的用户名必须在执行命令的区域中有效,而不一定要在 –Z 选项指定的 zoneclustername 中有效。

cmd-path

调用者要以应用程序用户身份执行的可执行文件的全路径名。如果指定了 –Z 选项,将相对于执行命令的区域(而不是 –Z 选项指定的 zoneclustername)来计算 cmd-path

如果既没有指定 –R 也没有指定 –U,则应用程序用户名是可执行文件的所有者,除非 Resource_security 设置为 COMPATIBILITY,在这种情况下,应用程序用户名设置为调用进程的实际用户 ID。

如果计算的应用程序用户是 root 用户(超级用户),但调用者的实际用户 ID 为非 root 用户,则应用程序用户名将成为调用者的实际用户 ID。

示例

示例 1 在脚本中将 scha_check_app_usersu 一起使用

以下 bash 脚本在使用 su(1M) 执行名为 mycommand 的命令(该命令与名为 myresource 的 RGM 资源关联)之前调用 scha_check_app_user

    COMMANDPATH=/opt/mypkg/bin/mycommand
    RESOURCENAME=myresource
    TMPFILE=$(/usr/bin/mktemp)

    # Here we are redirecting the error/warning messages into 
    # a temp file and will write them later. 
    # Instead, we could just let them flow out to stderr.
    APPUSER=$(/usr/cluster/bin/scha_check_app_user \ 
            -R $RESOURCENAME $COMMANDPATH 2>$TMPFILE)
    errcode=$?

    if [[ $errcode -ne 0 ]]; then
        # Security checks failed -- do not execute the program
        printf "Security checks failed on program %s:\n" $COMMANDPATH
        # Output the error messages
        /usr/bin/cat $TMPFILE
        /usr/bin/rm $TMPFILE
        exit errcode
    fi

    # There may still be warning messages in TMPFILE.
    # Write them for the user.
    /usr/bin/cat $TMPFILE
    /usr/bin/rm $TMPFILE

    # Application user name is in $APPUSER.
    # Execute mycommand with any necessary arguments.
    #
    # Note that the su command might still fail, for example, if
    # this script lacks the necessary privilege to execute as
    # the application user.
    #
    # Other command wrappers such as "su -" or "pfexec" could be used
    # here instead of plain "su".

    su $APPUSER $COMMANDPATH arg1 arg2

退出状态

返回以下退出状态代码。scha_calls(3HA) 中介绍了错误代码。

0 SCHA_ERR_NOERR

通过了安全检查,命令可以用应用程序用户身份执行。但是,在输出写入到 stderr 时,会指示获取或检查应用程序用户时发生了错误。应当将任何此类警告消息传递回用户。

3 SCHA_ERR_INVAL

使用了无效参数调用该命令。在这种情况下,不会将应用程序用户写入到 stdout。一条错误消息将写入到 stderr,其中具体列出了多个可能错误中的某一个。

6 SCHA_ERR_ACCESS

路径参数标识的文件不是可执行文件;或者 –U 选项指定了 root 用户,而调用者的实际用户 ID 为非 root 用户;或者 Resource_security 为 SECURE,但存在以下状况之一:

  • 可执行文件是全局可写的。

  • 应用程序用户是 root,可执行文件是组可写的。

SCHA_ERR_ACCESS 退出代码表示存在安全违规,调用者不应执行命令。

14 SCHA_ERR_RSRC

rname 参数标识的资源名称无效。在这种情况下,不会将应用程序用户写入到 stdout。一条错误消息将写入到 stderr

16 SCHA_ERR_CHECKS

Resource_security 为 SECURE,而 Application_user 名称未映射到有效用户 ID。SCHA_ERR_CHECKS 退出代码表示存在安全违规,调用者不应执行命令。

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
ha-cluster/developer/api
接口稳定性
Evolving(发展中)

另请参见

su(1M)pfexec(1)cluster(1CL)scha_cmds(1HA)scha_calls(3HA)scha_strerror(3HA)attributes(5)Oracle Solaris Cluster Data Services Developer’s Guide