9.3. 로드 밸런서 또는 프록시 설정
이 섹션에서는 클러스터된 Red Hat Single Sign-On 배포 앞에 역방향 프록시 또는 로드 밸런서를 배치하기 전에 설정해야 할 여러 가지 사항에 대해 설명합니다. 또한 클러스터된 도메인 예제 인 기본 제공 로드 밸런서를 구성하는 방법을 설명합니다.
다음 다이어그램에서는 로드 밸런서의 사용을 보여줍니다. 이 예에서 로드 밸런서는 3개의 클라이언트와 3개의 Red Hat Single Sign-On 서버 클러스터 간의 역방향 프록시 역할을 합니다.
로드 밸런서 다이어그램의 예
9.3.1. 클라이언트 IP 주소 식별
Red Hat Single Sign-On의 몇 가지 기능은 인증 서버에 연결된 HTTP 클라이언트의 원격 주소가 클라이언트 시스템의 실제 IP 주소라는 사실에 의존합니다. 예를 들면 다음과 같습니다.
- 이벤트 로그 - 실패한 로그인 시도가 잘못된 소스 IP 주소로 기록됨
- SSL 필수 - 필요한 SSL이 외부(기본값)로 설정된 경우 모든 외부 요청에 대해 SSL이 필요합니다.
- 인증 흐름 - IP 주소를 사용하여 예를 들어 외부 요청에 대한 OTP만 표시하는 사용자 정의 인증 흐름
- 동적 클라이언트 등록
이는 Red Hat Single Sign-On 인증 서버 앞에 역방향 프록시 또는 로드 밸런서가 있는 경우 문제가 될 수 있습니다. 일반적인 설정은 사설 네트워크에 있는 Red Hat Single Sign-On 서버 인스턴스의 백엔드에 요청을 로드 밸런싱 및 전달하는 공용 네트워크에 프런트 엔드 프록시가 있다는 것입니다. 이 시나리오에서는 Red Hat Single Sign-On 서버 인스턴스에서 실제 클라이언트 IP 주소를 전달 및 처리하도록 몇 가지 추가 구성이 있습니다. 특히 다음 내용에 유의하십시오.
-
X-Forwarded-For
및X-Forwarded-Proto
HTTP 헤더를 올바르게 설정하도록 역방향 프록시 또는 로드 밸런서를 구성합니다. - 원래 'Host' HTTP 헤더를 유지하도록 역방향 프록시 또는 로드 밸런서를 구성합니다.
-
X-Forwarded-For
헤더에서 클라이언트의 IP 주소를 읽도록 인증 서버를 구성합니다.
X-Forwarded-For
및 X-Forwarded-Proto
HTTP 헤더를 생성하고 원래 Host
HTTP 헤더를 유지하도록 프록시를 구성하는 것은 이 가이드의 범위를 벗어납니다. 프록시에 X-Forwarded-For
헤더를 설정했는지 확인하기 위해 추가 예방 조치를 취해야 합니다. 프록시가 올바르게 구성되지 않은 경우 잘못된 클라이언트가 이 헤더를 직접 설정하고 Red Hat Single Sign-On을 사용하여 클라이언트가 실제로 있는 것과 다른 IP 주소에서 연결하는 것으로 간주할 수 있습니다. 이는 IP 주소의 블랙리스트 또는 흰색 목록을 수행하는 경우 매우 중요합니다.
프록시 외에도 Red Hat Single Sign-On 측에서 구성해야 할 몇 가지 사항이 있습니다. 프록시가 HTTP 프로토콜을 통해 요청을 전달하는 경우 네트워크 패킷이 아닌 X-Forwarded-For
헤더에서 클라이언트의 IP 주소를 가져오도록 Red Hat Single Sign-On을 구성해야 합니다. 이렇게 하려면 운영 모드에따라 프로필 구성 파일(standalone.xml,standalone-ha.xml, domain.xml 또는 domain.xml)을 열고 urn:jboss:domain:undertow:12.0
XML 블록을 찾습니다.
X-Forwarded-For
HTTP Config
<subsystem xmlns="urn:jboss:domain:undertow:12.0"> <buffer-cache name="default"/> <server name="default-server"> <ajp-listener name="ajp" socket-binding="ajp"/> <http-listener name="default" socket-binding="http" redirect-socket="https" proxy-address-forwarding="true"/> ... </server> ... </subsystem>
<subsystem xmlns="urn:jboss:domain:undertow:12.0">
<buffer-cache name="default"/>
<server name="default-server">
<ajp-listener name="ajp" socket-binding="ajp"/>
<http-listener name="default" socket-binding="http" redirect-socket="https"
proxy-address-forwarding="true"/>
...
</server>
...
</subsystem>
proxy-address-forwarding
특성을 http-listener
요소에 추가합니다. 값을 true
로 설정합니다.
프록시에서 요청 전달(예: Apache HTTPD + mod-cluster) 대신 HTTP 프로토콜을 사용하는 경우 작업을 약간 다르게 구성해야 합니다. http-listener
를 수정하는 대신 filter를 추가하여 이 정보를 10.0.0.1 패킷에서 가져와야 합니다.
X-Forwarded-For
AJP Config
<subsystem xmlns="urn:jboss:domain:undertow:12.0"> <buffer-cache name="default"/> <server name="default-server"> <ajp-listener name="ajp" socket-binding="ajp"/> <http-listener name="default" socket-binding="http" redirect-socket="https"/> <host name="default-host" alias="localhost"> ... <filter-ref name="proxy-peer"/> </host> </server> ... <filters> ... <filter name="proxy-peer" class-name="io.undertow.server.handlers.ProxyPeerAddressHandler" module="io.undertow.core" /> </filters> </subsystem>
<subsystem xmlns="urn:jboss:domain:undertow:12.0">
<buffer-cache name="default"/>
<server name="default-server">
<ajp-listener name="ajp" socket-binding="ajp"/>
<http-listener name="default" socket-binding="http" redirect-socket="https"/>
<host name="default-host" alias="localhost">
...
<filter-ref name="proxy-peer"/>
</host>
</server>
...
<filters>
...
<filter name="proxy-peer"
class-name="io.undertow.server.handlers.ProxyPeerAddressHandler"
module="io.undertow.core" />
</filters>
</subsystem>
9.3.2. 역방향 프록시를 사용하여 HTTPS/SSL 활성화
역방향 프록시가 SSL에 포트 8443을 사용하지 않는 경우 HTTPS 트래픽이 리디렉션되는 포트를 구성해야 합니다.
<subsystem xmlns="urn:jboss:domain:undertow:12.0"> ... <http-listener name="default" socket-binding="http" proxy-address-forwarding="true" redirect-socket="proxy-https"/> ... </subsystem>
<subsystem xmlns="urn:jboss:domain:undertow:12.0">
...
<http-listener name="default" socket-binding="http"
proxy-address-forwarding="true" redirect-socket="proxy-https"/>
...
</subsystem>
절차
-
redirect-socket
특성을http-listener
요소에 추가합니다. 값은 또한 정의해야 하는 소켓 바인딩을 가리키는proxy-https
여야 합니다. socket-binding
-group 요소에 새 socket-binding
요소를 추가합니다.<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> ... <socket-binding name="proxy-https" port="443"/> ... </socket-binding-group>
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> ... <socket-binding name="proxy-https" port="443"/> ... </socket-binding-group>
Copy to Clipboard Copied!
9.3.3. 구성 확인
역방향 프록시 또는 로드 밸런서 구성을 확인할 수 있습니다.
절차
역방향 프록시를 통해
/auth/realms/master/.well-known/openid-configuration
경로를 엽니다.예를 들어 역방향 프록시 주소가
https://acme.com/
인 경우 URLhttps://acme.com/auth/realms/master/.well-known/openid-configuration
를 엽니다. Red Hat Single Sign-On의 여러 엔드포인트가 나열된 JSON 문서가 표시됩니다.- 역방향 프록시 또는 로드 밸런서의 주소(scheme, 도메인 및 포트)로 끝점이 시작되는지 확인합니다. 이렇게 하면 Red Hat Single Sign-On이 올바른 끝점을 사용하고 있는지 확인합니다.
Red Hat Single Sign-On이 요청에 대해 올바른 소스 IP 주소가 표시되는지 확인합니다.
이를 확인하려면 잘못된 사용자 이름 및/또는 암호를 사용하여 관리 콘솔에 로그인할 수 있습니다. 서버 로그에 다음과 같은 경고가 표시됩니다.
08:14:21,287 WARN XNIO-1 task-45 [org.keycloak.events] type=LOGIN_ERROR, realmId=master, clientId=security-admin-console, userId=8f20d7ba-4974-4811-a695-242c8fbd1bf8, ipAddress=X.X.X.X, error=invalid_user_credentials, auth_method=openid-connect, auth_type=code, redirect_uri=http://localhost:8080/auth/admin/master/console/?redirect_fragment=%2Frealms%2Fmaster%2Fevents-settings, code_id=a3d48b67-a439-4546-b992-e93311d6493e, username=admin
08:14:21,287 WARN XNIO-1 task-45 [org.keycloak.events] type=LOGIN_ERROR, realmId=master, clientId=security-admin-console, userId=8f20d7ba-4974-4811-a695-242c8fbd1bf8, ipAddress=X.X.X.X, error=invalid_user_credentials, auth_method=openid-connect, auth_type=code, redirect_uri=http://localhost:8080/auth/admin/master/console/?redirect_fragment=%2Frealms%2Fmaster%2Fevents-settings, code_id=a3d48b67-a439-4546-b992-e93311d6493e, username=admin
Copy to Clipboard Copied! -
ipAddress
값이 역방향 프록시 또는 로드 밸런서의 IP 주소가 아닌 로그인하려는 머신의 IP 주소인지 확인합니다.
9.3.4. 기본 제공 로드 밸런서 사용
이 섹션에서는 클러스터 도메인 예제에서 설명하는 기본 제공 로드 밸런서를 구성하는 방법을 설명합니다.
클러스터 도메인 예제는 한 시스템에서만 실행되도록 설계되었습니다. 다른 호스트에 슬레이브를 표시하려면 다음을 수행해야합니다.
- 새 호스트 슬레이브를 가리키도록 domain.xml 파일을 편집합니다.
- 서버 배포를 복사합니다. domain.xml,host.xml 또는 host-master.xml 파일이 필요하지 않습니다. 독립 실행형/ 디렉터리도 필요하지 않습니다.
- host-slave.xml 파일을 편집하여 명령줄에서 사용된 바인딩 주소를 변경하거나 덮어 쓰기합니다.
절차
- 로드 밸런서 구성에 새 호스트 슬레이브를 등록할 수 있도록 domain.xml 을 엽니다.
로드 밸런서
프로필의 undertow 구성으로 이동합니다.reverse-proxy
XML 블록 내에remote-
이라는 새 호스트 정의를 추가합니다.host
3domain.xml reverse-proxy config
<subsystem xmlns="urn:jboss:domain:undertow:12.0"> ... <handlers> <reverse-proxy name="lb-handler"> <host name="host1" outbound-socket-binding="remote-host1" scheme="ajp" path="/" instance-id="myroute1"/> <host name="host2" outbound-socket-binding="remote-host2" scheme="ajp" path="/" instance-id="myroute2"/> <host name="remote-host3" outbound-socket-binding="remote-host3" scheme="ajp" path="/" instance-id="myroute3"/> </reverse-proxy> </handlers> ... </subsystem>
<subsystem xmlns="urn:jboss:domain:undertow:12.0"> ... <handlers> <reverse-proxy name="lb-handler"> <host name="host1" outbound-socket-binding="remote-host1" scheme="ajp" path="/" instance-id="myroute1"/> <host name="host2" outbound-socket-binding="remote-host2" scheme="ajp" path="/" instance-id="myroute2"/> <host name="remote-host3" outbound-socket-binding="remote-host3" scheme="ajp" path="/" instance-id="myroute3"/> </reverse-proxy> </handlers> ... </subsystem>
Copy to Clipboard Copied! output-socket-binding
은 나중에 domain.xml 파일에서 구성된socket-binding
을 가리키는 논리 이름입니다. 부하 분산 시 고정 세션을 활성화하기 위해 이 값이 쿠키에서 사용되므로instance-id
속성도 새 호스트에 고유해야 합니다.load-balancer-sockets
socket-binding-group
으로 이동하여remote-host3
에 대한outbound-socket-binding
을 추가합니다.이 새 바인딩은 새 호스트의 호스트 및 포트를 가리켜야 합니다.
domain.xml outbound-socket-binding
<socket-binding-group name="load-balancer-sockets" default-interface="public"> ... <outbound-socket-binding name="remote-host1"> <remote-destination host="localhost" port="8159"/> </outbound-socket-binding> <outbound-socket-binding name="remote-host2"> <remote-destination host="localhost" port="8259"/> </outbound-socket-binding> <outbound-socket-binding name="remote-host3"> <remote-destination host="192.168.0.5" port="8259"/> </outbound-socket-binding> </socket-binding-group>
<socket-binding-group name="load-balancer-sockets" default-interface="public"> ... <outbound-socket-binding name="remote-host1"> <remote-destination host="localhost" port="8159"/> </outbound-socket-binding> <outbound-socket-binding name="remote-host2"> <remote-destination host="localhost" port="8259"/> </outbound-socket-binding> <outbound-socket-binding name="remote-host3"> <remote-destination host="192.168.0.5" port="8259"/> </outbound-socket-binding> </socket-binding-group>
Copy to Clipboard Copied!
9.3.4.1. 마스터 바인딩 주소
다음 작업은 마스터 호스트의 공개
및 관리
바인딩 주소를 변경하는 것입니다. Bind Addresses 장에서 설명한 domain.xml 파일을 편집하거나 다음과 같이 명령줄에서 이러한 바인딩 주소를 지정합니다.
domain.sh --host-config=host-master.xml -Djboss.bind.address=192.168.0.2 -Djboss.bind.address.management=192.168.0.2
$ domain.sh --host-config=host-master.xml -Djboss.bind.address=192.168.0.2 -Djboss.bind.address.management=192.168.0.2
9.3.4.2. 호스트 슬레이브 바인딩 주소
다음으로 공용
,관리
, 도메인 컨트롤러 바인딩 주소 (jboss.domain.master-address
)를 변경해야 합니다. 다음과 같이 host-slave.xml 파일을 편집하거나 명령줄에서 해당 파일을 지정합니다.
domain.sh --host-config=host-slave.xml
$ domain.sh --host-config=host-slave.xml
-Djboss.bind.address=192.168.0.5
-Djboss.bind.address.management=192.168.0.5
-Djboss.domain.master.address=192.168.0.2
jboss.bind.address
및 jboss.bind.address.management
값은 호스트 슬레이브의 IP 주소와 관련이 있습니다. jboss.domain.master.address
값은 마스터 호스트의 관리 주소인 도메인 컨트롤러의 IP 주소여야 합니다.