Contents
そろそろこのホームページのサーバ証明書を更新する時期になったのですが 「Ansible Towerでサーバ証明書のCSRを発行できれば運用便利かも」と思ってやってみました。
環境
バージョン
項目 | バージョン | 役割 |
---|---|---|
RHEL | 7.6 | Ansible Towerホスト |
Ansible Tower | 3.5.1 | |
CentOS | 7.6 | Webサーバ |
環境図
ここでやろうとしていることは以下のようなことです。
番号 | 説明 |
---|---|
① | 証明書作成者がAnsible Towerでテンプレートを実行 |
② | Ansible TowerがWebサーバ上で証明書を作成する |
③ | 作成した秘密鍵とCSRのファイルダウンロードURLを表示 |
④ | ダウンロードする |
Ansible Towerで証明書を作成した場合、保存先をどうするか?という課題があります。
ここでは、簡単に動作確認をするためWebサーバを立てて、そこで証明書の作成・保存をして証明書のダウンロードまでできるようにします。
※本来はセキュリティを考えた運用にする必要があります。
準備
Webサーバ
必要なパッケージおよびモジュールをインストールします。
1 2 3 4 |
[root@web ~]# yum -y install epel-release [root@web ~]# yum -y install httpd python2-pip [root@web ~]# pip install PyOpenSSL |
Apacheの設定を変更します。
秘密鍵とCSRのファイルをダウンロード出来るように AddType
を追加します。
1 2 3 4 |
[root@web ~]# vi /etc/httpd/conf/httpd.conf (snip) AddType application/force-download .key .csr # 最終行にでも追加 |
Apacheを起動します。
1 2 3 |
[root@web ~]# systemctl start httpd [root@web ~]# systemctl enable httpd |
ひとまずここでは、作成した秘密鍵・CSRが5分以上経過したら自動で削除されるようにします。
1 2 3 |
[root@web ~]# crontab -e */1 * * * * find /var/www/html/ -maxdepth 1 -mindepth 1 -cmin +5 -exec rm -rf {} \; |
Ansible Tower
Playbook
ここでは、手動でPlaybookを保存するディレクトリとPlaybookを作成します。
1 2 3 |
[root@at01 ~]# mkdir /var/lib/awx/projects/server_certificate/ [root@at01 ~]# vi /var/lib/awx/projects/server_certificate/main.yml |
Playbookの中身は以下のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
--- - name: This playbook for generate certificate signing request file hosts: all gather_facts: no tasks: - name: Set certificate files save directory name variable. set_fact: dir_name: "{{ 1000 | random | to_uuid | upper }}" - name: Set root_dir path variable. set_fact: root_dir: "/var/www/html/{{ dir_name }}" - name: Create for certificate save directory. file: path: "{{ root_dir }}" state: directory - name: Generate an OpenSSL private key. openssl_privatekey: path: "{{ root_dir }}/{{ common_name }}.key" passphrase: "{{ private_key_password }}" cipher: "{{ private_key_chipher }}" type: "{{ private_key_type }}" size: "{{ private_key_size }}" - name: Generate an OpenSSL certificate signing request. openssl_csr: path: "{{ root_dir }}/{{ common_name }}.csr" privatekey_passphrase: "{{ private_key_password }}" privatekey_path: "{{ root_dir }}/{{ common_name }}.key" country_name: "{{ csr_country_name }}" state_or_province_name: "{{ csr_state_or_province_name }}" locality_name: "{{ csr_locality_name }}" organization_name: "{{ csr_organization_name }}" organizational_unit_name: "{{ csr_organizational_unit_name }}" common_name: "{{ common_name }}" email_address: "{{ csr_email }}" key_usage: "{{ csr_key_usage }}" extended_key_usage: "{{ csr_extended_key_usage }}" - name: Change file ownership and group. file: path: "{{ root_dir }}/{{ item }}" owner: apache group: apache loop: - "{{ common_name }}.key" - "{{ common_name }}.csr" - name: Private key download url. debug: msg="http://{{ ansible_host }}/{{ dir_name }}/{{ common_name }}.key" - name: OpenSSL certificate signing request download url. debug: msg="http://{{ ansible_host }}/{{ dir_name }}/{{ common_name }}.csr" |
変数 | 説明 |
---|---|
dir_name | 証明書関連ファイルを保存するディレクトリ名 |
root_dir | 証明書関連ファイルを保存するディレクトリのフルパス |
private_key_password | 秘密鍵のパスワード |
private_key_chipher | 秘密鍵のサイファー |
private_key_type | 秘密鍵のタイプ |
private_key_size | 秘密鍵のサイズ |
csr_country_name | 国名 |
csr_state_or_province_name | 都道府県 |
csr_locality_name | 市区町村 |
csr_organization_name | 組織名(会社名) |
csr_organizational_unit_name | 部門名 |
common_name | コモンネーム(FQDN) |
csr_email | Emailアドレス |
csr_key_usage | キー使用拡張 |
csr_extended_key_usage | 拡張キー |
プロジェクト設定
テンプレート設定
テンプレートには以下のSURVEYを設定しています。
実行
Ansible Towerで秘密鍵とCSRを作成してみます。
以下はデモ動画です。
Demo to Generate certificate signing request file with Ansible Tower from sky_joker on Vimeo.
CSR確認
作成したCSRの中身を確認してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
[root@web ~]# openssl req -text -noout -in server.csr Certificate Request: Data: Version: 0 (0x0) Subject: C=JP, ST=Tokyo, O=example Co.,Ltd, CN=www.example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (4096 bit) Modulus: 00:cc:a1:c4:e7:ed:6f:a5:21:1e:6b:54:91:16:1f: 15:10:0f:fc:89:5f:fa:f1:d2:69:d6:99:75:08:a5: d8:21:b8:7f:8b:4d:77:6e:98:df:51:a7:4d:3f:54: c2:3f:8b:bb:07:21:6e:4b:37:ba:0d:95:65:d9:cb: 00:7e:bb:b6:9f:8e:0d:bd:cd:b3:d3:a1:58:75:17: ac:13:77:37:28:8b:90:cb:7b:8d:27:af:78:6a:75: ec:68:14:d7:83:ba:2b:a9:54:f4:89:62:87:06:c4: aa:a1:8e:fb:80:83:c5:02:22:dd:38:04:9a:ef:e1: f2:2b:91:79:95:ca:7a:fc:5f:45:0c:9b:4e:77:c4: a2:8c:cf:21:9a:3f:65:b0:5e:2b:5f:31:6c:6e:f9: 0c:6c:9d:10:5b:18:d4:21:2e:0b:fa:c7:fb:90:f3: 0c:2e:85:5c:27:98:50:a4:c1:8f:e7:84:db:bc:99: 04:28:66:46:39:4c:5e:31:fc:2f:f5:d7:20:4b:e1: 2c:52:fb:5c:44:3f:3b:9c:2a:9c:01:dc:a8:08:fe: 62:a0:44:ad:88:66:9a:a0:7d:e6:8d:be:63:a7:27: 8d:af:30:78:79:c2:1a:8b:4c:46:46:ad:f8:29:59: 3e:32:b4:05:fc:d3:dd:b5:ba:f9:fd:c7:60:64:93: dc:60:5f:04:e5:a3:de:12:15:b9:1e:82:10:e2:7a: c4:04:0a:35:13:3e:5f:ec:28:54:08:12:1c:c2:e5: d8:16:67:0d:ab:28:44:eb:73:29:fb:5c:41:ca:82: 63:38:59:fc:cb:d9:1b:d4:4f:b5:6a:5f:ae:a7:3a: 96:67:0e:75:ef:58:7c:91:c3:de:a5:eb:b8:6f:4f: 32:bd:46:36:b4:f9:44:ce:e3:23:23:9b:59:ca:88: 7c:bb:38:ad:d4:66:8a:7d:08:e1:4b:0e:f8:b7:17: a5:9a:9f:63:96:ad:9e:b5:ad:1e:33:55:f5:2d:e9: ef:a7:71:20:42:5f:76:c1:4c:e0:97:e7:1f:f6:cc: dc:da:38:2d:97:82:fa:a9:fd:b5:33:1c:74:52:fb: 52:0c:a3:e8:d6:19:07:76:82:0e:0c:c1:21:41:d1: 0d:62:42:df:47:5b:06:b2:46:44:87:82:48:61:66: 4f:b7:b8:9b:fe:da:da:5c:ef:82:8d:6a:f8:a2:1c: fb:c6:ac:33:f3:69:3f:06:42:dd:ab:16:b2:97:3d: 45:73:80:10:a1:cb:6b:66:10:64:57:4e:54:5b:53: 31:66:9f:38:17:92:f9:7a:34:d2:3f:d3:45:d2:8b: 09:25:d3:62:0b:66:e6:4c:19:4e:78:25:77:9f:61: 33:29:17 Exponent: 65537 (0x10001) Attributes: Requested Extensions: X509v3 Subject Alternative Name: DNS:www.example.com X509v3 Key Usage: Digital Signature, Data Encipherment X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption a0:f6:77:4c:fa:b6:52:25:f1:e2:2e:b3:17:96:38:af:2e:c0: 6b:bd:6b:dc:82:cd:3b:46:ce:07:4e:7b:cf:17:c1:0f:9e:3a: e1:c6:22:f3:9d:6e:45:91:51:ad:8b:30:0e:46:12:d8:96:44: e3:79:60:b0:81:a5:11:01:9e:73:c7:1a:4d:2c:6a:cc:72:6e: f7:b5:b3:19:73:e9:9f:17:c4:25:e4:98:04:77:6d:41:18:3d: 8f:fb:54:ea:df:38:bc:6e:ce:9a:7b:9d:ae:31:01:3b:39:4d: 23:72:95:33:43:8a:f2:ba:00:48:23:a9:3e:2a:c3:3f:68:7e: 2d:b4:24:f5:b8:73:64:ac:92:b1:5f:5d:eb:1b:87:f6:48:16: 99:b2:ec:05:a2:2b:03:0b:76:dd:9a:a9:d7:06:3f:9f:2a:63: 51:c3:5e:14:70:d1:fa:a5:7f:90:99:e4:5b:6f:69:09:02:51: 97:5d:7e:2f:19:fa:45:72:3f:0e:f1:93:bf:e8:b0:e9:52:1d: d3:63:ef:aa:60:f6:d9:06:99:d3:b8:e8:38:f1:40:90:1f:ed: 59:20:69:ba:dc:6e:58:e2:ca:59:77:3c:06:8c:74:98:9f:fa: a9:86:cc:c3:54:87:8e:d0:3d:f6:3b:55:5e:e9:4e:4d:d1:eb: 1d:91:b3:eb:57:6e:5b:ce:88:f2:24:6a:8c:4b:52:49:5a:d5: 29:0c:40:a4:58:a8:e5:25:9f:4f:1a:d6:21:0c:13:09:2a:ed: ac:02:b3:a9:36:ce:14:a2:da:0f:24:1b:a4:c5:ed:af:80:d7: 96:01:4e:4a:be:81:26:11:22:52:67:73:6f:d9:df:1e:c8:e9: eb:92:3a:57:9d:5d:36:c9:6c:f9:b5:6f:59:1c:0b:9d:c7:48: 8c:d0:bc:a9:01:68:e7:fe:62:11:b1:3d:b3:be:12:20:34:ae: ab:65:f3:c5:b4:f7:17:b8:fc:c4:ec:03:f0:c6:3c:ee:3d:27: 3e:c3:4d:73:3e:4f:c2:6e:34:48:69:13:db:77:32:23:b5:bd: cd:e0:60:5d:a8:a0:50:f6:11:71:48:a4:cb:ba:fb:31:e5:a3: ad:8f:a1:38:11:2b:97:f4:16:aa:7c:f5:08:52:0b:4f:b0:cb: 89:4e:44:01:93:b0:b1:48:48:9a:f4:66:9c:1d:1a:80:ce:07: 20:91:f0:c8:12:2c:98:89:10:a1:d9:0a:e7:10:08:c0:83:56: 0f:3e:0d:f8:0d:eb:da:00:c9:51:43:1e:ca:c4:18:2e:f3:c4: 91:9c:05:4b:34:da:6d:80:5e:42:7d:de:2b:da:0e:29:91:31: a8:9b:b8:02:3b:51:4c:f9 |
きちんと作られていますね 🙂
最後に
Ansible Towerで秘密鍵とCSR作成をして保存先のサーバからダウンロードして取得することができました 🙂
CSRの作成は、今までopensslコマンドをペチペチ叩いていましたが、Ansible TowerではSURVEYで指定したパラメーターを入力するだけで簡単に作れました。
これで誰でも簡単に作れますね。
今回はCSRまでしか作りませんでしたが、自己証明書やPKCS12なども簡単に作れるので証明書作成はAnsible Towerで標準化できますね。
環境によって今までは証明書の作成するホストや保存先・取扱などバラバラになっているところは、これをすることでUI(オペレーション)や保存先の標準化ができ運用ルールの整理も比較的楽になるのではないでしょうか。
以上、Ansible Towerを使った証明書作成の例でした!
みんなでハッピーオートメーション!