对象冒充_冒充其他用户时提高安全性

标签: linux  java  数据库  python  shell

IBM UrbanCode部署

IBM®UrbanCode Deploy (以前称为uDeploy)是用于软件部署自动化的基于Web的应用程序。 它提供了一个图形用户界面(GUI),可用于设置环境配置以及编排不同的部署任务。 您还可以单击几下或通过调度常规部署,在许多不同的目标系统上运行任务。

在UrbanCode Deploy下管理的部署过程的总体情况包括:

  • UrbanCode Deploy服务器,承载主要的UrbanCode Deploy应用程序和GUI,并执行常规部署过程。
  • 在每个目标系统上安装的UrbanCode Deploy代理。
  • UrbanCode Deploy服务器将指令发送到UrbanCode Deploy代理。 然后,代理在相应的目标系统上运行指令。

用户模拟

为了安全起见,请在每个目标系统上使用专门的UrbanCode Deploy代理用户(请参阅UrbanCode Deploy文档中对此进行阅读)。 通过使用专用用户,可以仅将代理对目标系统的访问限制为特定的位置和命令。 以这种方式,可以增强相应目标系统上的安全性。 在代理将需要访问通常无法访问的某些位置或命令的情况下,它必须以其他用户身份运行这些任务。 UrbanCode Deploy提供了用户模拟功能,使您可以执行此操作。

将用户模拟应用于部署过程,以确保满足以下条件:

  • 每个代理用户具有最低权限。
  • 支持以不同用户身份运行命令。
  • 每个命令均以适当的用户身份运行。
  • UrbanCode Deploy任务以最低特权级别运行,并且不高于最初授予它们的特权。

用户模拟的设置分为两个级别:

  • 目标系统
  • UrbanCode Deploy应用程序用户界面(UI)

苏多斯

sudo是一个安全系统,该系统授予用户特权以超级用户身份运行各种命令(提供相应的安全级别)。 该系统在类似UNIX的操作系统(例如Ubuntu(Linux)和AIX(UNIX))上实现。 术语sudo代表超级用户do。 Sudoers是指系统文件/ etc / sudoers,用作具有相应操作系统sudo设置的配置文件。 它遵循《 Sudoers手册》中记录的特定sudoers文件格式。

sudoers条目示例为:

