Red Hat InsightsとRed Hat Ansibleでアップデート作業を自動化しよう!

投稿者: | 2019年12月4日

今回はRed Hat InsightsからAnsibleのPlaybookを出力して、そのPlaybookを実際に実行してアップデート作業が楽になる方法をご案内します。Playbookに記述されている内容の解説も入れておりますのでこれからAnsibleを学習される方にも有益になればと思います。

Red Hat Insightsとは?

Red Hat Insightsの紹介は下記の記事にて公開中です。Insightsってなに?と思われた方は参考にご利用ください。

Red Hat Insightsへのアクセス

Red Hat Customer PortalよりToolsのメニューを開きます。

ToolsメニューよりGo to insightsをクリックします。

下記のRed Hatにログインより保有するRed Hat Customer Portal のログインIDとパスワードを入力してログインします。

Red Hat Insightsが設定されていると、Overviewより現在Insightsで管理しているシステム全ての分析結果が表示されます。今回はこの分析結果から「1 Important affecting 3 systems」で出力された「Kernel vulnerable to remote denial of service via SACK packets (CVE-2019-11477, CVE-2019-11478, and CVE-2019-11479)」を適用するところを見てみます。

Red Hat Insightsから確認する

Red Hat Insightsにアクセスするには、下記URLよりログインを行います。

事前にRed Hatアカウントの作成が必要となります。アカウントをお持ちでない方は事前にRed Hat ログインより新規アカウントを作成してください。

Red Hat Customer Portal | Red Hat Insights
https://access.redhat.com/products/red-hat-insights/

ログインをするとこちらの画面が表示されます。私の管理しているシステムでは1つの重要な影響を及ぼす問題が3システムで存在することが見えます。

今回の評価環境で表示されている 1 Important affecting 3 systems をクリックするとRulesの画面に遷移します。この中では詳細が見えるようになり今回の環境では Kernel vulnerable to remote denial of service via SACK packets (CVE-2019-11477, CVE-2019-11478, and CVE-2019-11479) が該当している事がわかります。

そして一覧の項目を見ていくと「Ansible 」の項目があります。ここにチェックがついていれば問題を解決するためのPlaybookが提供されていることになります。

Kernel vulnerable to remote denial of service via SACK packets (CVE-2019-11477, CVE-2019-11478, and CVE-2019-11479)をクリックすると概要が見えます。下図の赤枠のところ部分で今回のインシデントの概要が説明されています。

Linuxカーネルの低MSSサイズでのTCP Selective Acknowledgment(SACK)パケット処理の3つの関連する欠陥が見つかりました。 権限のないリモート攻撃者は、サービス拒否攻撃を実行できます。

Three related flaws were found in the Linux kernel’s handling of TCP Selective Acknowledgement (SACK) packets handling with low MSS size. An unprivileged remote attacker can perform denial of service attack.

概要の右側ではTotal riskとRisk of change の項目が用意されており、Risk of changeの中には変更によりリブートが発生するかどうかの記述も行われています。

少し下にスクロールすると Affected systems の項目が表示され、該当するシステムが一覧で確認できます。今回はこの中から localhost.localdomain のシステムに適用したいので、ホスト名の左にあるチェックボックスにチェックを入れてからNameの上部にある Remediate をクリックします。

Remediate をクリックするとポップアップメニューが表示されます。
今回は Create new Playbook を選択し、任意のPlaybook名を入力して Next を押し次に進みます。

今回のインシデントの対処方法を選択します。Reviewをしながら適用方法を変更することも出来ますが、今回は推奨される対応を受け入れる選択「Accept all recommended resolution steps for all actions. Some may require system reboot. You can disable automatic reboot in the next step or once the Playbook is created.」を選択します。

確認画面が表示されます。問題がなければ Create を選択してPlaybookを作成します。

Playbookの作成が完了すると右上にポップアップが表示されます。また作成されたPlaybookの確認は左メニューの Remediations にて確認することができます。

左メニューの Remediations をクリックするとこれまでに作成したPlaybookが確認できます。今回は先程作成した CVE-2019-11479 を選択して Download Playbook をクリックします。

ダウンロードしたPlaybookをエディターなどで開くと以下のように表示されます。冒頭はコメント部分で説明がありますので、どのようなPlaybookなのかがわかります。

Kernel vulnerable to remote denial of service via SACK packets (CVE-2019-11477, CVE-2019-11478, and CVE-2019-11479)に対応するPlaybook

実際のPlaybookの実行部分を抜粋すると下記の内容になります。

