2.4K Views
April 12, 23
スライド概要
【Ansible で複数サーバのセキュリティチェックをしよう】
現在管理しているシステムが脆弱性の影響を受けるバージョンかを確認するには、システムが多いほど手間がかかり、対策を実施するとなると更に膨大な時間がかかります。今回は、このような場面でAnsible を使い、複数のシステムに対するバージョンチェックや脆弱性への対策を一度に実行する方法についてご紹介します。
◆執筆◆
サイオスOSSよろず相談室 サポートエンジニア
https://sios.jp/lp/yorozu/
サイオステクノロジーのプロフェッショナルサービスチームが運営しています。クラウド、OSS、認証など、皆様に役立つ技術情報を発信しています!
サイオスOSSよろず相談室 これから始める 「Ansible」入門 (3) ©SIOS Technology, Inc. All Rights Reserved.
Ansible で複数サーバの セキュリティチェックをしよう システムの管理者が常に頭を悩ませる問題として、セキュリティ対策は外せないも のではないでしょうか。日々発表される脆弱性情報のなかに、ゼロデイ脆弱性が存 在するとさらに厄介です。そのような脆弱性に対してシステム管理者の皆様は常に セキュリティ対策が実施できるよう備えていると思います。 しかし、いざ対策を実施するにしても、現在管理しているシステムが脆弱性の影響 を受けるバージョンなのかを確認するために、実際に利用中のバージョンを確認す るにも、チェック対象のシステムの数が多ければ多いほど確認にかける時間は膨大 なものとなりますし、その対策を実施するとしてもさらに時間が必要です。 今回は、このような場面においても Ansible を使って、複数のシステムに対する バージョンチェックや脆弱性への対策を一度に実行する方法についてご紹介したい と思います。 目次 Ansible でバージョンチェックを する方法 Ansible で脆弱性対応をする方法 ©SIOS Technology, Inc. All Rights Reserved. 2
Ansible でバージョンチェックをする方法 脆弱性対応をはじめるにあたり、まずは管理対象のシステムに実際にインストール されているソフトウェアのバージョン情報を収集する必要があります。基本的には、 システムの設計書などに導入しているソフトウェアやパッケージのバージョンが定 義されているものですが、突発的な対応等で実際の環境には違うバージョンが導入 されていることも少なくないと思います。 そのために、システムごとにバージョン情報を収集する必要がありますが、ひとつ ひとつの環境にログインして確認するのは手間ですし、シェルスクリプトを作成す るのも良いですが、一から作成するのも面倒です。そこで、Ansible を使ってバー ジョン情報を簡単に収集したいと思います。 Ansible でシステムのパッケージバージョン情報を取得するモジュールは ansible.builtin.package_facts です。このモジュールを実行すると、パッケージ 名をキーとする辞書型変数 ansible_facts.packages にシステムのパッケージ情報 が登録されます。 ©SIOS Technology, Inc. All Rights Reserved. 3
まずは動作を確認するために、以下のような Playbook を作成します。ファイル名 は package.yml としています。ここでは、 ansible.builtin.debug モジュールを 使って ansible.builtin.package_facts モジュールで取得したパッケージ情報のう ち、nginx パッケージの情報のみ表示しています。 yaml - hosts : webserver tasks : - name : パッケージ情報を収集する ansible.builtin.package_facts : - name : nginx パッケージのバージョン情報を表示する ansible.builtin.debug : var : ansible_facts.packages['nginx'] ©SIOS Technology, Inc. All Rights Reserved. 4
作成した Playbook を以下のように実行します。実行の際に必要なインベントリ ファイル hosts は前回の記事の内容と同一ですので、必要であれば前回の記事を ご覧ください。 $ ansible-playbook -i hosts package.yml sh PLAY [webserver] ********************************************************************************* ******************* TASK [Gathering Facts] ********************************************************************************* ************* ok: [ubuntu2204] ok: [rocky9] TASK [パッケージ情報を収集する] ********************************************************************************* **** ok: [rocky9] ok: [ubuntu2204] ©SIOS Technology, Inc. All Rights Reserved. 5
TASK [nginx パッケージのバージョン情報を表示する]
*******************************************************************
ok: [rocky9] => {
"ansible_facts.packages['nginx']": [
{
"arch": "x86_64",
"epoch": 1,
"name": "nginx",
"release": "10.el9",
"source": "rpm",
"version": "1.20.1"
}
]
}
ok: [ubuntu2204] => {
"ansible_facts.packages['nginx']": [
{
"arch": "amd64",
"category": "web",
"name": "nginx",
"origin": "Ubuntu",
"source": "apt",
"version": "1.18.0-6ubuntu14.3"
}
]
}
©SIOS Technology, Inc. All Rights Reserved.
6
PLAY RECAP
*********************************************************************************
*************************
rocky9
rescued=0
: ok=3
ignored=0
changed=0
ubuntu2204
: ok=3
rescued=0 ignored=0
unreachable=0
changed=0
failed=0
unreachable=0
skipped=0
failed=0
実行した結果を確認すると、変数 ansible_facts.packages['nginx’]
skipped=0
にはパッケー
ジ情報がリスト型で登録されていることがわかります。これは、kernel パッケージ
のように同一パッケージ名で複数のバージョンがインストールされていることもあ
るため、このような仕様になっています。また、OS によって取得できる情報に差
があることがわかります。例えば、Rocky Linux ではバージョン情報として
version の他に release も併せて確認する必要がありますが、Ubuntu では
version だけでバージョン情報が確認できます。
これで Ansible におけるパッケージバージョン情報取得の挙動がわかりました。こ
れをもとに、環境ごとのパッケージバージョン情報をまとめたテキストファイルを
作りたいと思います。ファイル名としては versions.txt で、 ansible-playbook
コマンドを実行した環境に作成します。各行に環境名とバージョン情報を整形して
「<環境名>: <パッケージ名>-<バージョン番号>」のように出力することとします。
©SIOS Technology, Inc. All Rights Reserved.
7
この仕様で動作する Ansible Playbook は次のようになります。
yaml
- hosts : webserver
tasks :
- name : パッケージ情報を収集する
ansible.builtin.package_facts :
- name : パッケージ情報を記録する (Rocky Linux)
ansible.builtin.lineinfile :
path : versions.txt
regexp : "^{{ inventory_hostname }}:"
line : "{{ inventory_hostname }}: {{ item.name }}-{{ item.version }}"
create : yes
loop : "{{ ansible_facts.packages['nginx'] }}"
when : ansible_distribution != "Rocky"
delegate_to : localhost
- name : パッケージ情報を記録する (Rocky Linux 以外)
ansible.builtin.lineinfile :
path : versions.txt
regexp : "^{{ inventory_hostname }}:"
line : "{{ inventory_hostname }}: {{ item.name }}-{{ item.version }}{{ item.release }}"
create : yes
loop : "{{ ansible_facts.packages['nginx'] }}"
when : ansible_distribution == "Rocky"
delegate_to : localhost
©SIOS Technology, Inc. All Rights Reserved.
8
バージョン情報をテキストファイルに出力するために ansible.builtin.lineinfile モ ジュールを使っていますが、出力する内容は前述のとおり Rocky Linux と Ubuntu で分ける必要があるため、 when キーワードを使って OS ごとに出力する内容を 分けています。また、 ansible-playbook コマンドを実行する環境のローカル上に 情報を出力したいので、 delegate_to キーワードを使って実際に実行する環境を 指定しています。 この Ansible Playbook を実行すると、 ansible-playbook コマンドを実行した環 境のカレントパスに packages.txt ファイルが作成され、以下のような内容が記録 されます。 ubuntu2204 : nginx-1.18.0-6ubuntu14.3 text rocky9 : nginx-1.20.1-10.el9 ©SIOS Technology, Inc. All Rights Reserved. 9
Ansible で脆弱性対応をする方法
バージョン情報をチェックすることができましたので、今度はパッケージのアップ
デートを Ansible で実行してみましょう。本記事の執筆時点で、Rocky Linux 向け
の nginx パッケージのバージョンが上がり、 nginx-1.20.1-13.el9 がリリースされ
ていましたので、このバージョンを指定してアップデートする Ansible Playbook を
作成します。
作成する Ansible Playbook の内容は以下のようになります。
yaml
- hosts : webserver
become : yes
vars :
nginx_version :
Rocky : '1:1.20.1-13.el9'
Ubuntu : '1.18.0-6ubuntu14.3'
tasks :
- name : 指定したバージョンの nginx にアップデートする (Rocky Linux)
ansible.builtin.dnf :
name : "nginx-{{ nginx_version.Rocky }}"
state : present
when : ansible_distribution == "Rocky"
- name : 指定したバージョンの nginx にアップデートする (Ubuntu)
ansible.builtin.apt :
name : "nginx={{ nginx_version.Ubuntu }}"
update_cache : yes
state : present
when : ansible_distribution == "Ubuntu"
©SIOS Technology, Inc. All Rights Reserved. 10
まず、アップデート先となる nginx のバージョンを変数として定義し、今後さらに アップデートする作業が発生した場合に備えます。Rocky Linux 向けのパッケージ バージョン指定に epoch の "1" を指定していますが、これは Rocky Linux 向けの nginx パッケージに epoch が指定されているためです。 この Ansible Playbook を実行すると、指定したバージョンのパッケージにアップ デートされます。今回では対象のシステムが2台だけでしたが、数十台、数百台の システムが対象でも、指定したバージョンのパッケージに一度でアップデート可能 になるため、脆弱性対応としては素早く実施が可能になると言えます。 次回は、インフラ自動化ツールのひとつである Terraform を Ansible と組み合わせ て、AWS 環境の構築を自動化する方法についてご紹介します。 ©SIOS Technology, Inc. All Rights Reserved. 11
Ansible入門シリーズ 【これから始めるAnsible】 本連載では、自動化ツールの一つであるAnsible について、これから 入門1 Ansible を学ぼうという方、使っていきたい方を対象に、導入方法から 実用例までを簡単に紹介していきます。今回は、まずAnsible がどんな ツールなのかについて紹介し、その導入方法をお伝えします。 →こちらから 【Word やExcel の手順書をAnsible Playbook に置き換えよう】 よくありがちなWordやExcelの手順書は、書き手によってフォーマット 入門2 が変わったり、変更点がわかりづらいといったことはありませんか? WordやExcelの手順書をAnsiblePlaybookに置き換え、上記のような問題 点を解消する方法についてご紹介します。 →こちらから 【Ansible で複数サーバのセキュリティチェックをしよう】※本記事 現在管理しているシステムが脆弱性の影響を受けるバージョンかを確 入門3 認するには、システムが多いほど手間がかかり、対策を実施するとな ると更に膨大な時間がかかります。今回は、このような場面でAnsible を使い、複数のシステムに対するバージョンチェックや脆弱性への対 策を一度に実行する方法についてご紹介します。 【Terraform と連携してAWS 上の環境を構築しよう】 全4回にわたってAnsible の魅力をお伝えするこの連載は、今回で最後と なります。最後を飾る今回は、インフラ自動構築ツールのひとつであ 入門4 るTerraform をAnsible と組み合わせることによって、インフラの構築か らシステムの設定まで、一連の構築作業を全て自動化する手法をご紹 介します。 →こちらから ©SIOS Technology, Inc. All Rights Reserved. 12
https://sios.jp/products/oss/yorozu/ ©SIOS Technology, Inc. All Rights Reserved.