目录

简介

先决条件

要求

使用的组件

背景信息

ES03中的更改

基于ES01的无VPN配置的升级说明

身份验证

非SSO身份验证

SSO身份验证

Websocket连接的身份验证

暴力攻击防御

日志记录

安装和配置Fail2ban

验证静态资源URL

缓存CORS报头

配置

在DMZ中安装OpenResty作为反向代理

OpenResty安装

配置Nginx

配置Nginx缓存

配置SSL证书

使用自定义Diffie-Hellman参数

确保OCSP绑定已启用 — 证书撤销检查

Nginx配置

配置反向代理端口

配置反向代理和上游组件之间的相互TLS身份验证

清除缓存

标准准则

配置映射文件

使用反向代理作为映射文件服务器

CentOS 8内核强化

IPtables强化

限制客户端连接

阻止客户端连接

阻止不同的IP地址

阻止IP地址范围

阻止子网中的所有IP地址

SELinux

验证

Finesse

CUIC和实时数据

IdS

性能

故障排除

简介

本文档介绍如何使用反向代理访问Cisco Finesse桌面，而不连接基于12.6 ES03版Cisco Finesse、Cisco Unified Intelligence Center(CUIC)和思科身份服务(IdS)的VPN。

注意：思科不支持Nginx安装和配置。有关此主题的疑问，可在思科社区论坛上讨论。

注意：有关VPN-Less的ES03部署，请参阅各个组件的自述文件，以规划升级并检查兼容性限制。

思科Finesse 12.6 ES03自述文件

CUIC / IdS 12.6 ES03自述文件

先决条件

要求

Cisco 建议您了解以下主题：

- 思科统一联系中心企业版(UCCE)

- 思科Finesse

- Linux管理

- 网络管理和Linux网络管理

使用的组件

本文档中的信息基于以下软件和硬件版本：

- Finesse - 12.6 ES03

- CUIC - 12.6 ES03

- IdS - 12.6 ES03

- 适用于联系中心(CC)的UCCE/托管协作解决方案(HCS)- 11.6或更高版本

- 套装联络中心企业版(PCCE)- 12.5或更高版本

注意：由于LD/CUIC共驻部署，PCCE/UCCE 2k部署需要在CCE的12.6版本上

本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始（默认）配置。如果您的网络处于活动状态，请确保您了解所有命令的潜在影响。

注意：本文档中提供的配置已针对2000用户UCCE部署示例，使用CentOS 8.0上部署的Nginx反向代理(OpenResty)进行配置、强化和负载测试。性能配置文件参考信息在本文档中提供。

背景信息

UCCE/PCCE和HCS for UCCE解决方案支持此部署模式。

支持反向代理的部署（从12.6 ES01开始提供），作为访问Cisco Finesse桌面而不连接VPN的选项。此功能使座席能够灵活地从任何位置通过互联网访问Finesse桌面。

要启用此功能，必须在隔离区(DMZ)中部署反向代理对。

在反向代理部署中，介质访问保持不变。要连接到介质，代理可以使用Cisco Jabber over Mobile and Remote Access解决方案(MRA)或UCCE的移动代理功能与公共交换电话网(PSTN)或移动终端。此图显示通过单个高可用性(HA)对反向代理节点访问两个Finesse群集和两个CUIC节点时网络部署的样式。

支持从Internet上的代理和从LAN连接的代理并行访问，如下图所示。

注意：请参阅功能指南，了解第三方代理选择标准替代Nginx以支持此部署。

- UCCE 12.6功能指南 — 提供VPN-Less功能的功能概述、设计和配置详细信息。

- 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设置。

- 为代理和组件服务器请求启用相互安全套接字层(SSL)信任验证。

- 增强的代理配置安全性，以防止拒绝服务(DoS)/分布式拒绝服务(DDoS)攻击 — 需要Lua支持

- 增强的Nginx请求速率限制，适用于系统的不同部分。

- IpTables的速率限制。

- 在请求上游组件服务器之前验证静态资源请求。

- 更轻且可缓存的未验证页面，不会命中上游组件服务器。

- 其他其他功能 — 需要Lua支持

- 从代理提供的自动感知跨源资源共享(CORS)响应，以帮助自动配置和提高性能

- 与无VPN相关的缺陷修复

- CSCwa26057 — 在finesse桌面登录期间为座席提供的多个证书

- CSCwa24471 - Finesse登录页不显示SSO代理FQDN名称

