高度なAccess Gatewayポリシーの例
このトピックでは、高度なポリシー構成例を提供します。これらの例は、説明および教育のみを目的としています。
- すべてのURI文字列の大文字と小文字を指定する
- 特定のURに送信するフィールドを選択する
- 大きなファイルのアップロード/ダウンロードにタイムアウトを設定する
- 特定のエラーコードとURLをURIに送信する
- クエリ引数に基づき動作を指定する
- URL文字列の書き換え
- 特定のファイルタイプを保護しない
- AJAXセッション処理の拡張
- 特定の文字によるリクエストの拒否
- WebSocketセキュリティ
すべてのURI文字列の大文字と小文字を指定する
説明 |
すべてのURI文字列を小文字に変換します。 |
シナリオ |
システムによっては、同じ文字でも大文字と小文字を異なる文字だと解釈します。このような状況を避けるために、すべての文字を小文字で入力します。 |
構成 |
保護されたルールを構成して、この設定がroot '/'ポリシーに適用されるようにします。また、rootポリシーをAdaptive Rule(適応型ルール)ポリシーに変更します。「ポリシータイプ」を参照してください。 |
例 |
#set all URIs to lower case if ($request_uri ~ "/.*/.*$") { set_by_lua_block $request_uri_temp { return string.gsub(ngx.var.request_uri, "?.*", "") } set_by_lua $request_uri_low "return ngx.arg[1]:lower()" $request_uri_temp; rewrite ^ https://$host$request_uri_low; } |
特定のURに送信するフィールドを選択する
説明 |
特定のURLへのリクエストに含むフィールドを指定します。 |
シナリオ |
リクエストの処理に必要なフィールドのみを送信したいと考えています。これを使用すると、不必要な情報の送信を回避して、帯域幅やストレージなどを節約することができます。 |
構成 |
属性名の隣にある鉛筆アイコンをクリックします。属性を含めるには、[Send(送信)]トグルをオンにします。属性を除外するには、このトグルをオフにします。 |
例 |
ヘッダーに変数を追加します。 set $TEST " "; # Set a value for later use proxy_set_header header_name $TEST; #Add a value to the HTTP Header |
大きなファイルのアップロード/ダウンロードにタイムアウトを設定する
説明 |
大きなのファイルのアップロード/ダウンロードにタイムアウト制限を設定します。 |
シナリオ |
大きなファイルのアップロードやダウンロードでは、Access Gatewayがネットワークエラーを返します。 |
構成 |
リソースの保護されたルールまたはデフォルトルールを開いて、 でタイムアウト値を指定します。 |
例 |
# Specify a longer timeout for file uploads/downloads to the backend protected resource send_timeout 5m; |
特定のエラーコードとURLをURIに送信する
説明 |
該当するURIに特定のリターンコードとURLを返します。 |
シナリオ |
ユーザーにデフォルトのエラーメッセージを表示したくない、カスタムHTMLページにリダイレクトしたいと考えています。 |
構成 |
保護されたルールを構成して、リターンコードとURLを指定します。 |
例 |
# Regardless of the behavior, # for the given protected resource # return 301 return 301 https://www.okta.com; |
クエリ引数に基づき動作を指定する
説明 |
異なる状況に合わせて動的なレスポンスを構成したいと考えています。 |
シナリオ |
構成のテストで認証をスキップしたいと考えています。 |
構成 |
保護されたルールを構成して、特定の条件が存在するときに何が起こるかを決定するようにします。 |
例 |
#If the query argument test is equal to demo #then set the policy type field to NO_AUTH if ($arg_test = "demo") { set $policy_type "NO_AUTH"; }; |
URL文字列の書き換え
説明 |
ゲートウェイでURLの書き換えが有効になっている場合、リンクやリダイレクトがブラウザを間違ったURLへポイントすることがあります。 |
シナリオ |
gw.okta.comというパブリックドメインがあり、app1.okta.comという内部リソースがあるとします。そして、リンクをapp1.okta.comだけに送りたいとします。 |
構成 |
保護されたルールを構成して、1つのURLから別のURLにリクエストがリダイレクトされるようにします。 |
注記 |
デフォルトでは、subs_filterはtext/htmlドキュメントでのみ機能します。この例では、圧縮データは使用できません。「HTTP Substitutions Filter」を参照してください。 |
1つのリダイレクトの例 |
# replace source (gw.okta.com) with destination (app1.okta.com) subs_filter http://gw.okta.com https://app1.okta.com; |
複数のリダイレクトの例 |
# specify the types of files to process subs_filter_types text/html text/css text/xml; # # replace source (internal....) with destination (app1...) using flags ig # i: ignore case # g: replace all matched strings subs_filter internaldomain1.okta.com app1.okta.com ig; subs_filter internaldomain2.okta.com app1.okta.com ig; |
Chrome以外のエージェントを異なるロケーションにリダイレクトする
説明 |
特定のユーザーエージェント(この場合Chrome)を使用していないすべてのユーザーを、別のURLにリダイレクトします。 |
シナリオ |
ボットやその他の自動リクエストがサーバーに到達するのを防ぎたいと考えています。 |
構成 |
保護されたルールを構成して、Access GatewayがChrome以外のエージェントから特定のURLにリクエストをリダイレクトし、301ステータスコード(Moved Permanently)を返すようにします。 |
例 |
# Replace Chrome with the desired user agent and configure the error and redirect URL if ($http_user_agent !~* Chrome ) { return 301 https://www.okta.com; } |
特定のファイルタイプを保護しない
説明 |
画像やスタイルシートなど、特定のファイルタイプを保護したくないと考えています。 |
シナリオ |
以前のプラットフォームでは、画像やスタイルシートなどのファイルに無制限でアクセスできました。Access Gatewayでも同じようにしたいと考えています。 |
構成 |
保護したくないファイルタイプのそれぞれについて、保護されたルールを構成します。 |
例 |
if ($request_uri ~ "^.*.png$") { set $policy_type "NO_AUTH"; } if ($request_uri ~ "^.*.jpg$") { set $policy_type "NO_AUTH"; } if ($request_uri ~ "^.*.css$") { set $policy_type "NO_AUTH"; } |
AJAXセッション処理の拡張
説明 |
AJAX呼び出しを使用するアプリは、セッションタイムアウト後にハングアップしたり、更新が必要になったりします。 |
シナリオ |
アプリがAJAXを呼び出します。一定期間アイドル状態で、セッションがタイムアウトします。アプリがもう一度AJAXを呼び出すと、セッションが非アクティブのために失敗します。 |
構成 |
保護されたルールを構成して、セッションが延長されるようにします。 |
注記 |
例にあるスクリプトは定義された間隔で実行され、ユーザーセッションが非アクティブかどうかを確認します。ユーザーセッションが期限切れになると、スクリプトはユーザーに対し警告を発し、ページを更新します。その後、Oktaセッションが存在する場合は、ユーザーが新しいセッションを取得します。存在しない場合は、ユーザーが再度認証を行う必要があります。 スクリプトは、3つのパラメータを受け付けます。
アプリのページにJQueryライブラリーが含まれる場合には、JQueryを使用した例に従ってください。 |
例1 |
アプリがJQueryを使用しています。サンプルのメッセージを顧客向けのメッセージに置き換えます。 proxy_set_header Accept-Encoding ""; |
例2 |
アプリがJQueryを使用していません。サンプルのメッセージを顧客向けのメッセージに置き換えます。 proxy_set_header Accept-Encoding ""; subs_filter "</head>" "<script type=\"text/javascript\"> window.oagSMParams={\"oagSMTimeoutSeconds\" :60, \"oagSMAlertEnabled\" : true, \"oagSMAlertMessage\" :\"Your message to be displayed\"}; </script> <script type=\"text/javascript\" src=\"/AQUNAAsIAAM/dist/jquery.min.js\"> </script> <script src=\"/AQUNAAsIAAM/js/sessionTimeout.js\"></script></head>"; |
例3 |
アプリがiFrameとJQueryを使用しています。iFrameページの1つで置換するタグ(<tag-to-replace>)を特定します。 proxy_set_header Accept-Encoding ""; subs_filter "</tag-to-replace>" "<script type=\"text/javascript\"> window.oagSMParams={\"oagSMTimeoutSeconds\" :60, \"oagSMAlertEnabled\" : true, \"oagSMAlertMessage\" :\"Your message to be displayed\"}; </script> <script src=\"/AQUNAAsIAAM/js/sessionTimeout.js\"></script></tag-to-replace>"; |
例4 |
アプリはiFrameを使用していますが、JQueryを使用していません。iFrameページの1つで置換するタグ(<tag-to-replace>)を特定します。 proxy_set_header Accept-Encoding ""; subs_filter "</tag-to-replace>" "<script type=\"text/javascript\"> window.oagSMParams={\"oagSMTimeoutSeconds\" :60, \"oagSMAlertEnabled\" : true, \"oagSMAlertMessage\" :\"Your message to be displayed\"}; </script> <script type=\"text/javascript\" src=\"/AQUNAAsIAAM/dist/jquery.min.js\"> </script> <script src=\"/AQUNAAsIAAM/js/sessionTimeout.js\"></script></tag-to-replace>"; |
特定の文字によるリクエストの拒否
説明 |
危険な文字が含まれるリクエストを拒否します。 |
シナリオ |
バックエンドのWebアプリを攻撃する際には、特定の文字が使用されます。これらの文字を含んだリクエストを拒否すると、潜在的な攻撃対象を取り除くことができます。 |
構成 |
保護されたルールを構成して、阻止したい文字を含めるようにします。 |
例 |
header_filter_by_lua_block { -- add characters inside the brackets reBadChars = '[><]' if string.match(ngx.var.uri, reBadChars) then ngx.log(ngx.STDERR, "Bad chars found in URI") return ngx.exit(403) end } |
WebSocketセキュリティ
説明 |
HTTP呼び出しをWebSocket(WSS)呼び出しに変換します。 |
シナリオ |
WSSを通信プロトコルとして使用します。Access Gatewayは、HTTP呼び出しからWSS呼び出しに変換することをバックエンドサーバーに通知しなければなりません。 |
構成 |
WSSリソースごとに保護ルールを作成します:
|
例 |
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; |