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ファイルとなるわけです。

#
# 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を変更します。

# ----------------------------------------------------------------
# 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

namehostnameurlすべてでlocalhostではなくドメイン名を使用するように変更します。
更に、urlは変更したコンテキストルート/rundeckを追加します。
urlはApache経由で接続する際の最終的なURLを設定します。

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

#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月時点

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

  • /etc/httpd/conf.d/rundeck.conf

Rundeck向けのVirtualHost設定です。

<Location "/rundeck">
    ProxyPass http://localhost:4440/rundeck
    ProxyPassReverse http://localhost:4440/rundeck
</Location>

Locationはserver.servlet.context-pathと一致させます。
こちら側はドメイン名でなくてもlocalhostを使用して問題ないです。

反映作業

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

sudo systemctl restart rundeckd
sudo systemctl reload httpd

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

参考

CentOS7 + RPM版 Apache HTTPD 2.4.6 で Let's Encrypt 導入メモ : certbot, 2017年1月時点
Rundeck - System Properties Configuration