了解权限提升:become

Ansible 使用现有的权限提升系统来执行具有 root 权限或其他用户权限的任务。因为此功能允许你“成为”另一个用户,不同于登录到机器的用户(远程用户),我们称之为 becomebecome 关键字使用现有的权限提升工具,如 sudosupfexecdoaspbrundzdoksurunasmachinectl 等。

使用 become

你可以使用剧本或任务指令、连接变量或在命令行中控制 become 的使用。如果通过多种方式设置权限提升属性,请查看 通用优先级规则 以了解将使用哪些设置。

可以在 插件列表 中找到 Ansible 中包含的所有 become 插件的完整列表。

Become 指令

可以在剧本或任务级别设置控制 become 的指令。可以通过设置连接变量来覆盖这些指令,连接变量通常在主机之间有所不同。这些变量和指令是独立的。例如,设置 become_user 不会设置 become

become

设置为 true 以激活权限提升。

become_user

设置为具有所需权限的用户 — 你成为的用户,而不是你登录的用户。不表示 become: true,允许在主机级别设置。默认值为 root

become_method

(在剧本或任务级别)覆盖 ansible.cfg 中设置的默认方法,设置为使用任何 Become 插件

become_flags

(在剧本或任务级别)允许对任务或角色使用特定标志。一个常见的用法是在 shell 设置为 nologin 时将用户更改为 nobody。在 Ansible 2.2 中添加。

