RundeckをHTTPS対応したお話。

# ことの始まり。

自前のVPSの管理だとか、自前で作っているシステムのバッチ基盤としてRundeckを使用しています。
ところが、適当に導入してしまっていたのでHTTP通信でのやり取りをしている状況です。_セキュリティ的によろしくない。_
いい加減何とかしなければ、と思ったので、HTTPS対応を行いました。そのことを残しておきます。

__既存の記事を見ながら作業したらハマった__

## TL;DR;

* Rundeckのマニュアルをちゃんと読め
* JVMオプションとして``server.web.context``は使えない、``server.servlet.context-path``を使え
* /etc/rundeck/profileはいじらない、カスタマイズ用のファイルを作成すべし

## 環境・前提

作業した環境はこんなところです。

| 項目 | 内容 | 説明 |
|:-:|:-:|:--|
| OS | Centos 7.9 | さくらのVPS |
| MW | Rundeck 3.3.6 | yumを使用してインストールしました。 |
| MW | Apache 2.4.6 | 言わずもがな |
| MW | certbot 1.9.0 | Let's Encryptツール |

上記にある通り、Rundeckは実行可能Warやtomcat前提のwarではなく、パッケージとして導入したもの（=debやrpm)を使用しています。

## 構成

利用者 <--HTTPS--> Apache <----> Rundeck

## 変更作業

ではHTTP通信をHTTPS化するべく、作業を進めましょう。

### Rundeck編

Rundeck側で対応が必要なファイルは以下です。

* /etc/default/rundeckd または /etc/sysconfig/rundeckd
* /etc/rundeck/framework.properties
* /etc/rundeck/rundeck-config.properties

``/etc/default/rundeckd`` または ``/etc/sysconfig/rundeckd`` はデフォルトでは作成されないため、新規に作成します。DEBパッケージの場合は``/etc/default/rundeckd``、RPMパッケージの場合は``/etc/sysconfig/rundeckd``を使用するとのことです。
__（RPMだけれど/etc/default/rundeckdにファイル作ったら普通に読んでくれた、もしかしてどっちも見ている？）__

多くの記事では``/etc/rundeck/profile``をいじっている記述があるのですが、このファイルはアップデートがあった場合に書き換えられてしまう可能性があるため、変更してはいけないとのことです。（/etc/rundeck/profileを開くと先頭に書いてある）
profileファイルのカスタマイズがrundeckdファイルとなるわけです。

``` conf
#
# Rundeck Configuration
#
RDECK_JVM_OPTS="-Dserver.servlet.context-path=/rundeck \
                -Drundeck.jetty.connector.forwarded=true"

```

この中で最も大事なのは``server.servlet.context-path``です。Rundeckのコンテキストパスを指定するものです。Apacheをフロントエンドとするため、パスを合わせるために設定が必要です。
__他の記事を参照するとコレを``server.web.context``で設定する記述があるのですが、少なくとも利用しているバージョンでは機能しませんでした。←コレがハマりポイント__


``/etc/rundeck/framework.properties``はサーバ名や接続URIを変更します。

``` conf
# ----------------------------------------------------------------
# Rundeck server connection information
# ----------------------------------------------------------------

#framework.server.name = localhost
framework.server.name = <<サーバドメイン>
#framework.server.hostname = localhost
framework.server.hostname = <<サーバドメイン>
framework.server.port = 4440
#framework.server.url = http://localhost:4440
framework.server.url = https://<<サーバドメイン>/rundeck
```
``name````hostname````url``すべてでlocalhostではなくドメイン名を使用するように変更します。
更に、``url``は変更したコンテキストルート``/rundeck``を追加します。
``url``はApache経由で接続する際の最終的なURLを設定します。

``/etc/rundeck/rundeck-config.properties``はGrailsとしての設定です。ここでも接続URIの変更が必要です。

``` conf
#grails.serverURL=http://localhost:4440
grails.serverURL = https://<<ドメイン>>/rundeck
```

設定内容は``framework.server.url``と一致させる必要があります。

### Apache編

ApacheにLet'sEncryptの証明書を設定する手順は以下を参照してください。今回のバージョンとは多少異なりますが、同じ手順で行けました。

[CentOS7 + RPM版 Apache HTTPD 2.4.6 で Let's Encrypt 導入メモ : certbot, 2017年1月時点](https://qiita.com/msakamoto_sf/items/c699dd0e769733d42087)

Rundeckと連携させるにあたり、Apache側で対応が必要なファイルは以下です。

* /etc/httpd/conf.d/rundeck.conf

Rundeck向けのVirtualHost設定です。

``` conf
<Location "/rundeck">
	ProxyPass http://localhost:4440/rundeck
	ProxyPassReverse http://localhost:4440/rundeck
</Location>
```
Locationは``server.servlet.context-path``と一致させます。
こちら側はドメイン名でなくてもlocalhostを使用して問題ないです。

## 反映作業

設定の反映のためには、Rundeckの再起動・Apacheのリロードが必要です。

``` bash
sudo systemctl restart rundeckd
sudo systemctl reload httpd
``` 

コレでHTTPSアクセスができるようになるはずです。

## 参考

[CentOS7 + RPM版 Apache HTTPD 2.4.6 で Let's Encrypt 導入メモ : certbot, 2017年1月時点](https://qiita.com/msakamoto_sf/items/c699dd0e769733d42087)
[Rundeck - System Properties Configuration](https://docs.rundeck.com/docs/administration/configuration/system-properties.html#executable-war)