10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Code EngineのアプリにIP制限をかけてみる

Last updated at Posted at 2023-03-24

今回はCode Engine上のアプリにIP制限をかけ、特定の利用者へのみアプリ公開する方法を試してみたいと思います

IBM Cloud Code Engineのアプリはパブリックとプライベート、そしてプロジェクトと3タイプでアプリの公開範囲の設定ができますが、より細かな制御をするために今回はCloud Internet Service(CIS)と組み合わせてみます

Untitled.png

事前準備

設定の流れ

  1. Code Engineでアプリをデプロイ
  2. Code EngineでDomain Mappingを設定
  3. CISでドメインを登録
  4. CISでDNSレコードの登録
  5. CISでIPファイアウォールの設定
  6. 最終確認

1. Code Engineでアプリをデプロイ

まずは簡単なアプリをCode Engineにデプロイします

今回はサンプルアプリのコンテナイメージ ( icr.io/codeengine/helloworld ) をそのまま使っていきます

Untitled 1.png

動作検証をスムーズにするため、1インスタンスだけで稼働し続けるようにしています

また課金を抑えるためにリソースは最低限のものを選択しました

Untitled 2.png

デプロイが完了したので、実際にアプリにアクセスして稼働チェックしておきます

アプリのURLは、「アプリケーションのテスト」ボタンから取得できます

Untitled 3.png

Hello Worldが表示され、アプリが稼働していることが確認できたので、次にすすみます

Untitled 4.png

2. Code EngineでDomain Mappingを設定

次に、CIS経由でアクセスできるように、カスタム・ドメイン・マッピングを設定します

「ドメイン・マッピング」 の画面にて、 「作成」 をクリックします

Untitled 5.png