例如,要管理系统服务(需要 root 权限)时,作为非 root 用户连接,可以使用 become_user 的默认值(root

- name: Ensure the httpd service is running
  service:
    name: httpd
    state: started
  become: true

apache 用户身份运行命令

- name: Run a command as the apache user
  command: somecommand
  become: true
  become_user: apache

nobody 用户身份执行某些操作,此时 shell 为 nologin

- name: Run a command as nobody
  command: somecommand
  become: true
  become_method: su
  become_user: nobody
  become_flags: '-s /bin/sh'

要为 sudo 指定密码,请使用 --ask-become-pass (-K 的简写) 运行 ansible-playbook。如果运行使用 become 的剧本,并且剧本似乎挂起,很可能是它卡在了权限提升提示符处。使用 CTRL-c 停止它,然后使用 -K 和相应的密码执行剧本。

Become 连接变量

可以为每个受管理节点或组定义不同的 become 选项。可以在清单中定义这些变量,也可以像普通变量一样使用它们。

ansible_become

覆盖 become 指令,并决定是否使用权限提升。

ansible_become_method

应使用哪种权限提升方法

ansible_become_user

设置你通过权限提升成为的用户;不表示 ansible_become: true

ansible_become_password

设置权限提升密码。有关如何避免在纯文本中使用秘密的详细信息,请参阅 使用加密变量和文件

ansible_common_remote_group

确定 Ansible 是否应尝试在 setfaclchown 都失败时将临时文件 chgrp 到某个组。有关更多信息,请参阅 成为无权限用户的风险。在版本 2.10 中添加。

例如,如果你想以 root 用户身份在名为 webserver 的服务器上运行所有任务,但你只能以 manager 用户身份连接,可以使用如下所示的清单条目

webserver ansible_user=manager ansible_become=true

注意

上面定义的变量对于所有 become 插件都是通用的,但也可以设置特定于插件的变量。请参阅每个插件的文档,了解插件的所有选项以及如何定义它们。可以在 Become 插件 中找到 Ansible 中所有 become 插件的完整列表。

Become 命令行选项

--ask-become-pass, -K

请求权限提升密码;不表示将使用 become。请注意,此密码将用于所有主机。

--become, -b

使用 become 运行操作(不包含密码)

--become-method=BECOME_METHOD

要使用的权限提升方法(默认=sudo),有效选项:[ sudo | su | pbrun | pfexec | doas | dzdo | ksu | runas | machinectl ]

--become-user=BECOME_USER

以该用户身份运行操作(默认=root),不表示 --become/-b

become 的风险和限制

虽然权限提升大多直观,但它在工作方式上存在一些限制。用户应该了解这些限制,以避免出现意外情况。

成为无权限用户的风险

Ansible 模块首先通过将参数代入模块文件,然后将文件复制到远程机器,最后在那里执行来在远程机器上执行。

如果在不使用 become 的情况下执行模块文件、become_user 为 root,或者以 root 身份连接到远程机器,则一切正常。在这种情况下,Ansible 将创建具有仅允许用户和 root 读取的权限的模块文件,或者仅允许要切换到的无权限用户读取。

但是,当连接用户和 become_user 都是非特权用户时,模块文件将以 Ansible 连接的用户身份(即 remote_user)写入,但该文件需要由 Ansible 设置为 become 的用户可读。Ansible 解决此问题的具体方法可能因平台而异。然而,在 POSIX 系统上,Ansible 通过以下方式解决此问题。

首先,如果 setfacl 已安装并在远程 PATH 中可用,并且远程主机上的临时目录已使用 POSIX.1e 文件系统 ACL 支持进行挂载,Ansible 将使用 POSIX ACL 与第二个非特权用户共享模块文件。

接下来,如果 POSIX ACL 不可用setfacl 无法运行,Ansible 将尝试使用 chown 更改模块文件的所有权,前提是系统支持以非特权用户身份执行此操作。

Ansible 2.11 中的新功能:此时,Ansible 将尝试使用 chmod +a,这是一种在 macOS 上设置文件 ACL 的特定方法。

Ansible 2.10 中的新功能:如果上述所有操作都失败,Ansible 接下来将检查配置设置 ansible_common_remote_group 的值。许多系统允许给定用户将文件的组所有权更改为用户所属的组。因此,如果第二个非特权用户(become_user)与 Ansible 连接的用户(remote_user)拥有一个共同的 UNIX 组,并且如果 ansible_common_remote_group 被定义为该组,Ansible 可以尝试使用 chgrp 将模块文件的组所有权更改为该组,从而可能使其对 become_user 可读。

此时,如果 ansible_common_remote_group 已定义,并且 chgrp 尝试成功执行,Ansible 假设(但重要的是,不检查)新组所有权已足够,不再进行回退。也就是说,Ansible 不会检查 become_user 是否实际上与 remote_user 共享一个组;只要命令成功退出,Ansible 就认为结果成功,不会继续检查 world_readable_temp(如以下所述)。

如果 ansible_common_remote_group 未设置,并且上述 chown 失败,或者 ansible_common_remote_group 已设置chgrp(或随后的组权限 chmod)返回了非成功的退出代码,Ansible 最后将检查 world_readable_temp 选项。如果设置了该选项,Ansible 将把模块文件放在一个世界可读的临时目录中,并赋予世界可读权限,以允许 become_user(以及系统上的任何其他用户)读取文件内容。如果传递给模块的任何参数本质上是敏感的,并且你不信任远程机器,那么这将是一个潜在的安全风险。

模块执行完毕后,Ansible 将删除临时文件。

存在多种方法可以完全避免上述逻辑流程。

  • 使用 管道。启用管道后,Ansible 不会将模块保存到客户端的临时文件。相反,它将模块管道到远程 Python 解释器的 stdin。管道不适用于涉及文件传输的 Python 模块(例如:copyfetchtemplate),也不适用于非 Python 模块。

  • 避免成为非特权用户。当你使用 become 成为 root 或不使用 become 时,临时文件将通过 UNIX 文件权限进行保护。在 Ansible 2.1 及更高版本中,如果你以 root 身份连接到托管机器,然后使用 become 访问非特权帐户,UNIX 文件权限也同样安全。

警告

尽管 Solaris ZFS 文件系统具有文件系统 ACL,但这些 ACL 不是 POSIX.1e 文件系统 ACL(而是 NFSv4 ACL)。Ansible 无法使用这些 ACL 来管理其临时文件的权限,因此,如果远程机器使用 ZFS,你可能需要使用 world_readable_temp 选项

版本 2.1 中已更改。

Ansible 使得在不知情的情况下以不安全的方式使用 become 变得困难。从 Ansible 2.1 开始,如果 Ansible 无法使用 become 安全地执行,则默认情况下会发出错误。如果你无法使用管道或 POSIX ACL,必须以非特权用户身份连接,必须使用 become 以不同的非特权用户身份执行,并确定你的托管节点足够安全以使你想要在其中运行的模块对世界可读,你可以启用 world_readable_temp 选项,这将把错误更改为警告,并允许任务按 2.1 之前的版本运行。

版本 2.10 中已更改。

Ansible 2.10 引入了上面提到的 ansible_common_remote_group 回退。如上所述,如果已启用,则在 remote_userbecome_user 都是非特权用户的情况下使用它。有关此回退发生时间的详细信息,请参考上面的文本。

警告

如上所述,如果 ansible_common_remote_groupworld_readable_temp 都已启用,世界可读回退不太可能触发,但 Ansible 仍然可能无法访问模块文件。这是因为,在组所有权更改成功之后,Ansible 不会再进行任何回退,也不会进行任何检查以确保 become_user 实际上是“公共组”的成员。这是设计决策,因为执行此类检查需要另一个往返连接到远程机器,这是一个耗时的操作。但是,Ansible 在这种情况下会发出警告。

并非所有连接插件都支持

特权提升方法还必须由所使用的连接插件支持。大多数连接插件在不支持 become 时会发出警告。有些插件会直接忽略它,因为它们始终以 root 身份运行(jail、chroot 等)。

每个主机只能启用一种方法

方法不能链接。你不能使用 sudo /bin/su - 成为用户,你需要有权限在 sudo 中以该用户身份运行命令,或者能够直接 su 到该用户(对 pbrunpfexec 或其他支持的方法也是如此)。

特权提升必须是通用的

你不能将特权提升权限限制为特定命令。Ansible 不总是使用特定命令来执行某些操作,而是从一个每次都会更改的临时文件名运行模块(代码)。如果你将 ‘/sbin/service’ 或 ‘/bin/chmod’ 作为允许的命令,这将导致 Ansible 失败,因为这些路径与 Ansible 用于运行模块的临时文件不匹配。如果你有安全规则将你的 sudo/pbrun/doas 环境限制为仅运行特定命令路径,请从没有此限制的专用帐户运行 Ansible,或者使用 AWX 或 Red Hat Ansible Automation Platform 管理对 SSH 凭据的间接访问。

可能无法访问由 pamd_systemd 填充的环境变量

对于大多数使用 systemd 作为其 init 的 Linux 发行版,become 使用的默认方法不会打开一个新的“会话”,从 systemd 的角度来看。由于 pam_systemd 模块不会完全初始化一个新会话,与通过 ssh 打开的正常会话相比,你可能会遇到一些意外情况:由 pam_systemd 设置的一些环境变量,最显著的是 XDG_RUNTIME_DIR,不会在新用户中填充,而是继承或直接清空。

这可能会在尝试调用依赖于 XDG_RUNTIME_DIR 访问总线的 systemd 命令时造成问题。

$ echo $XDG_RUNTIME_DIR

$ systemctl --user status
Failed to connect to bus: Permission denied

要强制 become 打开一个通过 pam_systemd 的新 systemd 会话,你可以使用 become_method: machinectl

有关更多信息,请参阅 此 systemd 问题

解决临时文件错误消息

  • Ansible 尝试以非特权用户身份运行时,无法设置对临时文件的权限

  • 可以通过安装提供 setfacl 命令的软件包来解决此问题。 (通常是 acl 软件包,但请查看您的操作系统文档。)

提升权限和网络自动化

从 2.6 版本开始,Ansible 支持对所有支持 enable 模式且由 Ansible 维护的网络平台使用 become 进行权限提升(进入 enable 模式或特权 EXEC 模式)。使用 become 将替换 provider 字典中的 authorizeauth_pass 选项。

要对网络设备使用 become 进行权限提升,您必须将连接类型设置为 connection: ansible.netcommon.network_cliconnection: ansible.netcommon.httpapi。 有关详细信息,请查看 Platform Options 文档。

您可以在需要权限提升的特定任务、整个剧本或所有剧本中使用提升的权限。添加 become: truebecome_method: enable 会指示 Ansible 在执行设置这些参数的任务、剧本或剧本集之前进入 enable 模式。

如果您看到此错误消息,则生成它的任务需要 enable 模式才能成功。

Invalid input (privileged mode required)

要为特定任务设置 enable 模式,请在任务级别添加 become

- name: Gather facts (eos)
  arista.eos.eos_facts:
    gather_subset:
      - "!hardware"
  become: true
  become_method: enable

要为单个剧本中的所有任务设置 enable 模式,请在剧本级别添加 become

- hosts: eos-switches
  become: true
  become_method: enable
  tasks:
    - name: Gather facts (eos)
      arista.eos.eos_facts:
        gather_subset:
          - "!hardware"

为所有任务设置 enable 模式

通常,您希望所有剧本中的所有任务都使用特权模式运行,最好使用 group_vars 来实现。

group_vars/eos.yml

ansible_connection: ansible.netcommon.network_cli
ansible_network_os: arista.eos.eos
ansible_user: myuser
ansible_become: true
ansible_become_method: enable

enable 模式的密码

如果您需要密码才能进入 enable 模式,您可以通过以下两种方式之一指定密码:

  • 提供 --ask-become-pass 命令行选项

  • 设置 ansible_become_password 连接变量

警告

提醒一下,密码永远不要以纯文本形式存储。有关使用 Ansible Vault 对密码和其他机密信息进行加密的信息,请参阅 Ansible Vault

authorize 和 auth_pass

Ansible 仍然支持使用 connection: local 对传统网络剧本使用 enable 模式。要使用 connection: local 进入 enable 模式,请使用模块选项 authorizeauth_pass

- hosts: eos-switches
  ansible_connection: local
  tasks:
    - name: Gather facts (eos)
      eos_facts:
        gather_subset:
          - "!hardware"
      provider:
        authorize: true
        auth_pass: " {{ secret_auth_pass }}"

我们建议您将剧本更新为始终使用 become 来实现网络设备的 enable 模式。将来将弃用 authorizeprovider 字典的使用。有关详细信息,请查看 Platform Options 文档。

提升权限和 Windows

从 Ansible 2.3 版本开始,可以使用 become 通过 runas 方法在 Windows 主机上进行提升权限。Windows 上的提升权限使用与非 Windows 主机上的 become 相同的清单设置和调用参数,因此设置和变量名称与本文档中定义的名称相同,只是 become_user 除外。由于 Windows 上没有 become_user 的合理默认值,因此在使用 become 时需要该值。有关详细信息,请参阅 ansible.builtin.runas 提升权限插件

虽然可以使用 become 假设另一个用户的身份,但它在 Windows 主机上还有其他用途。一个重要的用途是绕过在 WinRM 上运行时施加的一些限制,例如受限的网络委派或访问禁止的系统调用(如 WUA API)。您可以将 become 与与 ansible_user 相同的用户一起使用,以绕过这些限制并运行在 WinRM 会话中通常无法访问的命令。

注意

在 Windows 上,您不能使用非特权帐户连接并使用 become 提升权限。只有在连接帐户已经是目标主机的管理员时,才能使用 become。

管理权限

Windows 中的许多任务都需要管理权限才能完成。使用 runas 提升权限方法时,Ansible 将尝试使用提升权限用户可用的所有权限运行模块。如果无法提升用户令牌,它将在执行期间继续使用有限令牌。

用户必须具有 SeDebugPrivilege 才能使用提升的权限运行提升权限进程。默认情况下,此权限会分配给管理员。如果调试权限不可用,则提升权限进程将使用一组有限的权限和组运行。

要确定 Ansible 能够获得的令牌类型,请运行以下任务:

- name: Check my username
  ansible.windows.win_whoami:
  become: true

输出将类似于以下内容:

ok: [windows] => {
    "account": {
        "account_name": "vagrant-domain",
        "domain_name": "DOMAIN",
        "sid": "S-1-5-21-3088887838-4058132883-1884671576-1105",
        "type": "User"
    },
    "authentication_package": "Kerberos",
    "changed": false,
    "dns_domain_name": "DOMAIN.LOCAL",
    "groups": [
        {
            "account_name": "Administrators",
            "attributes": [
                "Mandatory",
                "Enabled by default",
                "Enabled",
                "Owner"
            ],
            "domain_name": "BUILTIN",
            "sid": "S-1-5-32-544",
            "type": "Alias"
        },
        {
            "account_name": "INTERACTIVE",
            "attributes": [
                "Mandatory",
                "Enabled by default",
                "Enabled"
            ],
            "domain_name": "NT AUTHORITY",
            "sid": "S-1-5-4",
            "type": "WellKnownGroup"
        },
    ],
    "impersonation_level": "SecurityAnonymous",
    "label": {
        "account_name": "High Mandatory Level",
        "domain_name": "Mandatory Label",
        "sid": "S-1-16-12288",
        "type": "Label"
    },
    "login_domain": "DOMAIN",
    "login_time": "2018-11-18T20:35:01.9696884+00:00",
    "logon_id": 114196830,
    "logon_server": "DC01",
    "logon_type": "Interactive",
    "privileges": {
        "SeBackupPrivilege": "disabled",
        "SeChangeNotifyPrivilege": "enabled-by-default",
        "SeCreateGlobalPrivilege": "enabled-by-default",
        "SeCreatePagefilePrivilege": "disabled",
        "SeCreateSymbolicLinkPrivilege": "disabled",
        "SeDebugPrivilege": "enabled",
        "SeDelegateSessionUserImpersonatePrivilege": "disabled",
        "SeImpersonatePrivilege": "enabled-by-default",
        "SeIncreaseBasePriorityPrivilege": "disabled",
        "SeIncreaseQuotaPrivilege": "disabled",
        "SeIncreaseWorkingSetPrivilege": "disabled",
        "SeLoadDriverPrivilege": "disabled",
        "SeManageVolumePrivilege": "disabled",
        "SeProfileSingleProcessPrivilege": "disabled",
        "SeRemoteShutdownPrivilege": "disabled",
        "SeRestorePrivilege": "disabled",
        "SeSecurityPrivilege": "disabled",
        "SeShutdownPrivilege": "disabled",
        "SeSystemEnvironmentPrivilege": "disabled",
        "SeSystemProfilePrivilege": "disabled",
        "SeSystemtimePrivilege": "disabled",
        "SeTakeOwnershipPrivilege": "disabled",
        "SeTimeZonePrivilege": "disabled",
        "SeUndockPrivilege": "disabled"
    },
    "rights": [
        "SeNetworkLogonRight",
        "SeBatchLogonRight",
        "SeInteractiveLogonRight",
        "SeRemoteInteractiveLogonRight"
    ],
    "token_type": "TokenPrimary",
    "upn": "[email protected]",
    "user_flags": []
}

label 键下,account_name 条目确定用户是否具有管理权限。以下列出可能返回的标签及其含义:

  • Medium:Ansible 无法获取提升的令牌,并在有限令牌下运行。在模块执行期间,只有分配给用户的一小部分权限可用,并且用户没有管理权限。

  • High:使用了提升的令牌,并且在模块执行期间,用户分配的所有权限都可用。

  • System:使用的是 NT AUTHORITY\System 帐户,它具有可用的最高级别权限。

输出还将显示已授予用户的权限列表。当权限值为 disabled 时,权限会分配给登录令牌,但未启用。在大多数情况下,这些权限将在需要时自动启用。

如果在 Ansible 版本低于 2.5 的版本上运行,或者常规的 runas 提升权限过程失败,则可以通过以下方式获取提升的令牌:

  • become_user 设置为 System,它对操作系统具有完全控制权。

  • 向 Ansible 在 WinRM 上连接的用户授予 SeTcbPrivilegeSeTcbPrivilege 是一种高级权限,可以授予对操作系统的完全控制权。默认情况下,没有用户会获得此权限,如果授予用户或组此权限,则应谨慎处理。有关此权限的更多信息,请参阅 充当操作系统的一部分。您可以使用以下任务在 Windows 主机上设置此权限:

    - name: grant the ansible user the SeTcbPrivilege right
      ansible.windows.win_user_right:
        name: SeTcbPrivilege
        users: '{{ansible_user}}'
        action: add
    
  • 在尝试提升权限之前,请在主机上关闭 UAC 并重新启动。UAC 是一种安全协议,旨在使用“最小权限”原则运行帐户。您可以通过运行以下任务来关闭 UAC:

    - name: turn UAC off
      win_regedit:
        path: HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system
        name: EnableLUA
        data: 0
        type: dword
        state: present
      register: uac_result
    
    - name: reboot after disabling UAC
      win_reboot:
      when: uac_result is changed
    

注意

授予 SeTcbPrivilege 或关闭 UAC 会导致 Windows 安全漏洞,因此如果执行这些步骤,请务必小心。

本地服务帐户

在 Ansible 2.5 版本之前,become 仅适用于使用本地或域用户帐户的 Windows。在这些早期版本中,无法使用 SystemNetworkService 等本地服务帐户作为 become_user。自 Ansible 2.5 版本发布以来,此限制已被解除。可以在 become_user 下设置的三个服务帐户是:

  • System

  • NetworkService

  • LocalService

由于本地服务帐户没有密码,因此如果指定了 ansible_become_password 参数,则它将不被需要且会被忽略。

无需设置密码即可提升权限

从 Ansible 2.8 开始,become 可用于提升为 Windows 本地或域帐户的权限,而无需为此帐户提供密码。 要使此方法起作用,必须满足以下要求

  • 连接用户已分配 SeDebugPrivilege 权限

  • 连接用户属于 BUILTIN\Administrators

  • become_user 拥有 SeBatchLogonRightSeNetworkLogonRight 用户权限

通过两种不同的方法之一实现无需密码提升权限

  • 如果帐户已登录,则复制现有登录会话的令牌

  • 使用 S4U 生成仅在远程主机上有效的登录令牌

在第一种情况下,提升权限进程是从该用户帐户的另一个登录中生成的。 这可能是现有的 RDP 登录、控制台登录,但这并不总是保证发生。 这类似于 Run only when user is logged on 选项的计划任务。

如果不存在提升权限帐户的另一个登录,则使用 S4U 创建新的登录,并通过该登录运行模块。 这类似于 Run whether user is logged on or not 选项的计划任务。 在这种情况下,提升权限进程将无法访问任何网络资源,例如正常的 WinRM 进程。

为了区分使用无密码提升权限和提升没有密码的帐户,请确保将 ansible_become_password 保持为未定义状态,或者设置 ansible_become_password:

注意

由于无法保证在 Ansible 运行时用户会存在现有令牌,因此提升权限进程很可能只能访问本地资源。 如果任务需要访问网络资源,请使用密码提升权限

没有密码的帐户

警告

作为一般的安全最佳实践,您应该避免允许没有密码的帐户。

Ansible 可用于提升为没有密码的 Windows 帐户(例如 Guest 帐户)。 要提升为没有密码的帐户,请像往常一样设置变量,但将 ansible_become_password: ''

在提升权限可以用于此类帐户之前,必须禁用本地策略 帐户:将本地帐户对空白密码的使用限制为仅控制台登录。 这可以通过组策略对象 (GPO) 完成,也可以使用此 Ansible 任务完成

- name: allow blank password on become
  ansible.windows.win_regedit:
    path: HKLM:\SYSTEM\CurrentControlSet\Control\Lsa
    name: LimitBlankPasswordUse
    data: 0
    type: dword
    state: present

注意

这仅适用于没有密码的帐户。 如果 become_user 有密码,您仍然需要在 ansible_become_password 下设置帐户的密码。

Windows 的提升权限标志

Ansible 2.5 将 become_flags 参数添加到 runas 提升权限方法。 可以使用 become_flags 任务指令设置此参数,也可以使用 ansible_become_flags 在 Ansible 的配置中进行设置。 此参数最初支持的两个有效值为 logon_typelogon_flags

注意

只有在提升为普通用户帐户时才应设置这些标志,而不是本地服务帐户(例如 LocalSystem)。

logon_type 设置要执行的登录操作的类型。 该值可以设置为以下值之一

  • interactive:默认登录类型。 进程将在与本地运行进程时相同的上下文中运行。 这将绕过所有 WinRM 限制,并且是建议使用的方法。

  • batch:在类似于设置了密码的计划任务的批处理上下文中运行进程。 这应该绕过大多数 WinRM 限制,并且如果 become_user 不允许交互式登录,则非常有用。

  • new_credentials:在与调用用户相同的凭据下运行,但传出连接将在 become_userbecome_password 的上下文中运行,类似于 runas.exe /netonlylogon_flags 标志也应设置为 netcredentials_only。 如果进程需要使用不同的凭据集访问网络资源(例如 SMB 共享),请使用此标志。

  • network:在网络上下文中运行进程,没有任何缓存的凭据。 这将导致与在没有凭据委派的正常 WinRM 进程下运行相同的登录会话类型,并且在相同的限制下操作。

  • network_cleartext:与 network 登录类型相同,但会缓存凭据以便它可以访问网络资源。 这与在具有凭据委派的正常 WinRM 进程下运行相同的登录会话类型。

有关更多信息,请参见 dwLogonType.

logon_flags 指定 Windows 在创建新进程时如何登录用户。 该值可以设置为无或以下值中的多个值

  • with_profile:设置的默认登录标志。 进程将加载用户在 HKEY_USERS 注册表键中的配置文件到 HKEY_CURRENT_USER

  • netcredentials_only:进程将使用与调用者相同的令牌,但在访问远程资源时将使用 become_userbecome_password。 这在没有信任关系的跨域场景中很有用,并且应该与 new_credentials logon_type 一起使用。

默认情况下,将设置 logon_flags=with_profile,如果配置文件不应加载,请设置 logon_flags=;如果应使用 netcredentials_only 加载配置文件,请设置 logon_flags=with_profile,netcredentials_only

有关更多信息,请参见 dwLogonFlags.

以下是一些使用 become_flags 与 Windows 任务的示例

- name: copy a file from a fileshare with custom credentials
  ansible.windows.win_copy:
    src: \\server\share\data\file.txt
    dest: C:\temp\file.txt
    remote_src: true
  vars:
    ansible_become: true
    ansible_become_method: runas
    ansible_become_user: DOMAIN\user
    ansible_become_password: Password01
    ansible_become_flags: logon_type=new_credentials logon_flags=netcredentials_only

- name: run a command under a batch logon
  ansible.windows.win_whoami:
  become: true
  become_flags: logon_type=batch

- name: run a command and not load the user profile
  ansible.windows.win_whomai:
  become: true
  become_flags: logon_flags=

Windows 上提升权限的限制

  • 在 Windows Server 2008、2008 R2 和 Windows 7 上使用 asyncbecome 运行任务仅在使用 Ansible 2.7 或更高版本时才有效。

  • 默认情况下,提升权限用户将使用交互式会话登录,因此它必须具有在 Windows 主机上执行此操作的权限。 如果它没有继承 SeAllowLogOnLocally 权限,或者继承了 SeDenyLogOnLocally 权限,则提升权限进程将失败。 添加权限或设置 logon_type 标志以更改使用的登录类型。

  • 在 Ansible 版本 2.3 之前,只有在 ansible_winrm_transportbasiccredssp 时,提升权限才有效。 从 Ansible 2.4 版本开始,此限制已解除,适用于所有主机,但 Windows Server 2008(非 R2 版本)除外。

  • 必须运行辅助登录服务 seclogon 才能使用 ansible_become_method: runas

  • 连接用户必须已经是 Windows 主机上的管理员才能使用 runas。 不过,目标提升权限用户不需要是管理员。

另请参见

通信

有问题? 需要帮助? 想分享你的想法? 请访问 Ansible 通信指南