OCI LBロードバランサでTLS/SSLを終端する


はじめに

検証でクイックにOracle Cloud Infrastructure(OCI) LB(ロードバランサ)でSSLを終端する手順。
(検証とはいえ、HTTP(80)で外部公開とか作りたくない人向け)

※本来はTLSであるが、マニュアル表記やGUI上の表記は「SSL」であるため、以後は「SSL」と記載している

参考ブログ:https://www.ateam-oracle.com/load-balancing-ssl-traffic-in-oci
マニュアル:https://docs.cloud.oracle.com/en-us/iaas/Content/Balance/Tasks/managingcertificates.htm

全体の流れ

  1. Linuxで自己証明書を作成
  2. OCI LBでSSL終端させる設定(一般的なSSLアクセラレータ)
  3. 【Appendix】+ LB-WEBサーバ間もSSL通信させる設定(End to End SSL)
  4. 【Appendix】LBはルーティングだけして、WEBサーバでSSL終端させる

前提

  • OCIのネットワーク周り、VCNやサブネットは構成済み
  • 自己証明書発行用LinuxはOracle Linux 7.7 デプロイ直後の初期イメージでに1台
  • LBはAlways Free(無償!)で構築済み
  • バックエンドのWebサーバは、OCIマーケットプレイスで展開しているJenkins(ライセンスは無償)を利用でデプロイ済み

予備知識

  • OCI LBは自己証明書は対応している
  • OCI LBはLet's Encryptの証明書にも対応している
  • OCI LBはセルフCAを建てて、CA認証局で署名したサーバ証明書(SSL証明書)は登録できなかった。追加確認。。

1.Linuxで自己証明書を作成

①OSにSSHでログイン

「opc」ユーザ

②rootに切り替え

$ sudo -i

③秘密鍵生成

AES256bitの共通鍵を使って、RSA2048bitの秘密鍵を生成

# openssl genrsa -out private_key.pem -aes256 2048
Generating RSA private key, 2048 bit long modulus
................................................................................+++
....................................+++
e is 65537 (0x10001)
Enter pass phrase for private_key.pem: (パスワード付与する)
Verifying - Enter pass phrase for private_key.pem: (パスワード付与する)

# ll
total 4
-rw-r--r--. 1 root root 1766 Jan 28 14:30 private_key.pem

④CSR作成

先ほど生成した秘密鍵を使ってCSRを作成
※「Common Name」以外は適当。「Common Name」は実際にサーバにアクセスする際の名前もしくはIPアドレスにするのが良い。名前の場合、自分で所有している実在するドメイン名だと

# openssl req -new -key private_key.pem -out www.csr
Enter pass phrase for private_key.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Osaka
Locality Name (eg, city) [Default City]:Osaka
Organization Name (eg, company) [Default Company Ltd]:Company
Organizational Unit Name (eg, section) []:Infra
Common Name (eg, your name or your server's hostname) []:www.sample.work       
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: (そのままEnter)
An optional company name []: (そのままEnter)

# ll
total 8
-rw-r--r--. 1 root root 1766 Jan 28 14:30 private_key.pem
-rw-r--r--. 1 root root 1054 Jan 28 14:40 www.csr

⑤自己証明書の生成

ここで出てくる「www-self.crt 」がサーバ証明書(SSL証明書)である

# openssl x509 -in www.csr -out www-self.crt -req -signkey private_key.pem -days 3650
Signature ok
subject=/C=JP/ST=Osaka/L=Osaka/O=Company/OU=Infra/CN=www.sample.work/[email protected]
Getting Private key
Enter pass phrase for private_key.pem: (秘密鍵のパスワードを問われるので、①のときに指定したPWを入力)

⑥確認
www-self.crt・・・OCILBの「SSL証明書」として登録するもの
private_key.pem・・・OCILBに「秘密キー」として登録するもの

# ll
total 12
-rw-r--r--. 1 root root 1766 Jan 28 14:30 private_key.pem
-rw-r--r--. 1 root root 1054 Jan 28 14:40 www.csr
-rw-r--r--. 1 root root 1298 Jan 28 14:47 www-self.crt

2.OCI LBでSSL終端させる設定

事前にLBも作成済(無料!)

①OCI設定を開く

ロードバランサ詳細開いて「証明書の追加」

③証明書の登録

以下をそれぞれ登録(テキスト形式なので、今回は開いてコピペ)

  • www-self.crt・・・OCILBの「SSL証明書」として登録するもの
  • private_key.pem・・・OCILBに「秘密キー」として登録するもの

※パスフレーズは秘密鍵のパスワードを入力する
※自己証明書なので「CA証明書」は無いため、無くてもOK。ただし、LB-WEB間もSSL通信させたい場合は必要なので、無駄にでもopensslでCAで認証局を建ててその際に出てくるCA認証局の証明書を登録する。(自己CA認証局で署名したサーバ証明書は、OCILBでは「SSL証明書」として利用はできない その際にはサーバ証明書をこちらにも登録する

登録された

④リスナー設定を変更

(下記手順で変更できない部分がある場合は、リスナーのみ再作成する)
ポイントを記載

  • プロトコル:HTTP
  • ポート:443
  • SSL使用にチェック
  • 登録したサーバ証明書を指定

※バックエンドセット名はいまは気にしない

以上、の手順で完成

「OCI LBロードバランサでTLS/SSLを終端する」の確認

※今回はwww.sample.work は PCのhostsに書いている。ここは実在するドメイン名で、自分で管理する権威DNSサーバでAレコード等を記載するのが良い。

[Appendix]LB-WEBサーバ間もSSL通信させる設定(End to End SSL)

バックエンドセットを編集し、「SSLの使用」にチェックを入れ、リスナーに登録したものと同じ証明書を選択する。
※ただし、証明書を登録する際に「CA証明書」も入ったものでないとエラーになる。よって、自己証明書ではEnd to End SSLは正しく設定できない。

[Appendix]LBはルーティングだけして、WEBサーバでSSL終端させる

  • リスナーはHTTPではなく、あえてTCPの443で待ち受ける。
    そして、「SSLの使用」のチェックは外す。

  • バックエンドセットは プロトコル指定はないので、普通443宛に流す。

  • 「SSLの使用」にチェックは入れない。

  • 「セキュア」属性のチェックは外す。

以上