- CSCwa24519 :如果无法从组件解析反向代理主机名，则Web代理服务无法重新启动

- CSCwa23252 :当CA证书链的深度大于1时，代理Finesse信任会断开

- CSCwa46459 webservice中暴露的log4j零日漏洞

基于ES01的无VPN配置的升级说明

- ES03配置需要Nginx安装，并支持Lua。

- 证书要求

- 在Nginx ES02配置能够成功连接到上游服务器之前，Cisco Finesse、CUIC和IdS需要将Nginx/OpenResty主机证书添加到Tomcat信任存储并重新启动。

- 需要在Nginx服务器中配置Cisco Finesse、CUIC和IdS上游服务器证书，以使用基于ES03的配置。

注意：建议在安装ES03 Nginx配置之前删除现有的基于ES01的Nginx配置。

注意：ES03配置脚本还要求在Cisco Finesse、CUIC和IdS中安装相应的ES03 COP。

身份验证

Finesse 12.6 ES03在代理中引入身份验证。单点登录(SSO)和非SSO部署支持身份验证。

对代理接受的所有请求和协议执行身份验证，然后将其转发到上游组件服务器，组件服务器在本地执行身份验证。所有身份验证都使用通用Finesse登录凭证对请求进行身份验证。

通过验证在建立套接字连接之前从中成功进行应用验证的IP地址，在代理上验证持久连接，例如依赖可扩展消息传送和在线状态协议(XMPP)等应用协议进行身份验证和后期连接的Websockets。

非SSO身份验证

非SSO身份验证不需要任何额外配置，在进行所需脚本替换后，即可使用开箱即用的Nginx配置脚本。身份验证依赖于用于登录Finesse的用户名和密码。对所有终端的访问将通过Finesse身份验证服务进行验证。

有效用户列表在本地缓存（每15分钟更新一次缓存），用于验证请求中的用户。通过将请求转发到已配置的Finesse URI来验证用户凭证，然后在本地缓存凭证散列（缓存15分钟）以在本地验证新请求。如果用户名或密码有任何更改，则仅在15分钟后生效。

SSO身份验证

SSO身份验证要求管理员在配置文件中的Nginx服务器上配置IdS令牌加密密钥。IdS令牌加密密钥可以从IdS服务器获取， show ids secret CLI命令。这些密钥必须配置为管理员在SSO身份验证工作之前必须在脚本中执行的#Must更改替换项之一的一部分。

请参阅SSO用户指南，了解要为IdS工作的代理解析所执行的IdS SAML配置。

配置SSO身份验证后，可以使用有效的令牌对访问系统中的任何终端。代理配置通过拦截对IdS发出的令牌检索请求或解密有效令牌并随后在本地缓存这些令牌以进行进一步验证来验证凭证。

Websocket连接的身份验证

无法使用标准授权报头对Websocket连接进行身份验证，因为浏览器中的本地Websocket实施不支持自定义报头。应用级身份验证协议，负载中包含的身份验证信息不会阻止建立Websocket连接，因此恶意实体只需创建大量连接来淹没系统，就可以发起DOS或DDOS攻击。

为了降低这种可能性，所提供的nginx反向代理配置具有特定检查，以仅允许从那些在建立Websocket连接之前成功发出经过身份验证的REST请求的IP地址接受Websocket连接。这意味着，在发出REST请求之前尝试创建Websocket连接的客户端现在将收到授权失败错误，并且不是支持的使用方案。

暴力攻击防御

Finesse 12.6 ES02身份验证脚本主动防止可用于猜测用户密码的暴力攻击。它通过阻止用于访问服务的IP地址来实现此目的，在短时间内尝试了一定数量的失败。这些请求将被418客户端错误拒绝。可以从文件<nginx-install-directory>/logs/blocking.log和<nginx-install-directory>/logs/error.log访问被阻止的IP地址的详细信息。

失败的请求数、时间间隔和阻塞持续时间是可配置的。配置存在于<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;

}

日志记录

要查找被阻止的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或类似协议集成，以将该禁令添加到IPtable/防火墙规则。

安装和配置Fail2ban

Fail2ban扫描日志文件并禁止显示恶意迹象的IP — 密码失败太多、寻求漏洞等。通常，Fail2Ban随后用于更新防火墙规则以在指定时间内拒绝IP地址，不过也可以配置任何任意其他操作（如发送电子邮件）。有关详细信息，请访问 https://www.fail2ban.org/。

