認証サービス使ってHTTPS通信してみた
初めに
こんにちは。Oracle Cloud Infrastructure(OCI)特集 編集部です。
今回はOCIの認証サービスを使って自前Webサーバにhttps通信をしたいと思います。
全体図は以下になります。プライベートサブネットにWebサーバを構築し、パブリックから直接通信できないようにしています。
構築の流れはWebサーバ構築→ロードバランサー構築→証明書作成→自端末へ証明書登録になります。

1章 ネットワーク、サーバ構築
本章では土台となるVCNからWebサーバの構築まで記載します。プライベートサブネットにWebサーバを構築するので、ルーティングやセキュリティリストの構築も注意してください。
1.OCIコンソールにログインし、ネットワーキング→仮想クラウド・ネットワーク→VCNの作成をクリック、以下を入力し作成します。
・名前:任意
・コンパートメントに作成:対象コンパートメント
・IPv4 CIDR Blocks:任意
・その他デフォルトで構築



②サブネットを作成します。
Webサーバ用プライベートサブネットと、ロードバランサ・踏み台サーバ用パブリックサブネットになります。
■パブリックサブネット
・名前:任意
・コンパートメントに作成:対象コンパートメント
・サブネット・タイプ:リージョナル
I ・Pv4 CIDR Block:任意
・サブネット・アクセス:パブリック・サブネット
・その他はデフォルトで構築


■プライベートサブネット
・名前:任意
・コンパートメントに作成:対象コンパートメント
・サブネット・タイプ:リージョナル
・IPv4 CIDR Block:任意
・サブネット・アクセス:プライベート・サブネット
・その他はデフォルトで構築


③IGWとパブリックサブネット用ルートテーブルを作成し、パブリックサブネットにルーティングします。
・名前:任意
・コンパートメントに作成:対象コンパートメント



④パブリックサブネット用セキュリティリストを作成し、自端末から接続できるように以下を追加します。
■Webサーバhttp通信確認用
・ソース:自端末IP
・IPプロトコル:TCP
・ソース・ポート範囲:ALL
・宛先ポート:80
■Webサーバhttps通信確認用
・ソース:自端末IP
・IPプロトコル:TCP
・ソース・ポート範囲:ALL
・宛先ポート:443
■自端末接続用
・ソース:自端末IP
・IPプロトコル:TCP
・ソース・ポート範囲:ALL
・宛先ポート:3389


⑤プライベートサブネット用セキュリティリストでパブリックサブネットからの通信を許可するよう以下を追加します。
■踏み台サーバ通信用
・ソース:パブリックサブネットIP
・IPプロトコル:TCP
・ソース・ポート範囲:ALL
・宛先ポート:3389
■ロードバランサhttp通信用
・ソース:パブリックサブネットIP
・IPプロトコル:TCP
・ソース・ポート範囲:ALL
・宛先ポート:80
■ロードバランサhttps通信用
・ソース:パブリックサブネットIP
・IPプロトコル:TCP
・ソース・ポート範囲:ALL
・宛先ポート:443

⑥パブリックサブネットに踏み台用Windows サーバ、プライベートサブネットにWebサーバ用Windowsサーバを構築します。
■Webサーバ
・名前:任意
・コンパートメントに作成:対象コンパートメント
・イメージ:Windows
・”コンパートメント名”の仮想クラウド・ネットワーク:構築したVCN
・”コンパートメント名”のサブネット:構築したプライベートサブネット
・パブリックIP:パブリックIPを割り当てない
・その他はデフォルトで構築する



■踏み台サーバ
・名前:任意
・コンパートメントに作成:対象コンパートメント
・イメージ:Windows
・”コンパートメント名”の仮想クラウド・ネットワーク:構築したVCN
・”コンパートメント名”のサブネット:構築したパブリックサブネット
・パブリックIP:パブリックIPを割り当てる
・その他はデフォルトで構築する




⑦踏み台サーバ→Webサーバとリモート接続し、「機能と役割の追加」からIISを追加します。
Webサーバの任意のブラウザで「http://localhost/」を検索し、IISが表示されることを確認します。
※確認できましたら、踏み台サーバは削除しても構いません。

2章 ロードバランサ構築
この章では自端末からプライベートサブネットにあるWebサーバにhttp接続まで記載します。WebサーバにパブリックIPを付与してない、セキュリティリストで許可してないので自端末から直接通信はできず、ロードバランサ経由で通信します。
①OCIコンソールに戻り、ネットワーキング→ロードバランサ→ロードバランサの作成の順にクリックし、以下を入力します。
■詳細の追加
・ロードバランサ名:任意
・可視性タイプの選択:パブリック:エフェメラルIPアドレス
・シェイプ:デフォルト
・最小帯域幅の選択・デフォルト
・IPv6アドレス割り当ての有効化:チェックなし
・ネットワーキングの選択:構築したVCN:パブリックサブネット
・ネットワーク・セキュリティ・グループを使用してトラフィックを制御:チェックなし


■バックエンドの選択
・ロード・バランシング・ポリシーの指定:重み付けラウンド・ロビン
・バックエンド・サーバーの選択:Webサーバ
・ヘルス・チェック・ポリシーの指定:デフォルト(プロトコル:http ポート:80)
・SSLの使用:チェックなし


■リスナーの構成
・リスナー名:任意
・リスナーで処理するトラフィックのタイプを指定します:HTTP
・リスナーでイングレス・トラフィックをモニターするポートを指定します:80

