DO447管理任务执行--控制提权

简介: DO447管理任务执行--控制提权

DO447管理任务执行–控制提权

RHCSA专栏:戏说 RHCSA 认证

RHCE专栏:戏说 RHCE 认证

此文章(第三章 管理任务执行–控制提权 )收录在RHCA专栏:RHCA 回忆录

📜1.1 特权升级策略

Ansible剧本可以在许多不同的级别实现特权升级。Ansible使用指令或连接变量,这取决于打算控制权限升级的级别。对于剧本、角色、块和任务,需要使用权限升级指令:become、become_user、become_method和become_flags。

📑配置特权升级

如果将Ansible配置文件的privilege_escalation部分中的become布尔值设置为yes(或true),那么剧本中的所有剧本将默认使用privileqe_escalation。当运行在被管理的主机上时,这些play将使用当前的become_method方法切换到当前的become_user。

还可以在使用命令行选项启动playbook时覆盖配置文件并指定特权升级设置。下表比较了配置指令和命令行选项:

特权升级指令和选项


image-20220408224522831

重要:如果Ansible配置文件指定为:false,但命令行包含 -b选项,那么Ansible将忽略配置文件并默认使用权限升级。


📑剧本的特权升级

在编写剧本时,可能需要对某些剧本进行特权升级,但不是对所有剧本。您可以显式地指定每个剧本是否应该使用特权升级。如果play没有指定是否使用特权升级,则使用配置文件或命令行中的默认设置。

下面是一个包含三个剧本的剧本示例。第一个play使用become: true来使用特权升级,而不管配置文件或命令行选项指定什么。第二个play使用become: false表示不使用特权升级,即使配置文件或命令行选项指定这样做。第三个play没有一个become指令,将使用基于Ansible配置文件或命令行的默认设置的特权升级。变量ansible_user_id显示运行当前play的托管主机上用户的用户名。

image-20220408224617004

要确保剧本使用或不使用特权升级,请在剧本中显式地指定设置。根据play或所涉及的主机,可能需要在配置设置或清单变量中指定升级方法或特权用户。


📑任务中的特权升级

可以为剧本中的一个任务开启(或关闭)特权升级。为此,向任务添加适当的become指令。

image-20220408224651433

在前面的示例中,play的权限升级默认关闭,但第一个任务使用权限升级。


📑block的特权升级

如果有一个子集的任务在你的发挥,要求(或不要求)特权升级,你可以设置成为一个块。块中的所有任务都共享相同的特权升级设置,并且这个设置覆盖了在play中所做的设置。

下面的例子展示了可以用这种机制做的事情:

  • 为剧本中的任务子集打开特权升级。

  • 为剧本中的任务子集关闭特权升级。

  • 与become_user一起使用,可以使用特权升级来执行应用程序使用的其他普通用户(如数据库用户)而不是root用户的任务子集。

image-20220408224742103

📑角色的特权升级

角色有两种基本方法来执行特权升级。

  • 让角色本身在其内部或其任务上设置特权升级变量。该角色的文档可能会指定是否必须设置其他变量,如become_method来使用该角色。

  • 在Ansible配置或playbook中自己指定此信息。

或者,可以像前面讨论的那样,在调用该角色的角色上设置特权升级设置。或者,可以在单个角色上调整这些设置,就像可以在单个任务或块上一样:

image-20220408224815816


📑连接变量的特权升级

可以使用连接变量来配置特权升级。这些连接变量可以作为组或单个主机上的清单变量应用。

下表比较了playbook和配置指令与连接变量名的关系:

image-20220408224841333

重要:连接变量覆盖配置文件中的become设置,以及剧本、任务、块和角色中的设置。在使用这些变量配置特权升级时要小心,因为它们的优先级高于configuration和playbook指令。使用configuration或playbook指令通常会给你更多的灵活性和控制权,来决定是否使用特权升级。

