Contents
はじめに
本記事は Ansible Advent Calendar 2022, Ansible Advent Calendar 2022 – Qiitaの10日目の記事になります。
ここでは、Ansible Automation Platform 2.3から追加された機能の一つである「プロジェクトの署名検証」を試してみたいと思います。
署名をするツールは ansible-sign を使用します。
署名をすることでAnsibleのコンテンツが改ざんされていた場合や想定していない修正が入ってるものは検知して実行できなくすることが可能です。
環境
項目 | バージョン |
---|---|
RHEL | 8.6 |
Ansible Automation Platform | 2.3 |
ansible-sign | 0.1.1 |
python | 3.9.13 |
gpg | 1.8.5 |
環境準備
gpgインストール
gpgをインストールします。
1 2 |
[root@kensyou-10064139 ~]# dnf install gpg |
ansible-signインストール
Python 3.9をインストールした後にvenvを作成してansible-signをインストールします。
1 2 3 4 5 |
[root@kensyou-10064139 ~]# dnf -y install python39 [root@kensyou-10064139 ~]# python3 -m venv venv [root@kensyou-10064139 ~]# . venv/bin/activate (venv) [root@kensyou-10064139 ~]# |
証明検証用コンテンツ準備
今回は検証用として以下のような構造でサンプルを作成しました。
1 2 3 4 5 6 7 |
(venv) [root@kensyou-10064139 ~]# tree sample/ sample/ |-- inventories | `-- inventory `-- playbooks `-- playbook.yml |
Ansibleコンテンツの署名
GPGキーペア作成
署名用で使用GPGキーペアを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
(venv) [root@kensyou-10064139 ~]# gpg --generate-key gpg (GnuPG) 2.2.20; Copyright (C) 2020 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Note: Use "gpg --full-generate-key" for a full featured key generation dialog. GnuPG needs to construct a user ID to identify your key. Real name: sky-joker # 名前を入力 Email address: sky-jokerxx@gmail.com # Emailアドレスを入力 You selected this USER-ID: "sky-joker <sky-jokerxx@gmail.com>" Change (N)ame, (E)mail, or (O)kay/(Q)uit? o # o を入力してエンター |
次にパスワード入力が求められるのでパスワードを入れててエンターを押します。
1 2 3 4 5 6 7 8 9 |
┌──────────────────────────────────────────────────────┐ │ Please enter the passphrase to │ │ protect your new key │ │ │ │ Passphrase: ________________________________________ │ │ │ │ <OK> <Cancel> │ └──────────────────────────────────────────────────────┘ |
パスワードの再入力が求められるので入力してエンターを押します。
1 2 3 4 5 6 7 8 |
┌──────────────────────────────────────────────────────┐ │ Please re-enter this passphrase │ │ │ │ Passphrase: ________________________________________ │ │ │ │ <OK> <Cancel> │ └──────────────────────────────────────────────────────┘ |
GPGキーペアが作成されたか確認します。
1 2 3 4 5 6 7 8 9 |
(venv) [root@kensyou-10064139 ~]# gpg --list-keys (snip) /root/.gnupg/pubring.kbx ------------------------ pub rsa2048 2022-12-09 [SC] [expires: 2024-12-08] 4271BE309B61C61705F86C59F00263BE494F5CB0 uid [ultimate] sky-joker <sky-jokerxx@gmail.com> sub rsa2048 2022-12-09 [E] [expires: 2024-12-08] |
コンテンツ署名
署名に必要な MANIFEST.in
を作成します。
1 2 3 |
(venv) [root@kensyou-10064139 ~]# cd sample/ (venv) [root@kensyou-10064139 sample]# vi MANIFEST.in |
今回のケースでは以下のように記述しています。
1 2 3 4 5 6 |
include .gitignore recursive-include inventories * recursive-include playbooks *.yml recursive-exclude .git * |
ファイル単体の場合は include
を指定します。
再帰的に指定する場合は recursive-include
を指定します。
再帰的に除外する場合は recursive-exclude
を指定します。
MANIFEST.in
の詳細については以下を参照ください。
MANIFEST.in
を作成したら署名を実行します。
1 2 |
(venv) [root@kensyou-10064139 sample]# ansible-sign project gpg-sign . |
パスワード入力が求められるため入力しエンターを押します。
1 2 3 4 5 6 7 8 9 10 11 12 |
┌────────────────────────────────────────────────────────────────┐ │ Please enter the passphrase to unlock the OpenPGP secret key: │ │ "sky-joker <sky-jokerxx@gmail.com>" │ │ 2048-bit RSA key, ID F00263BE494F5CB0, │ │ created 2022-12-09. │ │ │ │ │ │ Passphrase: __________________________________________________ │ │ │ │ <OK> <Cancel> │ └────────────────────────────────────────────────────────────────┘ |
コンテンツに署名が実行されます。
1 2 3 4 |
[OK ] GPG signing successful! [NOTE ] Checksum manifest: ./.ansible-sign/sha256sum.txt [NOTE ] GPG summary: signature created |
コンテンツ検証のハッシュ値などは以下に保存されています。
1 2 3 4 5 |
(venv) [root@kensyou-10064139 sample]# tree .ansible-sign/ .ansible-sign/ |-- sha256sum.txt `-- sha256sum.txt.sig |
これで署名が完了したのでGitHub/GitLabなどにプッシュしてください。
GPG公開鍵登録
Ansible Automation Platform(AAP)に登録する公開鍵を取得します。
まず、取得する公開鍵を確認します。
1 2 3 4 5 6 7 8 |
(venv) [root@kensyou-10064139 sample]# gpg --list-keys /root/.gnupg/pubring.kbx ------------------------ pub rsa2048 2022-12-09 [SC] [expires: 2024-12-08] 4271BE309B61C61705F86C59F00263BE494F5CB0 # 今回はこちら uid [ultimate] sky-joker <sky-jokerxx@gmail.com> sub rsa2048 2022-12-09 [E] [expires: 2024-12-08] |
公開鍵を表示します。
1 2 3 4 5 |
(venv) [root@kensyou-10064139 sample]# gpg --export --armour 4271BE309B61C61705F86C59F00263BE494F5CB0 -----BEGIN PGP PUBLIC KEY BLOCK----- (snip) -----END PGP PUBLIC KEY BLOCK----- |
上記で表示された公開鍵を以下の手順でAPPに登録します。
認証情報
へ移動して 追加
をクリックします。
以下の情報を入力して 保存
をクリックします。
項目 | 説明 |
---|---|
名前 | 任意の名前 |
認証情報タイプ | GPG Public Key |
GPG Public Key | 作成したGPGキーの公開鍵をコピペする |
プロジェクト
へ移動して 追加
をクリックします。
以下の情報を入力して 保存
をクリックします。
項目 | 説明 |
---|---|
名前 | 任意の名前 |
ソースコントロールのタイプ | Git |
コンテンツ署名検証の認証情報 | 作成したGPG Public Keyを指定 |
ソースコントロールのURL | リポジトリのURLを指定 |
ソースコントロール認証情報 | 必要な場合は作成して指定 |
問題ない場合はプロジェクトの同期が 成功
します。
もし、何かしらのファイル修正後に再度署名を実行しなかった場合(意図しない改ざんがされている場合)は同期が 失敗
します。
実行結果に問題のあるファイルが表示されます。
こんな感じで検証することができます 🙂