内容

概要

前提条件

要件

使用するコンポーネント

背景説明

ES03の変更

ES01ベースのVPNレス構成のアップグレードノート

[Authentication]

非SSO認証

SSO認証

Websocket接続の認証

総当たり攻撃防御

Logging

Fail2banのインストールと設定

静的リソースURLの検証

CORSヘッダーのキャッシュ

設定

DMZにリバースプロキシとしてOpenRestyをインストールする

OpenRestyのインストール

Nginxの設定

Nginxキャッシュの設定

SSL証明書の設定

カスタムDiffie-Hellmanパラメータの使用

OCSPホチキス止めが有効になっていることを確認 – 証明書失効チェック

Nginxの設定

リバースプロキシポートの設定

リバースプロキシとアップストリームコンポーネント間の相互TLS認証の設定

キャッシュのクリア

標準ガイドライン

マッピングファイルの設定

マッピングファイルサーバとしてリバースプロキシを使用

CentOS 8カーネルの強化

IPテーブルの強化

クライアント接続の制限

クライアント接続のブロック

個別のIPアドレスのブロック

IPアドレスの範囲のブロック

サブネット内のすべてのIPアドレスのブロック

SELinux

確認

Finesse

CUICおよびライブデータ

IdS

パフォーマンス

トラブルシュート

概要

このドキュメントでは、リバースプロキシを使用して、Cisco Finesse、Cisco Unified Intelligence Center(CUIC)、およびCisco Identity Service(IdS)の12.6 ES03バージョンに基づくVPNに接続せずにCisco Finesseデスクトップにアクセスする方法について説明します。

注：Nginxのインストールと設定は、シスコではサポートされていません。この内容に関する質問は、シスココミュニティフォーラムで説明できます。

注：VPN-LessのES03導入については、アップグレードを計画し、互換性の制限を確認するために、各コンポーネントのreadmeを参照してください。

Cisco Finesse 12.6 ES03 Readme

CUIC/IdS 12.6 ES03 Readme

前提条件

要件

次の項目に関する知識があることが推奨されます。

- Cisco Unified Contact Center Enterprise(UCCE)リリース

- Cisco Finesse

- Linux管理

- ネットワーク管理とLinuxネットワーク管理

使用するコンポーネント

このドキュメントの情報は、次のソフトウェアとハードウェアのバージョンに基づいています。

- Finesse - 12.6 ES03

- CUIC - 12.6 ES03

- IdS:12.6 ES03

- UCCE/Hosted Collaboration Solution(HCS) for Contact Center(CC) - 11.6以降

- Packaged Contact Center Enterprise(PCCE) - 12.5以降

注:LD/CUICの共存による展開のため、PCCE/UCCE 2kの展開は12.6バージョンのCCE上に存在する必要があります

このドキュメントの情報は、特定のラボ環境にあるデバイスに基づいて作成されました。このドキュメントで使用するすべてのデバイスは、初期（デフォルト）設定の状態から起動しています。本稼働中のネットワークでは、各コマンドによって起こる可能性がある影響を十分確認してください。

注：このドキュメントで提供されている設定は、CentOS 8.0に導入されたNginx reverse proxy(OpenResty)を使用して、サンプルの2000ユーザUCCE導入に対して設定、強化、および負荷テストされています。このドキュメントでは、パフォーマンスプロファイルのリファレンス情報を提供しています。

背景説明

この導入モデルは、UCCEソリューションのUCCE/PCCEおよびHCSでサポートされています。

VPNに接続せずにCisco Finesseデスクトップにアクセスするオプションとして、リバースプロキシの導入（12.6 ES01から利用可能）がサポートされています。この機能により、エージェントはインターネット経由でどこからでもFinesseデスクトップにアクセスできます。

この機能を有効にするには、リバースプロキシペアを非武装地帯(DMZ)に導入する必要があります。

逆プロキシ展開では、メディアアクセスは変更されません。メディアに接続するために、エージェントはCisco Jabber over Mobile and Remote Accessソリューション(MRA)またはUCCEのモバイルエージェント機能を公衆電話交換網(PSTN)またはモバイルエンドポイントで使用できます。次の図は、リバースプロキシノードの単一のハイアベイラビリティ(HA)ペアを介して2つのFinesseクラスタと2つのCUICノードにアクセスする場合のネットワーク展開の様子を示しています。

次の図に示すように、インターネット上のエージェントとLANから接続するエージェントからの同時アクセスがサポートされます。

注：この導入をサポートするには、Nginxの代わりにサードパーティ製プロキシ選択基準の機能ガイドを参照してください。

- UCCE 12.6機能ガイド- VPNレス機能の機能の概要、設計、設定の詳細を示しています。

- UCCE 12.6セキュリティガイド：リバースプロキシ導入のセキュリティ設定のガイドラインを提供します。

このドキュメントを読む前に、機能ガイドとセキュリティガイドの「VPNなし」のセクションを確認することを推奨します。

ES03の変更

- 新しい機能

- Finesseスーパーバイザ機能は、リバースプロキシでサポートされるようになりました。

- CUIC RealTimeおよびHistoricalレポートは、プロキシ環境のFinesseガジェットでサポートされるようになりました。

- すべての要求/通信の認証：Luaサポートが必要

- すべてのFinesse/CUIC/IM & Presence(IM&P)要求は、データセンターに入ることを許可される前に、プロキシで認証されます。

- WebsocketおよびライブデータソケットIO接続も制限され、Finesseに対してセキュリティで保護された要求を正常に行ったクライアントからのみ許可されます。

- Fail2Banで悪意のあるIPアドレスをブロックするために使用できる、総当たり攻撃の検出とプロキシでのロギング。

- リバースプロキシ設定のセキュリティ強化 – Luaサポートが必要

- リバースプロキシとアップストリームコンポーネント(Finesse/IdS/CUIC/Livedata)間の相互転送層セキュリティ(TLS)認証。

- SeLinuxの設定。

- プロキシおよびコンポーネントサーバー要求に対する相互Secure Sockets Layer(SSL)信頼の検証を有効にします。

- Denial-of-Service(DoS)/Distributed Denial-of-Service(DDoS)攻撃を防止するためのプロキシ設定のセキュリティ強化 – Luaサポートが必要

- システムのさまざまな部分の拡張Nginx要求レート制限。

- IpTableのレート制限。

- アップストリームコンポーネントサーバを要求する前の静的リソース要求の検証。

- アップストリームのコンポーネントサーバにヒットしない、より軽量でキャッシュ可能な非認証ページ。

- その他の機能 – Luaサポートが必要

- プロキシから提供されるCross-Origin Resource Sharing(CORS)応答を自動検知し、自動設定を支援し、パフォーマンスを向上

- VPNレスに関する不具合修正

- CSCwa26057 - Finesseデスクトップログイン時にエージェントに提供される複数の証明書

- CSCwa24471 - FinesseログインページにSSOエージェントのFQDN名が表示されない

- CSCwa24519 :コンポーネントからリバースプロキシホスト名を解決できない場合、Webproxyサービスが再起動しない

- CSCwa23252 :CA証明書チェーンの深さが1つ以上の場合、プロキシFinesse信頼が失われます

- CSCwa46459 webserviceで公開されたlog4jゼロデイの脆弱性

ES01ベースのVPNレス構成のアップグレードノート

- ES03の設定には、LuaをサポートするNginxのインストールが必要です。

- 証明書の要件

- Cisco Finesse、CUIC、およびIdSでは、Nginx/OpenRestyホスト証明書をTomcat信頼ストアに追加し、再起動する必要があります。その後、Nginx ES02設定がアップストリームサーバに正常に接続できるようになります。

- ES03ベースの設定を使用するには、NginxサーバでCisco Finesse、CUIC、およびIdSアップストリームサーバ証明書を設定する必要があります。

注：ES03 Nginx設定をインストールする前に、既存のES01ベースのNginx設定を削除することを推奨します。

注：ES03設定スクリプトには、Cisco Finesse、CUIC、およびIdSでの対応するES03 COPのインストールも必要です。

[Authentication]

Finesse 12.6 ES03では、プロキシでの認証が導入されています。認証は、シングルサインオン(SSO)および非SSO展開でサポートされます。

認証は、プロキシで受け入れられるすべての要求とプロトコルに対して適用され、上流のコンポーネントサーバに転送されます。コンポーネントサーバによってローカルで適用される認証も行われます。すべての認証は、共通のFinesseログインクレデンシャルを使用して要求を認証します。

認証と接続後にExtensible Messaging and Presence Protocol(XMPP)などのアプリケーションプロトコルに依存するWebソケットなどの固定接続は、ソケット接続の確立前にアプリケーション認証が成功したIPアドレスを検証することによって、プロキシで認証されます。

