cloudflare access(Zero Trust)を使って非公開マシンをセキュアに公開する
システム開発部の前野です。いつもウェブネーションのコーポレートサイトへご訪問頂きありがとうございます。普段はAmazon Linuxを使っている私ですが、先日は久々にDebianを使った環境構築を行いました。
AWSも基本的にECSコンテナ内で環境をさくっと作って必要な部分しか使わないのでOSを意識する機会は減りましたが、Proxmox VE8(AWSみたいなクラウド環境をさっくり作れちゃうESXiみたいなOS。全機能無料でクラスタ構成も可能、OpenvSwitchやらCephも内包し、SDNやSDSまで可。)が先日リリースされて、PCIパススルーでハマった時にDebianが良い勉強になりました。
最近新しいOSに巡り合う機会が多く、先日リリースしたサービスではECS環境にてAmazon Linux 2023を採用し、他のサイトではAlmaLinuxとか。あとは個人的に注目しているのが、UnraidというDebianベースでストレージの管理と仮想環境やDockerに尖ったOSです。
個人ではGoogle One(2TB)を使っているので、クラウド任せになってからストレージを持たなくなりましたが、Syncthingが最近使って便利だったので、また機会があれば紹介できればと思います。
目次
cloudflare access(Zero Trust)を使ったセキュアなリモートアクセス
今回はcloudflare access(Zero Trust)について紹介になります。リンク貼りましたが、結構小難しく書かれていて、リンク先で書いてあることがちんぷんかんぷんですね。ゼロトラストとは、どこでも誰でもアクセスされる(できる)事を想定し、誰も信頼しない(ゼロトラスト)という語源で、要するに出先から家や会社のマシンへアクセスができるようになります。
設定できる数に制限(確か50まで)はありますが、無料で使える機能なので、ルータの配下にあるマシンへリモートでアクセスしたいけど、セキュリティが怖いからさすがに公開したくないなというニーズをカバーできます。
1. cloudflareのメニュからAccess(Zero Trust)を選ぶ
最近色々なサービスが増えてメニューが移動したりしてカオスです。セキュリティ設定も大幅に変わりましたし、以前は有料だったRate limiting(1分間に指定ディレクトリ以下を◯◯回以上アクセスされたら1時間ブロックする機能)も一部機能が無料で使えるようになったりして、新サービスだけでなく、既存機能もアップグレードされています。
2. Tunnelの作成
Create a Tunnelよりトンネルを作成します。ここで設定するのは識別するためのトンネル名です。
名前を設定すると、接続先のサーバーへ設定するコマンドが表示されます。ここで表示される選択肢はWindows、Mac、Debian、Red Hat(および互換OS)、Dockerなので、大体のOSをサポートしています。
私が設定した時は以下のエラーが表示されて動かなかったのですが、/etc/resolv.confでDNSサーバーをルータのIPアドレスからGoogleのPublicDNS(8.8.8.8)に変更することで改善しました。
Client robustness to misbehaving server
一覧でStatusの表示がINACTIVEから緑色でHEALTHYになったら成功です。赤色でDOWNと表示されているようであれば登録と起動に一度は成功しているので、cloudflaredが起動しているか確認してみてください。
3. 外からアクセスできるように設定(Public Hostname)
cloudflareと連携するサーバー間でトンネルの作成に成功したら、次はアクセスできるように設定します。流れとしては、cloudflareで管理しているドメインに対してサブドメインを発行し、トンネルのサーバーへアクセスします。
Public hostnameの欄から設定をします。まずsubdomainの欄では設定したいサブドメインを記載します。誰でもアクセスできるようにするようなURLにするのには抵抗がある場合、誰でも分からないようにサブドメインにはuuidを自動生成して設定しておくと良いでしょう。Domainの欄ではcloudflareで管理しているドメインを選択します。
次にServiceの欄では、どのようなアクセス方法かを選びます。例えばトンネルに設定したサーバーの8081番ポートをHTTPS経由で公開するには、上記画像のように、TypeをHTTPS、URLにlocalhost:8081と設定します。
またHTTPS、かつ、オレオレSSLでのアクセスの場合はエラーとなり接続ができませんので、上記画像のようにAdditional application settings→No TLS Verifyを有効にします。
ここまでの状態で先ほど設定したサブドメインへアクセスしてみましょう。設定に問題がなければ非公開のサーバーへアクセスができることが確認できます。
4. 2段階認証を設定してよりセキュアに
3までの設定で外からアクセスができることを確認しましたが、誰でも見れるのは精神衛生的によくありません。ここでは2段階認証を設定してよりセキュアにしたいと思います。
ルータ等の設定を変更したわけではないので、外部から非公開のサイトにアクセスするには、トンネルの設定で作成したホスト名を必ず経由します。cloudflareを経由する通信に対して2段階認証の設定を追加することで、非公開サイトには必ず2段階認証を必要とすることができ、よりセキュアな環境を担保できます。
先ほどはTunnelsを選びましたが、ここでは一番上にあるApplicationsを選択します。
次にSelf-hostedを選びます。
Application nameには任意の名前を設定します。
Application domainでは先ほど設定したPublic hostnameの値を入力します。
次に認証方法です。ここではメールでの2段階認証を行いたいと思います。
Policy nameは任意の名前を設定します。次にConfiguration rulesのSelectorでEmailsを選択肢、Valueには2段階認証を受信するメールアドレスを入力し、最後に保存をします。これにより指定したメールアドレスでのみ2段階認証を行うことができます。
設定したサブドメインへアクセスをすると、メールアドレスの入力を求められます。
設定したメールアドレスを入力すると、6桁のコードが書いたメールが届きます。2段階認証によって非公開サーバーをよりセキュアに保つことができました!