「ドメイン・マッピングの作成」 ダイアログが表示されるので必要事項を入力します

  • TLSシークレット
    • 選択 or 作成:
      • 作成:初めての登録、証明書がワイルドカードではない場合
      • 選択:ワイルドカード証明書を利用している場合ですでに登録している場合は作成済みのSecretを選択する(同じワイルドカード証明書は同じリージョンに1つしか登録できないようです。別プロジェクトであっても同じリージョンでは利用できません
    • Certificate chain: 中間証明書を含むfullchainのCA証明書の内容
      (let's encryptの場合はfullchain.pemの内容)
    • Private key: プライベートキーの内容
      (let's encryptの場合はprivkey.pemの内容)
  • ドメイン名とターゲット・アプリケーション
    • カスタム・ドメイン・ネーム: アプリ公開に利用したいURL(私はmyapp.handson-lab.comと指定)
    • ターゲット・アプリケーション: ターゲットのCode Engineアプリを選択
    • CNAME ターゲット:DNSの設定に使うのでコピーしておきます

Untitled 6.png

状況が「デプロイ中」から「準備完了」になったらOKです

数分で完了するはずなので、かなり待ってもデプロイ中から進まない場合は登録している証明書の内容や鍵の確認をしてみてください

またワイルドカード証明書を利用している人は、同じプロジェクトで同じワイルドカード証明書を登録済みの状況で新たにTLS Secretを作成してしまっていないかや、同じリージョンの別プロジェクトですでにワイルドカード証明書を使っていないかチェックしてみてください

Untitled 7.png

3. CISでドメインを登録

CISのインスタンス作成や、ドメインの登録の部分はこちらのQiitaをご参照ください

IBM Cloud CISの動作確認(1) -初期導入編- - Qiita

4. CISでDNSレコードの登録

Code Engineのドメイン・マッピングにて提供されたCNAME ターゲットを使ってDNS登録していきます

CISにて「信頼性」から「DNS」を選び、「DNSレコード」の「追加」をクリックします

Untitled 8.png

「レコードの追加」ダイアログにて必要事項を入力します

  • タイプ:CNAME
  • 名前:Code Engineのカスタム・ドメインにて設定したドメイン名
    (私の場合はmyapp.handson-lab.com
  • 別名のドメイン名:Code Engineのカスタム・ドメイン設定時に表示されたCNAME ターゲット
    (私の場合はcustom.z6qoi5aro6g.jp-tok.codeengine.appdomain.cloud)

Untitled 9.png

無事にレコードが登録されました

この後IPファイアウォールを利用するので、プロキシーをONにしておきます

Untitled 10.png

Untitled 11.png

nslookupで確認し、以下のようなCISの宛先が返ってくることを確認します

# proxy-onでの期待結果
❯ nslookup myapp.handson-lab.com
Server:		2404:1a8:7f01:b::3
Address:	2404:1a8:7f01:b::3#53

Non-authoritative answer:
Name:	myapp.handson-lab.com
Address: 172.67.31.110
Name:	myapp.handson-lab.com
Address: 104.22.62.198
Name:	myapp.handson-lab.com
Address: 104.22.63.198

# proxy-offだと以下のような結果が返ってきてしまいます
❯ nslookup myapp.handson-lab.com
Server:		2404:1a8:7f01:b::3
Address:	2404:1a8:7f01:b::3#53

Non-authoritative answer:
myapp.handson-lab.com	canonical name = custom.z6qoi5aro6g.jp-tok.codeengine.appdomain.cloud.
custom.z6qoi5aro6g.jp-tok.codeengine.appdomain.cloud	canonical name = s01.jp-tok.codeengine.appdomain.cloud.
s01.jp-tok.codeengine.appdomain.cloud	canonical name = 163f4bf89dd14529ab332f76dd35b0eb.pacloudflare.com.
Name:	163f4bf89dd14529ab332f76dd35b0eb.pacloudflare.com
Address: 172.65.200.138

5. CISでIPファイアウォールの設定

それでは最後に、特定のIPからのみアクセスできるようにIPファイアウォールの設定をしていきます

今回はドメイン・ロックダウン機能をつかっていきます

各機能の違いはこちらを参考にしました IBM Cloud Internet Services (CIS) IP Firewallについて - Qiita

Untitled 12.png

「ドメイン・ロックダウン・ルールの作成」ダイアログにて必要事項を入力します

  • ルール名: わかりやすい名前
  • URL:ファイアウォールを設定したいURL
  • IPアドレスと範囲:許可したいIPアドレス(IPv4とIPv6両方書きます)

Untitled 13.png

レコードが追加され、有効がONになっていることを確認します

これですべての設定が完了です!

Untitled 14.png

6. 最終確認

最後にIP制御ができているかチェックしてみます

左側が、私のLocal環境からのアクセスで許可されたIPからのアクセスです

右側が、リモートデスクトップで接続している別拠点にあるRemote環境で、許可されていないIPからのアクセスです。

期待通り、許可していないIPからのアクセスは「Access denied」とブロックされました

Untitled 15.png

補足-Code Engineの提供のパブリックエンドポイントは残す?残さない?

残しておくと、仮にパブリックのURLが知られた場合にダイレクトでアクセスされてしまうので、プライベートなどに変更することをおすすめします

Untitled 16.png

パブリックのエンドポイントを無効化しました

左:インターネットからCode Engineが提供していたFQDNにアクセスすることができなくなりました

右:カスタムドメインマッピングで設定したドメインを使ってインターネットからアクセスできます

Untitled 17.png

補足-2つ目以降のアプリでのカスタムドメインの設定方法

もう一つ、Helloworldアプリもカスタムドメインで公開してみます

手順はほぼ同じですが、ワイルドカード証明書を利用している場合はドメイン・マッピングの作成のTLSシークレットの部分だけ変わります

前回同様、「ドメイン・マッピング」の画面から作成をクリックします

Untitled 18.png

ワイルドカードの証明書の場合はすでにTLS Secretが登録済みなので「TLSシークレット」は作成ではなく、選択を選びます。ワイルドカードではなく、個別に証明書を設定する場合(helloworld.handson-lab.com)はTLSシークレットの作成を選んで登録してください

Untitled 19.png

ドメイン・マッピングの作成が完了後は初回同様に、CISからDNSレコードの追加を行います

CNAMEターゲットはCode Engineプロジェクトごとに割り振られているので、先程と同じCNAMEです

(同じCNAMEにですが、アクセスした際にヘッダー情報に含まれるアクセスURLを元にCode Engine側で適切なアプリにルーティングが行われます)

Untitled 20.png

先程作ったものと並んでDNSレコードが登録できました。

Untitled 21.png

そして最後に、IPファイアウォール設定を更新します

Untitled 22.png

最後に確認のためアクセスします

(nginxのコンテナイメージをそのままデプロイしたので、見慣れたNginxの画面が表示されました)

Untitled 23.png

参考リンク

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?