非SSO認証

SSO以外の認証では追加の設定は必要なく、必要なスクリプトを置換すると、すぐにNginx設定スクリプトで動作します。認証は、Finesseへのログインに使用するユーザ名とパスワードに依存します。すべてのエンドポイントへのアクセスは、Finesse認証サービスで検証されます。

有効なユーザのリストは、プロキシでローカルにキャッシュされます（15分ごとにキャッシュが更新されます）。これは、要求でユーザを検証するために使用されます。ユーザのクレデンシャルは、設定されたFinesse URIに要求を転送することによって検証され、その後、クレデンシャルハッシュがローカルにキャッシュ（キャッシュされた15分）され、新しい要求がローカルに認証されます。ユーザ名またはパスワードに変更があった場合は、15分後に有効になります。

SSO認証

SSO認証では、管理者が設定ファイル内のNginxサーバでIdSトークン暗号化キーを設定する必要があります。IdSトークン暗号化キーは、IdSサーバから show ids secret CLI コマンド.これらのキーは、SSO認証が機能する前に管理者がスクリプトで実行する必要がある#Must-change置換の1つの一部として設定する必要があります。

プロキシ解決がIdSで動作するために実行するIdS SAML設定については、SSOユーザガイドを参照してください。

SSO認証を設定すると、有効なトークンのペアを使用して、システム内の任意のエンドポイントにアクセスできます。プロキシ設定は、IdSに対して行われたトークン取得要求を傍受するか、有効なトークンを復号化し、それ以降の検証のためにローカルでキャッシュすることによって、クレデンシャルを検証します。

Websocket接続の認証

カスタムヘッダーはブラウザのネイティブwebsocket実装でサポートされていないため、Websocket接続は標準認証ヘッダーで認証できません。アプリケーションレベルの認証プロトコル。ペイロードに含まれる認証情報によってwebsocket接続の確立が妨げられず、悪意のあるエンティティがシステムを圧倒する無数の接続を作成するだけでDOSまたはDDOS攻撃を引き起こす可能性があります。

この可能性を軽減するために、提供されるnginxリバースプロキシ設定では、websocket接続の確立前に認証されたREST要求を正常に行ったIPアドレスからのみwebsocket接続を受け入れることができるように、特定のチェックが行われています。これは、REST要求が発行される前にWebソケット接続を作成しようとするクライアントが認可失敗エラーを受け取り、サポートされている使用シナリオではないことを意味します。

総当たり攻撃防御

Finesse 12.6 ES02認証スクリプトは、ユーザパスワードの推測に使用できるブルートフォース攻撃を積極的に防止します。これは、サービスへのアクセスに使用されるIPアドレスを、短時間で特定の回数の試行が失敗した後でブロックすることによって行われます。これらの要求は418クライアントエラーによって拒否されます。ブロックされたIPアドレスの詳細は、<nginx-install-directory>/logs/blocking.logおよび<nginx-install-directory>/logs/error.logファイルからアクセスできます。

失敗した要求の数、時間間隔、およびブロック期間は設定可能です。<nginx-install-directory>/conf/conf.d/maps.confファイルに設定が存在します。

## These two constants indicate five auth failures from a client can be allowed in thirty seconds.

## if  the threshold is crossed,client ip will be blocked.

map $host $auth_failure_threshold_for_lock {

## Must-change Replace below two parameters as per requirement

default 5 ;

}

map $host $auth_failure_counting_window_secs {

## Must-change Replace below two parameters as per requirement

default 30;

}

## This indicates duration of blocking a client to avoid brute force attack

map $host $ip_blocking_duration {

## Must-change Replace below parameter as per requirement

default 1800;

}

Logging

ブロックされているIPアドレスを検索するには、ディレクトリ<nginx-install-directory>/logsから次のコマンドを実行します。

grep "will be blocked for" blocking.log

grep "IP is already blocked." error.log

2021/10/29 17:30:59 [emerg] 1181750#1181750: *19 [lua] block_unauthorized_users.lua:153: _redirectAndSendError(): 10.68.218.190 will be blocked for 30 minutes for exceeding retry limit., client: 10.68.218.190, server: saproxy.cisco.com, request: "GET /finesse/api/SystemInfo?nocache=1636456574482 HTTP/2.0", host: "saproxy.cisco.com:8445", referrer: "https://saproxy.cisco.com:8445/desktop/container/?locale=en_US&"

2021/10/29 19:21:00 [error] 943068#943068: *43 [lua] block_unauthorized_users.lua:53: 10.70.235.30 :: IP is already blocked..., client: 10.70.235.30, server: saproxy.cisco.com, request: "GET /finesse/api/SystemInfo?nocache=1635591686497 HTTP/2.0", host: "saproxy.cisco.com:8445", referrer: "https://saproxy.cisco.com:8445/desktop/container/?locale=en_US"

お客様はFail2banまたは同様の機能を使用して、IPテーブル/ファイアウォールルールにbanを追加することを推奨します。

Fail2banのインストールと設定

Fail2banはログファイルをスキャンし、悪意のあるサインを示すIPを禁止します。パスワードのエラーが多すぎる、悪用を求めるなど。一般に、Fail2Banはファイアウォールルールを更新して、指定した時間IPアドレスを拒否するように使用されます。ただし、他の任意のアクション（電子メールの送信など）も設定できます。詳細については、https://www.fail2ban.org/を参照してください。

Fail2banは、blocking.logを監視するように設定することで、NginxによってブロックされたIPアドレスをbruteforce攻撃の検出時に識別し、設定可能な期間だけブロックすることができます。CentOSリバースプロキシにfail2banをインストールして設定する手順は、次のとおりです。

1. yumを使用したFail2banのインストール

yum update && yum install epel-release

yum install fail2ban

2.地元の刑務所を作る

Jail設定を使用すると、管理者は、ブロックされたIPアドレスによるアクセスを禁止されるポート、IPアドレスがブロックされる期間、監視されるログファイルからブロックされたIPアドレスを識別するために使用されるフィルタ設定などを設定できます。アップストリームサーバへのアクセスをブロックするIPアドレスを禁止するためのカスタム設定を追加する手順は、次のとおりです。

a) Fail2banインストールディレクトリ（この例では/etc/fail2ban）に移動します

cd /etc/fail2ban

b) jail.confをjail.localにコピーして、ローカルの変更を隔離したままにします。

cp jail.conf jail.local

c)次のjail設定をjail.localファイルの末尾に追加し、テンプレート内のポートを実際のポートに置き換えます。必要に応じて、禁止時間設定を更新します。

# Jail configurations for HTTP connections.

[finesse-http-auth]

enabled = true

# The ports to be blocked. Add any additional ports.

port = http,https,<finesse-ports>,<cuic-ports>,<any-other-ports-to-be-blocked>

# Path to nginx blocking logs.

logpath = /usr/local/openresty/nginx/logs/blocking.log

# The filter configuration.

filter = finesseban

# Block the IP from accessing the port, once the IP is blocked by lua.

maxretry= 1

# Duration for retry set to 3 mins. Doesn't count as the maxretry is 1

findtime= 180

# Lock time is set to 3 mins. Change as per requirements.

bantime = 180

3.フィルタの設定

フィルタは、Fail2banに、禁止するホストを特定するためにログで何を探すかを指示します。フィルタを作成する手順は、次のとおりです。

a) filter.d/finesseban.confを作成します。

touch filter.d/finesseban.conf

b)ファイルfilter.d/finesseban.confに次の行を追加します

[Definition]

# The regex match that would cause blocking of the host.

failregex = <HOST> will be blocked for

4)Fail2banの開始

次のコマンドを実行して、fail2banを起動します。

fail2ban-client start

fail2banログファイルを開き、エラーがないことを確認します。デフォルトでは、fail2banのログは/var/log/fail2ban.logファイルに移動します。

静的リソースURLの検証

認証されていない方法でアクセスできる有効なエンドポイントはすべて、ES03スクリプトでアクティブに追跡されます。

これらの非認証パスへの要求は、無効なURIが要求された場合、アップストリームサーバにこれらの要求を送信せずに、アクティブに拒否されます。

CORSヘッダーのキャッシュ

最初のオプション要求が成功すると、応答ヘッダーaccess-control-allow-headers、access-control-allow-origin、access-control-allow-methods、access-control-expose-headers、およびaccess-control-allow-credentialsが5分間プロキシにキャッシュされます。これらのヘッダーは、それぞれのアップストリームサーバごとにキャッシュされます。

設定

このドキュメントでは、Finesse VPNレスアクセスをイネーブルにするために使用されるリバースプロキシとしてのNginxの設定について説明します。提供されている手順を確認するために使用されるUCCEソリューションコンポーネント、プロキシ、およびOSのバージョンが提供されます。関連する手順は、選択したOS/プロキシに適合させる必要があります。

