高度なAccess Gatewayポリシーの例

このトピックでは、高度なポリシー構成例を提供します。これらの例は、説明および教育のみを目的としています。

すべてのURI文字列の大文字と小文字を指定する

説明

すべてのURI文字列を小文字に変換します。

シナリオ

システムによっては、同じ文字でも大文字と小文字を異なる文字だと解釈します。このような状況を避けるために、すべての文字を小文字で入力します。

構成

保護されたルールを構成して、この設定がroot '/'ポリシーに適用されるようにします。また、rootポリシーを適応型ルールポリシーに変更します。ポリシータイプを参照してください。

#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

大きなファイルのアップロード/ダウンロードにタイムアウトを設定する(Set a timeout for large file uploads and downloads)

説明

大きなのファイルのアップロード/ダウンロードにタイムアウト制限を設定します。

シナリオ

大きなファイルのアップロードやダウンロードでは、Access Gatewayがネットワークエラーを返します。

構成

リソースの保護されたルールまたはデフォルトルールを開いて、詳細(Advanced) > カスタム(Custom)でタイムアウト値を指定します。

# 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_filtertext/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つのパラメータを受け付けます。

  • oagSMTimeoutSeconds:必須、デフォルトなし。スクリプトがセッション確認のために実行される頻度を秒単位で指定します。
  • oagSMAlertEnabled:デフォルト値はfalseです。パラメーターがtrueに設定されると、警告が表示されます。
  • oagSMAlertMessage:警告に表示されるメッセージです。デフォルトのメッセージは、一定期間操作がなかったためにセッションがタイムアウトしました(Session timed out due to inactivity)です。

アプリのページに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リソースごとに保護ルールを作成します:

  • 名前(Name)WebSocket
  • リソース(Resource)/uri/to/websocket
  • タイプ(Type)Protected
  • それぞれのリソースについて、例にある2つのスクリプト要素を追加します。

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";