下面的示例演示了在一个组的YAML清单中使用权限升级变量:

image-20220408224906639

可以设置连接变量,以便在主机级升级特权。在每台主机上执行此操作很繁琐,但在较大组中的一台主机需要特定连接选项的情况下会很有帮助。

以下示例演示在主机级使用连接变量配置特权升级:

image-20220408225006916

还可以在剧本中设置连接变量,例如在剧本本身上设置连接变量。这样做将覆盖清单变量以及任何become指令的设置。

image-20220408225021713


📜1.2 选择特权升级方法

如您所见,有许多方法可以控制特权升级。那么,您应该如何选择使用哪种方法呢?在选择如何控制特权升级时,请考虑以下竞争需求:

  • 让你的剧本保持简单(Ansible最佳实践的关键原则)是首要的考虑。

  • 其次要考虑的是,在可能的情况下以最小权限运行任务(以避免由于playbook错误而导致托管主机的意外损害)。

许多刚使用Ansible的人总是用特权升级来运行他们的剧本。这种方法很简单,而且在许多情况下,正在执行的任务必须作为根用户运行。但是,不需要作为根运行的任务仍然使用更高的特权运行,这可能增加风险。

一些用户直接连接到根帐户,以避免权限升级。这通常不是一个好的实践,因为运行playbook的任何人都必须在管理主机。这也会使评估哪个管理员执行哪个剧本运行变得困难。

因此,一个好的实践是有选择地控制哪些play或任务需要特权升级。例如,如果apache用户可以启动httpd服务器,则不需要以root用户运行该任务。

理想情况下,应该以尽可能简单的方式配置特权升级,并且应该清楚地知道它是否用于某个任务。例如,你可以使用become: true为某个剧本打开特权升级开关的剧本,然后有选择地禁用不需要升级的任务,在该任务上使用become: false。或者,如果与工作流兼容,您可以将需要升级权限的任务分组到一个play中,将不需要升级权限的任务分组到另一个play中。

如果剧本需要特权升级,但由于某些原因您无法编辑它,那么可能需要在配置文件中设置特权升级。通常,如果剧本需要特权升级,那么剧本可能更有意义地指出该需求。最大的挑战是,使用剧本的不同主机需要不同的权限升级方法才能正常工作。在这种情况下,可以为这些主机或它们的组设置清单变量,如ansible_become_method,同时启用是否通过剧本中的become使用特权升级。


📜1.3 课本练习

[student@workstation ~]$ lab task-escalation start

📑拉取实验代码

[student@workstation ~]$ mkdir -p /home/student/git-repos/
[student@workstation ~]$ cd git-repos/
[student@workstation git-repos]$ git clone http://git.lab.example.com:8081/git/task-escalation.git
[student@workstation git-repos]$ cd task-escalation

📑删除提权配置文件

[student@workstation task-escalation]$ vim ansible.cfg
[defaults]
inventory=inventory.yml
remote_user=devops

📑对主要剧本进行提权

[student@workstation task-escalation]$ vim roles/firewall/tasks/main.yml
---
# tasks file for firewall

- name: Ensure Firewall Sources Configuration
  firewalld:
    source: "{
    { item.source if item.source is defined else omit }}"
    zone: "{
    { item.zone if item.zone is defined else omit }}"
    permanent: true
    state: "{
    { item.state | default('enabled') }}"
    service: "{
    { item.service if item.service is defined else omit }}"
    immediate: true
    port: "{
    { item.port if item.port is defined else omit }}"
  loop: "{
    { firewall_rules }}"
  notify: reload firewalld
  become: yes
[student@workstation task-escalation]$ vim roles/firewall/handlers/main.yml
---
# handlers file for firewall

- name: reload firewalld
  service:
    name: firewalld
    state: reloaded
  become: yes
[student@workstation task-escalation]$ vim roles/haproxy/tasks/main.yml
---
# tasks file for haproxy