- 使用するNginxバージョン – OpenResty 1.19.9.1

- 構成に使用されるOS:CentOS 8.0

注：説明されているNginxの設定は、Finesse Release 12.6(1)ES3ソフトウェアダウンロードページからダウンロードできます。

DMZにリバースプロキシとしてOpenRestyをインストールする

このセクションでは、OpenRestyベースのプロキシインストール手順について詳しく説明します。リバースプロキシは通常、前述の展開図に示すように、ネットワーク非武装地帯(DMZ)の専用デバイスとして設定されます。

1. 必要なハードウェア仕様を使用して選択したOSをインストールします。選択したOSによってカーネルとIPv4パラメータの調整が異なる場合があり、選択したOSのバージョンが異なる場合は、これらの側面を再確認することをお勧めします。

2. 2つのネットワークインターフェイスを設定します。インターネットクライアントからのパブリックアクセスと、内部ネットワーク内のサーバとの通信には、1つのインターフェイスが必要です。

3. OpenRestyをインストールします。

Nginx 1.19+に基づいており、Luaをサポートしている限り、Nginxの種類を使用できます。

- Nginx Plus

- Nginx Open Source （Nginxオープンソースを使用するには、OpenRestyベースのLuaモジュールとともにコンパイルする必要があります）

- OpenResty

- GetPageSpeedエクストラ

注：提供された設定はOpenResty 1.19でテストされており、マイナーアップデートがある場合は、他のディストリビューションと一緒に動作することが期待されます。

OpenRestyのインストール

1. OpenRestyをインストールします。OpenResty Linux Packagesを参照してください。
OpenRestyのインストールの一部として、Nginxはこの場所にインストールされ、～/.bashrcファイルに追加することでPATH変数にOpenRestyパスを追加します。

export PATH=/usr/local/openresty/bin:$PATH

2. Nginxを開始/停止します。

- Nginxを開始するには、次のように入力します openresty.

- Nginxを停止するには、次のように入力します openresty -s stop.

Nginxの設定

この設定は、OpenRestyベースのNginxインストール用に説明されています。OpenRestyのデフォルトディレクトリは次のとおりです。

- <nginx-install-directory> = /usr/local/openresty/nginx

- <Openresty-install-directory> = /usr/local/openresty

1. Nginxのリバースプロキシ設定を含むFinesseリリース12.6(1)ES03ソフトウェアダウンロードページ(12.6-ES03-reverse-proxy-config.zip)からファイルをダウンロードして抽出します。

2. nginx.conf、nginx/conf.d/、およびnginx/html/を、抽出されたリバースプロキシ設定ディレクトリから<nginx-install-directory>/conf、<nginx-install-directory>/conf/conf.d/、<nginx-install-directory>/html/にそれぞれコピーします。

3. <nginx-install-directory>内の抽出されたリバースプロキシ構成ディレクトリからnginx/luaディレクトリをコピーします。

4. lualibの内容を<Openresty-install-directory>/lualib/restyにコピーします。

5. nginx/logrotate/saproxyファイルを<nginx-install-directory>/logrotate/フォルダにコピーして、nginxログのローテーションを構成します。Nginxのデフォルトが使用されていない場合は、ファイルの内容を修正して、正しいログディレクトリを指すようにします。

6. Nginxは専用の非特権サービスアカウントで実行する必要があります。このアカウントはロックされ、無効なシェル（または選択したOSに該当するシェル）が設定されている必要があります。

7. htmlおよびconf.dという名前の解凍フォルダの下にあるファイル内の「Must-change」文字列を検索し、表示された値を適切なエントリに置き換えます。

8. すべての必須の置換が行われていることを確認します。この置換は、設定ファイルの変更が必要なコメントと共に説明されています。

9. CUICおよびFinesse用に設定されたキャッシュディレクトリが、これらの一時ディレクトリとともに<nginx-install-directory>/cacheの下に作成されていることを確認します。

- <nginx-install-directory>/cache/client_temp

- <nginx-install-directory>/cache/proxy_temp

注：ここに示す設定は、2000の導入例に対するもので、大規模な導入に適した拡張が必要です。

Nginxキャッシュの設定

デフォルトでは、プロキシキャッシュパスはファイルシステムに保存されます。次に示すように、tmpfsにキャッシュの場所を作成して、メモリ内ドライブに変更することを推奨します。

1. /homeの下に異なるプロキシキャッシュパスのディレクトリを作成します。
たとえば、プライマリFinesse用にこれらのディレクトリを作成する必要があります。セカンダリFinesseサーバとCUICサーバについても同じ手順を実行する必要があります。

mkdir -p /home/primaryFinesse/rest

mkdir -p /home/primaryFinesse/desktop

mkdir -p /home/primaryFinesse/shindig

mkdir -p /home/primaryFinesse/openfire

mkdir -p /home/primaryCUIC/cuic

mkdir -p /home/primaryCUIC/cuicdoc

mkdir -p /home/client_temp

mkdir -p /home/proxy_temp

echo "tmpfs /home/primaryFinesse/rest tmpfs size=1510M,rw,auto,noexec,nodev,nosuid,gid=root,uid=root,mode=1700 0 0" >>

/etc/fstab echo "tmpfs /home/primaryFinesse/desktop tmpfs size=20M,rw,auto,noexec,nodev,nosuid,gid=root,uid=root,mode=1700 0 0" >>

/etc/fstab echo "tmpfs /home/primaryFinesse/shindig tmpfs size=500M,rw,auto,noexec,nodev,nosuid,gid=root,uid=root,mode=1700 0 0" >>

/etc/fstab echo "tmpfs /home/primaryFinesse/openfire tmpfs size=10M,rw,auto,noexec,nodev,nosuid,gid=root,uid=root,mode=1700 0 0" >>

/etc/fstab echo "tmpfs /home/primaryCUIC/cuic tmpfs size=100M,rw,auto,noexec,nodev,nosuid,gid=root,uid=root,mode=1700 0 0" >>

/etc/fstab echo "tmpfs /home/primaryCUIC/cuicdoc tmpfs size=100M,rw,auto,noexec,nodev,nosuid,gid=root,uid=root,mode=1700 0 0" >>

/etc/fstab echo "tmpfs /home/client_temp tmpfs size=2048M,rw,auto,noexec,nodev,nosuid,gid=root,uid=root,mode=1700 0 0" >>

/etc/fstab echo "tmpfs /home/proxy_temp tmpfs size=2048M,rw,auto,noexec,nodev,nosuid,gid=root,uid=root,mode=1700 0 0" >> /etc/fstab

注：設定に追加された新しいFinesseクラスタごとに、クライアントおよびproxy_tempキャッシュを1 GB増やします。

2. コマンドを使用して、新しいマウントポイントをマウントします mount -av.

3. ファイルシステムが新しいマウントポイントをマウントしたことを、 df -h コマンドが表示されない場合もあります。

4. FinesseおよびCUICキャッシュ設定ファイルのproxy_cache_pathの場所を変更します。
たとえば、Finesseプライマリのパスを変更するには、<nginx-install-directory>conf/conf.d/finesse/cachesに移動し、既存のキャッシュの場所/usr/local/openresty/nginx/cache/finesse25/を新しく作成したファイルシステムの場所に変更します /home/primaryFinesse

##Must-change /usr/local/openresty/nginx/cache/finesse25 location would change depending on folder extraction proxy_cache_path /home/primaryFinesse/desktop levels=1:2 use_temp_path=on keys_zone=desktop_cache_fin25:10m max_size=15m inactive=3y use_temp_path=off; proxy_cache_path /home/primaryFinesse/shindig levels=1:2 use_temp_path=on keys_zone=shindig_cache_fin25:10m max_size=500m inactive=3y use_temp_path=off; proxy_cache_path /home/primaryFinesse/openfire levels=1:2 use_temp_path=on keys_zone=openfire_cache_fin25:10m max_size=10m inactive=3y use_temp_path=off; proxy_cache_path /home/primaryFinesse/rest levels=1:2 use_temp_path=on keys_zone=rest_cache_fin25:10m max_size=1500m inactive=40m use_temp_path=off;

5. FinesseセカンダリサーバとCUICサーバで同じ手順を実行します。

注：これらのドライブはアプリケーションに対してディスクのように設定され、メモリ領域を消費するように構成されたメモリブロックであるため、前のすべての手順で作成されたすべてのtmpfsドライブのサイズ合計が最終的なメモリ容量に追加されていることを確認します。

SSL証明書の設定

自己署名証明書の使用 – テスト展開