- name: Disable selective acknowledgments for the running system
  hosts: "localhost.localdomain"
  become: true

  tasks:
    - name: Set net.ipv4.tpc_sack to 0
      sysctl:
        name: net.ipv4.tcp_sack
        value: '0'
        sysctl_set: yes
        state: present
        reload: yes
        sysctl_file: /etc/sysctl.d/99-tcpsack.conf


- name: run insights
  hosts: "localhost.localdomain"
  become: True
  gather_facts: False
  tasks:
    - name: run insights
      command: insights-client
      changed_when: false

Playbookを分割してそれぞれでどのような指定がされているのか見ていきましょう。

Play領域と呼ばれるPlaybook 全体の設定を記述するエリアでは、各行毎に次の指定が行われています。

- name: Disable selective acknowledgments for the running system
  hosts: "localhost.localdomain"
  become: true
  • Playbookの説明として nameディレクティブにて「Disable selective acknowledgments for the running system」を記述
  • hosts ディレクティブでは insights で適用を指定したホスト名 “localhost.localdomain” が記述
  • 権限昇格(sudo)を設定する become ディレクティブにて true を設定し、権限昇格を行った上で tasks を実行します。

tasks領域では、Ansibleの実行内容が記述されます。このタスクでは実行中のシステムのTCP Selective Acknowledgments(SACK)を無効である状態に変更するように記述されています。

  tasks:
    - name: Set net.ipv4.tpc_sack to 0
      sysctl:
        name: net.ipv4.tcp_sack
        value: '0'
        sysctl_set: yes
        state: present
        reload: yes
        sysctl_file: /etc/sysctl.d/99-tcpsack.conf
  • tasks ディレクティブの宣言
  • name ディレクティブにてタスクの実行内容の説明(Playbook実行時にどのようなタスクなのか表示されます。) 「Set net.ipv4.tpc_sack to 0」を記述
  • sysctl モジュールを指定、以降は sysctl モジュールのオプションを指定
    sysctl モジュールの詳細はこちらのドキュメントを参照ください。
    • net.ipv4.tcp_sack の設定を指定
      ※ ここでは説明を記述するnameではないのでご注意ください。
    • value にて値を 0 (無効) に指定
    • sysctl_set にてsysctlコマンドでトークン値を確認
    • state にて、値が 0 ならそのまま
    • sysctl_file にて対象となるファイルを指定

実施後にRed Hat Insights へ情報を送信し状態のUpdateを行います。

- name: run insights
  hosts: "localhost.localdomain"
  become: True
  gather_facts: False
  tasks:
    - name: run insights
      command: insights-client
      changed_when: false

ここで新たに登場するのが”gather_facts”ディレクティブです。
gather_facts: False と指定するとPlaybook実行時に行われるホスト情報(facts)の取得が行われなくなります。Playbookを連続して実施する場合、状態に変更がない場合にはこの設定を行うことで実行が多少早くなります。

tasks 内では、command モジュールが指定されており、今回は ”insights-client” が実行されます。(Red Hat InsightsサービスにAPIを通じて現在の情報を渡しているという説明が良いですかね)

また command モジュールを使用する場合は必ず Changed となるため、ここでは ”changed_when: false” を指定することで Changed とならないように設定しています。

Ansible Playbookを実行すると

# ansible-playbook cve-2019-11479-1575423485133.yml 

PLAY [Disable selective acknowledgments for the running system] ******************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [localhost.localdomain]

TASK [Set net.ipv4.tpc_sack to 0] ************************************************************************************************
changed: [localhost.localdomain]

PLAY [run insights] **************************************************************************************************************

TASK [run insights] **************************************************************************************************************
ok: [localhost.localdomain]

PLAY RECAP ***********************************************************************************************************************
localhost.localdomain      : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@localhost ~]# cat /etc/sysctl.d/99-tcpsack.conf
net.ipv4.tcp_sack=0

/etc/sysctl.d/99-tcpsack.conf の設定値が net.ipv4.tcp_sack=0 となりました。
そして、Red Hat Insights のサイトからも対象システムが一つ減りました。

Red Hat Insights と Ansible の連携のまとめ

Red Hat Insights を使用することで現在管理しているシステムに影響を与える問題が発生しているかどうかを知ることができ、問題が合った場合も Ansible のPlaybook が提供されている問題ならば数クリックで対応するためのPlaybookを入手して後は実行するだけになります。

ぜひ、皆様もRed Hat InsightsとAnsibleの連携をご利用ください。