본 제품에 대한 문서 세트는 편견 없는 언어를 사용하기 위해 노력합니다. 본 설명서 세트의 목적상, 편견 없는 언어는 나이, 장애, 성별, 인종 정체성, 민족 정체성, 성적 지향성, 사회 경제적 지위 및 교차성에 기초한 차별을 의미하지 않는 언어로 정의됩니다. 제품 소프트웨어의 사용자 인터페이스에서 하드코딩된 언어, RFP 설명서에 기초한 언어 또는 참조된 서드파티 제품에서 사용하는 언어로 인해 설명서에 예외가 있을 수 있습니다. 시스코에서 어떤 방식으로 포용적인 언어를 사용하고 있는지 자세히 알아보세요.
Cisco는 전 세계 사용자에게 다양한 언어로 지원 콘텐츠를 제공하기 위해 기계 번역 기술과 수작업 번역을 병행하여 이 문서를 번역했습니다. 아무리 품질이 높은 기계 번역이라도 전문 번역가의 번역 결과물만큼 정확하지는 않습니다. Cisco Systems, Inc.는 이 같은 번역에 대해 어떠한 책임도 지지 않으며 항상 원본 영문 문서(링크 제공됨)를 참조할 것을 권장합니다.
이 문서에서는 12.6 ES03 버전의 Cisco Finesse, Cisco CUIC(Unified Intelligence Center) 및 Cisco Id(Identity Service)를 기반으로 하는 VPN에 연결하지 않고 리버스 프록시를 사용하여 Cisco Finesse 데스크톱에 액세스하는 방법에 대해 설명합니다.
참고: Cisco는 Nginx 설치 및 컨피그레이션을 지원하지 않습니다. 이 주제와 관련된 문의는 Cisco 커뮤니티 포럼에서 논의할 수 있습니다.
참고: VPN-Less의 ES03 구축의 경우, 업그레이드를 계획하고 호환성 제한을 확인하려면 개별 구성 요소의 추가 정보를 참조하십시오. Cisco Finesse 12.6 ES03 추가 정보, CUIC / Id 12.6 ES03 추가 정보
다음 주제에 대한 지식을 보유하고 있으면 유용합니다.
이 문서의 정보는 다음 소프트웨어 및 하드웨어 버전을 기반으로 합니다.
이 문서의 정보는 특정 랩 환경의 디바이스를 토대로 작성되었습니다. 이 문서에 사용된 모든 디바이스는 초기화된(기본) 컨피그레이션으로 시작되었습니다. 현재 네트워크가 작동 중인 경우 모든 명령의 잠재적인 영향을 미리 숙지하시기 바랍니다.
참고: 이 문서에 제공된 컨피그레이션은 샘플 2000 사용자 UCCE 구축에 대해 CentOS 8.0에 구축된 Nginx 리버스 프록시(OpenResty)를 사용하여 구성, 강화 및 로드 테스트를 거쳤습니다. 성능 프로필 참조 정보는 이 문서에서 확인할 수 있습니다.
이 구축 모델은 UCCE 솔루션용 UCCE/PCCE 및 HCS에서 지원됩니다.
VPN에 연결하지 않고 Cisco Finesse 데스크톱에 액세스할 수 있는 옵션으로 리버스 프록시 구축(12.6 ES01에서 사용 가능)이 지원됩니다. 이 기능은 상담원이 어디에서나 인터넷을 통해 Finesse 데스크톱에 액세스할 수 있는 유연성을 제공합니다.
이 기능을 활성화하려면 DMZ(Demilitarized Zone)에 리버스 프록시 쌍을 구축해야 합니다.
역방향 프록시 배포에서는 미디어 액세스가 변경되지 않습니다. 에이전트에 Cisco Jabber over Mobile and Remote Access Solution(MRA) 또는 UCCE의 Mobile Agent 기능을 PSTN(Public Switched Telephone Network) 또는 모바일 엔드포인트와 함께 사용하여 미디어에 연결할 수 있습니다. 이 다이어그램은 단일 HA(High Availability) 쌍의 리버스 프록시 노드를 통해 2개의 Finesse 클러스터와 2개의 CUIC 노드에 액세스할 때 네트워크 구축의 모양을 보여줍니다.
이 이미지에 표시된 대로 인터넷에 있는 에이전트와 LAN에서 연결하는 에이전트의 동시 액세스가 지원됩니다.
참고: 이 구축을 지원하려면 Nginx 대신 서드파티 프록시 선택 기준에 대한 기능 가이드를 참조하십시오.
- UCCE 12.6 기능 가이드 - VPN 없는 기능에 대한 기능 개요, 설계 및 구성 세부 정보를 제공합니다.
- UCCE 12.6 보안 가이드 - 리버스 프록시 구축을 위한 보안 구성 지침을 제공합니다.
이 문서를 읽기 전에 기능 가이드 및 보안 가이드의 VPN-Less 섹션을 검토하는 것이 좋습니다.
참고: ES03 Nginx 컨피그레이션을 설치하기 전에 기존 ES01 기반 Nginx 컨피그레이션을 제거하는 것이 좋습니다.
참고: ES03 컨피그레이션 스크립트에는 Cisco Finesse, CUIC 및 Id에 해당 ES03 COP를 설치해야 합니다.
Finesse 12.6 ES03은 프록시에서 인증을 도입합니다. SSO(Single Sign On) 및 비 SSO 구축에 대해 인증이 지원됩니다.
인증은 업스트림 구성 요소 서버로 전달되기 전에 프록시에서 수락되는 모든 요청 및 프로토콜에 대해 시행되며, 여기서 구성 요소 서버에 의해 시행된 인증도 로컬로 수행됩니다. 모든 인증은 일반 Finesse 로그인 자격 증명을 사용하여 요청을 인증합니다.
XMPP(Extensible Messaging and Presence Protocol)와 같은 애플리케이션 프로토콜을 통해 인증 및 사후 연결을 수행하는 웹 소켓과 같은 영구 연결은 소켓 연결을 설정하기 전에 애플리케이션 인증이 성공한 IP 주소를 검증하여 프록시에서 인증됩니다.
비 SSO 인증은 추가 컨피그레이션이 필요하지 않으며, 필요한 스크립트 교체가 이루어지면 즉시 Nginx 컨피그레이션 스크립트로 작동합니다. 인증은 Finesse에 로그인하는 데 사용되는 사용자 이름 및 비밀번호에 따라 달라집니다. 모든 엔드포인트에 대한 액세스는 Finesse 인증 서비스로 검증됩니다.
유효한 사용자 목록은 프록시에서 로컬로 캐시됩니다(15분마다 캐시 업데이트). 이 목록은 요청에서 사용자를 검증하는 데 사용됩니다. 구성된 Finesse URI에 요청을 전달하여 사용자 자격 증명을 검증한 다음 자격 증명 해시를 로컬로 캐시하여(15분 동안 캐시됨) 새 요청을 로컬로 인증합니다. 사용자 이름 또는 비밀번호가 변경될 경우 15분 후에만 적용됩니다.
SSO 인증에서는 관리자가 구성 파일 내의 Nginx 서버에서 IdS 토큰 암호화 키를 구성해야 합니다. IdS 토큰 암호화 키는 IdS 서버에서 show ids secret CLI 명령을 사용하여 얻을 수 있습니다. 이 키는 SSO 인증이 작동하기 전에 관리자가 스크립트에서 수행해야 하는 #Must-change 교체 중 하나로 구성되어야 합니다.
프록시 확인이 Id에 대해 작동하도록 수행할 IdS SAML 컨피그레이션에 대해서는 SSO 사용 설명서를 참조하십시오.
SSO 인증이 구성되면 유효한 토큰 쌍을 사용하여 시스템의 엔드포인트에 액세스할 수 있습니다. 프록시 컨피그레이션은 Id에 대한 토큰 검색 요청을 가로채거나 유효한 토큰을 해독한 다음 추가 검증을 위해 로컬로 캐싱하여 자격 증명을 검증합니다.
브라우저의 기본 websocket 구현에서는 사용자 지정 헤더가 지원되지 않으므로 표준 권한 부여 헤더로 Websocket 연결을 인증할 수 없습니다. 페이로드에 포함된 인증 정보가 Websocket 연결 설정을 차단하지 않으므로 악성 엔터티가 시스템을 압도하기 위해 수많은 연결을 생성하는 것만으로 DOS 또는 DDOS 공격을 렌더링할 수 있는 애플리케이션 수준 인증 프로토콜입니다.
이러한 가능성을 완화하기 위해 제공된 nginx 리버스 프록시 컨피그레이션에는 웹소켓 연결을 설정하기 전에 성공적으로 인증된 REST 요청을 한 IP 주소에서만 웹소켓 연결을 허용하도록 특정 확인이 필요합니다. 즉, REST 요청이 발행되기 전에 websocket 연결을 생성하려고 시도하는 클라이언트에서 권한 부여 실패 오류가 발생하며 지원되는 사용 시나리오가 아닙니다.
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; }
차단된 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은 로그 파일을 스캔하고 너무 많은 비밀번호 오류, 익스플로잇 찾기 등 악의적인 징후를 보이는 IP를 차단합니다. 일반적으로 Fail2Ban은 지정된 시간 동안 IP 주소를 거부하도록 방화벽 규칙을 업데이트하는 데 사용되지만, 임의의 다른 작업(예: 이메일 전송)도 구성할 수 있습니다. 자세한 내용은 https://www.fail2ban.org/을 참조하십시오.
Fail2ban은 blocking.log를 모니터링하여 무차별 대입 공격 탐지 시 Nginx에 의해 차단된 IP 주소를 식별하고 구성 가능한 기간 동안 금지하도록 구성할 수 있습니다. CentOS Reverse Proxy에 대해 fail2ban을 설치하고 구성하는 단계는 다음과 같습니다.
1. yum을 사용하여 Fail2ban을 설치합니다.
yum update && yum install epel-release
yum install fail2ban
2. 지역 교도소를 만듭니다.
관리자는 Jail 컨피그레이션을 통해 차단된 IP 주소로 액세스하지 못하도록 금지할 포트, IP 주소가 차단된 상태로 유지되는 기간, 모니터링되는 로그 파일에서 차단된 IP 주소를 식별하는 데 사용되는 필터 컨피그레이션 등의 다양한 속성을 구성할 수 있습니다. 업스트림 서버에 액세스하지 못하도록 차단된 IP 주소를 금지하기 위한 사용자 지정 컨피그레이션을 추가하는 단계는 다음과 같습니다.
2.1. Fail2ban 설치 디렉터리로 이동합니다(이 예에서는 /etc/fail2ban).
cd /etc/fail2ban
2.2. jail.conf의 사본을 jail.local로 만들어 로컬 변경 사항을 격리시킵니다.
cp jail.conf jail.local
2.3. 이러한 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이 차단할 호스트를 식별하기 위해 로그에서 찾을 내용을 알려줍니다. 필터를 만드는 단계는 다음과 같습니다.
3.1. filter.d/finesseban.conf을 만듭니다.
touch filter.d/finesseban.conf
3.2. 이러한 행을 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 파일로 이동합니다.
인증되지 않은 방식으로 액세스할 수 있는 모든 유효한 엔드포인트는 ES03 스크립트에서 적극적으로 추적됩니다.
유효하지 않은 URI가 요청될 경우 이러한 요청을 업스트림 서버로 전송하지 않고 이러한 인증되지 않은 경로에 대한 요청은 적극적으로 거부됩니다.
첫 번째 옵션 요청이 성공하면 응답 헤더 access-control-allow-headers, access-control-allow-origin, access-control-allow-methods, access-control-expose-headers 및 access-control-allow-credentials가 프록시에서 5분 동안 캐시됩니다. 이러한 헤더는 각 업스트림 서버에 대해 캐시됩니다.
이 문서에서는 Finesse VPN-Less 액세스를 활성화하는 데 사용할 역방향 프록시로서 Nginx의 컨피그레이션에 대해 설명합니다. 제공된 지침을 확인하는 데 사용되는 UCCE 솔루션 구성 요소, 프록시 및 OS 버전이 제공됩니다. 관련 지침은 선택한 OS/프록시에 맞게 조정해야 합니다.
참고: 설명된 Nginx 컨피그레이션은 Finesse Release 12.6(1)ES3 소프트웨어 다운로드 페이지에서 다운로드할 수 있습니다.
프록시를 구성한 후 이 명령을 사용하여 솔루션에 액세스하는 데 사용되는 프록시/서비스의 계획된 호스트 이름 및 IP를 사용하여 VPN Less 액세스를 위한 솔루션 구성 요소(Finesse/CUIC/IdS)를 구성합니다.
utils system reverse-proxy allowed-hosts add utils system reverse-proxy config-uri <uri> add
이러한 명령에 대한 자세한 내용은 UCCE 12.6 기능 가이드를 참조한 후 이 문서를 사용해야 합니다.
이 섹션에서는 OpenResty 기반 프록시 설치 단계에 대해 자세히 설명합니다. 리버스 프록시는 앞서 설명한 구축 다이어그램에 나와 있는 것처럼 일반적으로 네트워크 DMZ(Demilitarized Zone)에서 전용 디바이스로 구성됩니다.
Nginx 1.19+를 기반으로 하고 Lua를 지원하는 모든 종류의 Nginx를 이 용도로 사용할 수 있습니다.
참고: 제공된 컨피그레이션은 OpenResty 1.19에서 테스트되었으며 사소한 업데이트만 있는 경우 다른 배포와 함께 작동할 것으로 예상됩니다.
export PATH=/usr/local/openresty/bin:$PATH
openresty
입력합니다.openresty -s stop
입력합니다.이 컨피그레이션은 OpenResty 기반 Nginx 설치에 대해 설명합니다. OpenResty의 기본 방향은 다음과 같습니다.
참고: 제공된 컨피그레이션은 샘플 2000 구축을 위한 것이며 대규모 구축을 위해 적절하게 확장해야 합니다.
기본적으로 프록시 캐시 경로는 파일 시스템에 저장됩니다. 여기에 나와 있는 것처럼 tmpfs에 캐시 위치를 만들어 메모리 내 드라이브로 변경하는 것이 좋습니다.
예를 들어, 이러한 디렉토리는 기본 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 캐시를 1GB씩 늘립니다.
mount -av
.df -h
확인합니다.예를 들어, 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;
참고: 이전 단계에서 생성한 모든 tmpfs 드라이브 크기 합계가 구축의 최종 메모리 크기에 추가되어야 합니다. 이러한 드라이브는 애플리케이션에서 디스크처럼 보이도록 구성된 메모리 블록이며 많은 메모리 공간을 소비하기 때문입니다.
자체 서명 인증서는 리버스 프록시를 프로덕션으로 롤아웃할 준비가 될 때까지만 사용해야 합니다. 프로덕션 구축에서는 CA(Certificate Authority) 서명 인증서만 사용합니다.
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>으로 전달)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>으로 전달)참고: 제공된 컨피그레이션은 샘플 2000 구축을 위한 것이며 대규모 구축을 위해 적절하게 확장해야 합니다.
CA 서명 인증서는 다음 단계를 통해 리버스 프록시에 설치할 수 있습니다.
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 패스프레이즈를 기록해 둡니다. 이 패스프레이즈는 구축 과정에서 개인 키의 암호를 해독하는 데 사용됩니다.
인증 기관에 CSR을 전송하고 서명된 인증서를 가져옵니다.
참고: CA에서 받은 인증서가 모든 해당 인증서를 포함하는 인증서 체인이 아닌 경우 모든 관련 인증서를 단일 인증서 체인 파일로 작성합니다.
명령을 사용하여 첫 번째 단계의 일부로 생성된 키를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;
chmod 400 /usr/local/openresty/nginx/ssl/ca_signed_cert.crt
인증서에chmod 400 /usr/local/openresty/nginx/ssl/nginx_decrypted.key
읽기 전용 권한이 있고 소유자로 제한되도록 Enter 키를 누릅니다.
다음 명령으로 사용자 지정 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;
참고: 이 기능을 활성화하려면 서버에서 CA 서명 인증서를 사용해야 하며, 서버는 인증서를 서명한 CA에 액세스할 수 있어야 합니다.
file/usr/local/openresty/nginx/conf/conf.d/ssl/ssl.conf폴더에 이 컨피그레이션을 추가/업데이트합니다.ssl_stapling on; ssl_stapling_verify on;
보안을 적용하고 성능을 제공하려면 이러한 항목을 포함하도록 기본 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을 지원해야 하는 경우 443에서 수신을 활성화하고 8445에서 수신을 비활성화하려면 <nginx-install-directory>conf/conf.d/finesse.conf 파일을 편집합니다.
리버스 프록시 호스트의 연결을 위한 클라이언트 SSL 인증서 인증은 CCBU 업스트림 구성 요소 CUIC/Finesse/IdS/Livedata에서 새로운 CVOS CLI 옵션을 통해 활성화할 수 있습니다.
utils system reverse-proxy client-auth enable/disable/status.
기본적으로 이는 비활성화되어 있으며 관리자가 각 업스트림 서버에서 CLI를 독립적으로 실행하여 명시적으로 활성화해야 합니다. 이 옵션이 활성화되면 업스트림 호스트에서 실행 중인 Cisco Web Proxy Service는 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 인증 구성 시 주의 사항:
리버스 프록시 캐시는 명령으로 지울 수
있습니다.
이 섹션에서는 Nginx를 프록시 서버로 설정할 때 따라야 할 표준 지침에 대해 간략하게 설명합니다.
이 지침은 인터넷 보안 센터에서 파생되었습니다. 각 가이드라인에 대한 자세한 내용은 를 참조하십시오.
Finesse 데스크톱의 리버스 프록시 구축에서는 매핑 파일을 사용하여 외부에 표시되는 호스트 이름/포트 조합 목록과 Finesse, Id 및 CUIC 서버에서 사용하는 실제 서버 이름 및 포트에 대한 매핑을 구성해야 합니다. 내부 서버에 구성된 이 매핑 파일은 인터넷을 통해 연결된 클라이언트가 인터넷에서 사용되는 필수 호스트 및 포트로 리디렉션될 수 있도록 하는 주요 구성입니다.
구성 요소 서버에 액세스할 수 있는 웹 서버에 매핑 파일을 배포해야 하며, 배포가 작동하려면 해당 URI를 구성해야 합니다. 네트워크 내에서 사용 가능한 전용 웹 서버를 사용하여 매핑 파일을 구성하는 것이 좋습니다. 이러한 서버를 사용할 수 없는 경우 역방향 프록시를 대신 사용할 수 있습니다. 그러면 네트워크 내에서 프록시에 액세스할 수 있어야 하며 DMZ에 무단 액세스할 수 있는 외부 클라이언트에 정보가 노출될 위험이 있습니다. 다음 섹션에서는 이러한 작업을 수행하는 방법에 대해 자세히 설명합니다.
모든 구성 요소 서버에서 매핑 파일 URI를 구성하는 정확한 단계와 매핑 파일 데이터를 생성하는 방법에 대한 자세한 내용은 기능 가이드를 참조하십시오.
이러한 단계는 리버스 프록시가 프록시 매핑 파일 호스트로도 사용되는 경우에만 필요합니다.
nginx -s reload
로드합니다.curl
확인합니다.선택한 운영 체제가 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는 시스템 관리자가 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 서비스를 다시 시작해야 합니다. IPtables 서비스systemctl restart iptables
를 다시 시작하려면 을 입력합니다.
이전 IPtables 컨피그레이션 외에도 프록시를 사용하는 클라이언트의 주소 범위를 알고 있는 설치에서는 이 정보를 사용하여 프록시 액세스 규칙을 보호하는 것이 좋습니다. 이는 온라인 보안과 관련하여 느슨한 규칙이 있는 국가의 IP 주소 범위에서 자주 생성되는 악성 네트워크의 봇넷에서 프록시를 보호하는 데 있어 큰 보상을 제공할 수 있습니다. 따라서 액세스 패턴이 확실할 경우 IP 주소 범위를 국가/주 또는 ISP 기반 IP 범위로 제한하는 것이 좋습니다.
또한 IP 주소 또는 IP 주소 범위에서 공격이 발생한 것으로 식별되는 경우 특정 주소 범위를 차단하는 방법을 아는 것도 유용합니다. 이러한 경우 해당 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 범위가 있는 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 주소 범위에 대해 클래스리스 도메인 간 라우팅 표기법을 사용하여 IPTables 컨피그레이션 파일에 단일 행을 추가하여 전체 서브넷의 모든 IP 주소를 차단합니다. 예를 들어, 모든 클래스 C 주소를 차단하려면 다음을 입력합니다.
iptables -A INPUT -s 192.0.0.0/16 -j DROP.
SELinux는 Linux OS에 향상된 기능으로 통합된 플랫폼 보안 프레임워크입니다. 리버스 프록시가 다음에 제공되므로 OpenResty를 실행하기 위해 SELinux 정책을 설치하고 추가하는 절차입니다.
openresty -s stop
중지합니다.systemctl
정지하면 부팅 중에 OpenResty 프로세스가 자동으로 시작됩니다. 루트 사용자로 이 명령을 입력합니다.
[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
sudo systemctl enable openresty
입력합니다.systemctl start openresty / systemctl stop openresty
중지하고 프로세스가 루트 사용자로 시작/중지되었는지 확인합니다.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
새 Linux 사용자 생성 및 SElinux 사용자로 매핑
Linux 사용자 semanage login -l
와 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 *
루트로 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.
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 *
SELinux __default__login 기본적으로 SELinux unconfined_u 사용자에게 매핑됩니다. 다음 명령을 사용하여 user_u를 기본적으로 제한해야 합니다.
semanage login -m -s user_u -r s0 __default__
명령이 제대로 작동하는지 확인하려면 을 semanage login -l
입력합니다. 이 출력은 다음과 같습니다.
nginx.conf를 수정하고 nginxuser에 대한 소유권 변경을 수행합니다.
chown -R nginxuser:nginxuser
Openresty-install-directory> 디렉토리에 *를 입력합니다.작업자 프로세스를 실행하기 위한 사용자로 nginxuser를 포함하도록 nginx.conf 파일을 수정합니다.
........ user nginxuser nginxuser; ..........
Nginx에 대한 SELinux 정책 쓰기
sepolicy generate --init /usr/bin/nginx
대신 기존 정책으로 시작하는 것이 좋습니다.
make
컴파일합니다.semodule
로드합니다. semodule -i nginx.pp
semodule --list-modules=full
ps -aefZ | grep nginx
구성이 올바르게 작동하는지 확인하려면 이 섹션을 활용하십시오.
Id 컨피그레이션을 검증하려면 다음 단계를 수행합니다.
nmon 도구를 사용하여 작성한 상위 등가 성능 캡처의 데이터 분석은 Finesse Release 12.6(1) ES03 소프트웨어 다운로드 페이지(load_result.zip)에서 확인할 수 있습니다. 데이터는 8시간 동안 사용자 2,000명의 기본 레이아웃에 구성된 대로 SSO 로그인 및 CUIC LD 보고서를 사용하는 샘플 2000 UCCE 구축에서 데스크톱 및 수퍼바이저 작업을 위한 프록시의 상태를 나타냅니다. 비교 가능한 하드웨어에서 Nginx를 사용하여 설치를 위한 컴퓨팅, 디스크 및 네트워크 요구 사항을 도출하는 데 사용할 수 있습니다.
젤리눅스
setenforce 0
systemctl restart nginx
시작합니다.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
make
컴파일합니다.semodule -i nginx.pp
setenforce
개정 | 게시 날짜 | 의견 |
---|---|---|
5.0 |
24-Dec-2021 |
OpenResty의 수정된 단계. SSL 인증서 생성 및 애플리케이션 단계를 수정했습니다. 문서를 ES03 링크로 업데이트했습니다. |
4.0 |
10-Dec-2021 |
ES03 업데이트. |
3.0 |
10-Nov-2021 |
솔루션 가이드 및 인증 설명을 업데이트했습니다. |
2.0 |
09-Nov-2021 |
최초 릴리스 |
1.0 |
09-Nov-2021 |
최초 릴리스 |