Barry ALL = (Ann) NOPASSWD: /tmp/script_files/*.sh

在代码示例中,用户Barry可以以用户Ann的身份访问/ tmp / script_files位置中任何主机上的任何外壳脚本文件,而无需提供标识密码。

根据用于管理类UNIX文件系统访问控制列表(ACL)策略中的定义,每个文件都分配了一组10位(标志)。 它们被分类为文件类型标志,然后是三组,每组三个许可标志。 下表提供了这些权限位的进一步说明。

表1. ACL文件权限位分类
ACL位数 可能的值 含义
1个 -,l,d
  1. -(连字符或破折号)–常规文件
  2. l(小写L)–文件类型:symlink
  3. d(小写D)–目录
不适用 不适用
2 - 用户所有者- R的EAD许可 [R --
3 -,w 用户拥有者- 仪式权限 w --
4 -, X 用户所有者– e X ecute权限 X --
5 - 集团拥有者- R的EAD许可 [R --
6 -,w 集团拥有者- 仪式权限 w --
7 -, X 群组所有者– e X ecute权限 X --
8 - 其他用户- R的EAD许可 [R --
9 -,w 其他用户- 仪式权限 w --
10 -, X 其他用户– e X ecute权限 X --

此策略允许拒绝或授予不同用户对各种系统文件,位置和命令的不同访问级别。

例如,考虑具有以下情况的系统:

  • 三个用户:Ann,Barry和Cathy
  • 三个用户组:groupA,groupB和groupC。 每个用户一组。
  • 第四个用户组:groupABC,其中包括上述所有用户
  • 两个Shell脚本文件:anns_script.sh和print_foo_bar.sh,具有以下ACL配置:
-rwxr-x--- 1 Ann groupA 28 Apr 1 14:01 anns_script.sh
-rwxr-xr-x 1 Cathy groupABC 28 Apr 1 14:03 print_foo_bar.sh

在示例代码中,您可以看到第一个脚本文件由用户Ann和用户组groupA拥有。 您还可以看到第二个文件归用户Cathy和用户组groupABC拥有。 下面提供了上述文件的权限位的进一步细分。 请注意,文件类型标志(第一位)将被忽略。

  • anns_script.sh :此文件上的权限位为rwxr-x---并指定:
    • 第一组3位(rwx)请注意,文件“用户所有者– Ann”可以读取(r),写入(w)和执行(x)该文件。
    • 第二组3位(rx)用于文件“组所有者”。 仅设置了Read(r)和eXecute(x)标志。 第二个(w)位用(-)关闭。 这意味着groupA的成员可以读取和执行文件,但不能对其进行写入。
    • 第三组3位(---)显示未为其他用户设置任何权限位。 其他系统用户Barry和Cathy无法访问此文件。
  • print_foo_bar.sh :此文件上的权限位为rwxr-xr-x,并指定以下信息。
    • 文件用户所有者(Cathy)可以将文件读取(r),写入(w)和执行(x)作为Shell脚本。
    • 文件组所有者(groupABC)也可以读取(r)和eXecute(x),但是不能对其进行编辑(写入)。
    • 其他用户也可以读取(r)和执行(x)该文件。

系统的超级用户root具有对所有文件的完全访问权限。 因此,root用户可以读取,写入和执行(如果适用)任何系统文件,而不管其所有者的用户和用户组如何。

如果用户Barry尝试运行anns_script.sh,则会出现相应的错误消息bash: ./tmp/script_files/anns_script.sh: Permission denied

要为Barry用户提供对anns_script.sh文件的访问,请完成以下步骤之一:

  1. 将用户Barry添加到用户组groupA中,以仅提供对该文件的读取和执行权限。
  2. 更新sudoers并以用户Ann的身份授予Barry文件访问权限,以允许用户Barry冒充用户Ann。

要使用第二种方法,用户Barry需要结合使用sudo命令和相应的命令来运行所需的文件:

Barry:# sudo -u Ann /tmp/script_files/anns_script.sh

回顾本节前面提供的Barry的sudoers条目:

Barry ALL = (Ann) NOPASSWD: /tmp/script_files/*.sh

根据上述Barry用户的sudoers记录,如果用户运行上述提供的命令,则不需要密码即可完成指定的命令。 相反,所请求的anns_script.sh就像由用户Ann运行一样运行。

在未设置上述sudoers配置的情况下,或者Barry尝试以用户Ann的身份在不同位置访问或执行另一个文件时,情况有所不同。 例如:

Barry:# sudo -u Ann /tmp/other_location/other_file.sh

在这种情况下,需要密码验证:

[sudo] password for Barry:

这是因为上面提供的sudoers条目或文件中指定的任何其他sudoers规则未覆盖此位置。

设置并实施用户模拟

本节提供有关使用UrbanCode Deploy进行用户模拟的设置和实施的全面指南。 它遵循许多步骤,包括目标系统配置和用于使用用户模拟的UrbanCode Deploy组件设置。

各种操作系统(OS)的配置,文件和用户管理不同。 因此,本文中的某些步骤仅说明要执行的操作,而没有提供相应的Shell或其他命令来完成该操作。

提供的每个步骤都是为基于Web的应用程序的部署设置而提供的,应该在Apache和数据库系统上都实施。

表2提供了有关已使用变量的更多信息。 表2中变量的值仅是示例,不是真实值。 而是将任何[使用方括号括起来的]变量替换为适当的目标系统值。

先决条件

  • 目标系统上安装了Java版本6或更高版本
  • 设置了一个shell变量${JAVA_HOME}并指向您的Java二进制主目录。
  • Sudoers软件包安装在每个目标系统上
  • 在每个目标系统上设置了专用的UrbanCode Deploy代理用户和用户组

以其专用用户身份启动代理

本节提供有关如何在UrbanCode Deploy系统上进一步设置用户模拟的注释。 记录了UrbanCode Deploy代理安装,并提供了两种安装类型的演练指南。

如“先决条件”部分所述,您应该已经在Apache和数据库系统上安装了UrbanCode Deploy代理。 如果不是这样,请按照上述安装链接之一操作,然后再继续进行本文操作。

为了促进UrbanCode Deploy代理的功能并以其专用用户身份运行它,请执行以下操作:

  1. 使用su命令切换到root用户。
  2. 确认${JAVA_HOME} shell变量已添加到您的AGENT_UserName配置文件中。
    1. 打开[AGENT_UserHome] /。profile文件进行编辑。
    2. 将此代码添加到它:
      #export java path
      export JAVA_HOME=[the value of your ${JAVA_HOME} shell variable]
      export PATH=$JAVA_HOME/bin:$PATH
  3. 发出概要文件以选择新变量:
    [AGENT_UserHome]/.profile
  4. 要对UrbanCode Deploy代理用户实施进一步的安全限制,您还可以执行以下一个或两个步骤:
    1. 限制对AGENT_UserName的密码请求。
    2. 将AGENT_UserName的SSH访问限制为目标系统。 这样可以防止SSH以AGENT_UserName身份登录到目标系统。

    注意:稍后在本文的“ OS级别上的设置环境目录”部分中提供了进一步的安全措施。

  5. 确认AGENT_HOME_DIR下的所有内容均由您的AGENT_UserName和AGENT_UserGroup拥有:
    1. 使用su命令切换到root用户。
    2. 更新代理主目录的所有权:
      chown -R [AGENT_UserName]:[AGENT_UserGroup] [AGENT_HOME_DIR]
  6. 确认您的UrbanCode Deploy代理以其专用的AGENT_UserName的身份运行:
    1. 切换到您的AGENT_UserName:
      su - [AGENT_UserName]
    2. 导航到您的[AGENT_HOME_DIR] / bin目录:
      cd [AGENT_HOME_DIR]/bin
    3. 运行命令:
      ./agent run

这些操作的结果是,您将获得两条消息之一。 如果该代理已经在运行,则会收到第一条消息,告诉您该代理已经在运行。 如果代理未在运行,则会收到第二条消息,告诉您它正在启动。

设置Sudoers和组

要允许对Apache和数据库用户模拟用户,请在目标系统上完成以下步骤:

注意:这些步骤必须同时在Apache和数据库系统上实现。

  1. 确保您以root用户身份工作。
  2. 将根用户添加到AGENT_UserGroup。
  3. 将您的APACHE_UserName和DATABASE_UserName添加到适当的AGENT_UserGroup。

设置Sudo权限

在Apache和数据库系统上更新您的sudoers文件。

  1. 打开sudoers进行编辑。
    1. 如果您不是root用户,请使用su命令切换到该用户。
    2. 使用visudo命令打开sudoers编辑器。
  2. 对于AIX OS系统,将以下两行添加到文件末尾:
    [AGENT_UserName] ALL = (root,[Apache_or_DB_User]) NOPASSWD: /usr/bin/ksh -c [AGENT_HOME_DIR]/var/temp/command-script-*.ksh
    [AGENT_UserName] ALL = (root,[Apache_or_DB_User]) NOPASSWD: /usr/bin/bash -c [AGENT_HOME_DIR]/var/temp/command-script-*.sh
  3. 对于AIX OS系统,将sudo命令的格式设置为与您在上一步中设置的sudoers配置相对应。 将此行添加到您的[AGENT_HOME_DIR] /conf/agent/installed.properties文件中:
    com.urbancode.shell.impersonation.unix.sudoFormat=%s -i -n -u %u %c
  4. 对于Ubuntu OS系统,将以下行添加到文件末尾:
    [AGENT_UserName] ALL = (root, [Apache_or_DB_User]) NOPASSWD: [AGENT_HOME_DIR]/var/temp/command-script-*.sh

通过此Sudoers配置,您的UrbanCode Deploy代理可以在执行UrbanCode Deploy流程期间模拟APACHE_UserName和DATABASE_UserName并以root用户身份登录,而无需提供密码。

在操作系统级别上设置环境目录

下一步是更新或创建许多目录:

  1. 确保使用su命令以root用户身份工作。
  2. 创建以下目录:
    mkdir -p [AGENT_HOME_DIR]/var/plugins
    mkdir -p [AGENT_HOME_DIR]/var/temp
    mkdir -p [AGENT_HOME_DIR]/var/work
  3. 确认AGENT_UserName和AGENT_UserGroup拥有AGENT_HOME_DIR目录及其内容:
    chown -R [AGENT_UserName]:[AGENT_UserGroup] [AGENT_HOME_DIR]
  4. 限制AGENT_HOME_DIR及其内容,以便只能由AGENT_UserName访问:
    chmod -R u=rwx,go-rwx [AGENT_HOME_DIR]
  5. 更新以下目录的权限。 这是确保在AGENT_HOME_DIR上实施最高限制并允许UrbanCode Deploy代理模拟其他用户所必需的。 这些是AGENT_UserGroup成员并由sudoers配置允许的用户。
    chmod u=rwx,g=rx,o-rwx [AGENT_HOME_DIR]/
    chmod u=rwx,g=rx,o-rwx [AGENT_HOME_DIR]/conf
    chmod u=rwx,g=rx,o-rwx [AGENT_HOME_DIR]/conf/agent
    chmod u=rwx,g=rx,o-rwx [AGENT_HOME_DIR]/conf/agent/installed.properties
    
    chmod u=rwx,g=rx,o-rwx [AGENT_HOME_DIR]/var
    chmod u=rwx,g=rx,o-rwx [AGENT_HOME_DIR]/var/temp
    
    chmod -R u=rwx,g=rx,o-rwx [AGENT_HOME_DIR]/opt
    chmod -R u=rwx,g=rx,o-rwx [AGENT_HOME_DIR]/var/plugins
    chmod -R u=rwx,g=rx,o-rwx [AGENT_HOME_DIR]/var/work

现在已完成目标系统的设置,以通过UrbanCode Deploy启用用户模拟。 接下来,启用模拟进程的调试,然后设置要使用用户模拟部署的UrbanCode Deploy组件进程。

启用用户模拟的调试

要在UrbanCode Deploy上调试用户模拟的进程,请配置位于[AGENT_HOME_DIR] / conf / agent /目录中的log4j.properties文件。 要启用调试,请将以下行添加到文件末尾:

# logger level configurations
log4j.logger.com.urbancode.air=INFO
log4j.logger.com.arjuna.ats.jta=ERROR
log4j.logger.org.apache.activemq=FATAL
log4j.logger.org.hibernate=ERROR

# special logger configurations for user impersonation debugging
log4j.logger.com.urbancode.shell.impersonation.unix.UnixImpersonateCommand=DEBUG
log4j.logger.com.urbancode.shell.Shell=DEBUG
log4j.logger.com.urbancode.air.plugin_command.runtime.ShellHelper=DEBUG

使用以下行在[AGENT_HOME_DIR] / var / log /目录中定义代理的日志文件的位置:

log4j.appender.file.File=../var/log/agent.out

要获取更新,请使用以下两个命令以其专用用户身份启动代理中所述重新启动代理:

./agent stop
./agent start

日志文件中的调试条目显示为:

2014-06-27 09:34:24,408 - Executing shell as [APACHE USERNAME]
2014-06-27 09:34:24,442 - Running command as Unix user  [APACHE USERNAME]
2014-06-27 09:34:24,442 - Command: [/bin/sudo, -n, -u,  [APACHE USERNAME], [[PATH TO YOUR AGENT HOME DIRECTORY]/var/temp/command-script-#########.sh]

完成对用户模拟的进程的调试后,应注释掉#special logger...下的调试日志行,然后重新启动代理。 这阻止了进一步的用户模拟调试日志记录,该日志记录可能将大量信息添加到日志文件中。

配置UrbanCode Deploy组件以模拟用户

UrbanCode Deploy组件和流程的管理通过相应的UrbanCode Deploy服务器用户界面进行处理。 按照图1到4中的示例步骤,设置要模拟进行部署的UrbanCode Deploy组件过程。 图5和6提供了一个外壳脚本UrbanCode Deploy过程步骤的示例,该过程已模拟并部署了该步骤的输出。

图1显示了要编辑的示例组件过程的路径。

图1.导航到组件流程编辑器
组件菜单的导航路径

查看全尺寸图片

组件菜单的导航路径

导航到组件流程编辑器屏幕:

  1. 单击“ UrbanCode部署”主菜单中的“ 组件”选项卡。
  2. 单击指向您要编辑的组件的链接。 在此示例中,它是您的uDeploy组件
  3. 选择进程选项卡。
  4. 选择您要编辑的过程。 在此示例中,这是您的uDeploy组件流程

组件流程编辑器窗口如图2所示。

图2.组件流程编辑器
组件过程编辑器

查看全尺寸图片

组件过程编辑器

可以模拟一些步骤。 每个处理步骤的右上角都有一个铅笔图标。 单击铅笔以打开编辑过程。 如果可以模拟该步骤,则图3中的字段将出现在弹出窗口中。

图3. UrbanCode Deploy流程步骤编辑器:Use Impersonation字段
弹出窗口中显示的字段

查看全尺寸图片

弹出窗口中显示的字段

默认情况下,不会模拟该步骤。 要模拟该步骤,请选中“ 使用模拟”复选框。 这将更新“步骤编辑器”视图,如图4所示。

图4. UrbanCode Deploy流程步骤编辑器:启用了用户模拟

查看全尺寸图片

选择“ 使用模拟”复选框后,“用户”字段成为必填字段,如图4所示。您可以跳过“组”和“密码”字段,因为您已经在“ 设置Sudo权限”设置了无密码的模拟。

注意:必须选中“使用Sudo”复选框。

用户模拟的UrbanCode Deploy组件流程的部署示例

本节提供了模拟的UrbanCode Deploy组件处理步骤及其在目标系统上部署后的输出示例。

图5.类型shell脚本的示例UrbanCode Deploy组件处理步骤
Shell脚本的组件处理窗口的屏幕截图

查看全尺寸图片

Shell脚本的组件处理窗口的屏幕截图

图5显示了一个简单的Shell脚本,它作为Bash脚本(在Interpreter字段中定义)运行,并打印几条消息(如在Shell脚本字段中设置)。 代码${p:agent/sys.user.name}是UrbanCode Deploy特定的代码格式,用于访问某些特定于过程的变量。 在这种情况下,AGENT_UserName专用于相应的UrbanCode Deploy代理。 在脚本执行之前和上述步骤的部署过程中,UrbanCode Deploy代理将${p:agent/sys.user.name}代码替换为其相应的值。 在此示例中,这是udeployagent

图6显示了图5中执行的shell脚本的输出。

图6.模拟的UrbanCode Deploy流程部署的输出日志
输出日志

查看全尺寸图片

输出日志

图6中以红色突出显示的脚本内容部分包含实际的Shell脚本,其中包含AGENT_UserName的更新字段。 这由相应的UrbanCode Deploy代理在其目标环境上运行。

实际的脚本结果显示在命令输出行下。 它以蓝色突出显示,显示了所使用的UrbanCode Deploy代理的专用用户名和模拟用户的用户名。 在这种情况下, apache的用户名是通过shell命令whoami获得的。

结论

实践证明,使用特定或自定义脚本来促进软件部署过程可以大大减少手动部署的时间。 但是,对于部署更复杂的应用程序(其中特定功能由专用用户管理),需要以这些用户身份执行特定的部署步骤。 在部署过程中,自定义部署脚本的使用仍然需要合理数量的人工干预和观察。

本文表明,将UrbanCode Deploy与用户模拟一起使用是解决上面提到的部署过程中所有困难的一个很好的工具。 该工具在软件产品部署过程中的集成仍然需要一些开发时间。 但是,在设置并正确配置后,UrbanCode Deploy应用程序可以大大减少部署期间的人工干预。 它甚至可以使一个人只需单击几下即可触发并维护多个不同系统上的许多独立部署,从而显着减少部署时间,从而缩短了开发时间。

附录

表2.指南-变量和引用(在“用户模拟设置指南”中使用)
没有: 变量/参考 含义 笔记
1个 AGENT_UserName 参考UrbanCode Deploy代理专用用户

示例: ucduser
  • 应替换为正确的用户名
  • 您可以在Apache和数据库系统上拥有相同的专用用户
2 AGENT_UserGroup 参考UrbanCode Deploy代理专用用户组

示例: ucdgroup
  • 同上
  • 还将包括UrbanCode Deploy代理将尝试模拟的组和用户
3 AGENT_UserHome 上面引用了AGENT_UserName的用户主目录。

示例: /home/ucduser/
不适用
4 AGENT_HOME_DIR 对目标系统上UrbanCode Deploy代理安装目录的完整路径的引用。

示例: /opt/UrbanCode Deploy/ucd-agent
不适用
5 APACHE_UserName 对Apache系统上的Apache用户的引用。

示例: apacheusr
不适用
6 DATABASE_UserName 对数据库系统上的数据库用户的引用。

示例: dbuser
不适用
7 Apache_or_DB_User 参考上面的#5#6
  • 应该用两行以上的Apache或DB Users的值(用户名)替换
8 $ {JAVA_HOME} Shell变量 ,该变量保存系统上Java二进制主目录的路径

示例: /usr/bin/java
  • 应该在您的每个(Apache和数据库)系统上设置此变量

注意 :上表中变量的值仅是示例, 不应视为实际值。


翻译自: https://www.ibm.com/developerworks/library/d-increase-security-when-impersonating-other-users-trs/index.html

版权声明:本文为cusi77914原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cusi77914/article/details/107088174