ロギングの管理では以下を入力し、送信をクリックします。(エラーログだけ出力するようにしています)
・エラーログ:有効化
・コンパートメント:Webサーバを構築したコンパートメント
・デフォルト・ログ・グループの自動作成:チェックあり
・ログ名:任意
・ログの保持:1か月(デフォルト)


②ネットワーキング→ロードバランサをクリック、構築したロードバランサのパブリックIPをコピーし、自端末のブラウザで「http://ロードバランサIP/」を検索し、IISが表示されることを確認してください。


3章 証明書作成
本章ではhttps接続に必要な認証局と証明書を作成します。認証局作成に必要なボールト、キー作成も重要になります。
①OCIコンソールからアイデンティティとセキュリティ→動的グループ→動的グループの作成の順にクリック、以下を入力し、作成します。
・名前:任意
・説明:任意
・ルール1:resource.type =’certificateauthority’

②アイデンティティとセキュリティ→ポリシー→ポリシーの作成の順にクリック、以下を入力し、作成します。
・名前:任意
・説明:任意
・ポリシービルダー:Allow dynamic-group ”動的グループ名” to use keys in compartment ”コンパートメント名”

③アイデンティティとセキュリティ→ボールト→ボールトの作成の順にクリックし、以下を入力し、作成します。
・コンパートメントに作成:対象コンパートメント
・名前:任意
・仮想プライベート・ボールトにする:チェックを付けない

④構築したボールトの詳細からキーの作成をクリックし、以下を入力し、作成します。
・コンパートメントに作成:対象コンパートメント
・保護モード:HSM
・名前:任意
・キーのシェイプ・アルゴリズム:RSA
・キーのシェイプ:長さ:2048ビット
・外部キーのインポート:チェックを付けない

⑤アイデンティティとセキュリティ→認証局→認証局の作成をクリック、以下を入力し、作成します。
■基本情報
・コンパートメント:対象コンパートメント
・認証局タイプ:ルート認証局
・名前:任意
・説明:任意

■サブジェクト情報
・共通名:任意
・追加フィールド以下項目:任意で入力してください


■権威の構成
・有効期間の開始日:デフォルト
・有効期間の終了日:デフォルト
・”コンパートメント名”のボールト:構築したボールト
・”コンパートメント名”のキー:作成したキー
・署名アルゴリズム:SHA256_WITH_RSA

■ルール
・証明書の最大有効期間:デフォルト(90日)
・下位CAの最大有効期間:3650

■失効構成
・失効のスキップ:チェックを付ける

サマリーを確認し、認証局の作成をクリックします。

⑥作成した認証局の詳細から証明書の発行をクリック、以下を入力し、作成します。
■基本情報
・コンパートメント:対象コンパートメント
・証明書タイプ:内部CAによって発行済み
・名前:任意
・説明:任意

■サブジェクト情報
・共通名:任意
・サブジェクトの代替名:DNS名 任意のDNS名(Webサーバ接続時のドメイン名になります)
・追加フィールド項目:任意で入力してください。


■証明書作成
・証明書プロファイル・タイプ:TLSサーバまたはクライアント
・有効期間の開始日:デフォルト
・有効期間の終了日:デフォルト
・キー・アルゴリズム:RSA2048

■ルール
・更新期間:89
・拡張更新期間:30

サマリーを確認し、証明書の作成をクリックします。

⑦アイデンティティとセキュリティ→ロードバランサ→作成したロードバランサの詳細の左タブからリスナーをクリックします。

⑧リスナーの作成をクリック、以下を入力し、作成します。
・名前:任意
・プロトコル:HTTPS
・ポート:443
・証明書リソース:証明書サービス管理対象証明書
・”コンパートメント名”の証明書:作成した証明書
・バックエンド・セット:デフォルト
・アイドル・タイムアウト:空欄
・ルーティング・ポリシー:空欄


4章 証明書登録
本章では作成した証明書を自端末に登録し、Webサーバにhttps通信まで記載します。自端末のhosts変更をするため、必ずバックアップを取得してください。
①自端末のC:\Windows\System32\drivers\etc配下にあるhostsファイルをコピー、任意のフォルダにペーストしバックアップを取ります。
その後、hostsファイルを管理者権限で開き、最終行に構築したロードバランサのIPとDNS名を記載し上書きします。

②OCIコンソールに戻り、アイデンティティとセキュリティ→認証局→構築した認証局の順にクリック、左タブからバージョンを選択し、「:」からコンテンツの表示をクリックします。

③証明書PEMをダウンロードし、任意の方法で.crtファイルに変更します。
例:Linux サーバで以下コマンドを入力すると変更できます。
openssl x509 -outform der -in certificate.pem -out certificate.crt
④自端末の任意のブラウザで作成した証明書を登録します。
例:Chrome→設定プライバシーとセキュリティ→証明書の管理→信頼されたルート証明機関→インポートの順にクリックし、作成した証明書を登録します。

⑤自端末から証明書を登録したブラウザで「https://”登録したDNS名”/」を検索し、https接続出来たら完成です。

5章 最後に
いかがだったでしょうか。OCIの認証サービスを利用して安全にhttps接続できるようになりました。
今回は端末のhostsにドメイン名とパブリックIPを記載しましたが、DNSでサーバーのFQDNとパブリックIPのAレコードを追加することでhttps通信もできますので、良かったら試してみて下さい。
<免責事項>
情報の掲載には注意を払っておりますが、掲載された情報の内容の正確性については一切保証しません。また、当サイトに掲載された情報を利用・使用(閲覧、投稿、外部での再利用など全てを含む)するなどの行為に関連して生じたあらゆる損害等につきましても、理由の如何に関わらず自己責任で行う必要があります。