前回は、ゼロトラストネットワーク(ZTNA)の学習用環境としてCloudflare Zero TrustのPOC環境を構築し、自宅の環境でも手軽にゼロトラストネットワークを体験出来た。
疎通確認としてYouTubeへのアクセスをBlockするポリシーを設定し、想定どおりアクセスをブロックさせる事が出来たが、今回はもう少し踏み込んだ内容でポリシーを設定してみた。
当記事は、ポリシーの設定および疎通確認のメモ。
前回の記事の内容、Cloudflareのアカウント作成からCloudflare Zero Trustの設定、そしてクライアント側の設定までの流れに関しては、以下のリンク先を参照。
https://debslink.hatenadiary.jp/entry/20221103/1667482863 Cloudflare Zero Trustを導入してみた - POC環境構築編
追加記事の内容、Cloudflare Zero TrustのGatewayにてDNSポリシーの設定、そして疎通確認までの流れに関しては、以下のリンク先を参照。
https://debslink.hatenadiary.jp/entry/20221123/1669181060 Cloudflare Zero Trustを導入してみた - ポリシー設定編②
Cloudflare Zero Trustのポリシーについて
今回は、ユーザ側からWebアプリやサービスに流れていく通信のポリシーを定義するCloudflare Zero Trustのポリシーの機能に焦点を当てる。
Cloudflare Zero Trustでは以下の3種類のポリシーがある。ポリシーの適用場所は異なるものの、3種類全てが同一のBoard画面(管理画面)にて設定する。
①Cloudflare Gatewayで、インターネットへの外向き通信を評価するセキュアなWeb Gatewayポリシー。
②Cloudflare Accessによるアプリケーションへの内向き通信を保護するためのアクセスポリシー。
③ブラウザ隔離ポリシーで、インターネット上の脅威から組織のデバイスを保護し、データ損失を防止する。
WebゲートウェイであるCloudflare Gatewayにて設定可能なポリシーは以下の3種類である。
・DNSポリシー:DNSクエリを評価する。評価の結果問題が有れば、ユーザ側端末のドメインとIPアドレスの解決をブロックする。
・Networkポリシー:個々のTCP/UDP/GREパケットを評価する。評価の結果問題が有れば、HTTP以外のリソースを含む宛先のサーバーへのアクセスをブロックする。
・HTTPポリシー:HTTP要求を評価する。評価の結果問題が有れば、ドメイン全体だけでなく特定のURLの読み込みをブロックする。デフォルトではTLSを復号化してチェックする。
Cloudflare Gatewayのポリシーの構文
Cloudflare Gatewayに設定するポリシーの構文は以下のとおり。
【Policy name】+【Description】+【Selector】+【Operator】+【Value】+【Action】
・Policy name:作成するポリシーの名称。任意の文字列で指定出来る。
・Selector:評価基準。この評価基準に照らし合わせてトラフィックを評価する。
・Operator:トラフィックをSelectorにマッチングさせる方法。
・Value:評価の対象。
・Action:評価の結果、どう処理するか。
(Description:ポリシーの説明文。必須項目ではない為省略可。)
Actionの値はAllowやBlockだけでなく、ポリシー毎に様々な値が用意されている。
以下は、Cloudflare Gatewayに設定するポリシーで利用可能なActionの内容。
Action | 内容 | どのPolicyで使用 |
---|---|---|
Allow | SelectorとValueで指定した宛先への到達を許可 | DNSポリシー Networkポリシー HTTPポリシー |
Block | SelectorおよびValueで指定した宛先への到達をブロック | DNSポリシー Networkポリシー HTTPポリシー |
Override | 特定のドメインに対するすべてのDNSクエリを別の宛先に応答 | DNSポリシー |
Network Override | 特定のIPアドレスやポートに向けられた、またはポートから来るトラフィックを 検査せず、パブリックIPアドレスをプライベートIPアドレスに上書き |
Networkポリシー |
Safe Search | 検索エンジンは不快な内容をフィルタリングし、子どもや職場に安全な検索結果を返す | DNSポリシー |
YouTube Restricted | YouTubeに組み込まれた不快なコンテンツをフィルタリング | DNSポリシー |
Audit SSH | ※2022/11/8現在、ドキュメントにAudit SSHの項目無し | Networkポリシー |
Do Not Inspect | TLSインスペクトを実行せず透過転送 | HTTPポリシー |
Do Not Scan | Anti Virus Scanを実行せず転送 | HTTPポリシー |
例として、以下のポリシーを作成した場合...
・Policy name:TEST01
・Selector:Application
・Operator:in
・Value:Slack
・Action:Allow
TEST01というポリシーは、リクエスト先のWebアプリがSlackの場合、通信を許可する...という内容になる。
Cloudflare Zero Trustの設定は容易であるというものの、実際に設定画面をいじってみると多彩なSelectorが用意されている事が分かる。
以下は、DNSポリシーにおけるSelectorとActionの一覧である。
Selector | 対象 | Action |
---|---|---|
Application | 一般的なWebアプリの一覧 | Allow Block Override Safe Search YouTube Restricted |
Authoritative NameServer | 権威あるネームサーバーのIPアドレスと照合 | Allow Block |
Content Categories | 特定のコンテンツカテゴリに向けられたトラフィックに DNSポリシーを適用 |
Allow Block Override Safe Search YouTube Restricted |
DNS CNAME Response Value | DNSレスポンスをCNAMEレコードでフィルタリング | Allow Block |
DNS MX Response Value | DNSレスポンスをMXレコードでフィルタリング | Allow Block |
DNS PTS Response Value | DNSレスポンスをPTRレコードでフィルタリング | Allow Block |
DNS Resolver IP | 登録された場所と一致するGateway ResolverのIPアドレスに 到着したDNSクエリにポリシーを適用 |
Allow Block Override Safe Search YouTube Restricted |
DNS TXT Response | DNSレスポンスをTXTレコードでフィルタリング | Allow Block |
DOH subdomain | 各ロケーションに設定されたDoHエンドポイント宛の DNS-over-HTTPS(DoH)経由で到着するDNSクエリに対して マッチングするために使用 |
Allow Block |
Domain | ドメインとすべてのサブドメインに対して一致させるために使用 | Allow Block Override Safe Search YouTube Restricted |
Host | 指定されたホスト名のみに対してマッチ | Allow Block Override Safe Search YouTube Restricted |
Location | 特定のゲートウェイの場所または場所のセットにDNSポリシーを 適用 |
Allow Block Override Safe Search YouTube Restricted |
Query Record Type | ポリシーを適用するDNSリソースレコードの種類を選択 | Allow Block Override Safe Search YouTube Restricted |
Resolved Continent IP Geolocation | クエリの解決先である大陸に基づいてフィルタリング | Allow Block Override Safe Search YouTube Restricted |
Resolved Country IP Geolocation | クエリの解決先である国に基づいてフィルタリング | Allow Block Override Safe Search YouTube Restricted |
Resolved IP | クエリの解決先であるIPアドレスに基づいてフィルタリング | Allow Block |
SAML Attribute | SAML Attribute Assertionから値を指定 | Allow Block Override Safe Search YouTube Restricted |
Security Categolies | 特定のセキュリティカテゴリに向けられたトラフィックをブロック | Allow Block Override Safe Search YouTube Restricted |
Source Continent IP Geolocation | クエリがGatewayに到着した大陸を基にフィルタリング | Allow Block Override Safe Search YouTube Restricted |
Source Country IP Geolocation | クエリがGatewayに到着した国を基にフィルタリング | Allow Block Override Safe Search YouTube Restricted |
Source IP | クエリがゲートウェイに到着する特定のソースIPアドレスに DNSポリシーを適用 |
Allow Block Override Safe Search YouTube Restricted |
User Email | ユーザーの電子メールに基づくIDベースのDNSルールを作成 | Allow Block Override Safe Search YouTube Restricted |
User Group Email | IdPグループのメールアドレスに基づいてIDベースのDNSルールを 作成 |
Allow Block Override Safe Search YouTube Restricted |
User Group IDs | IdPグループIDに基づいてIDベースのDNSルールを作成 | Allow Block Override Safe Search YouTube Restricted |
User Group Names | IdPグループ名に基づいてIDベースのDNSルールを作成 | Allow Block Override Safe Search YouTube Restricted |
以下は、NetworkポリシーにおけるSelectorとActionの一覧である。
Selector | 対象 | Action |
---|---|---|
Application | 一般的なWebアプリケーションのリストに適用 | Allow Block |
Destination Continent IP Geolocation | リクエストの宛先である大陸に基づいてフィルタリング | Allow Audit SSH Block Network Override |
Destination Country IP Geolocation | リクエストの宛先である国に基づいてフィルタリング | Allow Audit SSH Block Network Override |
Destination IP | リクエストのターゲットのIPアドレス | Allow Audit SSH Block Network Override |
Destination Port | リクエスト先のポート番号 | Allow Block Network Override |
Passed Device Posture Checks | デバイスにインストールされているソフトウェアや デバイスの設定を確認しアクセスを制限 |
Allow Audit SSH Block Network Override |
Protocol | パケットの送信に使用されたプロトコル | Allow Block Network Override |
SAML Attribute | SAML Attribute Assertionから値を指定 | Allow Audit SSH Block Network Override |
SNI | GatewayがトラフィックをフィルタリングするSNI(Server Name Indication)ヘッダーのホスト |
Allow Block Network Override |
SNI Domain | GatewayがトラフィックをフィルタリングするSNIヘッダーのドメイン | Allow Block Network Override |
Source Continent IP Geolocation | リクエストをしたユーザーが居る大陸に基づいてフィルタリング | Allow Audit SSH Block Network Override |
Source Country IP Geolocation | リクエストをしたユーザーが居る国に基づいてフィルタリング | Allow Audit SSH Block Network Override |
Source IP | リクエストをしたユーザーのIPアドレス | Allow Audit SSH Block Network Override |
Source Port | リクエストをしたユーザーの送信元ポート | Allow Audit SSH Block Network Override |
User Email | ユーザーの電子メールに基づくIDベースのルールを作成 | Allow Audit SSH Block Network Override |
User Group Email | IdPグループのメールアドレスに基づいてIDベースのルールを作成 | Allow Audit SSH Block Network Override |
User Group IDs | IdPグループIDに基づいてIDベースのルールを作成 | Allow Audit SSH Block Network Override |
User Group Names | IdPグループ名に基づいてIDベースのルールを作成 | Allow Audit SSH Block Network Override |
User Name | IdP ユーザー名に基づいてIDベースのルールを作成 | Allow Audit SSH Block Network Override |
Virtual Network | ※2022/11/8現在、ドキュメントにVirtual Networkの項目無し | Allow Audit SSH Block Network Override |
以下は、HTTPポリシーにおけるSelectorとActionの一覧である。
Selector | 対象 | Action |
---|---|---|
Application | 一般的なWebアプリケーションのリストに適用 | Allow Block Do Not Inspect Do Not Scan |
Content Categories | 特定のコンテンツカテゴリに向けられたトラフィックにポリシーを適用 | Allow Block Do Not Inspect Do Not Scan |
Destination Continent IP Geolocation | リクエストの宛先である大陸に基づいてフィルタリング | Allow Block Do Not Inspect Do Not Scan |
Destination Country IP Geolocation | リクエストの宛先である国に基づいてフィルタリング | Allow Block Do Not Inspect Do Not Scan |
Destination IP | リクエスト先のIPアドレス | Do Not Inspect |
Domain | ドメインとすべてのサブドメインに対して一致させるために使用 | Allow Block Do Not Inspect Do Not Scan |
Download Mime Type | パケットの送信に使用されたプロトコル | Allow Block |
Host | リクエスト先のホスト名 | Allow Block Do Not Inspect Do Not Scan |
HTTP Method | 対象となるリソースに対して指示するGETやPOSTが対象 | Allow Block Do Not Scan |
HTTP Response | HTTPリクエストが正常に完了したどうかを示すレスポンスが対象 | Allow Block |
Passed Device Posture Checks | デバイスにインストールされているソフトウェアや デバイス設定を確認しアクセスを制限 |
Allow Block Do Not Inspect Do Not Scan |
SAML Attribute | SAML Attribute Assertionから値を指定 | Allow Block Do Not Inspect Do Not Scan |
Security Risks | DNSトンネリングやスパイウェア | Allow Block Do Not Inspect Do Not Scan |
Source Continent IP Geolocation | リクエストをしたユーザーが居る大陸に基づいてフィルタリング | Allow Block Do Not Inspect Do Not Scan |
Source Country IP Geolocation | リクエストをしたユーザーが居る国に基づいてフィルタリング | Allow Block Do Not Inspect Do Not Scan |
Source IP | リクエストを行ったユーザーのIPアドレス | Do Not Inspect |
Upload MIME Type | ※2022/11/8現在、ドキュメントにUpload MIME Typeの項目無し | Allow Block |
URL | リクエスト先のURL | Allow Block Do Not Scan |
URL Path | リクエスト先のURL | Allow Block Do Not Scan |
URL Path and Query | リクエスト先のURL | Allow Block Do Not Scan |
URL Query | リクエスト先のURL | Allow Block Do Not Scan |
User Email | ユーザーの電子メールに基づくIDベースのルールを作成 | Allow Block Do Not Inspect Do Not Scan |
User Name | IdP 内の特定のユーザーに対するIdP ユーザー名に基づいて IDベースのルールを作成 |
Allow Block Do Not Inspect Do Not Scan |
Virtual Network | ※2022/11/8現在、ドキュメントにVirtual Networkの項目無し | Allow Block Do Not Scan |
注意事項
・当記事は、学習用環境として自宅のネットワークにゼロトラストのサービスを適用させる内容です。在宅勤務だけでなく普段の生活にも通信断などのような影響を及ぼす可能性が有ります。
・Freeプランの場合、DLP(Data Loss Prevention)機能は未対応です。
・当ページにて紹介した手順による障害や損害につきましては、当ブログの著者は一切の責任を負いかねます。あらかじめご了承ください。
今回の要件とポリシー設定
今回は以下の2つの要件で、自宅の作業端末からAzure内のゲストOSとWebアプリへのアクセスを制御してみた。
①自分の端末から、MS Azureにて稼働しているLinuxサーバへのSSHアクセスを許可。
②自分の端末から、boxとGithubとSlackへのアクセスを許可、その他のWebアプリへのアクセスは拒否。
要件①のポリシー設定
最初に、MS Azureにて稼働しているLinuxサーバへのSSHアクセスのみを許可する設定を行う。
SSHアクセスやRDPアクセス等のような非HTTP/HTTPS通信の制御は、Networkポリシーで定義する。Boad画面左側の「Gateway」から「Policies」に移る。
続けて「Network」をクリックし「Create a policy」をクリックし設定画面に入る。
「Edit a network policy」画面内の「Name your policy」欄内の「Policy name」にポリシー名を入力。自分の場合「allow_azure_sv」とした。
「Build an expression」欄内の「Selector」は「Destination IP」を選択。「Operator」は「is」を選択。「Value」はアクセス先のサーバのパブリックIPを入力。
「Select an action」欄内の「Action」は「Allow」を選択。
Create policy」をクリックし、設定内容を保存する。
設定内容が保存され「Policies」画面に戻る。以下はNetworkポリシーの設定内容。
要件②のポリシー設定
次に、boxとGithubとSlackへのアクセスを許可する設定を行う。
GithubやSlack等のようなWebサービスへの通信の制御は、HTTPポリシーで設定を行う。
「Policies」画面内の「HTTP」をクリックし、HTTPポリシーの設定画面に入る。
「Create an HTTP policy」に入り「Create a policy」をクリックし設定画面に入る。
「Name your policy」欄内の「Policy name」にポリシー名を入力。自分の場合「allow_slack_github_box」とした
「Build an expression」欄内の「Selector」は「Application」を選択。「Operator」は「in」を選択。「Value」は「box」と「Github」と「Slack」を選択。
「Select an action」欄内の「Action」は「Allow」を選択。
「Create policy」をクリックし、設定内容を保存する。
次は上記で許可設定したbox、Github、Slack以外のWebアプリへのアクセスを全て破棄する設定に入る。
「Policies」画面にて引き続き「Create a policy」をクリックし、設定画面に入る。
「Name your policy」欄内の「Policy name」に「deny_all」を入力。
「Build an expression」欄内の「Selector」は「Application」を選択。「Operator」は「not_in」を選択。「Value」は「box」と「Github」と「Slack」を選択。
「Select an action」欄内の「Action」は「Block」を選択。
「Configure policy settings」欄内の「Block page customised text (optional):」は「Your access is denied」を入力。
「Create policy」をクリックし、設定内容を保存する。
上記の設定を終えた段階では、boxとGithubとSlack以外のHTTP通信は全て遮断されてCloudflareのBoard画面も表示出来なくなる為、CloudflareのBoard画面が正常に表示出来るよう、HTTPポリシーを追加する。
「Create a policy」をクリックし、設定画面に入る。
「Name your policy」欄内の「Policy name」に「cloudflare_board」を入力。
「Build an expression」欄内の「Selector」は「Application」を選択。「Operator」は「in」を選択。「Value」は「Cloudflare_Bashboard」を選択。
「Select an action」欄内の「Action」は「Allow」を選択。
「Create policy」をクリックし、設定内容を保存する。
このポリシーを先程作成した「deny_all」より先に評価してほしい為、ポリシーの確認画面にて「deny_all」のポリシーをマウスで下にずらし、一番最後に評価されるようにする。
設定内容が保存され「Policies」画面に戻る。deny_allのポリシーが一番下にいる事がわかる。
以下は「allow_slack_github_box」の設定内容。
以下は「cloudflare_board」の設定内容。
以下は「deny_all」の設定内容。
設定を終えたら画面内右上(macOSの場合)のWARPのアイコンをクリックし、設定内容を通信に反映させる。
接続確認
では早速、Azure内のゲストOSおよびWebアプリへの接続テストを実施する。
Block設定を入れたにも関わらず接続出来る場合はWarpにて接続を一旦無効にし、再度接続をONにする。
まずはAzure内のゲストOS(Ubuntu Linux)にSSHログインを試みる。正常にログイン出来た事を確認。
次にSlackのログイン画面へのアクセスを試みる。正常にアクセス出来た事およびログイン出来た事を確認。
続けて、Githubのログイン画面へのアクセスを試みる。正常にアクセス出来た事を確認。※ログインはしてません。
boxのログイン画面へのアクセスを試みる。正常にアクセス出来た事を確認。※ログインはしてません。
念の為、HTTPポリシー設定でAllowの対象ではなかったサイトへのアクセスを試みる。
YAMAPにアクセスしたところ、アクセスが拒否された。
尚、CiscoルータのACL設定のような「暗黙のdeny」やFW機器のデフォルト状態では全てdeny等といったものはCloudflare Zero TrustのGatewayポリシーには存在せず、ポリシー設定を入れない状態では全ての通信をAllowする。
ログの確認
上記にて実施した接続確認のログを見る。
Boad画面左側の「Logs」から「Gateway」に移る。
「Gateway Activity Log」のページにて、ポリシー設定した「Network」タブと「HTTP」タブにてログを確認する。
以下の画像内にて、Githubへのアクセスが「Allow」でログに残っている事が分かる。
ちなみにログの表示内容は、欄内の左側から「Host」「Email」「Action」「Request ID」「Time」を表す。EmailはCloudflare Zero Trustのユーザー登録する際に使用したもので、ユーザーIDのような役割を果たす。
更に探すと、Slackへのアクセスおよびboxが「Allow」でログに残っている事が分かる。
接続確認にてアクセスが拒否されたYAMAPのログも、きちんと残っている。
Azure内のゲストOS(Ubuntu Linux)にSSHログインした際のログも確認。
Networkポリシーで設定した為、「Network」タブ内から該当するログを探す。
送信元および宛先IPアドレスが黒塗りされた行が、今回Azure内のゲストOSへSSHログインした際のログである。
ログの表示内容は、欄内の左側から「Source IP」「Destination IP」「Action」「Request ID」「Time」を表す。
今回の要件では、GithubとSlackとbox以外はWebブラウザでアクセス出来ない為、当然の事ながらGoogleやOffice365等にもアクセス出来ません。
尚、接続内容がログに反映されるまで時間を要する事があるので注意。
今回はこれまで。
外部のサーバーへのSSHアクセスを許可するポリシーと複数のWebサービスのみアクセスを許可するポリシーを設定し、接続確認により設定したポリシーが正常に動作している事を確認出来た。
次回はDNSポリシーやもう少し詳細な内容のポリシーの設定を入れてみようと思う。
参照サイトや資料
Cloudflare Zero Trust公式ドキュメント
https://www.cloudflare.com/ja-jp/products/zero-trust/ Cloudflare Zero Trust
https://developers.cloudflare.com/cloudflare-one/ CloudflareDocs
https://developers.cloudflare.com/cloudflare-one/policies/filtering/ Gateway policies
参照サイト
https://fsbblog.jp/archive/entry-163.html【検証】Cloudflare Zero Trustを試す
https://zenn.dev/hiroe_orz17/articles/650463001ee087 Cloudflare Zero Trust の基本的なセットアップ手順
https://zenn.dev/hiroe_orz17/articles/59513491b4b8d9 Cloudflare Zero Trust クライアント側のセットアップ手順
Cloudflare Zero Trust関連の記事
https://debslink.hatenadiary.jp/entry/20221103/1667482863 Cloudflare Zero Trustを導入してみた - POC環境構築編
https://debslink.hatenadiary.jp/entry/20221123/1669181060 Cloudflare Zero Trustを導入してみた - ポリシー設定編②
https://debslink.hatenadiary.jp/entry/20221129/1669714627 Cloudflare Zero TrustとZscaler ZIAのポリシーについて
https://debslink.hatenadiary.jp/entry/20230321/1679325069 Cloudflare Zero TrustのIdPとしてOktaを導入してみた①
https://debslink.hatenadiary.jp/entry/20230415/1681545093 Cloudflare Zero TrustのIdPとしてOktaを導入してみた②
https://debslink.hatenadiary.jp/entry/20230708/1688789939 Cloudflare DEXを使用してみた