- block:
  - name: Ensure haproxy packages are present
    yum:
      name:
        - haproxy
        - socat
      state: present

  - name: Ensure haproxy is started and enabled
    service:
      name: haproxy
      state: started
      enabled: true

  - name: Ensure haproxy configuration is set
    template:
      src: haproxy.cfg.j2
      dest: /etc/haproxy/haproxy.cfg
      #validate: haproxy -f %s -c -q
    notify: reload haproxy
  become: yes

[student@workstation task-escalation]$ vim roles/haproxy/handlers/main.yml
---
# handlers file for haproxy

- block:
  - name: restart haproxy
    service:
      name: haproxy
      state: restarted

  - name: reload haproxy
    service:
      name: haproxy
      state: reloaded
  become: yes

[student@workstation task-escalation]$ vim roles/apache/tasks/main.yml 
---
# tasks file for apache

- block:
  - name: Ensure httpd packages are installed
    yum:
      name:
        - httpd
        - php
        - git
        - php-mysqlnd
      state: present

  - name: Ensure SELinux allows httpd connections to a remote database
    seboolean:
      name: httpd_can_network_connect_db
      state: true
      persistent: true

  - name: Ensure httpd service is started and enabled
    service:
      name: httpd
      state: started
      enabled: true
  become: yes
[student@workstation task-escalation]$ vim roles/webapp/tasks/main.yml
- name: Ensure stub web content is deployed
  copy:
    content: "{
    { webapp_message }}. (version {
    { webapp_version}})\n"
    dest: /var/www/html/index.html
  become: yes

📑运行剧本并检测

[student@workstation task-escalation]$ ansible-playbook site.yml
[student@workstation task-escalation]$ curl servera.lab.example.com
Hello from serverb.lab.example.com. (version v1.0)
[student@workstation task-escalation]$ curl servera.lab.example.com
Hello from serverc.lab.example.com. (version v1.0)

📑清除实验

[student@workstation task-escalation]$ lab task-escalation finish

💡总结

RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。

以上就是【金鱼哥】对 第三章 管理任务执行–控制提权 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

目录
相关文章
|
6月前
sudo的安全策略阻止/允许用户执行指定的命令
sudo的安全策略阻止/允许用户执行指定的命令
|
7月前
|
存储 Shell Linux
Shell命令切换root用户、管理配置文件、检查硬件
  与其他基于UNIX的系统一样,Linux也可以被多个人同时使用。多用户功能能够让多人在单个Linux系统上拥有账户,并且保护自己的数据不被他人破坏。
160 0
|
8月前
|
Web App开发 安全 应用服务中间件
nginxWebUI 存在前台远程命令执行漏洞
nginxWebUI 存在前台远程命令执行漏洞,攻击者通过该漏洞获取服务器控制权限进而进一步获取敏感数据信息。
163 1
shell脚本之---系统用户检查
shell脚本之---系统用户检查
|
移动开发 监控 安全
|
存储 编解码 安全
|
安全 网络协议 Java
命令执行漏洞详细讲解
应用有时需要调用一些执行系统命令的函数,如PHP中的`system`、`exec`、`shell_exec`、`passthru`、`popen`、`proc_popen`等,当用户能控制这些函数的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
|
运维 API 网络安全
DO447管理任务执行--控制任务执行
DO447管理任务执行--控制任务执行
118 0
DO447管理任务执行--控制任务执行
|
安全 前端开发 中间件
命令执行漏洞
原理 攻击者利用执行系统命令的函数 , 将恶意的系统命令拼接到正常的命令中,从而造成命令执行攻击 比如使用Web服务器的权限 执行系统命令,读写文件
|
Java Shell 网络安全
Shell脚本-控制多主机操作
环境介绍 首先要做到各个主机之间无密ssh连接。这样会最大可能方便的控制。 脚本 命名为status #!/bin/bash params=$@ i=166 for((i=166;i
922 0