自己署名証明書は、リバースプロキシを実稼働に展開する準備が整うまで使用する必要があります。実稼働環境では、認証局(CA)署名付き証明書のみを使用します。

1. SSLフォルダコンテンツのNginx証明書を生成します。証明書を生成する前に、/usr/local/openresty/nginxの下にsslというフォルダを作成する必要があります。これらのコマンドを使用して2つの証明書を生成する必要があります(1つは<reversproxy_primary_fqdn>用で、もう1つは<reversproxy_secondary_fqdn>用です)。

1. sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /usr/local/openresty/nginx/ssl/nginx.key -out /usr/local/openresty/nginx/ssl/nginx.crt (次のようにホスト名を渡します。<reverseproxy_primary_fqdn>

2. sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /usr/local/openresty/nginx/ssl/nginxnode2.key -out /usr/local/openresty/nginx/ssl/nginxnode2.crt （ホスト名を：<reverseproxy_secondary_fqdn>として渡します）。

3. 証明書パスが/usr/local/openresty/nginx/ssl/nginx.crtおよび/usr/local/openresty/nginx/ssl/nginxnode2.crtであることを確認します。これは、Finesse Nginx設定ファイルですでに設定されているためです。

2. 秘密キー400の権限を変更します(r—)。

3. リバースプロキシのファイアウォール/iptablesを設定して、Nginxサーバがリッスンするように設定されているポートに対応するようにファイアウォールからの通信を有効にします。

4. Finesse、IdS、およびCUICのIPアドレスとホスト名を、リバースプロキシサーバの/etc/hostsエントリの下に追加します。

5. Nginxホストを逆プロキシとして設定するには、コンポーネントサーバで実行する設定のソリューション機能ガイドを参照してください。

注：ここに示す設定は、2000の導入例に対するもので、大規模な導入に適した拡張が必要です。

CA署名付き証明書の使用 – 実稼働環境への導入

CA署名付き証明書は、次の手順でリバースプロキシにインストールできます。

1. 証明書署名要求(CSR)を生成します。
CSRと秘密キーを生成するには、次のように入力しますopenssl req -new -newkey rsa:4096 -keyout nginx.key -out nginx.csrプロキシにログインした後、プロンプトに従い、詳細を入力します。これにより、強度4096ビットのCSR（例ではnginx.csr）とRSA秘密キー（例ではnginx.key）が生成されます。

以下に、いくつかの例を示します。

[root@reverseproxyhost.companyname.com ssl]# openssl req -new -newkey rsa:4096 -keyout nginx.key -out nginx.csr Generating a RSA private key .....+++++ ...................................................................................................................................................+++++ writing new private key to 'nginx.key' Enter PEM pass phrase:passphrase Verifying - Enter PEM pass phrase:passphrase ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:US State or Province Name (full name) []:CA Locality Name (eg, city) [Default City]:Orange County Organization Name (eg, company) [Default Company Ltd]:CompanyName Organizational Unit Name (eg, section) []:BusinessUnit Common Name (eg, your name or your server's hostname) []:reverseproxyhostname.companydomain.com Email Address []:john.doe@comapnydomain.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:challengePWD An optional company name []:CompanyName

PEMパスフレーズを書き留めます。これは、展開中に秘密キーを復号化するために使用されます。

2. CAから署名付き証明書を取得します。
CSRを認証局に送信し、署名付き証明書を取得します。

注：CAから受け取った証明書がそれぞれの証明書を含む証明書チェーンではない場合、関連するすべての証明書を1つの証明書チェーンファイルに作成します。

3. 証明書とキーを展開します。
最初のステップの一部として生成されたキーを、openssl rsa -in nginx.key -out nginx_decrypted.keyコマンドが表示されない場合もあります。CA署名付き証明書と復号化されたキーを、リバースプロキシマシンの/usr/local/openresty/nginx/sslフォルダ内に配置します。コンフィギュレーションファイル/usr/local/openresty/nginx/conf/conf.d/ssl/ssl.confのNginx設定の証明書に関連するSSL設定を更新/追加します。

ssl_certificate /usr/local/openresty/nginx/ssl/ca_signed_cert.crt; ssl_certificate_key /usr/local/openresty/nginx/ssl/nginx_decrypted.key;

4. 証明書の権限を設定します。
chmod 400 /usr/local/openresty/nginx/ssl/ca_signed_cert.crtとchmod 400 /usr/local/openresty/nginx/ssl/nginx_decrypted.key証明書が読み取り専用の権限を持ち、所有者に制限されるようにします。

5. Nginxをリロードします。

カスタムDiffie-Hellmanパラメータの使用

次のコマンドを使用して、カスタムDiffie-Hellmanパラメータを作成します。

openssl dhparam -out /usr/local/openresty/nginx/ssl/dhparam.pem 2048 chmod 400 /usr/local/openresty/nginx/ssl/dhparam.pem

/usr/local/openresty/nginx/conf/conf.d/ssl/ssl.confファイルの新しいパラメータを使用するように、サーバ設定を変更します。

ssl_dhparam /usr/local/openresty/nginx/ssl/dhparam.pem;

OCSPホチキス止めが有効になっていることを確認 – 証明書失効チェック

注：これを有効にするには、サーバがCA署名付き証明書を使用し、サーバが証明書に署名したCAにアクセスできる必要があります。

次の設定をfile/usr/local/openresty/nginx/conf/conf.d/ssl/ssl.confディレクトリに追加/更新します。

ssl_stapling on; ssl_stapling_verify on;

Nginxの設定

セキュリティを強化し、パフォーマンスを提供するために、デフォルトのNginx設定ファイル(/usr/local/openresty/nginx/conf/nginx.conf)にこれらのエントリが含まれるように変更する必要があります。このコンテンツは、Nginxインストールによって作成されるデフォルトの設定ファイルを変更するために使用する必要があります。

# Increasing number of worker processes will not increase the processing the request. The number of worker process will be same as number of cores

# in system CPU. Nginx provides "auto" option to automate this, which will spawn one worker for each CPU core.

worker_processes  auto;

# Process id file location

pid /usr/local/openresty/nginx/logs/nginx.pid;

# Binds each worker process to a separate CPU

worker_cpu_affinity auto;

#Defines the scheduling priority for worker processes. This should be calculated by "nice" command. In our proxy set up the value is 0

worker_priority 0;

error_log  /usr/local/openresty/nginx/logs/error.log info;

#user root root;

# current limit on the maximum number of open files by worker processes, keeping 10 times of worker_connections

worker_rlimit_nofile 102400;

events {

multi_accept on;

# Sets the maximum number of simultaneous connections that can be opened by a worker process.

# This should not be more the current limit on the maximum number of open files i.e. hard limit of the maximum number of open files for the user (ulimit -Hn)

# The appropriate setting depends on the size of the server and the nature of the traffic, and can be discovered through testing.

worker_connections  10240;

#debug_connection 10.78.95.21

}

http {

include       mime.types;

default_type  text/plain;

## Must-change Change with DNS resolver ip in deployment

resolver 192.168.1.3;

## Must-change change lua package path to load lua libraries

lua_package_path  "/usr/local/openresty/lualib/resty/?.lua;/usr/local/openresty/nginx/lua/?.lua;;"

## Must-change change proxy_temp folder as per cache directory configurations

proxy_temp_path /usr/local/openresty/nginx/cache/proxy_temp 1 2 ;

## Must-change change client_temp folder as per cache directory configurations

client_body_temp_path /usr/local/openresty/nginx/cache/client_temp 1 2 ;

lua_shared_dict userlist 50m;

lua_shared_dict credentialsstore 100m;

lua_shared_dict userscount 100k;

lua_shared_dict clientstorage 100m;

lua_shared_dict blockingresources 100m;

lua_shared_dict tokencache_saproxy 10M;

lua_shared_dict tokencache_saproxy125 10M;

lua_shared_dict ipstore 10m;

lua_shared_dict desktopurllist 10m;

lua_shared_dict desktopurlcount 100k;

lua_shared_dict thirdpartygadgeturllist 10m;

lua_shared_dict thirdpartygadgeturlcount 100k;

lua_shared_dict corsheadersstore 100k;

init_worker_by_lua_block {

local UsersListManager = require('users_list_manager')

local UnauthenticatedDesktopResourcesManager = require("unauthenticated_desktopresources_manager")

local UnauthenticatedResourcesManager = require("unauthenticated_thirdpartyresources_manager")

--  Must-change Replace saproxy.cisco.com with reverseproxy fqdn

if  ngx.worker.id() == 0 then

UsersListManager.getUserList("saproxy.cisco.com", "https://saproxy.cisco.com:8445/finesse/api/Users")

UnauthenticatedDesktopResourcesManager.getDesktopResources("saproxy.cisco.com", "https://saproxy.cisco.com:8445/desktop/api/urls?type=desktop")

UnauthenticatedResourcesManager.getThirdPartyGadgetResources("saproxy.cisco.com", "https://saproxy.cisco.com:8445/desktop/api/urls?type=3rdParty")

end

}

include conf.d/*.conf;

sendfile        on;

tcp_nopush     on;

server_names_hash_bucket_size 512;

リバースプロキシポートの設定

デフォルトでは、Nginx設定はポート8445でFinesse要求をリッスンします。8445など、リバースプロキシからFinesse要求をサポートするために一度に有効にできるポートは1つだけです。ポート443をサポートする必要がある場合は、<nginx-install-directory>conf/conf.d/finesse.confファイルを編集して443でのリスニングを有効にし、8445でのリスニングを無効にします。

リバースプロキシとアップストリームコンポーネント間の相互TLS認証の設定

リバースプロキシホストからの接続に対するクライアントSSL証明書認証は、CCBUアップストリームコンポーネントのCUIC/Finesse/IdS/Livedataで、新しいCVOS CLIオプション

utils system reverse-proxy client-auth enable/disable/status。

デフォルトでは、これは無効になっており、管理者が各アップストリームサーバでCLIを個別に実行して明示的に有効にする必要があります。このオプションを有効にすると、アップストリームホストで実行されているCisco Webプロキシサービスは、CLI utils system reverse-proxy allowed-hosts add <proxy-host>の一部として追加された信頼されたリバースプロキシホストからの接続のTLSハンドシェイクでクライアント証明書の認証を開始します。

次に示すのは、プロキシ設定ファイルのssl.confとssl2.confの同じ設定ブロックです

#Must-change /usr/local/openresty/nginx/ssl/nginx.crt change this location accordingly proxy_ssl_certificate /usr/local/openresty/nginx/ssl/nginx.crt; #Must-change /usr/local/openresty/nginx/ssl/nginx.key change this location accordingly proxy_ssl_certificate_key /usr/local/openresty/nginx/ssl/nginx.key;

発信トラフィック（アップストリームへのプロキシ）に使用されるSSL証明書は、着信トラフィックに設定されるssl証明書（コンポーネントサーバブロック用のSSLコネクタ）と同じにすることができます。 自己署名証明書がproxy_ssl_certificateとして使用されている場合は、アップストリームコンポーネント(Finesse/IdS/CUIC/Livedata)tomcat信頼ストアにアップロードする必要があります。

リバースプロキシによるアップストリームサーバ証明書の検証はオプションであり、デフォルトでは無効になっています。リバースプロキシとアップストリームホストの間で完全なTLS相互認証を実現するには、ssl.confおよびssl2.confファイルから次の設定をアンコメントする必要があります。

#Enforce upstream server certificate validation at proxy -> #this is not mandated as per CIS buit definitely adds to security. #It requires the administrator to upload all upstream server certificates to the proxy certificate store #Must-Change Uncomment below lines IF need to enforce upstream server certificate validation at proxy #proxy_ssl_verify on; #proxy_ssl_trusted_certificate /usr/local/openresty/nginx/ssl/finesse25.crt; proxy_ssl_trusted_certificate: This file should contain the all upstream certificate enteries concatenated together

相互TLS認証を設定するための注意事項：

- この機能がCCBUコンポーネントで有効になると、TLSハンドシェイク時にもLANクライアントからクライアント証明書が要求されます。クライアントマシンのブラウザにクライアント/個人証明書がインストールされている場合は、クライアント認証に適した証明書を選択するように求めるポップアップをエンドユーザに表示できます。LANクライアントに対してクライアント証明書認証が強制されないため、エンドユーザがポップアップ要求で[cancel]を選択または押しても問題ありませんが、エクスペリエンスの変化が発生します。CDET CSCwa26057 を参照してください。

- Webproxyサービスによって解決できない許可リストにプロキシホストが追加されると、アップストリームコンポーネントのWebプロキシサービスが起動しません。許可リストに追加された逆プロキシホストが、DNSルックアップを介してアップストリームコンポーネントから解決できることを確認します。

キャッシュのクリア

リバースプロキシキャッシュは、

/clearCache.sh

コマンドが表示されない場合もあります。

標準ガイドライン

このセクションでは、Nginxをプロキシサーバとして設定する際に従う必要がある標準ガイドラインについて簡単に説明します。

これらのガイドラインは、インターネットセキュリティのセンターに基づいています。各ガイドラインの詳細については、同じドキュメントを参照してください。

1. 常に、最新の安定したOpenRestyおよびOpenSSLバージョンを使用することを推奨します。

2. 別のディスクマウントにNginxをインストールすることを推奨します。

3. NginxプロセスIDは、rootユーザー（または選択したOSに該当する場合）が所有する必要があり、644 (rw—)以上の権限を持っている必要があります。

4. Nginxは不明なホストの要求をブロックする必要があります。各サーバブロックに、明示的に定義されたserver_nameディレクティブが含まれていることを確認します。確認するには、nginx.confおよびnginx/conf.dディレクトリ内のすべてのサーバブロックを検索し、すべてのサーバブロックにserver_nameが含まれていることを確認します。

5. Nginxは許可ポートでのみリッスンする必要があります。nginx.confおよびnginx/conf.dディレクトリ内のすべてのサーバブロックを検索し、listen toディレクティブをチェックして、許可されたポートだけがリスニング用に開いていることを確認します。

6. Cisco FinesseはHTTPをサポートしていないため、プロキシサーバのHTTPポートもブロックすることをお勧めします。

7. Nginx SSLプロトコルはTLS 1.2である必要があります。レガシーSSLプロトコルのサポートは削除する必要があります。また、脆弱なSSL暗号も無効にする必要があります。

8. Nginxエラーとアクセスログをリモートsyslogサーバに送信することをお勧めします。

9. Webアプリケーションファイアウォールとして機能するmod_securityモジュールをインストールすることをお勧めします。詳細はModSecurityマニュアルを参照してください。Nginxのロードは、mod_securityモジュール内で確認されていないことに注意してください。

マッピングファイルの設定

Finesseデスクトップの逆プロキシ展開では、外部から見えるホスト名/ポートの組み合わせのリストと、Finesse、IdS、およびCUICサーバで使用される実際のサーバ名およびポートへのマッピングを設定するマッピングファイルが必要です。内部サーバに設定されるこのマッピングファイルは、インターネット経由で接続されたクライアントが、インターネット上で使用される必要なホストとポートにリダイレクトできるようにするキー設定です。

マッピングファイルは、コンポーネントサーバにアクセス可能なWebサーバに配置する必要があり、配置を機能させるには、そのURIを設定する必要があります。ネットワーク内で使用可能な専用Webサーバを使用してマッピングファイルを設定することを推奨します。このようなサーバが使用できない場合は、逆プロキシを使用できます。逆プロキシを使用すると、ネットワーク内からアクセス可能なプロキシが必要になり、DMZに不正アクセスできる外部クライアントに情報が公開される危険性があります。次のセクションでは、これを実現する方法について詳しく説明します。

すべてのコンポーネントサーバでマッピングファイルURIを設定する正確な手順と、マッピングファイルデータを作成する方法の詳細については、機能ガイドを参照してください。

マッピングファイルサーバとしてリバースプロキシを使用

これらの手順は、逆プロキシがプロキシマッピングファイルホストとしても使用される場合にのみ必要です。

1. Finesse/CUICホストとIdSホストで使用されるドメインコントローラの逆プロキシホスト名を、そのIPアドレスが解決されるように設定します。

2. 生成されたNginx署名付き証明書をcmplatformのtomcat-trust下の両方のノードにアップロードし、サーバを再起動します。

3. <NGINX_HOME>/html/proxymap.txtの変更が必要な値を更新します。

4. Nginx設定を nginx -s reload コマンドが表示されない場合もあります。

5. 別のネットワークホストからコンフィギュレーションファイルにアクセスできるかどうかを確認するには、 curl コマンドが表示されない場合もあります。

CentOS 8カーネルの強化

選択したオペレーティングシステムがCentOS 8の場合は、プロキシをホストする専用サーバを使用するインストールに対して、次のsysctl設定を使用してカーネルの強化/調整を行うことを推奨します。

## Configurations for kernel hardening - CentOS8. The file path is /etc/sysctl.conf

## Note that the commented configurations denote that CentOS 8's default value matches

## the recommended/tested value, and are not security related configurations.

# Avoid a smurf attack

net.ipv4.icmp_echo_ignore_broadcasts = 1

# Turn on protection for bad icmp error messages

net.ipv4.icmp_ignore_bogus_error_responses = 1

# Turn on syncookies for SYN flood attack protection

net.ipv4.tcp_syncookies = 1

# Turn on and log spoofed, source routed, and redirect packets

net.ipv4.conf.all.log_martians = 1

net.ipv4.conf.default.log_martians = 1

# Turn off routing

net.ipv4.ip_forward = 0

net.ipv4.conf.all.forwarding = 0

net.ipv6.conf.all.forwarding = 0

net.ipv4.conf.all.mc_forwarding = 0

net.ipv6.conf.all.mc_forwarding = 0

# Block routed packets

net.ipv4.conf.all.accept_source_route = 0

net.ipv4.conf.default.accept_source_route = 0

net.ipv6.conf.all.accept_source_route = 0

net.ipv6.conf.default.accept_source_route = 0

# Block ICMP redirects

net.ipv4.conf.all.accept_redirects = 0

net.ipv4.conf.default.accept_redirects = 0

net.ipv6.conf.all.accept_redirects = 0

net.ipv6.conf.default.accept_redirects = 0

net.ipv4.conf.all.secure_redirects = 0

net.ipv4.conf.default.secure_redirects = 0

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.send_redirects = 0

# Filter routing packets with inward-outward path mismatch(reverse path filtering)

net.ipv4.conf.all.rp_filter = 1

net.ipv4.conf.default.rp_filter = 1

# Router solicitations & advertisements related.

net.ipv6.conf.default.router_solicitations = 0

net.ipv6.conf.default.accept_ra_rtr_pref = 0

net.ipv6.conf.default.accept_ra_pinfo = 0

net.ipv6.conf.default.accept_ra_defrtr = 0

net.ipv6.conf.default.autoconf = 0

net.ipv6.conf.default.dad_transmits = 0

net.ipv6.conf.default.max_addresses = 1

net.ipv6.conf.all.accept_ra = 0

net.ipv6.conf.default.accept_ra = 0

# Backlog - increased from default 1000 to 5000.

net.core.netdev_max_backlog = 5000

# Setting syn/syn-ack retries to zero, so that they don't stay in the queue.

net.ipv4.tcp_syn_retries = 0

net.ipv4.tcp_synack_retries = 0

# Max tcp listen backlog. Setting it to 511 to match nginx config

net.core.somaxconn = 511

# Reduce the duration of connections held in TIME_WAIT(seconds)

net.ipv4.tcp_fin_timeout = 6

# Maximum resources allotted

# fs.file-max = 2019273

# kernel.pid_max = 4194304

# net.ipv4.ip_local_port_range = 32768 60999

# TCP window size tuning

# net.ipv4.tcp_window_scaling = 1

# net.core.rmem_default = 212992

# net.core.rmem_max = 212992

# net.ipv4.tcp_rmem = 4096 87380 6291456

# net.ipv4.udp_rmem_min = 4096

# net.core.wmem_default = 212992

# net.core.wmem_max = 212992

# net.ipv4.tcp_wmem = 4096 16384 4194304

# net.ipv4.udp_wmem_min = 4096

# vm.lowmem_reserve_ratio = 256 256 32 0 0

# net.ipv4.tcp_mem = 236373 315167 472746

# Randomize virtual address space

kernel.randomize_va_space = 2

# Congestion control

# net.core.default_qdisc = fq_codel

# net.ipv4.tcp_congestion_control = cubic

# Disable SysReq

kernel.sysrq = 0

# Controls the maximum size of a message, in bytes

kernel.msgmnb = 65536

# Controls the default maximum size of a message queue

kernel.msgmax = 65536

# Controls the eagerness of the kernel to swap.

vm.swappiness = 1

推奨される変更を行った後は、リブートすることをお勧めします。

IPテーブルの強化

IPtablesは、システム管理者がLinuxカーネルファイアウォールによって提供されるIPv4およびIPv6のテーブル、チェーン、およびルールを設定できるようにするアプリケーションです。

これらのIPtableルールは、Linuxカーネルファイアウォールでのアクセスを制限することにより、総当たり攻撃からプロキシアプリケーションを保護するように設定されています。

設定のコメントは、ルールを使用してレート制限されているサービスを示します。

注：管理者が別のポートを使用するか、同じポートを使用して複数のサーバへのアクセスを拡張する場合は、これらのポートの番号に応じて適切なサイジングを行う必要があります。

## Configuration for iptables service

## The file path is /etc/sysconfig/iptables

## Make a note for must-change values to be replaced.

## Restart of the iptable service is required after applying following rules

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

# Ensure loopback traffic is configured

-A INPUT -i lo -j ACCEPT

-A OUTPUT -o lo -j ACCEPT

-A INPUT -s 127.0.0.0/8 -j DROP

# Ensure ping openeded only for the particular source and blocked for rest

# Must-Change: Replace the x.x.x.x with valid ip address

-A INPUT -p ICMP --icmp-type 8 -s x.x.x.x -j ACCEPT

# Ensure outbound and established connections are configured

-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

-A OUTPUT -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# Block ssh for external interface

# Must-Change: Replace the ens224 with valid ethernet interface

-A INPUT -p tcp -i ens224 --dport 22 -j DROP

# Open inbound ssh(tcp port 22) connections

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

# Configuration for finesse 8445 port

-A INPUT -p tcp -m tcp --dport 8445 --tcp-flags SYN SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 --connlimit-saddr -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " Connections to 8445 exceeded connlimit "

-A INPUT -p tcp -m tcp --dport 8445 --tcp-flags SYN SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 --connlimit-saddr -j DROP

-A INPUT -p tcp -m tcp --dport 8445 --tcp-flags SYN SYN -m hashlimit --hashlimit-upto 6/sec --hashlimit-burst 8 --hashlimit-mode srcip,dstport --hashlimit-name TCP_8445_DOS -j ACCEPT

-A INPUT -p tcp -m tcp --dport 8445 --tcp-flags SYN SYN -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " Exceeded 8445 hashlimit "

-A INPUT -p tcp -m tcp --dport 8445 --tcp-flags SYN SYN -j DROP

# Configuration for IdS 8553 port

-A INPUT -p tcp -m tcp --dport 8553 --tcp-flags SYN SYN -m connlimit --connlimit-above 6 --connlimit-mask 32 --connlimit-saddr -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " IdS connection limit exceeded"

-A INPUT -p tcp -m tcp --dport 8553 --tcp-flags SYN SYN -m connlimit --connlimit-above 6 --connlimit-mask 32 --connlimit-saddr -j DROP

-A INPUT -p tcp -m tcp --dport 8553 --tcp-flags SYN SYN -m hashlimit --hashlimit-upto 2/sec --hashlimit-burst 4 --hashlimit-mode srcip,dstport --hashlimit-name TCP_8553_DOS -j ACCEPT

-A INPUT -p tcp -m tcp --dport 8553 --tcp-flags SYN SYN -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " Exceeded 8553 hashlimit "

-A INPUT -p tcp -m tcp --dport 8553 --tcp-flags SYN SYN -j DROP

# Configuration for IdP 443 port

-A INPUT -p tcp -m tcp --dport 443 --tcp-flags SYN SYN -m connlimit --connlimit-above 8 --connlimit-mask 32 --connlimit-saddr -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " IdP connection limit exceeded"

-A INPUT -p tcp -m tcp --dport 443 --tcp-flags SYN SYN -m connlimit --connlimit-above 8 --connlimit-mask 32 --connlimit-saddr -j DROP

-A INPUT -p tcp -m tcp --dport 443 --tcp-flags SYN SYN -m hashlimit --hashlimit-upto 4/sec --hashlimit-burst 6 --hashlimit-mode srcip,dstport --hashlimit-name TCP_443_DOS -j ACCEPT

-A INPUT -p tcp -m tcp --dport 443 --tcp-flags SYN SYN -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " Exceeded 443 hashlimit "

-A INPUT -p tcp -m tcp --dport 443 --tcp-flags SYN SYN -j DROP

# Must-Change: A2A file transfer has not been considered for below IMNP configuration.

# For A2A for support, these configuration must be recalculated to cater different file transfer scenarios.

# Configuration for IMNP 5280 port

-A INPUT -p tcp -m tcp --dport 5280 --tcp-flags SYN SYN -m connlimit --connlimit-above 30 --connlimit-mask 32 --connlimit-saddr -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " IMNP connection limit exceeded"

-A INPUT -p tcp -m tcp --dport 5280 --tcp-flags SYN SYN -m connlimit --connlimit-above 30 --connlimit-mask 32 --connlimit-saddr -j DROP

-A INPUT -p tcp -m tcp --dport 5280 --tcp-flags SYN SYN -m hashlimit --hashlimit-upto 20/sec --hashlimit-burst 25 --hashlimit-mode srcip,dstport --hashlimit-name TCP_5280_DOS -j ACCEPT

-A INPUT -p tcp -m tcp --dport 5280 --tcp-flags SYN SYN -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " Exceeded 5280 hashlimit "

-A INPUT -p tcp -m tcp --dport 5280 --tcp-flags SYN SYN -j DROP

# Configuration for IMNP 15280 port

-A INPUT -p tcp -m tcp --dport 15280 --tcp-flags SYN SYN -m connlimit --connlimit-above 30 --connlimit-mask 32 --connlimit-saddr -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " IMNP connection limit exceeded"

-A INPUT -p tcp -m tcp --dport 15280 --tcp-flags SYN SYN -m connlimit --connlimit-above 30 --connlimit-mask 32 --connlimit-saddr -j DROP

-A INPUT -p tcp -m tcp --dport 15280 --tcp-flags SYN SYN -m hashlimit --hashlimit-upto 20/sec --hashlimit-burst 25 --hashlimit-mode srcip,dstport --hashlimit-name TCP_15280_DOS -j ACCEPT

-A INPUT -p tcp -m tcp --dport 15280 --tcp-flags SYN SYN -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " Exceeded 15280 hashlimit "

-A INPUT -p tcp -m tcp --dport 15280 --tcp-flags SYN SYN -j DROP

# Configuration for IMNP 25280 port

-A INPUT -p tcp -m tcp --dport 25280 --tcp-flags SYN SYN -m connlimit --connlimit-above 30 --connlimit-mask 32 --connlimit-saddr -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " IMNP connection limit exceeded"

-A INPUT -p tcp -m tcp --dport 25280 --tcp-flags SYN SYN -m connlimit --connlimit-above 30 --connlimit-mask 32 --connlimit-saddr -j DROP

-A INPUT -p tcp -m tcp --dport 25280 --tcp-flags SYN SYN -m hashlimit --hashlimit-upto 20/sec --hashlimit-burst 25 --hashlimit-mode srcip,dstport --hashlimit-name TCP_25280_DOS -j ACCEPT

-A INPUT -p tcp -m tcp --dport 25280 --tcp-flags SYN SYN -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " Exceeded 25280 hashlimit "

-A INPUT -p tcp -m tcp --dport 25280 --tcp-flags SYN SYN -j DROP

# Configuration for CUIC 8444 port

-A INPUT -p tcp -m tcp --dport 8444 --tcp-flags SYN SYN -m connlimit --connlimit-above 6 --connlimit-mask 32 --connlimit-saddr -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " CUIC connection limit exceeded"

-A INPUT -p tcp -m tcp --dport 8444 --tcp-flags SYN SYN -m connlimit --connlimit-above 6 --connlimit-mask 32 --connlimit-saddr -j DROP

-A INPUT -p tcp -m tcp --dport 8444 --tcp-flags SYN SYN -m hashlimit --hashlimit-upto 2/sec --hashlimit-burst 4 --hashlimit-mode srcip,dstport --hashlimit-name TCP_8444_DOS -j ACCEPT

-A INPUT -p tcp -m tcp --dport 8444 --tcp-flags SYN SYN -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " Exceeded 8444 hashlimit "

-A INPUT -p tcp -m tcp --dport 8444 --tcp-flags SYN SYN -j DROP

# Configuration for CUIC 8447 port

-A INPUT -p tcp -m tcp --dport 8447 --tcp-flags SYN SYN -m connlimit --connlimit-above 6 --connlimit-mask 32 --connlimit-saddr -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " CUIC connection limit exceeded"

-A INPUT -p tcp -m tcp --dport 8447 --tcp-flags SYN SYN -m connlimit --connlimit-above 6 --connlimit-mask 32 --connlimit-saddr -j DROP

-A INPUT -p tcp -m tcp --dport 8447 --tcp-flags SYN SYN -m hashlimit --hashlimit-upto 2/sec --hashlimit-burst 4 --hashlimit-mode srcip,dstport --hashlimit-name  TCP_8447_DOS -j ACCEPT

-A INPUT -p tcp -m tcp --dport 8447 --tcp-flags SYN SYN -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " Exceeded 8447 hashlimit "

-A INPUT -p tcp -m tcp --dport 8447 --tcp-flags SYN SYN -j DROP

# Configuration for LiveData 12005  port

-A INPUT -p tcp -m tcp --dport 12005 --tcp-flags SYN SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 --connlimit-saddr -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " LD connection limit exceeded"

-A INPUT -p tcp -m tcp --dport 12005 --tcp-flags SYN SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 --connlimit-saddr -j DROP

-A INPUT -p tcp -m tcp --dport 12005 --tcp-flags SYN SYN -m hashlimit --hashlimit-upto 6/sec --hashlimit-burst 8 --hashlimit-mode srcip,dstport --hashlimit-name TCP_12005_DOS -j ACCEPT

-A INPUT -p tcp -m tcp --dport 12005 --tcp-flags SYN SYN -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " Exceeded 12005 hashlimit "

-A INPUT -p tcp -m tcp --dport 12005 --tcp-flags SYN SYN -j DROP

# Configuration for LiveData 12008  port

-A INPUT -p tcp -m tcp --dport 12008 --tcp-flags SYN SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 --connlimit-saddr -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " LD connection limit exceeded"

-A INPUT -p tcp -m tcp --dport 12008 --tcp-flags SYN SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 --connlimit-saddr -j DROP

-A INPUT -p tcp -m tcp --dport 12008 --tcp-flags SYN SYN -m hashlimit --hashlimit-upto 6/sec --hashlimit-burst 8 --hashlimit-mode srcip,dstport --hashlimit-name  TCP_12008_DOS -j ACCEPT

-A INPUT -p tcp -m tcp --dport 12008 --tcp-flags SYN SYN -m limit --limit 1/min --limit-burst 1 -j LOG --log-prefix " Exceeded 12008 hashlimit "

-A INPUT -p tcp -m tcp --dport 12008 --tcp-flags SYN SYN -j DROP

# Block all other ports

-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT

これらのルールは、手動で/etc/sysconfig/iptablesを編集するか、またはiptables.confなどのファイルに設定を保存し、cat iptables.conf >>/etc/sysconfig/iptablesを実行して適用することで直接適用できます。

ルールを適用した後、IPtablesサービスを再起動する必要があります。 systemctl restart iptables IPtablesサービスを再起動します。

クライアント接続の制限

以前のIPtable設定に加えて、プロキシを使用するクライアントのアドレス範囲を知っているインストールでは、この知識を使用してプロキシアクセスルールを保護することを推奨します。これは、オンラインセキュリティに関するルールがより緩い国々のIPアドレス範囲で頻繁に作成される悪意のあるネットワークのボットネットからプロキシを保護することに関して大きな見返りを提供できます。したがって、アクセスパターンが確実であれば、IPアドレス範囲を国/州またはISPベースのIP範囲に制限することを強く推奨します。

クライアント接続のブロック

また、IPアドレスまたはIPアドレスの範囲から攻撃が行われることが特定された場合に、特定の範囲のアドレスをブロックする方法を知ることも役立ちます。このような場合、これらのIPアドレスからの要求はiptableルールでブロックできます。

個別のIPアドレスのブロック

複数の異なるIPアドレスをブロックするには、各IPアドレスのIPTables設定ファイルに行を追加します。

たとえば、アドレス192.0.2.3と192.0.2.4をブロックするには、次のように入力します。

iptables -A INPUT -s 192.0.2.3 -j DROP iptables -A INPUT -s 192.0.2.4 - j DROP.

IPアドレスの範囲のブロック

範囲内の複数のIPアドレスをブロックし、IP範囲を持つIPTables設定ファイルに1行を追加します。

たとえば、192.0.2.3から192.0.2.35のアドレスをブロックするには、次のように入力します。

iptables -A INPUT -m iprange --src-range 192.0.2.3-192.0.2.35 -j DROP.

サブネット内のすべてのIPアドレスのブロック

IPアドレス範囲のクラスレスドメイン間ルーティング表記を使用して、IPTables設定ファイルに1行を追加することで、サブネット全体のすべてのIPアドレスをブロックします。たとえば、すべてのクラスCアドレスをブロックするには、次のように入力します。

iptables -A INPUT -s 192.0.0.0/16 -j DROP.

SELinux

SELinuxは、Linux OSの機能拡張として統合されたプラットフォームセキュリティフレームワークです。SELinuxポリシーをインストールして追加し、リバースプロキシとしてOpenRestyを実行する手順を次に示します。

1. プロセスを停止するには、 openresty -s stop コマンドが表示されない場合もあります。

2. 次のコマンドを使用して、nginxサーバを設定および起動します。 systemctl コマンドを発行して、起動時にOpenRestyプロセスが自動的に開始されるようにします。rootユーザとして次のコマンドを入力します。

1. /usr/lib/systemd/system にアクセスする。

2. openresty.serviceという名前のファイルを開きます。

3. PIDFileの場所に従ってファイルの内容を更新します。
[Unit]

Description=The OpenResty Application Platform

After=syslog.target network-online.target remote-fs.target nss-lookup.target

Wants=network-online.target

[Service]

Type=forking

PIDFile=/usr/local/openresty/nginx/logs/nginx.pid

ExecStartPre=/usr/local/openresty/nginx/sbin/nginx -t

ExecStart=/usr/local/openresty/nginx/sbin/nginx

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/bin/kill -s QUIT $MAINPID

PrivateTmp=true

[Install]

WantedBy=multi-user.target

4. rootユーザとして、 sudo systemctl enable openresty.

5. OpenRestyサービスの開始/停止 systemctl start openresty / systemctl stop openresty コマンドを発行し、プロセスがrootユーザとして開始/停止することを確認します。

1. Selinuxのインストール

- デフォルトでは、一部のSELinuxパッケージのみがCentOsにインストールされます。

- SELinuxポリシーを生成するには、policcoreutils-develパッケージとその依存関係をインストールする必要があります。

- policcoreutils-develをインストールするには、次のコマンドを入力します

yum install policycoreutils-devel

- パッケージをインストールした後、 sepolicy コマンドが機能します。
usage: sepolicy [-h] [-P POLICY]

{booleans,communicate,generate,gui,interface,manpage,network,transition}

...

SELinux Policy Inspection Tool

2. SElinuxユーザによる新しいLinuxユーザとマップの作成

1. semanage login -l を参照してください。

[root@loadproxy-cisco-com ~]# semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *               *

root                 unconfined_u         s0-s0:c0.c1023       *

2. rootとして、SELinux user_uユーザーにマップされた新しいLinuxユーザー（nginxユーザー）を作成します。

useradd -Z user_u nginxuser

[root@loadproxy-cisco-com ~]# passwd nginxuser

Changing password for user nginxuser.

New password:

Retype new password:

passwd: all authentication tokens updated successfully.

3. nginxuserとuser_uの間のマッピングを表示するには、次のコマンドをrootとして入力します。

[root@loadproxy-cisco-com ~]# semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *

nginxuser            user_u               s0                   *

root                 unconfined_u         s0-s0:c0.c1023       *

4. SELinux __default__loginは、SELinux unrestricted_uユーザにデフォルトでマップされます。次のコマンドを使用してuser_uをデフォルトで制限する必要があります。

semanage login -m -s user_u -r s0 __default__

コマンドが正しく動作しているかどうかを確認するには、次のように入力します semanage login -l.次の出力が表示されます。

5. nginx.confを変更し、nginxuserの所有権を変更します。

1. chown -R nginxuser:nginxuser * <Openresty-install-directory>ディレクトリ内にあります。

2. nginx.confファイルを変更して、nginxuserをワーカープロセスの実行ユーザーとして含めます。

........

user nginxuser nginxuser;

..........

NginxのSELinuxポリシーの作成

1. Nginxの新しいデフォルトカスタムポリシーを生成する代わりに、 sepolicy generate --init /usr/bin/nginx 既存のポリシーから開始することが推奨されます。

2. 指定されたURLからダウンロードしたnginx.fcファイル（File Contextsファイル）およびnginx.teファイル(Type Enforcementファイル)は、逆プロキシの使用に合わせて変更されました。

3. この修正バージョンは、特定のユースケースに対して修正されているため、参照として使用できます。

4. ファイルのソフトウェアダウンロードページからselinux-nginx-rhel-master-modified.tarファイルをダウンロードします。

5. .tarファイルを展開し、その中のnginxディレクトリに移動します。

6. .fcファイルを開き、nginxインストーラ、キャッシュ、およびpidファイルの必要なファイルパスを確認します。

7. 次のコマンドを使用して設定をコンパイルします。 make コマンドが表示されない場合もあります。

8. nginx.ppファイルが生成されます。

9. ポリシーを semodule コマンドが表示されない場合もあります。
semodule -i nginx.pp

10. /rootに移動し、touch /.autorelabelという空のファイルを作成します。

11. システムをリブートします。

12. ポリシーが正常にロードされたことを確認するには、次のコマンドを入力します。
semodule --list-modules=full

13. Nginxは違反なく実行する必要があります。(違反は/var/log/messagesおよび/var/log/audit/audit.logで利用可能になります)。

14. Nginxのステータスを確認するには、次のコマンドを入力します。
ps -aefZ | grep nginx

15. これで、Finesseエージェント/スーパーバイザデスクトップにアクセスできるようになります。

確認

ここでは、設定が正常に機能しているかどうかを確認します。

Finesse

1. https://<reverseproxy:port>/finesse/api/SystemInfoを要求します。DMZからアクセスして、到達可能かどうかを確認します。

2. <primaryNode>と<secondaryNode>の両方の<host>の値が有効な逆プロキシホスト名であることを確認してください。Finesseホスト名であってはなりません。

CUICおよびライブデータ

1. Finesseホスト名が逆プロキシホスト名ではなく応答に表示される場合は、『Finesse 12.6 UCCE Feature Guide』の「VPN-Less Access to Finesse Desktop」の項「Populate Network Translation Data」の説明に従って、プロキシマッピング設定と許可ホストががFinesseサーバに追加されていることを検証します。

2. LiveDataガジェットがFinesse Desktopで正しくロードされる場合、CUICおよびLiveDataプロキシの設定は適切です。

3. CUICとLiveDataの設定を検証するために、DMZからこれらのURLにHTTP要求を行い、到達可能かどうかを確認します。

- https://<reverseproxy:cuic_port>/cuic/rest/about

- https://<reverseproxy:ldweb_port>/livedata/security

- https://<reverseproxy:ldsocketio_port>/security

IdS

IdS設定を検証するには、次の手順を実行します。

1. LANからhttps://<ids_LAN_host:ids_port>:8553/idsadminのIdSAdminインターフェイスにログインします。これは、管理インターフェイスがリバースプロキシで公開されないためです。

2. Settings > IdS Trustの順に選択します。

3. プロキシクラスタパブリッシャノードが[SPメタデータのダウンロード]ページに表示されていることを確認し、[次へ]をクリックします。

4. [IDPメタデータのアップロード(Upload IDP metadata)]ページでIDPプロキシが正しく表示されていることを確認し、[次へ(Next)]をクリックします。

5. [Test SSO]ページからすべてのプロキシクラスタノードを介してテストSSOを開始し、すべてが正常であることを確認します。これには、リバースプロキシノードへのクライアントマシン接続が必要です。

パフォーマンス

nmonツールで作成された同等のパフォーマンスキャプチャのデータ分析は、Finesseリリース12.6(1) ES03ソフトウェアダウンロードページ(load_result.zip)から入手できます。 このデータは、SSOログインとCUIC LDレポートを使用した2000 UCCEの導入例で、デスクトップおよびスーパーバイザの動作のプロキシの状態を表します。これは、2000ユーザのデフォルトレイアウトで8時間にわたって設定されます。これは、同等のハードウェアでNginxを使用してインストールのコンピューティング、ディスク、およびネットワーク要件を導出するために使用できます。

ssl_stapling on;

ssl_stapling_verify on;

トラブルシュート

SELinux

1. Nginxがデフォルトで起動されていない場合、またはFinesseエージェントデスクトップにアクセスできない場合は、次のコマンドを使用してSELinuxをpermissiveモードに設定します。
setenforce 0

2. Nginxを systemctl restart nginx コマンドが表示されない場合もあります。

3. 違反は/var/log/messagesおよび/var/log/audit/audit.logで利用可能になります。

4. 次のコマンドを使用して、これらの違反に対処するためのルールを許可した.teファイルを再生成する必要があります。
cat /var/log/audit/audit.log | audit2allow -m nginx1 > nginx1.te. # this will create nginx1.te file

or

ausearch -c 'nginx' --raw | audit2allow -M  my-nginx  # this will create my-nginx.te file

5. selinux-nginx-rhel-master-modified/nginxディレクトリにある元のnginx.teファイルを、新しく生成された許可ルールで更新します。

6. 同じものをコンパイルするには、 make コマンドが表示されない場合もあります。

7. nginx.ppファイルが再生成されます。

8. semoduleコマンドでポリシーをロードします。
semodule -i nginx.pp

9. 次のコマンドでSELinuxを強制モードにします。
setenforce

10. システムをリブートします。

11. 必要な違反が修正されるまで、この手順を繰り返します。