Fail2ban可配置为监控blocking.log，以识别在检测Nginx拦截的IP地址，并在可配置的持续时间内禁止这些地址。在CentOS恢复代理上安装和配置fail2ban的步骤如下：

1.使用yum安装Fail2ban

yum update && yum install epel-release

yum install fail2ban

2.建立当地监狱

监狱配置允许管理员配置各种属性，如禁止任何被阻止的IP地址访问的端口、IP地址被阻止的持续时间、用于从受监控的日志文件中识别被阻止的IP地址的过滤器配置等。添加自定义配置以禁止访问上游服务器的IP地址的步骤如下：

a)转到Fail2ban安装目录（在本示例中为/etc/fail2ban）

cd /etc/fail2ban

b)将jail.conf复制到jail.local中，以保持本地更改的隔离。

cp jail.conf jail.local

c)在文件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)创建过滤器。d/finesseban.conf

touch filter.d/finesseban.conf

b)将以下行添加到文件过滤器。d/finesseban.conf

[Definition]

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

failregex = <HOST> will be blocked for

4)开始失败2ban

运行以下命令以启动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-exple-headers和access-control-allow-credentials在代理上缓存五分钟。这些报头会缓存到每个相应的上游服务器。

配置

本文档介绍将Nginx配置为反向代理，以用于启用Finesse VPN无访问。提供了用于验证所提供说明的UCCE解决方案组件、代理和操作系统版本。相关说明必须根据您选择的操作系统/代理进行调整。

- 使用的Nginx版本 — OpenResty 1.19.9.1

- 用于配置的操作系统 — CentOS 8.0

注意：描述的Nginx配置可从Finesse版本12.6(1)ES3软件下载页下载。

在DMZ中安装OpenResty作为反向代理

本节详细介绍基于OpenResty的代理安装步骤。反向代理通常配置为网络隔离区(DMZ)中的专用设备，如前面提到的部署图所示。

1. 使用所需的硬件规范安装您选择的操作系统。内核和IPv4参数调整可能因所选操作系统而异，如果所选操作系统版本不同，建议用户重新验证这些方面。

2. 配置两个网络接口。需要一个接口才能从Internet客户端进行公共访问，另一个接口才能与内部网络中的服务器通信。

3. 安装OpenResty。

Nginx的任何味道都可用于此目的，只要它们基于Nginx 1.19+并支持Lua:

- Nginx Plus

- Nginx开放源码（Nginx开放源码需要与基于OpenResty的Lua模块一起编译才能使用）

- OpenResty

- GetPageSpeed额外内容

注意：提供的配置已使用OpenResty 1.19进行测试，预计只能使用次要更新（如果有）与其他分发一起使用。

OpenResty安装

1. 安装OpenResty。请参见OpenResty Linux软件包。
作为OpenResty安装的一部分，Nginx将安装在此位置，并通过添加到~/.bashrc文件将OpenResty路径添加到PATH变量中。

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必须使用专用的非特权服务帐户运行，该帐户必须被锁定，并且具有无效的外壳（或适用于所选操作系统）。

7. 在名为html和conf.d的解压文件夹下的文件中找到“必须更改”字符串，并将指定的值替换为适当的条目。

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集群增加1 GB的客户端和代理温度缓存。

2. 使用命令装载新的装载点 mount -av。

3. 验证文件系统已使用 df -h 命令。

