Ingress の保護
このトピックでは、NetScaler を使用して Ingress を保護するためのさまざまな方法と、NetScaler Ingress Controller が提供するアノテーションについて説明します。
次の表に、Ingress NetScaler と NetScaler Ingress Controller を使用して Ingress を保護するために使用できる、サンプルアノテーションを含む TLS のユースケースを示します。
| ユースケース | サンプルアノテーション |
|---|---|
| TLSv1.3 プロトコルを有効にする | ingress.citrix.com/frontend-sslprofile: '{"tls13":"enabled", "tls13sessionticketsperauthcontext":"1", "dhekeyexchangewithpsk":"yes"}' |
| HTTP厳格なトランスポートセキュリティ (HSTS) | ingress.citrix.com/frontend-sslprofile: '{"hsts":"enabled", "maxage" : "157680000", "includesubdomain":"yes"} |
| OCSP ステープリング | ingress.citrix.com/frontend-sslprofile: '{"ocspstapling":"enabled"}' |
| クライアント認証を必須に設定する | ingress.citrix.com/frontend-sslprofile: '{"clientauth":"enabled", "clientcert" : "mandatory"}' |
| TLS セッションチケット拡張 | ingress.citrix.com/frontend-sslprofile: '{"sessionticket" : "enabled", "sessionticketlifetime : "300"}' |
| SSLセッション再利用 | ingress.citrix.com/frontend-sslprofile: '{"sessreuse" : "enabled", "sesstimeout : "120"}' |
| 暗号グループ | ingress.citrix.com/frontend-sslprofile:'{"snienable": "enabled", "ciphers" : [{"ciphername": "secure", "cipherpriority" :"1"}, {"ciphername": "secure", "cipherpriority" :"21"}]}' |
| 暗号リダイレクト | ingress.citrix.com/frontend-sslprofile:'{"snienable": "enabled", "ciphers" : [{"ciphername": "secure", "cipherpriority" :"1"}], "cipherredirect":"enabled", "cipherurl": "https://redirecturl"}' |
TLS v1.3プロトコルを有効にする
SSLプロファイルのアノテーションを使用して、SSLプロファイルでTLS 1.3プロトコルサポートを有効にし、Ingress NetScalerのSSLプロファイルで
tls13SessionTicketsPerAuthContextとdheKeyExchangeWithPskパラメーターを設定できます。
tls13SessionTicketsPerAuthContextパラメーターを使用すると、TLS 1.3がネゴシエートされ、チケットベースの再開が有効になり、ハンドシェイクが完了するか、ハンドシェイク後のクライアント認証が完了するたびに、Ingress NetScalerが発行するチケットの数を設定できます。この値を増やすことで、クライアントが各接続に新しいチケットを使用して複数の並列接続を開くことができるようになります。設定できる最小値は1、最大値は10です。デフォルトでは、値は1に設定されています。
注:
再開が無効になっている場合、チケットは送信されません。
dheKeyExchangeWithPskパラメーターを使用すると、TLS 1.3セッション再開ハンドシェイク中に事前共有キーが受け入れられたときに、Ingress NetScaler requires a DHEキー交換が発生するかどうかを指定できます。DHEキー交換は、チケットキーが侵害された場合でも前方秘匿性を確保しますが、DHEキー交換を実行するために追加のリソースが必要になります。
以下は、SSLプロファイルでTLS 1.3プロトコルサポートを有効にし、SSLプロファイルで
tls13SessionTicketsPerAuthContextとdheKeyExchangeWithPskパラメーターを設定するためのHTTPプロファイルのサンプルアノテーションです。
ingress.citrix.com/frontend-sslprofile: '{"tls13":"enabled", "tls13sessionticketsperauthcontext":"1", "dhekeyexchangewithpsk":"yes"}'
HTTP厳格トランスポートセキュリティ (HSTS)
Ingress NetScalerアプライアンスは、SSLプロファイルに組み込みオプションとしてHTTP Strict Transport Security (HSTS) をサポートしています。HSTSを使用すると、サーバーはクライアントとのすべての通信にHTTPS接続の使用を強制できます。つまり、サイトにはHTTPSを使用することによってのみアクセスできます。HSTSのサポートは、SSL LabsからのA+認定に必要です。詳細については、NetScalerでのHSTSのサポートを参照してください。
SSLプロファイルのアノテーションを使用して、Ingress NetScalerのSSLフロントエンドプロファイルでHSTSを有効にできます。以下は、Ingressアノテーションの例です。
ingress.citrix.com/frontend-sslprofile: '{"hsts":"enabled", "maxage" : "157680000", "includesubdomain":"yes"}'
ここで、:
-
HSTS- SSLプロファイル上のHTTP Strict Transport Security (HSTS) の状態。HSTSを使用すると、サーバーはクライアントとのすべての通信にHTTPS接続の使用を強制できます。サポートされている値はENABLEDとDISABLEDです。デフォルトでは、値はDISABLEDに設定されています。 -
maxage- クライアントがサーバーにHTTPSリクエストのみを送信する必要がある厳格なトランスポートセキュリティ (STS) ヘッダーの最大時間(秒単位)を設定できます。設定できる最小時間は0で、最大は4294967294です。デフォルトでは値は0です。 -
IncludeSubdomains- サブドメインのHSTSを有効にできます。Yesに設定されている場合、クライアントはサブドメインに対してHTTPSリクエストのみを送信する必要があります。デフォルトでは値はNoに設定されています。
OCSPステープリング
Ingress NetScalerは、OCSPレスポンダーから証明書の状態を検証した後、SSLハンドシェイク時にサーバー証明書の失効ステータスをクライアントに送信できます。サーバー証明書の失効ステータスは、アプライアンスがSSLハンドシェイクの一部としてクライアントに送信する応答に「ステープル」されます。NetScalerでのCRLおよびOCSPレポートの実装の詳細については、OCSPステープリングを参照してください。
OCSPステープリング機能を使用するには、以下のIngressアノテーションを持つSSLプロファイルを使用して有効にできます。
ingress.citrix.com/frontend-sslprofile: '{"ocspstapling":"enabled"}'
注:
OCSPステープリングを使用するには、NetScalerアプライアンスにOCSPレスポンダーを追加する必要があります。
クライアント認証を必須に設定する
SSLプロファイルのアノテーションを使用すると、クライアント認証を有効にできます。Ingress NetScalerアプライアンスは、SSLハンドシェイク中にクライアント証明書を要求します。
アプライアンスは、発行者の署名や有効期限などの通常の制約について、クライアントから提示された証明書をチェックします。
以下にいくつかのユースケースを示します。
-
ウェブサイトのコンテンツが表示される前に有効なクライアント証明書を要求します。これにより、ウェブサイトのコンテンツは認証されたマシンとユーザーのみに制限されます。
-
有効なクライアント証明書を要求します。有効なクライアント証明書が提供されない場合、ユーザーに多要素認証を求めます。
クライアント認証は、必須またはオプションに設定できます。
-
必須に設定されている場合、SSLクライアントが有効なクライアント証明書を送信しないと、接続は切断されます。有効とは、特定の認証局によって署名/発行され、期限切れまたは失効していないことを意味します。
-
オプションの場合、NetScalerはクライアント証明書を要求しますが、クライアントが無効な証明書を提示した場合や証明書を提示しなかった場合でも、SSLトランザクションを続行します。この構成は、認証シナリオ(例えば、有効なクライアント証明書が提供されない場合に2要素認証を要求するなど)に役立ちます。
SSLプロファイルの注釈を使用すると、SSL仮想サーバーでクライアント認証を有効にし、クライアント認証を
Mandatoryとして設定できます。
以下は、SSLプロファイルの注釈の例です。
ingress.citrix.com/frontend-sslprofile: '{"clientauth":"enabled", "clientcert" : "mandatory"}'
注:
クライアント証明書をIngress NetScaler上のSSL仮想サーバーにバインドしていることを確認してください。
TLSセッションチケット拡張
SSLハンドシェイクはCPU負荷の高い操作です。セッションの再利用が有効になっている場合、既存のクライアントに対してはサーバーまたはクライアントの鍵交換操作がスキップされます。これにより、クライアントはセッションを再開できます。これは応答時間を改善し、サーバーがサポートできる1秒あたりのSSLトランザクション数を増加させます。ただし、サーバーは各セッション状態の詳細を保存する必要があり、これはメモリを消費し、リクエストが複数のサーバー間で負荷分散される場合に、それらのサーバー間で共有することが困難です。
Ingress NetScalerアプライアンスは、SessionTicket TLS拡張をサポートしています。この拡張の使用は、セッションの詳細がサーバーではなくクライアントに保存されることを示します。クライアントは、クライアントHelloメッセージにセッションチケットTLS拡張を含めることで、このメカニズムをサポートしていることを示す必要があります。新しいクライアントの場合、この拡張は空です。サーバーはNewSessionTicketハンドシェイクメッセージで新しいセッションチケットを送信します。セッションチケットは、サーバーのみが知っているキーペアを使用して暗号化されます。サーバーが現在新しいチケットを発行できない場合、通常のハンドシェイクを完了します。
SSLプロファイルの注釈を使用すると、RFC 5077に従ってセッションチケットの使用を有効にできます。また、Ingress NetScalerによって発行されるセッションチケットの有効期間を、
sessionticketlifetimeパラメーターを使用して設定できます。
以下は、Ingress注釈の例です。
ingress.citrix.com/frontend-sslprofile: '{"sessionticket" : "enabled", "sessionticketlifetime : "300"}'
SSLセッションの再利用
NetScalerアプライアンスで既存のSSLセッションを再利用できます。SSL再ネゴシエーションプロセスが完全なSSLハンドシェイクで構成されるのに対し、SSL再利用はクライアントがリクエストとともにSSL IDを送信するため、部分的なハンドシェイクで構成されます。
SSLプロファイルの注釈を使用して、セッションの再利用を有効にし、Ingress NetScalerでセッションタイムアウト値(秒単位)を設定できます。
以下は、Ingressアノテーションの例です。
ingress.citrix.com/frontend-sslprofile: '{"sessreuse" : "enabled", "sesstimeout : "120"}'
デフォルトでは、アプライアンスでセッション再利用オプションが有効になっており、そのタイムアウト値は120秒に設定されています。したがって、クライアントが別のTCP接続で、以前のSSLセッションIDを120秒以内に送信した場合、アプライアンスは部分的なハンドシェイクを実行します。
暗号グループの使用
Ingress NetScalerには、組み込みの暗号グループが付属しています。DEFAULT暗号グループの一部ではない暗号を使用するには、それらをSSLプロファイルに明示的にバインドする必要があります。Ingress NetScaler上のSSL仮想サーバーにバインドするために、ユーザー定義の暗号グループを作成することもできます。
組み込みの暗号グループはTier-1およびTier-2 NetScalerで使用でき、ユーザー定義の暗号グループはTier-1 NetScalerでのみ使用できます。
ユーザー定義の暗号グループを使用するには、NetScalerにユーザー定義の暗号グループがあることを確認してください。次の手順を実行します。
-
ユーザー定義の暗号グループを作成します。例:
testgroup。 -
必要なすべての暗号をユーザー定義の暗号グループにバインドします。
-
ユーザー定義の暗号グループ名をメモします。
詳細な手順については、ユーザー定義の暗号グループを構成するを参照してください。
SSLプロファイルの注釈を使用して、組み込みの暗号グループ、ユーザー定義の暗号グループ、またはその両方をSSLプロファイルにバインドできます。
以下は、組み込みの暗号グループとユーザー定義の暗号グループをSSLプロファイルにバインドするために使用できるIngressアノテーションの構文です。
ingress.citrix.com/frontend-sslprofile:'{"snienable":"enabled", "ciphers" : [{"ciphername": "secure", "cipherpriority" :"1"}, {"ciphername": "testgroup", "cipherpriority" :"2"}]}'
Ingressアノテーションは、組み込みの暗号グループ
SECUREとユーザー定義の暗号グループtestgroupをSSLプロファイルにバインドします。
暗号リダイレクトの使用
SSLハンドシェイク中に、SSLクライアント(通常はWebブラウザ)は、設定された暗号の優先順位で、サポートする暗号スイートを通知します。そのリストから、SSLサーバーは自身が設定している暗号のリストと一致する暗号を選択します。
クライアントが通知した暗号がSSLサーバーに設定されている暗号と一致しない場合、SSLハンドシェイクは失敗します。失敗は、ブラウザに表示される不可解なエラーメッセージによって通知されます。これらのメッセージがエラーの正確な原因に言及することはほとんどありません。
暗号リダイレクトを使用すると、SSLハンドシェイクが失敗したときに、正確で意味のあるエラーメッセージを配信するようにSSL仮想サーバーを設定できます。SSLハンドシェイクが失敗すると、NetScalerアプライアンスはユーザーを以前に設定されたURLにリダイレクトするか、URLが設定されていない場合は、内部で生成されたエラーページを表示します。
以下は、暗号グループをバインドし、暗号リダイレクトを有効にしてリクエストを
redirecturlにリダイレクトするために使用できるイングレスアノテーションの構文です。
ingress.citrix.com/frontend-sslprofile:'{"snienable": "enabled", "ciphers" : [{"ciphername": "secure", "cipherpriority" :"1"}], "cipherredirect":"enabled", "cipherurl": "https://redirecturl"}'