4. 更改Finesse和CUIC缓存配置文件中的proxy_cache_path位置。
例如，要更改Finesse主目录的路径，请转到<nginx-install-directory>conf/conf.d/finesse/cache，并将现有缓存位置/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的文件夹。您需要借助这些命令生成两个证书(一个用于<reverseproxy_primary_fqdn>,另一个用于<reverseproxy_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. 在反向代理服务器上的/etc/hosts条目下添加Finesse、IdS和CUIC的IP地址和主机名。

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收到的证书不是包含所有相应证书的证书链，请将所有相关证书合并到单个证书链文件中。

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请求。一次，只能从反向代理启用一个端口以支持Finesse请求，例如8445。如果需要支持端口443，请编辑<nginx-install-directory>conf/conf.d/finesse.conf文件以启用443上的侦听，并禁用8445上的侦听。

配置反向代理和上游组件之间的相互TLS身份验证

通过新的CVOS CLI选项，可在CCBU上游组件CUIC/Finesse/IdS/Livedata上为来自反向代理主机的连接启用客户端SSL证书身份验证。

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

默认情况下，此功能被禁用，必须由管理员在每台上游服务器上独立执行CLI来明确启用。启用此选项后，在上游主机上运行的Cisco Web代理服务将在TLS握手中为来自作为CLI的一部分添加的受信任反向代理主机的连接开始对客户端证书进行身份验证。 utils system reverse-proxy allowed-hosts add <proxy-host>。

以下是代理配置文件(即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客户端实施，因此会成功，但体验会发生变化。请参阅CDET CSCwa26057 了解更多信息。

- 如果代理主机添加到Web代理服务无法解析的允许列表，则上游组件的Web代理服务将无法启动。确保添加到允许列表的反向代理主机可通过DNS查找从上游组件解析。

清除缓存

可以使用

/clearCache.sh

命令。

标准准则

本节简要介绍将Nginx设置为代理服务器时需要遵循的标准准则。

这些指南源自互联网安全中心。有关每个指南的更多详细信息，请参阅相同。

1. 始终建议使用最新的稳定OpenResty和OpenSSL版本。

2. 建议将Nginx安装在单独的磁盘安装中。

3. Nginx进程ID必须由根用户（或如果适用于所选操作系统）拥有，并且必须具有644(rw—)或更严格的权限。

4. Nginx必须阻止对未知主机的请求。确保每个服务器块都包含明确定义的server_name指令。要进行验证，请搜索nginx.conf和nginx/conf.d目录中的所有服务器块，并验证所有服务器块是否都包含server_name。

5. Nginx必须仅侦听授权端口。搜索nginx.conf和nginx/conf.d目录中的所有服务器块，并检查是否侦听指令，以便仅验证授权端口是否打开以进行侦听。

6. 由于Cisco Finesse不支持HTTP，因此建议同时阻止代理服务器HTTP端口。

7. Nginx SSL协议必须是TLS 1.2。必须删除对传统SSL协议的支持。它还必须禁用弱SSL密码。

8. 建议将Nginx错误和访问日志发送到远程系统日志服务器。

9. 建议安装用作Web应用防火墙的mod_security模块。有关详细信息，请参阅《ModSecurity手册》。请注意，尚未在mod_security模块内验证Nginx负载。

配置映射文件

Finesse桌面的反向代理部署需要映射文件来配置外部可见主机名/端口组合列表及其与实际服务器名称和端口的映射，这些服务器名称和端口由Finesse、IdS和CUIC服务器使用。内部服务器上配置的此映射文件是允许通过Internet连接的客户端重定向到Internet上使用的所需主机和端口的关键配置。

映射文件必须部署在组件服务器可访问的Web服务器上，并且需要配置其URI才能使部署工作。建议使用网络中可用的专用Web服务器配置映射文件。如果此类服务器不可用，则可以使用反向代理，这将要求从网络内部访问代理，并且还存在将信息暴露给外部客户端的风险，这些外部客户端可能未经授权访问DMZ。下一节详细介绍如何实现此目标。

有关在所有组件服务器上配置映射文件URI的确切步骤以及有关如何创建映射文件数据的更多详细信息，请参阅功能指南。

使用反向代理作为映射文件服务器

仅当反向代理也用作代理映射文件主机时，才需要执行这些步骤。

1. 在Finesse/CUIC和IdS主机使用的域控制器中配置反向代理主机名，以便解析其IP地址。

2. 在cmplatform的tomcat-trust下的两个节点上上传生成的Nginx签名证书，然后重新启动服务器。

3. 更新<NGINX_HOME>/html/proxymap.txt中的Must-change值。

4. 使用 nginx -s reload 命令。

5. 使用 curl 命令。

CentOS 8内核强化

如果所选操作系统是CentOS 8，则建议使用这些系统配置对使用专用服务器托管代理的安装进行内核强化/调整。

## 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

在您进行建议的更改后，建议重新启动。

IPtables强化

IPtables是允许系统管理员配置Linux内核防火墙提供的IPv4和IPv6表、链和规则的应用。

这些IPtables规则配置为通过限制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服务。

限制客户端连接

除了之前的IPtables配置外，建议使用代理的客户端的地址范围已知的安装使用此知识来保护代理访问规则。在保护代理免受恶意网络僵尸网络的侵害时，这会带来巨大回报，恶意网络的僵尸网络通常是在对在线安全规定更宽松的国家/地区的IP地址范围内创建的。因此，强烈建议将IP地址范围限制为国家/地区/状态或基于ISP的IP范围（如果您确定访问模式）。

阻止客户端连接

当确定攻击来自IP地址或IP地址范围时，了解如何阻止特定范围的地址也很有用。在这种情况下，可以使用iptable规则阻止来自这些IP地址的请求。

阻止不同的IP地址

要阻止多个不同的IP地址，请在IPTables配置文件中为每个IP地址添加一行。

例如，要阻止地址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配置文件添加一行。

例如，要阻止从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配置文件中添加一行，以阻止整个子网中的所有IP地址。例如，要阻止所有C类地址，请输入：

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

SELinux

SELinux是一个平台安全框架，集成为Linux操作系统的增强功能。下面提供了安装和添加SELinux策略以运行OpenResty作为反向代理的过程。

1. 使用 openresty -s stop 命令。

2. 使用配置和启动/停止nginx服务器 systemctl 命令，以便在启动期间自动启动OpenResty进程。以根用户身份输入这些命令。

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. 作为根用户，输入 sudo systemctl enable openresty。

5. 使用 systemctl start openresty / systemctl stop openresty 命令，并确保进程以根用户身份启动/停止。

1. 安装Selinux

- 默认情况下，CentOs中将只安装一些SELinux软件包。

- 要生成SELinux策略，需要安装policycoreutils-devel包及其依赖项。

- 输入此命令以安装policycoreutils-devel

yum install policycoreutils-devel

- 确保安装软件包后， sepolicy 命令可用。
usage: sepolicy [-h] [-P POLICY]

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

...

SELinux Policy Inspection Tool

2. 创建新的Linux用户并使用SElinux用户映射

1. 输入  semanage login -l 查看Linux用户与SELinux用户之间的映射。

[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. 作为根用户，创建映射到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 unconfired_u用户。默认情况下，需要使用以下命令限制user_u:

semanage login -m -s user_u -r s0 __default__

要检查命令是否工作正常，请输入 semanage login -l。它应产生以下输出：

5. 修改nginx.conf并对nginxuser执行更改所有权。

1. 输入 chown -R nginxuser:nginxuser *。

2. 修改nginx.conf文件，以将nginxuser作为运行工作进程的用户。

........

user nginxuser nginxuser;

..........

为Nginx编写SELinux策略

1. 而不是使用 sepolicy generate --init /usr/bin/nginx 命令，首选从现有策略开始。

2. 从提供的URL下载的nginx.fc文件（文件上下文文件）和nginx.te（类型实施文件）文件已修改，以适应反向代理使用。

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。并检查它们是否可到达。

2. 检查<primaryNode>和<secondaryNode>中的<host>值均是有效的反向代理主机名。它不应是Finesse主机名。

CUIC和实时数据

1. 如果响应中看到Finesse主机名而不是反向代理主机名，则验证代理映射配置和允许的主机已正确添加到Finesse服务器中，如Finesse 12.6 UCCE功能指南中“VPN-Less Access to Finesse Desktop”的“Populate Network Translation Data”部分所述。

2. 如果LiveData小工具在Finesse桌面中正确加载，则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. 选择设置> IdS信任。

3. 验证“下载SP元数据”页上是否列出代理群集发布服务器节点，然后单击“下一步”。

4. 验证IDP代理是否已正确显示（如果已在Upload IDP metadata页面上配置），然后单击Next。

5. 从“测试SSO”(Test SSO)页面通过所有代理群集节点启动测试SSO并验证所有都成功。这需要客户端计算机连接到反向代理节点。

性能

使用nmon工具进行的顶级等效性能捕获的数据分析可从Finesse版本12.6(1)ES03软件下载页(load_result.zip)获得。 数据表示在2000 UCCE部署示例中，使用SSO登录和CUIC LD报告（在默认布局中为2000个用户配置，时长8小时）的桌面和管理引擎操作的代理状态。它可用于使用Nginx在同类硬件上得出安装的计算、磁盘和网络要求。

ssl_stapling on;

ssl_stapling_verify on;

故障排除

SELinux

1. 如果默认情况下未启动Nginx或无法访问Finesse座席桌面，请使用以下命令将SELinux设置为允许模式：
setenforce 0

2. 尝试使用 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. 重复此步骤，直到修复所需违规。