2장. OpenID Connect를 사용하여 애플리케이션 및 서비스 보안

이 섹션에서는 Red Hat Single Sign-On 어댑터 또는 일반 OpenID Connect Relying Party 라이브러리를 사용하여 OpenID Connect에서 애플리케이션 및 서비스를 보호하는 방법에 대해 설명합니다.

2.1. Java 어댑터

Red Hat Single Sign-On에는 다양한 Java 어댑터가 포함되어 있습니다. 올바른 어댑터를 선택하는 것은 대상 플랫폼에 따라 다릅니다.

모든 Java 어댑터는 Java Adapters Config 장에 설명된 일반적인 구성 옵션 세트를 공유합니다.

2.1.1. Java 어댑터 구성

Red Hat Single Sign-On에서 지원하는 각 Java 어댑터는 간단한 JSON 파일로 구성할 수 있습니다. 다음과 같이 표시됩니다.

{
  "realm" : "demo",
  "resource" : "customer-portal",
  "realm-public-key" : "MIGfMA0GCSqGSIb3D...31LwIDAQAB",
  "auth-server-url" : "https://localhost:8443/auth",
  "ssl-required" : "external",
  "use-resource-role-mappings" : false,
  "enable-cors" : true,
  "cors-max-age" : 1000,
  "cors-allowed-methods" : "POST, PUT, DELETE, GET",
  "cors-exposed-headers" : "WWW-Authenticate, My-custom-exposed-Header",
  "bearer-only" : false,
  "enable-basic-auth" : false,
  "expose-token" : true,
  "verify-token-audience" : true,
  "credentials" : {
    "secret" : "234234-234234-234234"
  },

  "connection-pool-size" : 20,
  "socket-timeout-millis" : 5000,
  "connection-timeout-millis" : 6000,
  "connection-ttl-millis" : 500,
  "disable-trust-manager" : false,
  "allow-any-hostname" : false,
  "truststore" : "path/to/truststore.jks",
  "truststore-password" : "geheim",
  "client-keystore" : "path/to/client-keystore.jks",
  "client-keystore-password" : "geheim",
  "client-key-password" : "geheim",
  "token-minimum-time-to-live" : 10,
  "min-time-between-jwks-requests" : 10,
  "public-key-cache-ttl" : 86400,
  "redirect-rewrite-rules" : {
    "^/wsmaster/api/(.*)$" : "/api/$1"
  }
}

${…​} 시스템 속성 교체를 위해 ${…​} 를 사용할 수 있습니다. 예를 들어 ${jboss.server.config.dir}/path/to/Red Hat Single Sign-On 으로 교체됩니다. env 접두사를 통해 환경 변수 교체도 지원됩니다(예: ${env.MY_ENVIRONMENT_VARIABLE} ).

초기 구성 파일은 관리자 콘솔에서 가져올 수 있습니다. 이 작업은 관리자 콘솔을 열고 메뉴에서 Clients 를 선택하고 해당 클라이언트를 클릭하여 수행할 수 있습니다. 클라이언트 페이지가 열리면 설치 탭을 클릭하고 Keycloak OIDC JSON 을 선택합니다.

다음은 각 구성 옵션에 대한 설명입니다.

영역
영역의 이름입니다. 이것은 필수입니다.
resource
애플리케이션의 클라이언트 ID입니다. 각 애플리케이션에는 애플리케이션을 식별하는 데 사용되는 클라이언트 ID가 있습니다. 이것은 필수입니다.
realm-public-key
영역 공개 키의 PEM 형식. 관리 콘솔에서 이 값을 가져올 수 있습니다. 이 값은 OPTIONAL이며 설정하지 않는 것이 좋습니다. 설정되지 않은 경우 어댑터는 Red Hat Single Sign-On에서 이 값을 다운로드하고 필요한 경우 항상 다시 다운로드합니다(예: Red Hat Single Sign-On이 키를 회전). 그러나 realm-public-key가 설정되어 있으면 어댑터는 Red Hat Single Sign-On에서 새 키를 다운로드하지 않으므로 Red Hat Single Sign-On이 키를 회전하면 어댑터가 중단됩니다.
auth-server-url
Red Hat Single Sign-On 서버의 기본 URL입니다. 다른 모든 Red Hat Single Sign-On 페이지 및 REST 서비스 엔드포인트는 여기에서 파생됩니다. 일반적으로 https://host:port/auth 형식입니다. 이것은 필수입니다.
SSL-필수
Red Hat Single Sign-On 서버와의 모든 통신이 HTTPS를 통해 이루어집니다. 프로덕션 환경에서 이 값은 모두 로 설정되어야 합니다. 이것은 선택 사항입니다. 기본값은 외부 이므로 기본적으로 외부 요청에 HTTPS가 필요합니다. 유효한 값은 'all', 'external' 및 'none'입니다.
confidential-port
SSL/TLS를 통한 보안 연결에 Red Hat Single Sign-On 서버에서 사용하는 기밀 포트입니다. 이것은 선택 사항입니다. 기본값은 8443 입니다.
use-resource-role-mappings
true로 설정하면 어댑터는 사용자의 애플리케이션 수준 역할 매핑을 위해 토큰 내부를 찾습니다. false인 경우 사용자 역할 매핑의 영역 수준을 확인합니다. 이것은 선택 사항입니다. 기본값은 false입니다.
public-client
true로 설정하면 어댑터에서 클라이언트의 인증 정보를 Red Hat Single Sign-On으로 보내지 않습니다. 이것은 선택 사항입니다. 기본값은 false입니다.
enable-cors
이를 통해 CORS 지원이 가능합니다. CORS 사전 진행 요청을 처리합니다. 또한 액세스 토큰을 확인하여 유효한 출처를 결정합니다. 이것은 선택 사항입니다. 기본값은 false입니다.
cors-max-age
CORS가 활성화된 경우 Access-Control-Max-Age 헤더의 값을 설정합니다. 이것은 선택 사항입니다. 설정하지 않으면 이 헤더가 CORS 응답에서 반환되지 않습니다.
cors-allowed-methods
CORS가 활성화된 경우 Access-Control-Allow-Methods 헤더의 값을 설정합니다. 쉼표로 구분된 문자열이어야 합니다. 이것은 선택 사항입니다. 설정하지 않으면 이 헤더가 CORS 응답에서 반환되지 않습니다.
cors-allowed-headers
CORS를 활성화하면 Access-Control-Allow-Headers 헤더의 값을 설정합니다. 쉼표로 구분된 문자열이어야 합니다. 이것은 선택 사항입니다. 설정하지 않으면 이 헤더가 CORS 응답에서 반환되지 않습니다.
cors-exposed-headers
CORS를 활성화하면 Access-Control-Expose-Headers 헤더의 값을 설정합니다. 쉼표로 구분된 문자열이어야 합니다. 이것은 선택 사항입니다. 설정하지 않으면 이 헤더가 CORS 응답에서 반환되지 않습니다.
bearer-only
서비스의 경우 true 로 설정해야 합니다. 활성화된 경우 어댑터는 사용자 인증을 시도하지 않고 전달자 토큰만 확인합니다. 이것은 선택 사항입니다. 기본값은 false입니다.
autodetect-bearer-only
애플리케이션이 웹 애플리케이션 및 웹 서비스(예: CloudEvent 또는 REST)를 모두 제공하는 경우 true 로 설정해야 합니다. 이를 통해 인증되지 않은 웹 애플리케이션의 사용자를 Red Hat Single Sign-On 로그인 페이지로 리디렉션할 수 있지만 로그인 페이지로 리디렉션하지 않기 때문에 인증되지 않은 iPXE 또는 REST 클라이언트로 HTTP 401 상태 코드를 보낼 수 있습니다. Red Hat Single Sign-On은 X-Requested-With,ECDHEAction 또는 Accept 와 같은 일반적인 헤더를 기반으로 합니다. 기본값은 false입니다.
enable-basic-auth
어댑터가 기본 인증도 지원합니다. 이 옵션을 활성화하면 시크릿 도 제공해야 합니다. 이것은 선택 사항입니다. 기본값은 false입니다.
expose-token
true 인 경우 인증된 브라우저 클라이언트(JavaScript HTTP 호출을 통해)는 URL root/k_query_bearer_token 을 통해 서명된 액세스 토큰을 가져올 수 있습니다. 이것은 선택 사항입니다. 기본값은 false입니다.
인증 정보
애플리케이션의 자격 증명을 지정합니다. 키가 인증 정보 유형이고 값은 인증 정보 유형의 값인 오브젝트 표기법입니다. 현재 암호 및 jwt가 지원됩니다. 이는 '기밀' 액세스 유형이 있는 클라이언트의 경우에만 필수 사항입니다.
connection-pool-size
이 구성 옵션은 풀링해야 하는 Red Hat Single Sign-On 서버에 대한 연결 수를 정의합니다. 이것은 선택 사항입니다. 기본값은 20 입니다.
socket-timeout-millis
연결을 밀리초 단위로 설정한 후 데이터를 기다리는 소켓의 시간 초과입니다. 두 데이터 패킷 사이에 비활성의 최대 시간. 시간 제한 값이 0은 무한 타임아웃으로 해석됩니다. 음수 값은 정의되지 않은 것으로 해석됩니다(해당되는 경우 시스템 기본값). 기본값은 -1 입니다. 이것은 선택 사항입니다.
connection-timeout-millis
원격 호스트와의 연결을 밀리초 단위로 설정하기 위한 시간 초과입니다. 시간 제한 값이 0은 무한 타임아웃으로 해석됩니다. 음수 값은 정의되지 않은 것으로 해석됩니다(해당되는 경우 시스템 기본값). 기본값은 -1 입니다. 이것은 선택 사항입니다.
connection-ttl-millis
클라이언트의 연결 시간(밀리초)입니다. 값이 0 보다 작거나 같은 값은 무한 값으로 해석됩니다.A value less than or equal to zero is interpreted as an infinite value. 기본값은 -1 입니다. 이것은 선택 사항입니다.
disable-trust-manager
Red Hat Single Sign-On 서버에 HTTPS가 필요하며 이 구성 옵션이 true 로 설정된 경우 truststore를 지정할 필요가 없습니다. 이 설정은 개발 중에만 사용해야 하며, SSL 인증서 확인을 비활성화하므로 프로덕션에서는 사용하지 않아야 합니다. 이것은 선택 사항입니다. 기본값은 false입니다.
allow-any-hostname
Red Hat Single Sign-On 서버에 HTTPS가 필요하며 이 구성 옵션이 true 로 설정되어 있으면 신뢰 저장소를 통해 Red Hat Single Sign-On 서버의 인증서의 유효성을 검사하지만 호스트 이름 검증은 수행되지 않습니다. 이 설정은 개발 중에만 사용해야 하며, SSL 인증서 확인을 비활성화하므로 프로덕션에서는 사용하지 않아야 합니다. 이 설정은 테스트 환경에서 유용할 수 있습니다. 이 옵션은 선택 사항입니다. 기본값은 false입니다.
proxy-url
HTTP 프록시가 사용되는 경우의 URL입니다.
truststore
값은 신뢰 저장소 파일의 파일 경로입니다. 경로 접두사를 classpath: 인 경우 대신 배포의 classpath에서 truststore를 가져옵니다. Red Hat Single Sign-On 서버로의 발신 HTTPS 통신에 사용됩니다. HTTPS 요청을 수행하는 클라이언트는 통신 중인 서버의 호스트를 확인할 방법이 필요합니다. 이것이 신뢰가 하는 것입니다. 키 저장소에는 하나 이상의 신뢰할 수 있는 호스트 인증서 또는 인증 기관이 포함됩니다. Red Hat Single Sign-On 서버의 SSL 키 저장소의 공개 인증서를 추출하여 이 신뢰 저장소를 생성할 수 있습니다. ssl-requirednone 또는 disable-trust-managertrue 인 경우가 아니면 REQUIRED 입니다.
truststore-password
신뢰 저장소의 암호입니다. truststore가 설정되어 있고 truststore 에 암호가 필요한 경우 REQUIRED 입니다.
client-keystore
이는 키 저장소 파일의 파일 경로입니다. 이 키 저장소에 어댑터에서 Red Hat Single Sign-On 서버에 HTTPS 요청을 할 때 양방향 SSL에 대한 클라이언트 인증서가 포함되어 있습니다. 이것은 선택 사항입니다.
client-keystore-password
클라이언트 키 저장소의 암호입니다. client-keystore 가 설정된 경우 REQUIRED 입니다.
client-key-password
클라이언트 키의 암호입니다. client-keystore 가 설정된 경우 REQUIRED 입니다.
always-refresh-token
true 인 경우 어댑터는 모든 요청에서 토큰을 새로 고칩니다. 경고 - 이 기능을 활성화하면 애플리케이션에 대한 모든 요청에 대해 Red Hat Single Sign-On에 대한 요청이 발생합니다.
register-node-at-startup
true 인 경우 어댑터는 Red Hat Single Sign-On에 등록 요청을 보냅니다. 기본적으로 false 이며 애플리케이션이 클러스터될 때만 유용합니다. 자세한 내용은 애플리케이션 할당을 참조하십시오.
register-node-period
Red Hat Single Sign-On에 다시 등록된 어댑터 기간. 애플리케이션이 클러스터될 때 유용합니다. 자세한 내용은 애플리케이션 할당을 참조하십시오.
token-store
가능한 값은 세션쿠키 입니다. 기본값은 session 입니다. 즉 어댑터는 HTTP 세션에 계정 정보를 저장합니다. 대체 쿠키는 쿠키 의 정보를 저장함을 의미합니다. 자세한 내용은 애플리케이션 할당을 참조하십시오.
token-cookie-path
쿠키 저장소를 사용하는 경우 이 옵션은 계정 정보를 저장하는 데 사용되는 쿠키의 경로를 설정합니다. 상대 경로인 경우 애플리케이션이 컨텍스트 루트에서 실행되고 해당 컨텍스트 루트와 관련하여 해석되는 것으로 가정합니다. 절대 경로인 경우 절대 경로가 사용되어 쿠키 경로를 설정합니다. 기본값은 컨텍스트 루트와 관련된 경로를 사용합니다.
principal-attribute
OpenID Connect ID 토큰 속성을 사용하여 UserPrincipal 이름을. token 속성이 null인 경우 기본값은 sub 입니다. 가능한 값은 sub,preferred_username,email,name,nickname,given_name,family_name 입니다.
turn-off-change-session-id-on-login
일부 플랫폼에서 성공적으로 로그인하면 보안 공격 벡터를 연결할 때 세션 ID가 기본적으로 변경됩니다. 이 설정을 해제하려면 이 값을 true로 변경하십시오.이 옵션은 선택 사항입니다. 기본값은 false입니다.
token-minimum-time-to-live
만료되기 전에 Red Hat Single Sign-On 서버를 사용하여 활성 액세스 토큰을 선점하여 새로 고침하는 시간(초)입니다. 이 기능은 평가되기 전에 만료될 수 있는 다른 REST 클라이언트에 액세스 토큰을 보내는 경우에 특히 유용합니다. 이 값은 영역의 액세스 토큰 수명을 초과해서는 안 됩니다. 이것은 선택 사항입니다. 기본값은 0 초이므로 어댑터가 만료된 경우에만 어댑터에서 액세스 토큰을 새로 고칩니다.
min-time-between-jwks-requests
새 공개 키를 검색하기 위해 Red Hat Single Sign-On에 대한 두 요청 간 최소 간격을 지정하는 시간(초)입니다. 기본적으로 10초입니다. Adapter는 알 수 없는 아이와 토큰을 인식할 때 항상 새로운 공개 키를 다운로드하려고 합니다. 그러나 10초당 한 번 이상 시도하지 않습니다(기본값). 이는 공격자가 어댑터를 강제 적용하여 Red Hat Single Sign-On에 많은 요청을 보내는 경우 DoS가 발생하지 않도록 하기 위한 것입니다.
public-key-cache-ttl
새 공개 키를 검색하기 위해 Red Hat Single Sign-On에 대한 두 요청 간 최대 간격을 지정하는 시간(초)입니다. 기본적으로 86400초(1일)입니다. Adapter는 알 수 없는 아이와 토큰을 인식할 때 항상 새로운 공개 키를 다운로드하려고 합니다. 알려진 문제가 있는 토큰 인식하는 경우 이전에 다운로드한 공개 키만 사용합니다. 그러나 이 구성된 간격당 한 번 이상(기본적으로 1일)은 토큰에 이미 알려진 경우에도 새 공개 키가 항상 다운로드됩니다.
ignore-oauth-query-parameter
기본값은 false 로, true 로 설정되면 전달자 토큰 처리를 위해 access_token 쿼리 매개변수 처리가 해제됩니다. access_token만 통과하면 사용자가 인증할 수 없습니다.
redirect-rewrite-rules
필요한 경우 리디렉션 URI 재작성 규칙을 지정합니다. 이는 키가 Redirect URI와 일치해야 하는 정규식이고 값은 대체 문자열인 오브젝트 표기법입니다. $ 문자는 대체 문자열의 역참조에 사용할 수 있습니다.
verify-token-audience
true 로 설정하면 어댑터에서 전달자 토큰을 사용한 인증 중에 토큰에 이 클라이언트 이름(리소스)이 대상자로 포함되어 있는지 확인합니다. 옵션은 전달자 토큰에서 인증된 요청을 주로 제공하는 서비스에 특히 유용합니다. 이는 기본적으로 false 로 설정되지만 보안 향상을 위해 이를 활성화하는 것이 좋습니다. 대상 지원에 대한 자세한 내용은 support를 참조하십시오.

2.1.2. JBoss EAP 어댑터

ZIP 파일 또는 RPM에서 이 어댑터를 설치할 수 있습니다.

2.1.3. ZIP 파일에서 JBOSS EAP 어댑터 설치

JBoss EAP에 배포된 WAR 애플리케이션을 보호하려면 Red Hat Single Sign-On 어댑터 하위 시스템을 설치하고 구성해야 합니다. WAR를 보호하는 두 가지 옵션이 있습니다.

  • WAR에 어댑터 구성 파일을 제공하고 web.xml 내에서 auth-method를 KEYCLOAK로 변경할 수 있습니다.
  • 또는 WAR를 전혀 수정할 필요가 없으며 standalone.xml 과 같은 구성 파일의 Red Hat Single Sign-On 어댑터 하위 시스템 구성을 통해 보호할 수 있습니다.

두 방법 모두 이 섹션에 설명되어 있습니다.

어댑터는 사용 중인 서버 버전에 따라 별도의 아카이브로 사용할 수 있습니다.

절차

  1. Sotware Downloads 사이트에서 애플리케이션 서버에 적용되는 어댑터를 설치합니다.

    • JBoss EAP 7에 설치합니다.

      $ cd $EAP_HOME
      $ unzip rh-sso-7.6.9-eap7-adapter.zip

      이 ZIP 아카이브에는 Red Hat Single Sign-On 어댑터에 고유한 JBoss 모듈이 포함되어 있습니다. 어댑터 하위 시스템을 구성하는 JBoss CLI 스크립트도 포함되어 있습니다.

  2. 어댑터 하위 시스템을 구성하려면 적절한 명령을 실행합니다.

    • 서버가 실행되고 있지 않은 경우 JBoss EAP 7.1 이상에 설치합니다.

      $ ./bin/jboss-cli.sh --file=bin/adapter-elytron-install-offline.cli
      참고

      JBoss EAP 6.4에서는 오프라인 스크립트를 사용할 수 없습니다.

    • 서버가 실행 중인 경우 JBoss EAP 7.1 이상에 설치합니다.

      $ ./bin/jboss-cli.sh -c --file=bin/adapter-elytron-install.cli
      참고

      JBoss EAP 7.1 이상에서도 레거시 비Elytron 어댑터를 사용할 수 있습니다. 즉, adapter-install-offline.cli를 사용할 수 있습니다.

      참고

      EAP는 7.4.CP7 및 7.4.CP8 이후 각각 OpenJDK 17 및 Oracle JDK 17을 지원합니다. 새로운 Java 버전은 elytron 변형을 필수이므로 JDK 17의 레거시 어댑터를 사용하지 마십시오. 또한 어댑터 CLI 파일을 실행한 후 EAP에서 제공하는 enable-elytron-se17.cli 스크립트를 실행합니다. elytron 어댑터를 구성하고 호환되지 않는 EAP 하위 시스템을 제거하려면 두 스크립트 모두 필요합니다. 자세한 내용은 이 보안 구성 변경 사항 문서를 참조하십시오.

    • JBoss EAP 6.4에 설치

      $ ./bin/jboss-cli.sh -c --file=bin/adapter-install.cli

2.1.3.1. JBoss SSO

JBoss EAP는 동일한 JBoss EAP 인스턴스에 배포된 웹 애플리케이션에 대한 SSO(Single Sign-On)를 기본적으로 지원합니다. Red Hat Single Sign-On을 사용할 때는 이 기능을 활성화해서는 안 됩니다.

2.1.3.2. WAR 보안

이 섹션에서는 WAR 패키지에 구성을 추가하고 파일을 편집하여 WAR를 직접 보호하는 방법을 설명합니다.

절차

  1. WAR의 sites -INF 디렉터리에 keycloak.json 어댑터 구성 파일을 생성합니다.

    이 구성 파일의 형식은 Java 어댑터 구성 섹션에 설명되어 있습니다.

  2. web.xml 에서 auth-methodKEYCLOAK 로 설정합니다.
  3. 표준 서블릿 보안을 사용하여 URL에 대한 역할 기반 제약 조건을 지정합니다.

    예를 들면 다음과 같습니다.

    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
          version="3.0">
    
        <module-name>application</module-name>
    
        <security-constraint>
            <web-resource-collection>
                <web-resource-name>Admins</web-resource-name>
                <url-pattern>/admin/*</url-pattern>
            </web-resource-collection>
            <auth-constraint>
                <role-name>admin</role-name>
            </auth-constraint>
            <user-data-constraint>
                <transport-guarantee>CONFIDENTIAL</transport-guarantee>
            </user-data-constraint>
        </security-constraint>
        <security-constraint>
            <web-resource-collection>
                <web-resource-name>Customers</web-resource-name>
                <url-pattern>/customers/*</url-pattern>
            </web-resource-collection>
            <auth-constraint>
                <role-name>user</role-name>
            </auth-constraint>
            <user-data-constraint>
                <transport-guarantee>CONFIDENTIAL</transport-guarantee>
            </user-data-constraint>
        </security-constraint>
    
        <login-config>
            <auth-method>KEYCLOAK</auth-method>
            <realm-name>this is ignored currently</realm-name>
        </login-config>
    
        <security-role>
            <role-name>admin</role-name>
        </security-role>
        <security-role>
            <role-name>user</role-name>
        </security-role>
    </web-app>

2.1.3.3. 어댑터 하위 시스템을 통한 WAR 보안

Red Hat Single Sign-On으로 보안을 위해 WAR를 수정할 필요는 없습니다. 대신 Red Hat SSO(Single Sign-On Adapter)를 통해 외부에서 보호할 수 있습니다. KEYCLOAK을 auth-method 로 지정할 필요는 없지만 web.xml 에서 security-constraints 를 정의해야 합니다. 그러나 WEB-INF/keycloak.json 파일을 만들 필요가 없습니다. 메타데이터는 Red Hat Single Sign-On 하위 시스템 정의의 서버 구성(standalone.xml) 내에 정의됩니다.

<extensions>
  <extension module="org.keycloak.keycloak-adapter-subsystem"/>
</extensions>

<profile>
  <subsystem xmlns="urn:jboss:domain:keycloak:1.1">
     <secure-deployment name="WAR MODULE NAME.war">
        <realm>demo</realm>
        <auth-server-url>http://localhost:8081/auth</auth-server-url>
        <ssl-required>external</ssl-required>
        <resource>customer-portal</resource>
        <credential name="secret">password</credential>
     </secure-deployment>
  </subsystem>
</profile>

secure-deployment 이름 속성은 보안하려는 WAR를 식별합니다. 해당 값은 .war 가 추가된 web.xml 에 정의된 module-name 입니다. 나머지 구성은 Java 어댑터 구성에 정의된 keycloak.json 구성 옵션과 함께 1과 거의 일치합니다.

예외는 credential 요소입니다.

보다 쉽게 사용할 수 있도록 Red Hat Single Sign-On 관리 콘솔로 이동하여 이 WAR에 맞게 애플리케이션의 클라이언트/설치 탭으로 이동합니다. 잘라내고 붙여넣을 수 있는 XML 파일 예제를 제공합니다.

동일한 영역에서 보안된 여러 배포가 있는 경우 별도의 요소에서 영역 구성을 공유할 수 있습니다. 예를 들면 다음과 같습니다.

<subsystem xmlns="urn:jboss:domain:keycloak:1.1">
    <realm name="demo">
        <auth-server-url>http://localhost:8080/auth</auth-server-url>
        <ssl-required>external</ssl-required>
    </realm>
    <secure-deployment name="customer-portal.war">
        <realm>demo</realm>
        <resource>customer-portal</resource>
        <credential name="secret">password</credential>
    </secure-deployment>
    <secure-deployment name="product-portal.war">
        <realm>demo</realm>
        <resource>product-portal</resource>
        <credential name="secret">password</credential>
    </secure-deployment>
    <secure-deployment name="database.war">
        <realm>demo</realm>
        <resource>database-service</resource>
        <bearer-only>true</bearer-only>
    </secure-deployment>
</subsystem>

2.1.3.4. 보안 도메인

보안 컨텍스트는 Egress 계층으로 자동 전파됩니다.

2.1.4. RPM에서 JBoss EAP 7 어댑터 설치

참고

Red Hat Enterprise Linux 7에서는 채널이라는 용어가 리포지토리라는 이름으로 교체되었습니다. 이러한 명령에서는 리포지토리라는 용어만 사용됩니다.

사전 요구 사항

RPM에서 JBoss EAP 7 어댑터를 설치하려면 먼저 JBoss EAP 7.4 리포지토리를 구독해야 합니다.

  • Red Hat Subscription Manager를 사용하여 Red Hat Enterprise Linux 시스템이 계정에 등록되어 있는지 확인하십시오. 자세한 내용은 Red Hat 서브스크립션 관리 설명서를 참조하십시오.
  • 다른 JBoss EAP 리포지토리를 이미 구독한 경우 해당 리포지토리에서 먼저 구독 해제해야 합니다.

    Red Hat Enterprise Linux 6, 7의 경우 7: Red Hat Subscription Manager를 사용하여 다음 명령을 사용하여 JBoss EAP 7.4 리포지토리를 구독하십시오. <RHEL_VERSION>을 Red Hat Enterprise Linux 버전에 따라 6 또는 7로 바꿉니다.

    $ sudo subscription-manager repos --enable=jb-eap-7-for-rhel-<RHEL_VERSION>-server-rpms

    Red Hat Enterprise Linux 8의 경우: Red Hat Subscription Manager를 사용하여 다음 명령을 사용하여 JBoss EAP 7.4 리포지터리를 구독하십시오.

    $ sudo subscription-manager repos --enable=jb-eap-7.4-for-rhel-8-x86_64-rpms --enable=rhel-8-for-x86_64-baseos-rpms --enable=rhel-8-for-x86_64-appstream-rpms

절차

  1. Red Hat Enterprise Linux 버전에 따라 OIDC용 JBoss EAP 7 어댑터를 설치합니다.

    • Red Hat Enterprise Linux 6, 7에 설치합니다.

      $ sudo yum install eap7-keycloak-adapter-sso7_6
    • Red Hat Enterprise Linux 8에 설치합니다.

      $ sudo dnf install eap7-keycloak-adapter-sso7_6
      참고

      RPM 설치의 기본 EAP_HOME 경로는 /opt/rh/eap7/root/usr/share/wildfly입니다.

  2. OIDC 모듈에 대한 설치 스크립트를 실행합니다.

    $ $EAP_HOME/bin/jboss-cli.sh -c --file=$EAP_HOME/bin/adapter-install.cli

설치가 완료되었습니다.

2.1.5. RPM에서 JBoss EAP 6 어댑터 설치

참고

Red Hat Enterprise Linux 7에서는 채널이라는 용어가 리포지토리라는 이름으로 교체되었습니다. 이러한 명령에서는 리포지토리라는 용어만 사용됩니다.

RPM에서 EAP 6 어댑터를 설치하려면 먼저 JBoss EAP 6 리포지토리를 구독해야 합니다.

사전 요구 사항

  • Red Hat Subscription Manager를 사용하여 Red Hat Enterprise Linux 시스템이 계정에 등록되어 있는지 확인하십시오. 자세한 내용은 Red Hat 서브스크립션 관리 설명서를 참조하십시오.
  • 다른 JBoss EAP 리포지토리를 이미 구독한 경우 해당 리포지토리에서 먼저 구독 해제해야 합니다.

    Red Hat Subscription Manager를 사용하여 다음 명령을 사용하여 JBoss EAP 6 리포지토리를 구독하십시오. <RHEL_VERSION>을 Red Hat Enterprise Linux 버전에 따라 6 또는 7로 바꿉니다.

    $ sudo subscription-manager repos --enable=jb-eap-6-for-rhel-<RHEL_VERSION>-server-rpms

절차

  1. 다음 명령을 사용하여 OIDC용 EAP 6 어댑터를 설치합니다.

    $ sudo yum install keycloak-adapter-sso7_6-eap6
    참고

    RPM 설치의 기본 EAP_HOME 경로는 /opt/rh/eap6/root/usr/share/wildfly입니다.

  2. OIDC 모듈에 대한 설치 스크립트를 실행합니다.

    $ $EAP_HOME/bin/jboss-cli.sh -c --file=$EAP_HOME/bin/adapter-install.cli

설치가 완료되었습니다.

2.1.6. JBoss Fuse 6 어댑터

Red Hat Single Sign-On은 JBoss Fuse 6 내에서 실행되는 웹 애플리케이션 보안을 지원합니다.

주의

지원되는 유일한 버전의 Fuse 6은 최신 버전입니다. 이전 버전의 Fuse 6을 사용하는 경우 일부 기능이 제대로 작동하지 않을 수 있습니다. 특히 Hawtio 통합은 이전 버전의 Fuse 6에서 작동하지 않습니다.

Fuse에서 다음 항목에 대한 보안이 지원됩니다.

2.1.6.1. Fuse 6 내에서 웹 애플리케이션 보안

먼저 Red Hat Single Sign-On Karaf 기능을 설치해야 합니다. 다음으로 보안하려는 애플리케이션 유형에 따라 단계를 수행해야 합니다. 참조된 모든 웹 애플리케이션에서는 Red Hat Single Sign-On Cryostatty 인증기를 기본 Cryostat 서버에 삽입해야 합니다. 이를 수행하는 단계는 애플리케이션 유형에 따라 다릅니다. 자세한 내용은 아래에 설명되어 있습니다.

2.1.6.2. Keycloak 기능 설치

먼저 JBoss Fuse 환경에 keycloak 기능을 설치해야 합니다. keycloak 기능에는 Fuse 어댑터와 모든 타사 종속 항목이 포함되어 있습니다. Maven 리포지토리 또는 아카이브에서 설치할 수 있습니다.

2.1.6.2.1. Maven 리포지토리에서 설치

사전 요구 사항

  • 온라인 상태여야 하며 Maven 리포지토리에 액세스할 수 있어야 합니다.
  • Red Hat Single Sign-On의 경우 아티팩트를 설치할 수 있도록 적절한 Maven 리포지토리를 구성합니다. 자세한 내용은 JBoss Enterprise Maven 리포지토리 페이지를 참조하십시오.

    Maven 리포지토리가 https://maven.repository.redhat.com/ga/ 이라고 가정하고 $FUSE_HOME/etc/org.ops4j.pax.url.mvn.cfg 파일에 다음을 추가하고 지원되는 리포지토리 목록에 리포지토리를 추가합니다. 예를 들면 다음과 같습니다.

     org.ops4j.pax.url.mvn.repositories= \
        https://maven.repository.redhat.com/ga/@id=redhat.product.repo
        http://repo1.maven.org/maven2@id=maven.central.repo, \
        ...

절차

  1. JBoss Fuse 6.3.0 롤업 12를 시작합니다.
  2. Karaf 터미널 유형에서 다음을 수행합니다.

    features:addurl mvn:org.keycloak/keycloak-osgi-features/18.0.14.redhat-00001/xml/features
    features:install keycloak
  3. 또한 9 기능을 설치해야 할 수도 있습니다.

    features:install keycloak-jetty9-adapter
  4. 기능이 설치되었는지 확인합니다.

    features:list | grep keycloak
2.1.6.2.2. ZIP 번들에서 설치

이 설치 옵션은 오프라인 상태이거나 Maven을 사용하여 JAR 파일 및 기타 아티팩트를 가져오지 않으려는 경우에 유용합니다.

절차

  1. Sotware 다운로드 사이트에서 Red Hat Single Sign-On Fuse 어댑터 ZIP 아카이브를 다운로드합니다.
  2. JBoss Fuse의 루트 디렉터리에 압축을 풉니다. 그런 다음 종속 항목은 시스템 디렉터리 아래에 설치됩니다. 기존의 모든 files를 덮어쓸 수 있습니다.

    JBoss Fuse 6.3.0 롤업 12에 이 정보를 사용합니다.

    cd /path-to-fuse/jboss-fuse-6.3.0.redhat-254
    unzip -q /path-to-adapter-zip/rh-sso-7.6.9-fuse-adapter.zip
  3. Fuse를 시작하고 fuse/karaf 터미널에서 다음 명령을 실행합니다.

    features:addurl mvn:org.keycloak/keycloak-osgi-features/18.0.14.redhat-00001/xml/features
    features:install keycloak
  4. 해당 deltaty 어댑터를 설치합니다. JBoss Fuse 시스템 디렉터리에서 아티팩트를 직접 사용할 수 있으므로 Maven 리포지토리를 사용할 필요가 없습니다.

2.1.6.3. Classic WAR 애플리케이션 보안

절차

  1. /WEB-INF/web.xml 파일에서 필요한 내용을 선언합니다.

    • <security-constraint> 요소의 보안 제약 조건
    • <login-config> 요소의 로그인 구성
    • <security-role> 요소의 보안 역할.

      예를 들면 다음과 같습니다.

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://java.sun.com/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
               version="3.0">
      
          <module-name>customer-portal</module-name>
      
          <welcome-file-list>
              <welcome-file>index.html</welcome-file>
          </welcome-file-list>
      
          <security-constraint>
              <web-resource-collection>
                  <web-resource-name>Customers</web-resource-name>
                  <url-pattern>/customers/*</url-pattern>
              </web-resource-collection>
              <auth-constraint>
                  <role-name>user</role-name>
              </auth-constraint>
          </security-constraint>
      
          <login-config>
              <auth-method>BASIC</auth-method>
              <realm-name>does-not-matter</realm-name>
          </login-config>
      
          <security-role>
              <role-name>admin</role-name>
          </security-role>
          <security-role>
              <role-name>user</role-name>
          </security-role>
      </web-app>
  2. Authenticator가 포함된 jetty-web.xml 파일을 /WEB-INF/jetty-web.xml 파일에 추가합니다.

    예를 들면 다음과 같습니다.

    <?xml version="1.0"?>
    <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
     "http://www.eclipse.org/jetty/configure_9_0.dtd">
    <Configure class="org.eclipse.jetty.webapp.WebAppContext">
        <Get name="securityHandler">
            <Set name="authenticator">
                <New class="org.keycloak.adapters.jetty.KeycloakJettyAuthenticator">
                </New>
            </Set>
        </Get>
    </Configure>
  3. WAR의 /WEB-INF/ 디렉터리에 새 파일 keycloak.json을 생성합니다. 이 구성 파일의 형식은 Java Adapters Config 섹션에 설명되어 있습니다. 외부 어댑터 구성에 설명된 대로 이 파일을 외부에서 사용할 수도 있습니다.
  4. WAR 애플리케이션이 Import-Package 헤더 아래의 org.keycloak.adapters.jettyMETA-INF/MANIFEST.MF 파일에서 더 많은 패키지를 가져오는지 확인합니다. 프로젝트에서 maven-bundle-plugin 을 사용하면 매니페스트에 OSGI 헤더가 올바르게 생성됩니다. 패키지의 "*" 해상도는 애플리케이션 또는 블루프린트 또는 Spring 설명자에서 사용되지 않으므로 org.keycloak.adapters.jetty 패키지를 가져오지 않지만 jetty-web.xml 파일에서 사용됩니다.

    가져올 패키지 목록은 다음과 같습니다.

    org.keycloak.adapters.jetty;version="18.0.14.redhat-00001",
    org.keycloak.adapters;version="18.0.14.redhat-00001",
    org.keycloak.constants;version="18.0.14.redhat-00001",
    org.keycloak.util;version="18.0.14.redhat-00001",
    org.keycloak.*;version="18.0.14.redhat-00001",
    *;resolution:=optional
2.1.6.3.1. 외부 어댑터 구성

keycloak.json 어댑터 구성 파일을 WAR 애플리케이션 내에 번들링하지 않고 대신 외부에서 사용할 수 있고 이름 지정 규칙을 기반으로 로드되는 경우 이 구성 방법을 사용합니다.

기능을 활성화하려면 이 섹션을 /WEB_INF/web.xml 파일에 추가하십시오.

<context-param>
    <param-name>keycloak.config.resolver</param-name>
    <param-value>org.keycloak.adapters.osgi.PathBasedKeycloakConfigResolver</param-value>
</context-param>

해당 구성 요소는 keycloak.config 또는 karaf.etc java 속성을 사용하여 기본 폴더를 검색하여 구성을 찾습니다. 그런 다음 해당 폴더 중 하나에서 < your_web_context>-keycloak.json 이라는 파일을 검색합니다.

예를 들어 웹 애플리케이션에 컨텍스트 my-portal 이 있는 경우 $FUSE_HOME/etc/my-portal-keycloak.json 파일에서 어댑터 구성이 로드됩니다.

2.1.6.4. OSGI 서비스로 배포된 서블릿 보안

기존 WAR 애플리케이션으로 배포되지 않은 OSGI 번들 프로젝트 내부에 서블릿 클래스가 있는 경우 이 방법을 사용할 수 있습니다. Fuse는 Pax Web whiteboard Extender를 사용하여 웹 애플리케이션과 같은 서블릿을 배포합니다.

절차

  1. Red Hat Single Sign-On은 org.keycloak.adapters.osgi.undertow.PaxWebIntegrationService 를 제공하여 애플리케이션에 대한 jetty-web.xml 삽입 및 보안 제약 조건을 구성할 수 있습니다. 애플리케이션 내부에 OSGI-INF/blueprint/blueprint.xml 파일에서 이러한 서비스를 선언해야 합니다. 서블릿은 이에 따라 달라야 합니다. 예제 구성:

    <?xml version="1.0" encoding="UTF-8"?>
    <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0
               http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
    
        <!-- Using jetty bean just for the compatibility with other fuse services -->
        <bean id="servletConstraintMapping" class="org.eclipse.jetty.security.ConstraintMapping">
            <property name="constraint">
                <bean class="org.eclipse.jetty.util.security.Constraint">
                    <property name="name" value="cst1"/>
                    <property name="roles">
                        <list>
                            <value>user</value>
                        </list>
                    </property>
                    <property name="authenticate" value="true"/>
                    <property name="dataConstraint" value="0"/>
                </bean>
            </property>
            <property name="pathSpec" value="/product-portal/*"/>
        </bean>
    
        <bean id="keycloakPaxWebIntegration" class="org.keycloak.adapters.osgi.PaxWebIntegrationService"
              init-method="start" destroy-method="stop">
            <property name="jettyWebXmlLocation" value="/WEB-INF/jetty-web.xml" />
            <property name="bundleContext" ref="blueprintBundleContext" />
            <property name="constraintMappings">
                <list>
                    <ref component-id="servletConstraintMapping" />
                </list>
            </property>
        </bean>
    
        <bean id="productServlet" class="org.keycloak.example.ProductPortalServlet" depends-on="keycloakPaxWebIntegration">
        </bean>
    
        <service ref="productServlet" interface="javax.servlet.Servlet">
            <service-properties>
                <entry key="alias" value="/product-portal" />
                <entry key="servlet-name" value="ProductServlet" />
                <entry key="keycloak.config.file" value="/keycloak.json" />
            </service-properties>
        </service>
    
    </blueprint>
    • Classic WAR 애플리케이션 섹션과 같이 프로젝트 내부에 WEB-INF 디렉토리를 사용하고(프로젝트가 웹 애플리케이션이 아니더라도) /gateway-INF/jetty-web.xml/WEB-INF/keycloak.json 파일을 생성해야 할 수 있습니다. security-constraints가 블루프린트 구성 파일에 선언되므로 web.xml 파일이 필요하지 않습니다.
  2. META-INF/MANIFEST.MFImport-Package 에는 최소한 다음 가져오기가 포함되어야 합니다.

    org.keycloak.adapters.jetty;version="18.0.14.redhat-00001",
    org.keycloak.adapters;version="18.0.14.redhat-00001",
    org.keycloak.constants;version="18.0.14.redhat-00001",
    org.keycloak.util;version="18.0.14.redhat-00001",
    org.keycloak.*;version="18.0.14.redhat-00001",
    *;resolution:=optional

2.1.6.5. Apache Camel 애플리케이션 보안

KeycloakJettyAuthenticator 및 적절한 보안 제약 조건을 사용하여 securityHandler를 추가하여 camel-jetty 구성 요소로 구현된 Apache Camel 엔드포인트를 보호할 수 있습니다. 다음과 같은 구성으로 Camel 애플리케이션에 OSGI-INF/blueprint/blueprint.xml 파일을 추가할 수 있습니다. 역할, 보안 제약 조건 매핑 및 Red Hat Single Sign-On 어댑터 구성은 환경과 필요에 따라 약간 다를 수 있습니다.

예를 들면 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:camel="http://camel.apache.org/schema/blueprint"
           xsi:schemaLocation="
       http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
       http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">

    <bean id="kcAdapterConfig" class="org.keycloak.representations.adapters.config.AdapterConfig">
        <property name="realm" value="demo"/>
        <property name="resource" value="admin-camel-endpoint"/>
        <property name="bearerOnly" value="true"/>
        <property name="authServerUrl" value="http://localhost:8080/auth" />
        <property name="sslRequired" value="EXTERNAL"/>
    </bean>

    <bean id="keycloakAuthenticator" class="org.keycloak.adapters.jetty.KeycloakJettyAuthenticator">
        <property name="adapterConfig" ref="kcAdapterConfig"/>
    </bean>

    <bean id="constraint" class="org.eclipse.jetty.util.security.Constraint">
        <property name="name" value="Customers"/>
        <property name="roles">
            <list>
                <value>admin</value>
            </list>
        </property>
        <property name="authenticate" value="true"/>
        <property name="dataConstraint" value="0"/>
    </bean>

    <bean id="constraintMapping" class="org.eclipse.jetty.security.ConstraintMapping">
        <property name="constraint" ref="constraint"/>
        <property name="pathSpec" value="/*"/>
    </bean>

    <bean id="securityHandler" class="org.eclipse.jetty.security.ConstraintSecurityHandler">
        <property name="authenticator" ref="keycloakAuthenticator" />
        <property name="constraintMappings">
            <list>
                <ref component-id="constraintMapping" />
            </list>
        </property>
        <property name="authMethod" value="BASIC"/>
        <property name="realmName" value="does-not-matter"/>
    </bean>

    <bean id="sessionHandler" class="org.keycloak.adapters.jetty.spi.WrappingSessionHandler">
        <property name="handler" ref="securityHandler" />
    </bean>

    <bean id="helloProcessor" class="org.keycloak.example.CamelHelloProcessor" />

    <camelContext id="blueprintContext"
                  trace="false"
                  xmlns="http://camel.apache.org/schema/blueprint">
        <route id="httpBridge">
            <from uri="jetty:http://0.0.0.0:8383/admin-camel-endpoint?handlers=sessionHandler&amp;matchOnUriPrefix=true" />
            <process ref="helloProcessor" />
            <log message="The message from camel endpoint contains ${body}"/>
        </route>
    </camelContext>

</blueprint>
  • META-INF/MANIFEST의 Import-Package.MF 에는 다음 가져오기가 포함되어야 합니다.
javax.servlet;version="[3,4)",
javax.servlet.http;version="[3,4)",
org.apache.camel.*,
org.apache.camel;version="[2.13,3)",
org.eclipse.jetty.security;version="[9,10)",
org.eclipse.jetty.server.nio;version="[9,10)",
org.eclipse.jetty.util.security;version="[9,10)",
org.keycloak.*;version="18.0.14.redhat-00001",
org.osgi.service.blueprint,
org.osgi.service.blueprint.container,
org.osgi.service.event,

2.1.6.6. Camel RestDSL

Camel RestDSL은 유창한 방식으로 REST 엔드포인트를 정의하는 데 사용되는 Camel 기능입니다. 그러나 특정 구현 클래스를 계속 사용하고 Red Hat Single Sign-On과 통합하는 방법에 대한 지침을 제공해야 합니다.

통합 메커니즘을 구성하는 방법은 RestDSL 정의 경로를 구성하는 Camel 구성 요소에 따라 다릅니다.

다음 예제에서는 이전 블루프린트 예제에 정의된 일부 빈에 대한 참조와 함께 Cryostat 구성 요소를 사용하여 통합을 구성하는 방법을 보여줍니다.

<bean id="securityHandlerRest" class="org.eclipse.jetty.security.ConstraintSecurityHandler">
    <property name="authenticator" ref="keycloakAuthenticator" />
    <property name="constraintMappings">
        <list>
            <ref component-id="constraintMapping" />
        </list>
    </property>
    <property name="authMethod" value="BASIC"/>
    <property name="realmName" value="does-not-matter"/>
</bean>

<bean id="sessionHandlerRest" class="org.keycloak.adapters.jetty.spi.WrappingSessionHandler">
    <property name="handler" ref="securityHandlerRest" />
</bean>


<camelContext id="blueprintContext"
              trace="false"
              xmlns="http://camel.apache.org/schema/blueprint">

    <restConfiguration component="jetty" contextPath="/restdsl"
                       port="8484">
        <!--the link with Keycloak security handlers happens here-->
        <endpointProperty key="handlers" value="sessionHandlerRest"></endpointProperty>
        <endpointProperty key="matchOnUriPrefix" value="true"></endpointProperty>
    </restConfiguration>

    <rest path="/hello" >
        <description>Hello rest service</description>
        <get uri="/{id}" outType="java.lang.String">
            <description>Just an helllo</description>
            <to uri="direct:justDirect" />
        </get>

    </rest>

    <route id="justDirect">
        <from uri="direct:justDirect"/>
        <process ref="helloProcessor" />
        <log message="RestDSL correctly invoked ${body}"/>
        <setBody>
            <constant>(__This second sentence is returned from a Camel RestDSL endpoint__)</constant>
        </setBody>
    </route>

</camelContext>

2.1.6.7. 별도의 192.0.2.ty 엔진에서 Apache CXF 엔드포인트 보안

절차

별도의 Fromty 엔진에서 Red Hat Single Sign-On에서 보안한 CXF 엔드포인트를 실행하려면 다음 절차를 수행합니다.

  1. 애플리케이션에 META-INF/spring/beans.xml 을 추가하고, 이 경우 KeycloakJettyAuthenticator가 삽입된 KeycloakJettyAuthenticator 와 함께 httpj:engine-factory 를 선언합니다. CFX Cryostat-WS 애플리케이션의 구성은 다음과 유사할 수 있습니다.

    <?xml version="1.0" encoding="UTF-8"?>
    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:jaxws="http://cxf.apache.org/jaxws"
           xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
            http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
            http://cxf.apache.org/transports/http-jetty/configuration http://cxf.apache.org/schemas/configuration/http-jetty.xsd">
    
        <import resource="classpath:META-INF/cxf/cxf.xml" />
    
        <bean id="kcAdapterConfig" class="org.keycloak.representations.adapters.config.AdapterConfig">
            <property name="realm" value="demo"/>
            <property name="resource" value="custom-cxf-endpoint"/>
            <property name="bearerOnly" value="true"/>
            <property name="authServerUrl" value="http://localhost:8080/auth" />
            <property name="sslRequired" value="EXTERNAL"/>
        </bean>
    
        <bean id="keycloakAuthenticator" class="org.keycloak.adapters.jetty.KeycloakJettyAuthenticator">
            <property name="adapterConfig">
                <ref local="kcAdapterConfig" />
            </property>
        </bean>
    
        <bean id="constraint" class="org.eclipse.jetty.util.security.Constraint">
            <property name="name" value="Customers"/>
            <property name="roles">
                <list>
                    <value>user</value>
                </list>
            </property>
            <property name="authenticate" value="true"/>
            <property name="dataConstraint" value="0"/>
        </bean>
    
        <bean id="constraintMapping" class="org.eclipse.jetty.security.ConstraintMapping">
            <property name="constraint" ref="constraint"/>
            <property name="pathSpec" value="/*"/>
        </bean>
    
        <bean id="securityHandler" class="org.eclipse.jetty.security.ConstraintSecurityHandler">
            <property name="authenticator" ref="keycloakAuthenticator" />
            <property name="constraintMappings">
                <list>
                    <ref local="constraintMapping" />
                </list>
            </property>
            <property name="authMethod" value="BASIC"/>
            <property name="realmName" value="does-not-matter"/>
        </bean>
    
        <httpj:engine-factory bus="cxf" id="kc-cxf-endpoint">
            <httpj:engine port="8282">
                <httpj:handlers>
                    <ref local="securityHandler" />
                </httpj:handlers>
                <httpj:sessionSupport>true</httpj:sessionSupport>
            </httpj:engine>
        </httpj:engine-factory>
    
        <jaxws:endpoint
                        implementor="org.keycloak.example.ws.ProductImpl"
                        address="http://localhost:8282/ProductServiceCF" depends-on="kc-cxf-endpoint" />
    
    </beans>

    CXF Cryostat-RS 애플리케이션의 경우 engine-factory에 따라 끝점의 구성에 차이가 있을 수 있습니다.

    <jaxrs:server serviceClass="org.keycloak.example.rs.CustomerService" address="http://localhost:8282/rest"
        depends-on="kc-cxf-endpoint">
        <jaxrs:providers>
            <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
        </jaxrs:providers>
    </jaxrs:server>
  2. META-INF/MANIFEST.MFImport-Package 에는 이러한 가져오기가 포함되어야 합니다.
META-INF.cxf;version="[2.7,3.2)",
META-INF.cxf.osgi;version="[2.7,3.2)";resolution:=optional,
org.apache.cxf.bus;version="[2.7,3.2)",
org.apache.cxf.bus.spring;version="[2.7,3.2)",
org.apache.cxf.bus.resource;version="[2.7,3.2)",
org.apache.cxf.transport.http;version="[2.7,3.2)",
org.apache.cxf.*;version="[2.7,3.2)",
org.springframework.beans.factory.config,
org.eclipse.jetty.security;version="[9,10)",
org.eclipse.jetty.util.security;version="[9,10)",
org.keycloak.*;version="18.0.14.redhat-00001"

2.1.6.8. 기본 CXF 엔진에서 Apache CXF 끝점 보안

일부 서비스는 시작 시 배포된 서블릿과 함께 자동으로 제공됩니다. 이러한 서비스 중 하나는 http://localhost:8181/cxf 컨텍스트에서 실행되는 CXF 서블릿입니다. 이러한 끝점을 보호하는 것은 복잡할 수 있습니다. Red Hat Single Sign-On이 현재 사용 중인 한 가지 접근 방식은 시작 시 기본 제공 서블릿을 배포 취소하는 ServletReregistrationService로, Red Hat Single Sign-On이 보호하는 컨텍스트에 재배포할 수 있습니다.

애플리케이션 내의 구성 파일 OSGI-INF/blueprint/blueprint.xml 은 아래 파일과 유사할 수 있습니다. 애플리케이션에 고유한 엔드포인트인 Cryostat-RS customerservice 엔드포인트를 추가하지만 더 중요한 것은 전체 /cxf 컨텍스트를 보호합니다.

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs"
           xsi:schemaLocation="
		http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
		http://cxf.apache.org/blueprint/jaxrs http://cxf.apache.org/schemas/blueprint/jaxrs.xsd">

    <!-- JAXRS Application -->

    <bean id="customerBean" class="org.keycloak.example.rs.CxfCustomerService" />

    <jaxrs:server id="cxfJaxrsServer" address="/customerservice">
        <jaxrs:providers>
            <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
        </jaxrs:providers>
        <jaxrs:serviceBeans>
            <ref component-id="customerBean" />
        </jaxrs:serviceBeans>
    </jaxrs:server>


    <!-- Securing of whole /cxf context by unregister default cxf servlet from paxweb and re-register with applied security constraints -->

    <bean id="cxfConstraintMapping" class="org.eclipse.jetty.security.ConstraintMapping">
        <property name="constraint">
            <bean class="org.eclipse.jetty.util.security.Constraint">
                <property name="name" value="cst1"/>
                <property name="roles">
                    <list>
                        <value>user</value>
                    </list>
                </property>
                <property name="authenticate" value="true"/>
                <property name="dataConstraint" value="0"/>
            </bean>
        </property>
        <property name="pathSpec" value="/cxf/*"/>
    </bean>

    <bean id="cxfKeycloakPaxWebIntegration" class="org.keycloak.adapters.osgi.PaxWebIntegrationService"
          init-method="start" destroy-method="stop">
        <property name="bundleContext" ref="blueprintBundleContext" />
        <property name="jettyWebXmlLocation" value="/WEB-INF/jetty-web.xml" />
        <property name="constraintMappings">
            <list>
                <ref component-id="cxfConstraintMapping" />
            </list>
        </property>
    </bean>

    <bean id="defaultCxfReregistration" class="org.keycloak.adapters.osgi.ServletReregistrationService" depends-on="cxfKeycloakPaxWebIntegration"
          init-method="start" destroy-method="stop">
        <property name="bundleContext" ref="blueprintBundleContext" />
        <property name="managedServiceReference">
            <reference interface="org.osgi.service.cm.ManagedService" filter="(service.pid=org.apache.cxf.osgi)" timeout="5000"  />
        </property>
    </bean>

</blueprint>

결과적으로 기본 CXF HTTP 대상에서 실행되는 다른 모든 CXF 서비스도 보호됩니다. 마찬가지로 애플리케이션이 배포 취소되면 전체 /cxf 컨텍스트도 안전하지 않습니다. 이러한 이유로 별도의 CXF 엔진의 Secure CXF Application에 설명된 대로 애플리케이션에 고유한 Cryostat 엔진 을 사용하면 각 개별 애플리케이션에 대한 보안을 보다 효과적으로 제어할 수 있습니다.

  • WEB-INF 디렉토리는 프로젝트 내부에 있어야 할 수 있습니다(프로젝트가 웹 애플리케이션이 아닌 경우에도). 또한 Classic WAR 애플리케이션에서 와 유사한 방식으로 /WEB-INF/jetty-web.xml/WEB-INF/keycloak.json 파일을 편집해야 할 수도 있습니다. 보안 제약 조건이 블루프린트 구성 파일에 선언되므로 web.xml 파일이 필요하지 않습니다.
  • META-INF/MANIFEST.MFImport-Package 에는 다음 가져오기가 포함되어야 합니다.
META-INF.cxf;version="[2.7,3.2)",
META-INF.cxf.osgi;version="[2.7,3.2)";resolution:=optional,
org.apache.cxf.transport.http;version="[2.7,3.2)",
org.apache.cxf.*;version="[2.7,3.2)",
com.fasterxml.jackson.jaxrs.json;version="[2.5,3)",
org.eclipse.jetty.security;version="[9,10)",
org.eclipse.jetty.util.security;version="[9,10)",
org.keycloak.*;version="18.0.14.redhat-00001",
org.keycloak.adapters.jetty;version="18.0.14.redhat-00001",
*;resolution:=optional

2.1.6.9. Fuse 관리 서비스 보안

2.1.6.9.1. SSH 인증으로 Fuse 터미널 사용

Red Hat Single Sign-On은 주로 웹 애플리케이션의 인증에 대한 사용 사례를 다루지만 다른 웹 서비스 및 애플리케이션이 Red Hat Single Sign-On으로 보호되는 경우 Red Hat Single Sign-On 인증 정보를 사용한 SSH와 같은 비 웹 관리 서비스를 보호하는 것이 가장 좋습니다. Red Hat Single Sign-On에 대한 원격 연결을 허용하고 리소스 소유자 암호 자격 증명을 기반으로 인증 정보를 확인하는 JAAS 로그인 모듈을 사용하여 이 작업을 수행할 수 있습니다.

SSH 인증을 활성화하려면 다음 절차를 수행합니다.

절차

  1. Red Hat Single Sign-On에서 SSH 인증에 사용할 클라이언트(예: ssh-jmx-admin-client)를 만듭니다. 이 클라이언트에는 직접 액세스 권한 부여가 설정되어 있어야 합니다.
  2. $FUSE_HOME/etc/org.apache.karaf.shell.cfg 파일에서 이 속성을 업데이트하거나 지정합니다.

    sshRealm=keycloak
  3. 환경 및 Red Hat Single Sign-On 클라이언트 설정에 따라 다음과 유사한 콘텐츠를 사용하여 $FUSE_HOME/etc/keycloak-direct-access.json 파일을 추가합니다.

    {
        "realm": "demo",
        "resource": "ssh-jmx-admin-client",
        "ssl-required" : "external",
        "auth-server-url" : "http://localhost:8080/auth",
        "credentials": {
            "secret": "password"
        }
    }

    이 파일은 SSH 인증을 위해 keycloak JAAS 영역의 JAAS DirectAccessGrantsLoginModule에서 사용하는 클라이언트 애플리케이션 구성을 지정합니다.

  4. Fuse를 시작하고 keycloak JAAS 영역을 설치합니다. 가장 쉬운 방법은 JAAS 영역이 사전 정의된 keycloak-jaas 기능을 설치하는 것입니다. 순위가 높은 자체 keycloak JAAS 영역을 사용하여 기능의 사전 정의된 영역을 재정의할 수 있습니다. 자세한 내용은 JBoss Fuse 설명서 를 참조하십시오.

    Fuse 터미널에서 다음 명령을 사용하십시오.

    features:addurl mvn:org.keycloak/keycloak-osgi-features/18.0.14.redhat-00001/xml/features
    features:install keycloak-jaas
  5. 터미널에 다음을 입력하여 SSH를 admin 사용자로 사용하여 로그인합니다.

    ssh -o PubkeyAuthentication=no -p 8101 admin@localhost
  6. 암호 를 사용하여 로그인합니다.
참고

일부 이후 운영 체제에서는 SSH 명령의 -o 옵션 -o HostKeyAlgorithms=+ssh-dss 를 사용해야 할 수도 있습니다. 이후 SSH 클라이언트는 기본적으로 ssh-dss 알고리즘 사용을 허용하지 않기 때문입니다. 그러나 기본적으로 현재 JBoss Fuse 6.3.0 롤업 12에서 사용됩니다.

사용자에게 모든 작업을 수행하거나 작업 하위 집합을 수행하려면 영역 역할 admin 이 있어야 합니다(예: 사용자가 읽기 전용 Karaf 명령만 실행하도록 제한하는 뷰어 역할). 사용 가능한 역할은 $FUSE_HOME/etc/org.apache.karaf.shell.cfg 또는 $FUSE_HOME/etc/system.properties 에서 구성됩니다.

2.1.6.9.2. Cryostat 인증 사용

jconsole 또는 다른 외부 툴을 사용하여 RMI를 통해 remotely에 연결하려는 경우 Cryostat 인증이 필요할 수 있습니다. 그렇지 않으면 jolokia 에이전트가 기본적으로 hawt.io에 설치되므로 hawt.io/jolokia를 사용하는 것이 더 좋습니다. 자세한 내용은 Hawtio 관리 콘솔을 참조하십시오.

절차

  1. $FUSE_HOME/etc/org.apache.karaf.management.cfg 파일에서 jmxRealm 속성을 다음과 같이 변경합니다.

    jmxRealm=keycloak
  2. 위의 SSH 섹션에 설명된 대로 keycloak-jaas 기능을 설치하고 $FUSE_HOME/etc/keycloak-direct-access.json 파일을 구성합니다.
  3. jconsole에서는 다음과 같은 URL을 사용할 수 있습니다.
service:jmx:rmi://localhost:44444/jndi/rmi://localhost:1099/karaf-root

및 인증 정보: admin/password(사용자 환경에 따라 관리자 권한이 있는 사용자 기반).

2.1.6.10. Hawtio 관리 콘솔 보안

Red Hat Single Sign-On을 사용하여 Hawtio 관리 콘솔을 보호하려면 다음 절차를 수행합니다.

절차

  1. $FUSE_HOME/etc/system.properties 파일에 이러한 속성을 추가합니다.

    hawtio.keycloakEnabled=true
    hawtio.realm=keycloak
    hawtio.keycloakClientConfig=file://${karaf.base}/etc/keycloak-hawtio-client.json
    hawtio.rolePrincipalClasses=org.keycloak.adapters.jaas.RolePrincipal,org.apache.karaf.jaas.boot.principal.RolePrincipal
  2. 해당 영역의 Red Hat Single Sign-On 관리 콘솔에서 클라이언트를 생성합니다. 예를 들어 Red Hat Single Sign-On 데모 영역에서 클라이언트 hawtio-client 를 생성하고, 액세스 유형으로 public 을 지정하고, Hawtio: http://localhost:8181/hawtio/*를 가리키는 리디렉션 URI를 지정합니다. 또한 해당 Web Origin이 구성되어 있어야 합니다(이 경우 http://localhost:8181).
  3. 아래 예제와 유사한 내용을 사용하여 $FUSE_HOME/etc 디렉터리에 keycloak-hawtio-client.json 파일을 생성합니다. Red Hat Single Sign-On 환경에 따라 ,리소스, auth-server-url 속성을 변경합니다. resource 속성은 이전 단계에서 생성한 클라이언트를 가리켜야 합니다. 이 파일은 클라이언트(Hawtio JavaScript 애플리케이션) 측에서 사용합니다.
{
  "realm" : "demo",
  "resource" : "hawtio-client",
  "auth-server-url" : "http://localhost:8080/auth",
  "ssl-required" : "external",
  "public-client" : true
}
  1. 아래 예제와 유사한 내용을 사용하여 $FUSE_HOME/etc dicrectory에 keycloak-hawtio.json 파일을 생성합니다. Red Hat Single Sign-On 환경에 따라 realmauth-server-url 속성을 변경합니다. 이 파일은 서버의 어댑터 (JAAS 로그인 모듈) 측에서 사용됩니다.

    {
      "realm" : "demo",
      "resource" : "jaas",
      "bearer-only" : true,
      "auth-server-url" : "http://localhost:8080/auth",
      "ssl-required" : "external",
      "use-resource-role-mappings": false,
      "principal-attribute": "preferred_username"
    }
  2. JBoss Fuse 6.3.0 롤업 12를 시작하고 아직 수행하지 않은 경우 키클로킹 기능을 설치합니다. Karaf 터미널의 명령은 다음 예와 유사합니다.

    features:addurl mvn:org.keycloak/keycloak-osgi-features/18.0.14.redhat-00001/xml/features
    features:install keycloak
  3. http://localhost:8181/hawtio 으로 이동하여 Red Hat Single Sign-On 영역에서 사용자로 로그인합니다.

    사용자가 Hawtio에 성공적으로 인증하려면 적절한 realm 역할이 있어야 합니다. 사용 가능한 역할은 hawtio.roles$FUSE_HOME/etc/system.properties 파일에서 구성됩니다.

2.1.6.10.1. JBoss EAP 6.4에서 Hawtio 보안

사전 요구 사항

Hawtio 관리 콘솔 보안에 설명된 대로 Red Hat Single Sign-On을 설정합니다. 다음과 같이 가정합니다.

  • Red Hat Single Sign-On 영역 데모 및 클라이언트 hawtio-client가 있습니다.
  • Red Hat Single Sign-On은 localhost:8080에서 실행됩니다.
  • 배포된 Hawtio가 있는 JBoss EAP 6.4 서버는 localhost:8181 에서 실행됩니다. 이 서버가 있는 디렉터리를 $EAP_HOME 이라고 합니다.

절차

  1. hawtio-wildfly-1.4.0.redhat-630396.war 아카이브를 $EAP_HOME/standalone/configuration 디렉터리에 복사합니다. Hawtio 배포에 대한 자세한 내용은 Fuse Hawtio 설명서 를 참조하십시오.
  2. 위 콘텐츠가 포함된 keycloak-hawtio.jsonkeycloak-hawtio-client.json 파일을 $EAP_HOME/standalone/configuration 디렉터리에 복사합니다.
  3. JBoss 어댑터 설명서에 설명된 대로 Red Hat Single Sign-On 어댑터 하위 시스템을 JBoss EAP 6.4 서버에 설치합니다.
  4. $EAP_HOME/standalone/configuration/standalone.xml 파일에서 다음 예와 같이 시스템 속성을 구성합니다.

    <extensions>
    ...
    </extensions>
    
    <system-properties>
        <property name="hawtio.authenticationEnabled" value="true" />
        <property name="hawtio.realm" value="hawtio" />
        <property name="hawtio.roles" value="admin,viewer" />
        <property name="hawtio.rolePrincipalClasses" value="org.keycloak.adapters.jaas.RolePrincipal" />
        <property name="hawtio.keycloakEnabled" value="true" />
        <property name="hawtio.keycloakClientConfig" value="${jboss.server.config.dir}/keycloak-hawtio-client.json" />
        <property name="hawtio.keycloakServerConfig" value="${jboss.server.config.dir}/keycloak-hawtio.json" />
    </system-properties>
  5. security-domains 섹션의 동일한 파일에 Hawtio 영역을 추가합니다.

    <security-domain name="hawtio" cache-type="default">
        <authentication>
            <login-module code="org.keycloak.adapters.jaas.BearerTokenLoginModule" flag="required">
                <module-option name="keycloak-config-file" value="${hawtio.keycloakServerConfig}"/>
            </login-module>
        </authentication>
    </security-domain>
  6. secure-deployment 섹션 hawtio 를 어댑터 하위 시스템에 추가합니다. 이렇게 하면 Hawtio WAR에서 JAAS 로그인 모듈 클래스를 찾을 수 있습니다.

    <subsystem xmlns="urn:jboss:domain:keycloak:1.1">
        <secure-deployment name="hawtio-wildfly-1.4.0.redhat-630396.war" />
    </subsystem>
  7. Hawtio를 사용하여 JBoss EAP 6.4 서버를 다시 시작하십시오.

    cd $EAP_HOME/bin
    ./standalone.sh -Djboss.socket.binding.port-offset=101
  8. http://localhost:8181/hawtio 에서 Hawtio에 액세스합니다. Red Hat Single Sign-On으로 보호됩니다.

2.1.7. JBoss Fuse 7 어댑터

Red Hat Single Sign-On은 JBoss Fuse 7 에서 실행되는 웹 애플리케이션 보안을 지원합니다.

JBoss Fuse 7은 JBoss Fuse 7.4.0과 기본적으로 동일한 JBoss EAP 7 Adapter 와 동일한 기능을 활용합니다. 이 어댑터는 다양한 종류의 웹 애플리케이션을 실행하는 데 사용됩니다.

주의

지원되는 유일한 버전의 Fuse 7은 최신 버전입니다. 이전 버전의 Fuse 7을 사용하는 경우 일부 기능이 제대로 작동하지 않을 수 있습니다. 특히 7.12.0 미만의 Fuse 7 버전에서는 통합이 작동하지 않습니다.

Fuse에서 다음 항목에 대한 보안이 지원됩니다.

  • Pax Web comes Extender를 사용하여 Fuse에 배포된 클래식 WAR 애플리케이션
  • Pax Web whiteboard Extender를 사용하여 Fuse에 OSGI 서비스로 배포되고 표준 OSGi Enterprise HTTP Service인 org.osgi.service.http.HttpService#registerServlet()을 통해 등록된 서블릿
  • Camel Cryostat 구성 요소로 실행되는 Apache Camel Cryostat 끝점
  • 자체적인 Cryostat 엔진에서 실행되는 Apache CXF 끝점
  • CXF 서블릿에서 제공하는 기본 엔진에서 실행되는 Apache CXF 끝점
  • SSH 및 Cryostat 관리자 액세스
  • Hawtio 관리 콘솔

2.1.7.1. Fuse 7 내부의 웹 애플리케이션 보안

먼저 Red Hat Single Sign-On Karaf 기능을 설치해야 합니다. 다음으로 보안하려는 애플리케이션 유형에 따라 단계를 수행해야 합니다. 참조된 모든 웹 애플리케이션에서는 Red Hat Single Sign-On Cryostat 인증 메커니즘을 기본 웹 서버에 삽입해야 합니다. 이를 수행하는 단계는 애플리케이션 유형에 따라 다릅니다. 자세한 내용은 아래에 설명되어 있습니다.

2.1.7.2. Keycloak 기능 설치

먼저 JBoss Fuse 환경에서 keycloak-pax-http-undertowkeycloak-jaas 기능을 설치해야 합니다. keycloak-pax-http-undertow 기능에는 Fuse 어댑터 및 모든 타사 종속 항목이 포함되어 있습니다. keycloak-jaas 에는 SSH 및 Cryostat 인증에 사용되는 JAAS 모듈이 포함되어 있습니다. Maven 리포지토리 또는 아카이브에서 설치할 수 있습니다.

2.1.7.2.1. Maven 리포지토리에서 설치

사전 요구 사항

  • 온라인 상태여야 하며 Maven 리포지토리에 액세스할 수 있어야 합니다.
  • Red Hat Single Sign-On의 경우 아티팩트를 설치할 수 있도록 적절한 Maven 리포지토리를 구성합니다. 자세한 내용은 JBoss Enterprise Maven 리포지토리 페이지를 참조하십시오.
  • Maven 리포지토리가 https://maven.repository.redhat.com/ga/ 이라고 가정하고 $FUSE_HOME/etc/org.ops4j.pax.url.mvn.cfg 파일에 다음을 추가하고 지원되는 리포지토리 목록에 리포지토리를 추가합니다. 예를 들면 다음과 같습니다.

    config:edit org.ops4j.pax.url.mvn
    config:property-append org.ops4j.pax.url.mvn.repositories ,https://maven.repository.redhat.com/ga/@id=redhat.product.repo
    config:update
    
    feature:repo-refresh

절차

  1. Start JBoss Fuse 7.4.0
  2. Karaf 터미널에서 다음을 입력합니다.

    feature:repo-add mvn:org.keycloak/keycloak-osgi-features/18.0.14.redhat-00001/xml/features
    feature:install keycloak-pax-http-undertow keycloak-jaas
  3. 또한 Cryostat 기능을 설치해야 할 수도 있습니다.

    feature:install pax-web-http-undertow
  4. 기능이 설치되었는지 확인합니다.

    feature:list | grep keycloak
2.1.7.2.2. ZIP 번들에서 설치

이 기능은 오프라인 상태이거나 Maven을 사용하여 JAR 파일 및 기타 아티팩트를 가져오지 않으려는 경우에 유용합니다.

절차

  1. Sotware 다운로드 사이트에서 Red Hat Single Sign-On Fuse 어댑터 ZIP 아카이브를 다운로드합니다.
  2. JBoss Fuse의 루트 디렉터리에 압축을 풉니다. 그런 다음 종속 항목은 시스템 디렉터리 아래에 설치됩니다. 기존의 모든 files를 덮어쓸 수 있습니다.

    JBoss Fuse 7.4.0에서 이 기능을 사용하십시오.

    cd /path-to-fuse/fuse-karaf-7.z
    unzip -q /path-to-adapter-zip/rh-sso-7.6.9-fuse-adapter.zip
  3. Fuse를 시작하고 fuse/karaf 터미널에서 다음 명령을 실행합니다.

    feature:repo-add mvn:org.keycloak/keycloak-osgi-features/18.0.14.redhat-00001/xml/features
    feature:install keycloak-pax-http-undertow keycloak-jaas
  4. 해당 Cryostat 어댑터를 설치합니다. JBoss Fuse 시스템 디렉터리에서 아티팩트를 직접 사용할 수 있으므로 Maven 리포지토리를 사용할 필요가 없습니다.

2.1.7.3. Classic WAR 애플리케이션 보안

절차

  1. /WEB-INF/web.xml 파일에서 필요한 내용을 선언합니다.

    • <security-constraint> 요소의 보안 제약 조건
    • <login-config> 요소의 로그인 구성입니다. < auth-method>가 KEYCLOAK 인지 확인합니다.
    • <security-role> 요소의 보안 역할

      예를 들면 다음과 같습니다.

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://java.sun.com/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
               version="3.0">
      
          <module-name>customer-portal</module-name>
      
          <welcome-file-list>
              <welcome-file>index.html</welcome-file>
          </welcome-file-list>
      
          <security-constraint>
              <web-resource-collection>
                  <web-resource-name>Customers</web-resource-name>
                  <url-pattern>/customers/*</url-pattern>
              </web-resource-collection>
              <auth-constraint>
                  <role-name>user</role-name>
              </auth-constraint>
          </security-constraint>
      
          <login-config>
              <auth-method>KEYCLOAK</auth-method>
              <realm-name>does-not-matter</realm-name>
          </login-config>
      
          <security-role>
              <role-name>admin</role-name>
          </security-role>
          <security-role>
              <role-name>user</role-name>
          </security-role>
      </web-app>
  2. WAR의 /WEB-INF/ 디렉터리에 새 파일 keycloak.json을 생성합니다. 이 구성 파일의 형식은 Java Adapters Config 섹션에 설명되어 있습니다. 외부 어댑터 구성에 설명된 대로 이 파일을 외부에서 사용할 수도 있습니다.

    예를 들면 다음과 같습니다.

    {
        "realm": "demo",
        "resource": "customer-portal",
        "auth-server-url": "http://localhost:8080/auth",
        "ssl-required" : "external",
        "credentials": {
            "secret": "password"
        }
    }
  3. Fuse 6 어댑터와 달리 MANIFEST.MF에는 특별한 OSGi 가져오기가 필요하지 않습니다.
2.1.7.3.1. 구성 확인자

keycloak.json 어댑터 구성 파일은 번들(기본 동작) 또는 파일 시스템의 디렉터리에 저장할 수 있습니다. 구성 파일의 실제 소스를 지정하려면 keycloak.config.resolver 배포 매개변수를 원하는 구성 확인자 클래스로 설정합니다. 예를 들어 클래식 WAR 애플리케이션에서 다음과 같이 web.xml 파일에서 keycloak.config.resolver 컨텍스트 매개변수를 설정합니다.

<context-param>
    <param-name>keycloak.config.resolver</param-name>
    <param-value>org.keycloak.adapters.osgi.PathBasedKeycloakConfigResolver</param-value>
</context-param>

keycloak.config.resolver 에 대해 다음 해결자를 사용할 수 있습니다.

org.keycloak.adapters.osgi.BundleBasedKeycloakConfigResolver
이는 기본 확인자입니다. 구성 파일은 보안 중인 OSGi 번들 내부에서 예상됩니다. 기본적으로 이름이 WEB-INF/keycloak.json 이라는 파일을 로드하지만 이 파일 이름은 configLocation 속성을 통해 구성할 수 있습니다.
org.keycloak.adapters.osgi.PathBasedKeycloakConfigResolver

이 확인자는 keycloak.config 시스템 속성에 지정된 폴더 내에서 < your_web_context>-keycloak.json 이라는 파일을 검색합니다. keycloak.config 를 설정하지 않으면 karaf.etc 시스템 속성이 대신 사용됩니다.

예를 들어 웹 애플리케이션이 컨텍스트 my-portal 에 배포된 경우 어댑터 구성이 ${keycloak.config}/my-portal-keycloak.json 파일에서 로드되거나 ${karaf.etc}/my-portal-keycloak.json 에서 로드됩니다.

org.keycloak.adapters.osgi.HierarchicalPathBasedKeycloakConfigResolver

이 확인자는 위의 PathBasedKeycloakConfigResolver 와 유사합니다. 여기서 지정된 URI 경로의 경우 구성 위치가 가장 구체적인지 확인합니다.

예를 들어 /my/web-app/context URI의 경우 첫 번째 구성 위치가 존재할 때까지 다음 구성 위치가 있는지 검색합니다.

  • ${karaf.etc}/my-web-app-context-keycloak.json
  • ${karaf.etc}/my-web-app-keycloak.json
  • ${karaf.etc}/my-keycloak.json
  • ${karaf.etc}/keycloak.json

2.1.7.4. OSGI 서비스로 배포된 서블릿 보안

기존 WAR 애플리케이션으로 배포되지 않은 OSGI 번들 프로젝트 내부에 서블릿 클래스가 있는 경우 이 방법을 사용할 수 있습니다. Fuse는 Pax Web whiteboard Extender를 사용하여 웹 애플리케이션과 같은 서블릿을 배포합니다.

절차

  1. Red Hat Single Sign-On은 애플리케이션에 대한 인증 방법 및 보안 제약 조건을 구성할 수 있는 org.keycloak.adapters.osgi.undertow.PaxWebIntegrationService 를 제공합니다. 애플리케이션 내부에 OSGI-INF/blueprint/blueprint.xml 파일에서 이러한 서비스를 선언해야 합니다. 서블릿은 이에 따라 달라야 합니다. 예제 구성:

    <?xml version="1.0" encoding="UTF-8"?>
    <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
    
        <bean id="servletConstraintMapping" class="org.keycloak.adapters.osgi.PaxWebSecurityConstraintMapping">
            <property name="roles">
                <list>
                    <value>user</value>
                </list>
            </property>
            <property name="authentication" value="true"/>
            <property name="url" value="/product-portal/*"/>
        </bean>
    
        <!-- This handles the integration and setting the login-config and security-constraints parameters -->
        <bean id="keycloakPaxWebIntegration" class="org.keycloak.adapters.osgi.undertow.PaxWebIntegrationService"
              init-method="start" destroy-method="stop">
            <property name="bundleContext" ref="blueprintBundleContext" />
            <property name="constraintMappings">
                <list>
                    <ref component-id="servletConstraintMapping" />
                </list>
            </property>
        </bean>
    
        <bean id="productServlet" class="org.keycloak.example.ProductPortalServlet" depends-on="keycloakPaxWebIntegration" />
    
        <service ref="productServlet" interface="javax.servlet.Servlet">
            <service-properties>
                <entry key="alias" value="/product-portal" />
                <entry key="servlet-name" value="ProductServlet" />
                <entry key="keycloak.config.file" value="/keycloak.json" />
            </service-properties>
        </service>
    </blueprint>

    프로젝트 내부에 WEB-INF 디렉토리를 사용하고(프로젝트가 웹 애플리케이션이 아니더라도) Classic WAR 애플리케이션 섹션에 설명된 대로 /gateway-INF/keycloak.json 파일을 생성해야 할 수도 있습니다. security-constraints가 블루프린트 구성 파일에 선언되므로 web.xml 파일이 필요하지 않습니다.

  2. Fuse 6 어댑터와 달리 MANIFEST.MF에는 특별한 OSGi 가져오기가 필요하지 않습니다.

2.1.7.5. Apache Camel 애플리케이션 보안

블루프린트를 통해 적절한 보안 제약 조건을 삽입하고 사용된 구성 요소를 undertow-keycloak 로 업데이트하여 camel-undertow 구성 요소로 구현된 Apache Camel 엔드포인트를 보호할 수 있습니다. 다음과 같은 구성으로 Camel 애플리케이션에 OSGI-INF/blueprint/blueprint.xml 파일을 추가해야 합니다. 역할, 보안 제약 조건 매핑 및 어댑터 구성은 환경과 필요에 따라 약간 다를 수 있습니다.

표준 undertow 구성 요소와 비교하여 undertow-keycloak 구성 요소는 두 가지 새 속성을 추가합니다.

  • configResolver 는 Red Hat Single Sign-On 어댑터 구성을 제공하는 해결자 blank입니다. 사용 가능한 해결 방법은 Configuration Resolvers 섹션에 나열되어 있습니다.
  • allowedRoles 는 쉼표로 구분된 역할 목록입니다. 서비스에 액세스하는 사용자는 액세스를 허용하려면 하나 이상의 역할이 있어야 합니다.

예를 들면 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:camel="http://camel.apache.org/schema/blueprint"
           xsi:schemaLocation="
       http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
       http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint-2.17.1.xsd">

    <bean id="keycloakConfigResolver" class="org.keycloak.adapters.osgi.BundleBasedKeycloakConfigResolver" >
        <property name="bundleContext" ref="blueprintBundleContext" />
    </bean>

    <bean id="helloProcessor" class="org.keycloak.example.CamelHelloProcessor" />

    <camelContext id="blueprintContext"
                  trace="false"
                  xmlns="http://camel.apache.org/schema/blueprint">

        <route id="httpBridge">
            <from uri="undertow-keycloak:http://0.0.0.0:8383/admin-camel-endpoint?matchOnUriPrefix=true&amp;configResolver=#keycloakConfigResolver&amp;allowedRoles=admin" />
            <process ref="helloProcessor" />
            <log message="The message from camel endpoint contains ${body}"/>
        </route>

    </camelContext>

</blueprint>
  • META-INF/MANIFEST의 Import-Package.MF 에는 다음 가져오기가 포함되어야 합니다.
javax.servlet;version="[3,4)",
javax.servlet.http;version="[3,4)",
javax.net.ssl,
org.apache.camel.*,
org.apache.camel;version="[2.13,3)",
io.undertow.*,
org.keycloak.*;version="18.0.14.redhat-00001",
org.osgi.service.blueprint,
org.osgi.service.blueprint.container

2.1.7.6. Camel RestDSL

Camel RestDSL은 유창한 방식으로 REST 엔드포인트를 정의하는 데 사용되는 Camel 기능입니다. 그러나 특정 구현 클래스를 계속 사용하고 Red Hat Single Sign-On과 통합하는 방법에 대한 지침을 제공해야 합니다.

통합 메커니즘을 구성하는 방법은 RestDSL 정의 경로를 구성하는 Camel 구성 요소에 따라 다릅니다.

다음 예제에서는 undertow-keycloak 구성 요소를 사용하여 통합을 구성하는 방법과 이전 블루프린트 예제에 정의된 일부 빈에 대한 참조를 보여줍니다.

<camelContext id="blueprintContext"
              trace="false"
              xmlns="http://camel.apache.org/schema/blueprint">

    <!--the link with Keycloak security handlers happens by using undertow-keycloak component -->
    <restConfiguration apiComponent="undertow-keycloak" contextPath="/restdsl" port="8484">
        <endpointProperty key="configResolver" value="#keycloakConfigResolver" />
        <endpointProperty key="allowedRoles" value="admin,superadmin" />
    </restConfiguration>

    <rest path="/hello" >
        <description>Hello rest service</description>
        <get uri="/{id}" outType="java.lang.String">
            <description>Just a hello</description>
            <to uri="direct:justDirect" />
        </get>

    </rest>

    <route id="justDirect">
        <from uri="direct:justDirect"/>
        <process ref="helloProcessor" />
        <log message="RestDSL correctly invoked ${body}"/>
        <setBody>
            <constant>(__This second sentence is returned from a Camel RestDSL endpoint__)</constant>
        </setBody>
    </route>

</camelContext>

2.1.7.7. 별도의 Cryostat 엔진에서 Apache CXF 끝점 보안

별도의 Cryostat 엔진에서 Red Hat Single Sign-On에서 보안한 CXF 엔드포인트를 실행하려면 다음 절차를 수행합니다.

절차

  1. OSGI-INF/blueprint/blueprint.xml 을 애플리케이션에 추가하고, 이 경우 Camel 구성과 유사하게 적절한 구성 확인자 빈을 추가합니다. httpu:engine-factory 에서 org.keycloak.adapters.osgi.undertow.CxfKeycloakAuthHandler 처리기를 해당 camel 구성을 사용하여 선언합니다. CFX Cryostat-WS 애플리케이션의 구성은 다음과 유사할 수 있습니다.

    <?xml version="1.0" encoding="UTF-8"?>
    <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:jaxws="http://cxf.apache.org/blueprint/jaxws"
               xmlns:cxf="http://cxf.apache.org/blueprint/core"
               xmlns:httpu="http://cxf.apache.org/transports/http-undertow/configuration".
               xsi:schemaLocation="
          http://cxf.apache.org/transports/http-undertow/configuration http://cxf.apache.org/schemas/configuration/http-undertow.xsd
          http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd
          http://cxf.apache.org/blueprint/jaxws http://cxf.apache.org/schemas/blueprint/jaxws.xsd">
    
        <bean id="keycloakConfigResolver" class="org.keycloak.adapters.osgi.BundleBasedKeycloakConfigResolver" >
            <property name="bundleContext" ref="blueprintBundleContext" />
        </bean>
    
        <httpu:engine-factory bus="cxf" id="kc-cxf-endpoint">
            <httpu:engine port="8282">
                <httpu:handlers>
                    <bean class="org.keycloak.adapters.osgi.undertow.CxfKeycloakAuthHandler">
                        <property name="configResolver" ref="keycloakConfigResolver" />
                    </bean>
                </httpu:handlers>
            </httpu:engine>
        </httpu:engine-factory>
    
        <jaxws:endpoint implementor="org.keycloak.example.ws.ProductImpl"
                        address="http://localhost:8282/ProductServiceCF" depends-on="kc-cxf-endpoint"/>
    
    </blueprint>

    CXF Cryostat-RS 애플리케이션의 경우 engine-factory에 따라 끝점의 구성에 차이가 있을 수 있습니다.

    <jaxrs:server serviceClass="org.keycloak.example.rs.CustomerService" address="http://localhost:8282/rest"
        depends-on="kc-cxf-endpoint">
        <jaxrs:providers>
            <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
        </jaxrs:providers>
    </jaxrs:server>
  2. META-INF/MANIFEST.MFImport-Package 에는 이러한 가져오기가 포함되어야 합니다.
META-INF.cxf;version="[2.7,3.3)",
META-INF.cxf.osgi;version="[2.7,3.3)";resolution:=optional,
org.apache.cxf.bus;version="[2.7,3.3)",
org.apache.cxf.bus.spring;version="[2.7,3.3)",
org.apache.cxf.bus.resource;version="[2.7,3.3)",
org.apache.cxf.transport.http;version="[2.7,3.3)",
org.apache.cxf.*;version="[2.7,3.3)",
org.springframework.beans.factory.config,
org.keycloak.*;version="18.0.14.redhat-00001"

2.1.7.8. 기본 Cryostat 엔진에서 Apache CXF 끝점 보안

일부 서비스는 시작 시 배포된 서블릿과 함께 자동으로 제공됩니다. 이러한 서비스 중 하나는 http://localhost:8181/cxf 컨텍스트에서 실행되는 CXF 서블릿입니다. Fuse의 Pax Web은 구성 관리자를 통해 기존 컨텍스트 변경을 지원합니다. 이는 Red Hat Single Sign-On의 엔드포인트를 보호하는 데 사용할 수 있습니다.

애플리케이션 내의 구성 파일 OSGI-INF/blueprint/blueprint.xml 은 아래 파일과 유사할 수 있습니다. 애플리케이션 관련 엔드포인트인 Cryostat-RS customerservice 엔드포인트를 추가합니다.

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs"
           xsi:schemaLocation="
		http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
		http://cxf.apache.org/blueprint/jaxrs http://cxf.apache.org/schemas/blueprint/jaxrs.xsd">

    <!-- JAXRS Application -->
    <bean id="customerBean" class="org.keycloak.example.rs.CxfCustomerService" />

    <jaxrs:server id="cxfJaxrsServer" address="/customerservice">
        <jaxrs:providers>
            <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
        </jaxrs:providers>
        <jaxrs:serviceBeans>
            <ref component-id="customerBean" />
        </jaxrs:serviceBeans>
    </jaxrs:server>
</blueprint>

또한 ${karaf.etc}/org.ops4j.pax.web.context-anyName.cfg 파일을 생성해야 합니다. pax-web-runtime 번들에 의해 추적되는 팩토리 PID 구성으로 처리됩니다. 이러한 구성에는 표준 web.xml 의 일부 속성에 해당하는 다음 속성이 포함될 수 있습니다.

bundle.symbolicName = org.apache.cxf.cxf-rt-transports-http
context.id = default

context.param.keycloak.config.resolver = org.keycloak.adapters.osgi.HierarchicalPathBasedKeycloakConfigResolver

login.config.authMethod = KEYCLOAK

security.cxf.url = /cxf/customerservice/*
security.cxf.roles = admin, user

구성 관리자 파일에서 사용 가능한 속성에 대한 자세한 내용은 Fuse 설명서를 참조하십시오. 위의 속성에는 다음과 같은 의미가 있습니다.

bundle.symbolicName and context.id
org.ops4j.pax.web.service.WebContainer 내의 번들 및 배포 컨텍스트 식별.
context.param.keycloak.config.resolver
클래식 WAR의 web.xml 과 동일하게 번들에 keycloak.config.resolver 의 값을 제공합니다. 사용 가능한 해결 방법은 구성 해결 방법 섹션에 설명되어 있습니다.
login.config.authMethod
인증 방법. KEYCLOAK 여야 합니다.
보안.anyName.urlsecurity.anyName.roles

개별 보안 제약 조건의 속성 값은 각각 web.xmlsecurity-constraint/web-resource-collection/url-patternsecurity-constraint/auth-constraint/role-name 에 설정된 것처럼 설정합니다. 역할은 쉼표로 구분되고 주위에 공백을 사용합니다. anyName 식별자는 임의의 식별자일 수 있지만 동일한 보안 제약 조건의 개별 속성에 대해 일치해야 합니다.

참고

일부 Fuse 버전에는 역할이 ", " (콤마 및 단일 공간)로 구분되어야 하는 버그가 포함되어 있습니다. 역할을 분리하기 위해 정확히 이 표기법을 사용해야 합니다.

META-INF/MANIFEST.MFImport-Package 에는 최소한 다음 가져오기가 포함되어야 합니다.

javax.ws.rs;version="[2,3)",
META-INF.cxf;version="[2.7,3.3)",
META-INF.cxf.osgi;version="[2.7,3.3)";resolution:=optional,
org.apache.cxf.transport.http;version="[2.7,3.3)",
org.apache.cxf.*;version="[2.7,3.3)",
com.fasterxml.jackson.jaxrs.json;version="${jackson.version}"

2.1.7.9. Fuse 관리 서비스 보안

2.1.7.9.1. SSH 인증으로 Fuse 터미널 사용

Red Hat Single Sign-On은 주로 웹 애플리케이션의 인증에 대한 사용 사례를 다루지만 다른 웹 서비스 및 애플리케이션이 Red Hat Single Sign-On으로 보호되는 경우 Red Hat Single Sign-On 인증 정보를 사용한 SSH와 같은 비 웹 관리 서비스를 보호하는 것이 가장 좋습니다. Red Hat Single Sign-On에 대한 원격 연결을 허용하고 리소스 소유자 암호 자격 증명을 기반으로 인증 정보를 확인하는 JAAS 로그인 모듈을 사용하여 이 작업을 수행할 수 있습니다.

SSH 인증을 활성화하려면 다음 절차를 수행합니다.

절차

  1. Red Hat Single Sign-On에서 SSH 인증에 사용할 클라이언트(예: ssh-jmx-admin-client)를 만듭니다. 이 클라이언트에는 직접 액세스 권한 부여가 설정되어 있어야 합니다.
  2. $FUSE_HOME/etc/org.apache.karaf.shell.cfg 파일에서 이 속성을 업데이트하거나 지정합니다.

    sshRealm=keycloak
  3. 환경 및 Red Hat Single Sign-On 클라이언트 설정에 따라 다음과 유사한 콘텐츠를 사용하여 $FUSE_HOME/etc/keycloak-direct-access.json 파일을 추가합니다.

    {
        "realm": "demo",
        "resource": "ssh-jmx-admin-client",
        "ssl-required" : "external",
        "auth-server-url" : "http://localhost:8080/auth",
        "credentials": {
            "secret": "password"
        }
    }

    이 파일은 SSH 인증을 위해 keycloak JAAS 영역의 JAAS DirectAccessGrantsLoginModule에서 사용하는 클라이언트 애플리케이션 구성을 지정합니다.

  4. Fuse를 시작하고 keycloak JAAS 영역을 설치합니다. 가장 쉬운 방법은 JAAS 영역이 사전 정의된 keycloak-jaas 기능을 설치하는 것입니다. 순위가 높은 자체 keycloak JAAS 영역을 사용하여 기능의 사전 정의된 영역을 재정의할 수 있습니다. 자세한 내용은 JBoss Fuse 설명서 를 참조하십시오.

    Fuse 터미널에서 다음 명령을 사용하십시오.

    features:addurl mvn:org.keycloak/keycloak-osgi-features/18.0.14.redhat-00001/xml/features
    features:install keycloak-jaas
  5. 터미널에 다음을 입력하여 SSH를 admin 사용자로 사용하여 로그인합니다.

    ssh -o PubkeyAuthentication=no -p 8101 admin@localhost
  6. 암호 를 사용하여 로그인합니다.
참고

일부 이후 운영 체제에서는 SSH 명령의 -o 옵션 -o HostKeyAlgorithms=+ssh-dss 를 사용해야 할 수도 있습니다. 이후 SSH 클라이언트는 기본적으로 ssh-dss 알고리즘 사용을 허용하지 않기 때문입니다. 그러나 기본적으로 현재 JBoss Fuse 7.4.0에서 사용됩니다.

사용자에게 모든 작업을 수행하거나 작업 하위 집합을 수행하려면 영역 역할 admin 이 있어야 합니다(예: 사용자가 읽기 전용 Karaf 명령만 실행하도록 제한하는 뷰어 역할). 사용 가능한 역할은 $FUSE_HOME/etc/org.apache.karaf.shell.cfg 또는 $FUSE_HOME/etc/system.properties 에서 구성됩니다.

2.1.7.9.2. Cryostat 인증 사용

jconsole 또는 다른 외부 툴을 사용하여 RMI를 통해 remotely에 연결하려는 경우 Cryostat 인증이 필요할 수 있습니다. 그렇지 않으면 jolokia 에이전트가 기본적으로 hawt.io에 설치되므로 hawt.io/jolokia를 사용하는 것이 더 좋습니다. 자세한 내용은 Hawtio 관리 콘솔을 참조하십시오.

Cryostat 인증을 사용하려면 다음 절차를 수행합니다.

절차

  1. $FUSE_HOME/etc/org.apache.karaf.management.cfg 파일에서 jmxRealm 속성을 다음과 같이 변경합니다.

    jmxRealm=keycloak
  2. 위의 SSH 섹션에 설명된 대로 keycloak-jaas 기능을 설치하고 $FUSE_HOME/etc/keycloak-direct-access.json 파일을 구성합니다.
  3. jconsole에서는 다음과 같은 URL을 사용할 수 있습니다.
service:jmx:rmi://localhost:44444/jndi/rmi://localhost:1099/karaf-root

및 인증 정보: admin/password(사용자 환경에 따라 관리자 권한이 있는 사용자 기반).

2.1.7.10. Hawtio 관리 콘솔 보안

Red Hat Single Sign-On을 사용하여 Hawtio 관리 콘솔을 보호하려면 다음 절차를 수행합니다.

절차

  1. 해당 영역의 Red Hat Single Sign-On 관리 콘솔에서 클라이언트를 생성합니다. 예를 들어 Red Hat Single Sign-On 데모 영역에서 클라이언트 hawtio-client 를 생성하고, 액세스 유형으로 public 을 지정하고, Hawtio: http://localhost:8181/hawtio/*를 가리키는 리디렉션 URI를 지정합니다. 해당 웹 출처를 구성합니다(이 경우 http://localhost:8181). hawtio-client 클라이언트 세부 정보의 범위 탭에 계정 클라이언트의 view-profile 클라이언트 역할을 포함하도록 클라이언트 범위 매핑을 설정합니다.
  2. 아래 예제와 유사한 내용을 사용하여 $FUSE_HOME/etc 디렉터리에 keycloak-hawtio-client.json 파일을 생성합니다. Red Hat Single Sign-On 환경에 따라 ,리소스, auth-server-url 속성을 변경합니다. resource 속성은 이전 단계에서 생성한 클라이언트를 가리켜야 합니다. 이 파일은 클라이언트(Hawtio JavaScript 애플리케이션) 측에서 사용합니다.

    {
      "realm" : "demo",
      "clientId" : "hawtio-client",
      "url" : "http://localhost:8080/auth",
      "ssl-required" : "external",
      "public-client" : true
    }
  3. 아래 예제와 유사한 콘텐츠를 사용하여 $FUSE_HOME/etc 디렉터리에 keycloak-direct-access.json 파일을 생성합니다. Red Hat Single Sign-On 환경에 따라 realmurl 속성을 변경합니다. 이 파일은 JavaScript 클라이언트에서 사용합니다.

    {
      "realm" : "demo",
      "resource" : "ssh-jmx-admin-client",
      "auth-server-url" : "http://localhost:8080/auth",
      "ssl-required" : "external",
      "credentials": {
        "secret": "password"
      }
    }
  4. 아래 예제와 유사한 내용을 사용하여 $FUSE_HOME/etc dicrectory에 keycloak-hawtio.json 파일을 생성합니다. Red Hat Single Sign-On 환경에 따라 realmauth-server-url 속성을 변경합니다. 이 파일은 서버의 어댑터 (JAAS 로그인 모듈) 측에서 사용됩니다.

    {
      "realm" : "demo",
      "resource" : "jaas",
      "bearer-only" : true,
      "auth-server-url" : "http://localhost:8080/auth",
      "ssl-required" : "external",
      "use-resource-role-mappings": false,
      "principal-attribute": "preferred_username"
    }
  5. JBoss Fuse 7.4.0 을 시작하고 Keycloak 기능을 설치합니다. 그런 다음 Karaf 터미널을 입력합니다.

    system:property -p hawtio.keycloakEnabled true
    system:property -p hawtio.realm keycloak
    system:property -p hawtio.keycloakClientConfig file://\${karaf.base}/etc/keycloak-hawtio-client.json
    system:property -p hawtio.rolePrincipalClasses org.keycloak.adapters.jaas.RolePrincipal,org.apache.karaf.jaas.boot.principal.RolePrincipal
    restart io.hawt.hawtio-war
  6. http://localhost:8181/hawtio 으로 이동하여 Red Hat Single Sign-On 영역에서 사용자로 로그인합니다.

    사용자가 Hawtio에 성공적으로 인증하려면 적절한 realm 역할이 있어야 합니다. 사용 가능한 역할은 hawtio.roles$FUSE_HOME/etc/system.properties 파일에서 구성됩니다.

2.1.8. Spring Boot 어댑터

참고

Spring Boot Adapter는 더 이상 사용되지 않으며 RH-SSO의 8.0 이상 버전에 포함되어 있지 않습니다. 이 어댑터는 RH-SSO 7.x의 라이프사이클 동안 유지됩니다. Spring Boot 애플리케이션을 RH-SSO와 통합하려면 Spring Security로 마이그레이션해야 합니다.

2.1.8.1. Spring Boot 어댑터 설치

Spring Boot 앱을 보호하려면 앱에 Keycloak Spring Boot 어댑터 JAR을 추가해야 합니다. 그런 다음 일반 Spring Boot 구성 (application.properties)을 통해 추가 구성을 제공해야 합니다.

Keycloak Spring Boot 어댑터는 Spring Boot의 자동 구성을 사용하므로 이 어댑터 Keycloak Spring Boot Starter를 프로젝트에 추가하는 것입니다.

절차

  1. Maven을 사용하여 프로젝트에 Starter를 추가하려면 종속 항목에 다음을 추가합니다.

    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-spring-boot-starter</artifactId>
    </dependency>
  2. 어댑터 BOM 종속성을 추가합니다.

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>org.keycloak.bom</groupId>
          <artifactId>keycloak-adapter-bom</artifactId>
          <version>18.0.14.redhat-00001</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>

현재 다음 포함 컨테이너는 지원되며 Starter를 사용하는 경우 추가 종속 항목이 필요하지 않습니다.

  • Tomcat
  • CloudEvent
  • allty

2.1.8.2. Spring Boot 어댑터 구성

Red Hat Single Sign-On을 사용하도록 Spring Boot 앱을 구성하려면 절차를 사용하십시오.

절차

  1. keycloak.json 파일 대신 일반 Spring Boot 구성을 통해 Spring Boot 어댑터의 영역을 구성합니다. 예를 들면 다음과 같습니다.

    keycloak.realm = demorealm
    keycloak.auth-server-url = http://127.0.0.1:8080/auth
    keycloak.ssl-required = external
    keycloak.resource = demoapp
    keycloak.credentials.secret = 11111111-1111-1111-1111-111111111111
    keycloak.use-resource-role-mappings = true

    keycloak Spring Boot Adapter (예: 테스트에서) keycloak.enabled = false 를 설정하여 비활성화할 수 있습니다.

  2. keycloak.json과 달리 Policy Enforcer를 구성하려면 policy-enforcer-config 대신 policy-enforcer -config를 사용합니다.
  3. 일반적으로 web.xml 에 들어갈 자karta EE 보안 구성을 지정합니다.

    Spring Boot Adapter는 로그인 방법을 KEYCLOAK 로 설정하고 시작 시 security-constraints 를 구성합니다. 다음은 구성의 예입니다.

    keycloak.securityConstraints[0].authRoles[0] = admin
    keycloak.securityConstraints[0].authRoles[1] = user
    keycloak.securityConstraints[0].securityCollections[0].name = insecure stuff
    keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /insecure
    
    keycloak.securityConstraints[1].authRoles[0] = admin
    keycloak.securityConstraints[1].securityCollections[0].name = admin stuff
    keycloak.securityConstraints[1].securityCollections[0].patterns[0] = /admin
주의

Spring Application을 WAR로 배포하려는 경우 Spring Boot Adapter를 사용하지 말고 사용 중인 애플리케이션 서버 또는 서블릿 컨테이너에 전용 어댑터를 사용해야 합니다. Spring Boot에는 web.xml 파일도 포함되어 있어야 합니다.

2.1.9. Java 서블릿 필터 어댑터

Red Hat Single Sign-On 어댑터가 없는 플랫폼에 Java Servlet 애플리케이션을 배포하는 경우 서블릿 필터 어댑터를 사용하기로 선택합니다. 이 어댑터는 다른 어댑터와 약간 다르게 작동합니다. web.xml에서 보안 제약 조건을 정의하지 않습니다. 대신 Red Hat Single Sign-On 서블릿 필터 어댑터를 사용하여 필터 매핑을 정의하여 보안하려는 URL 패턴을 보호합니다.

주의

Backchannel logout은 표준 어댑터와 약간 다르게 작동합니다. HTTP 세션을 무효화하는 대신 세션 ID를 로그아웃한 것으로 표시합니다. 세션 ID를 기반으로 HTTP 세션을 무효화하는 표준 방법은 없습니다.

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      version="3.0">

	<module-name>application</module-name>

    <filter>
        <filter-name>Keycloak Filter</filter-name>
        <filter-class>org.keycloak.adapters.servlet.KeycloakOIDCFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Keycloak Filter</filter-name>
        <url-pattern>/keycloak/*</url-pattern>
        <url-pattern>/protected/*</url-pattern>
    </filter-mapping>
</web-app>

위의 코드 조각에는 두 개의 url-패턴이 있습니다. /protected/* 는 보호하려는 파일이며 /keycloak/* url-pattern은 Red Hat Single Sign-On 서버의 콜백을 처리합니다.

구성된 url-patterns 아래의 일부 경로를 제외해야 하는 경우 Filter init-param keycloak.config.skipPattern 을 사용하여 keycloak 필터가 filter-chain에 즉시 위임해야 하는 경로-패턴을 설명하는 정규식을 구성할 수 있습니다. 기본적으로 skipPattern이 구성되지 않습니다.

패턴은 컨텍스트 경로 없이 requestURI 와 일치합니다. context-path /myapp/myapp/index.html 에 대한 요청이 건너뛰기 패턴에 대해 /index.html 과 일치합니다.

<init-param>
    <param-name>keycloak.config.skipPattern</param-name>
    <param-value>^/(path1|path2|path3).*</param-value>
</init-param>

필터의 url-pattern에서 적용되는 보안 섹션을 가리키는 관리자 URL을 사용하여 Red Hat Single Sign-On 관리 콘솔에서 클라이언트를 구성해야 합니다.

Admin URL은 Admin URL로 콜백을 만들어 백채널 로그아웃과 같은 작업을 수행합니다. 따라서 이 예제의 관리자 URL은 http[s]://hostname/{context-root}/keycloak 이어야 합니다.

세션 ID 매퍼를 사용자 지정해야 하는 경우 Filter init-param keycloak.config.idMapper에서 정규화된 클래스 이름을 구성할 수 있습니다. 세션 ID 매퍼는 사용자 ID 및 세션 ID를 매핑하는 데 사용되는 매퍼입니다. 기본적으로 org.keycloak.adapters.spi.InMemorySessionIdMapper가 구성됩니다.

<init-param>
    <param-name>keycloak.config.idMapper</param-name>
    <param-value>org.keycloak.adapters.spi.InMemorySessionIdMapper</param-value>
</init-param>

Red Hat Single Sign-On 필터는 다른 어댑터와 동일한 구성 매개 변수를 컨텍스트 매개변수 대신 filter init params로 정의해야 합니다.

이 필터를 사용하려면 다음 maven 아티팩트를 WAR poms에 포함합니다.

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-servlet-filter-adapter</artifactId>
    <version>18.0.14.redhat-00001</version>
</dependency>

2.1.10. 보안 컨텍스트

토큰에 직접 액세스해야 하는 경우 KeycloakSecurityContext 인터페이스를 사용할 수 있습니다. 이 기능은 토큰(예: 사용자 프로필 정보)에서 추가 세부 정보를 검색하거나 Red Hat Single Sign-On에 의해 보호되는 RESTful 서비스를 호출하려는 경우에 유용할 수 있습니다.

서블릿 환경에서는 보안 호출에서 10.0.0.1ServletRequest의 속성으로 사용할 수 있습니다.

httpServletRequest
    .getAttribute(KeycloakSecurityContext.class.getName());

또는 insecured 요청에서 사용할 수 있습니다.

httpServletRequest.getSession()
    .getAttribute(KeycloakSecurityContext.class.getName());

2.1.11. 오류 처리

Red Hat Single Sign-On에는 서블릿 기반 클라이언트 어댑터의 일부 오류 처리 기능이 있습니다. 인증에 오류가 발생하면 Red Hat Single Sign-On을 통해 10.0.0.1 ServletResponse.sendError(). web.xml 파일 내에 오류 페이지를 설정하여 원하는 오류를 처리할 수 있습니다. Red Hat Single Sign-On을 사용하면 400, 401, 403 및 500 오류가 발생할 수 있습니다.

<error-page>
    <error-code>403</error-code>
    <location>/ErrorHandler</location>
</error-page>

Red Hat Single Sign-On은 검색할 수 있는 10.0.0.1ServletRequest 속성도 설정합니다. 특성 이름은 org.keycloak.adapters.spi.AuthenticationError 로, org.keycloak.adapters.OIDCAuthenticationError 로 캐스팅되어야 합니다.

예를 들면 다음과 같습니다.

import org.keycloak.adapters.OIDCAuthenticationError;
import org.keycloak.adapters.OIDCAuthenticationError.Reason;
...

OIDCAuthenticationError error = (OIDCAuthenticationError) httpServletRequest
    .getAttribute('org.keycloak.adapters.spi.AuthenticationError');

Reason reason = error.getReason();
System.out.println(reason.name());

2.1.12. logout

웹 애플리케이션에서 여러 가지 방법으로 로그아웃할 수 있습니다. Jakarta EE 서블릿 컨테이너의 경우>-< ServletRequest.logout() 을 호출할 수 있습니다. 다른 브라우저 애플리케이션의 경우 브라우저를 http://auth-server/auth/realms/{realm-name}/protocol/openid-connect/logout 로 리디렉션할 수 있으며, 이는 해당 사용자에게 브라우저와 SSO 세션이 있는 경우 사용자를 기록합니다. 사용자가 로그아웃을 확인한 후 실제 로그아웃이 수행됩니다. OpenID Connect RP-Initiated Logout 에 설명된 대로 id_token_hint,post_logout_redirect_uri,client_id 등의 매개변수를 선택적으로 포함할 수 있습니다. 따라서 id_token_hint 매개변수를 포함하는 경우 해당 logout을 사용자가 명시적으로 확인할 필요가 없습니다. 로그아웃 후 사용자는 제공되는 경우 지정된 post_logout_redirect_uri 로 자동으로 리디렉션됩니다. post_logout_redirect_uri 가 포함된 경우 client_id 또는 id_token_hint 매개변수를 포함해야 합니다.

로그아웃 프로세스의 일부로 외부 ID 공급자에서 로그아웃하지 않으려면 해당 ID 공급자의 ID(alias)가 값인 시작_idp 매개 변수를 제공할 수 있습니다. 이 매개변수는 logout 끝점이 외부 ID 공급자에 의해 시작된 단일 로그 아웃의 일부로 호출될 때 유용합니다. 시작_idp 매개변수는 RP-Initiated Logout 사양에 설명된 매개변수 외에 Red Hat Single Sign-On 로그 아웃 끝점에서 지원되는 매개변수입니다.

>-< ServletRequest.logout() 옵션을 사용하는 경우 어댑터는 새로 고침 토큰을 전달하는 Red Hat Single Sign-On 서버에 대해 백 채널 POST 호출을 실행합니다. 보호되지 않은 페이지(유효한 토큰을 확인하지 않는 페이지)에서 메서드가 실행되는 경우 새로 고침 토큰을 사용할 수 없으며, 이 경우 어댑터에서 호출을 건너뜁니다. 따라서 보호 페이지를 사용하여>-< ServletRequest.logout() 을 실행하는 것이 좋습니다. 따라서 현재 토큰이 항상 고려되고 Red Hat Single Sign-On 서버와의 상호 작용이 필요한 경우 수행됩니다.

2.1.13. 매개변수 전달

Red Hat Single Sign-On 초기 권한 부여 끝점 요청은 다양한 매개 변수를 지원합니다. 대부분의 매개변수는 OIDC 사양에 설명되어 있습니다. 일부 매개변수는 어댑터 구성에 따라 어댑터에 의해 자동으로 추가됩니다. 그러나 취소 기준으로 추가할 수 있는 몇 가지 매개변수도 있습니다. 보안 애플리케이션 URI를 열면 특정 매개변수가 Red Hat Single Sign-On 권한 부여 엔드포인트로 전달됩니다.

예를 들어 오프라인 토큰을 요청하는 경우 다음과 같은 scope 매개변수로 보안 애플리케이션 URI를 열 수 있습니다.

http://myappserver/mysecuredapp?scope=offline_access

매개 변수 scope=offline_access 는 Red Hat Single Sign-On 권한 부여 엔드포인트에 자동으로 전달됩니다.

지원되는 매개변수는 다음과 같습니다.

  • 범위 - 공백으로 구분된 범위 목록을 사용합니다. 공백으로 구분된 목록은 일반적으로 특정 클라이언트에 정의된 클라이언트 범위를 참조합니다. 범위 openid 는 항상 어댑터의 범위 목록에 추가됩니다. 예를 들어 범위 옵션 주소 전화 번호를 입력하면 Red Hat Single Sign-On에 범위 매개 변수 scope=openid 주소 전화가 포함됩니다.
  • 프롬프트 - Red Hat Single Sign-On에서는 다음 설정을 지원합니다.

    • login - SSO는 무시되고 사용자가 이미 인증된 경우에도 Red Hat Single Sign-On 로그인 페이지가 항상 표시됩니다.
    • 동의 - 동의필요한 고객에게만 적용됩니다. 이를 사용하는 경우 사용자가 이전에 이 클라이언트에 동의한 경우에도 Consent 페이지가 항상 표시됩니다.
    • none - 로그인 페이지가 표시되지 않습니다. 대신 사용자가 애플리케이션으로 리디렉션되며 사용자가 아직 인증되지 않은 경우 오류가 발생합니다. 이 설정을 사용하면 애플리케이션 측에서 필터/방문기를 생성하고 사용자에게 사용자 정의 오류 페이지를 표시할 수 있습니다. 자세한 내용은 사양을 참조하십시오.
  • max_age - 사용자가 이미 인증된 경우에만 사용됩니다. 사용자가 인증할 때부터 측정하여 인증이 지속되도록 허용되는 최대 시간을 지정합니다. user가 maxAge 보다 오래 인증되면 SSO가 무시되고 다시 인증해야 합니다.
  • login_hint - 로그인 양식에 사용자 이름/이메일 필드를 미리 채우는 데 사용됩니다.
  • kc_idp_hint - Red Hat Single Sign-On에 로그인 페이지를 건너뛰고 지정된 ID 공급자로 자동 리디렉션하도록 하는 데 사용됩니다. ID 공급자 설명서에서 추가 정보 .

대부분의 매개변수는 OIDC 사양에 설명되어 있습니다. 유일한 예외는 Red Hat Single Sign-On과 관련된 kc_idp_hint 매개 변수이며 자동으로 사용할 ID 공급자의 이름을 포함합니다. 자세한 내용은 Server Administration GuideIdentity Brokering 섹션을 참조하십시오.

주의

연결된 매개변수를 사용하여 URL을 열면 이미 애플리케이션에서 인증된 경우 어댑터에서 Red Hat Single Sign-On으로 리디렉션하지 않습니다. 예를 들어 이미 애플리케이션 mysecuredapp 에 인증된 경우 http://myappserver/mysecuredapp?prompt=login를 열면 Red Hat Single Sign-On 로그인 페이지로 자동으로 리디렉션되지 않습니다. 이 동작은 향후 변경될 수 있습니다.

2.1.14. 클라이언트 인증

기밀 OIDC 클라이언트가 백채널 요청을 보내야 하는 경우(예: 토큰의 코드를 교환하거나 토큰을 새로 고침) Red Hat Single Sign-On 서버에 대해 인증해야 합니다. 기본적으로 클라이언트를 인증하는 방법에는 클라이언트 ID와 클라이언트 시크릿, 서명된 JWT의 클라이언트 인증 또는 클라이언트 시크릿을 사용하여 서명된 JWT의 클라이언트 인증 세 가지가 있습니다.

2.1.14.1. 클라이언트 ID 및 클라이언트 보안

OAuth2 사양에 설명된 기존 방법입니다. 클라이언트에는 시크릿이 있으며 어댑터(애플리케이션)와 Red Hat Single Sign-On 서버 둘 다에 알려야 합니다. Red Hat Single Sign-On Admin Console에서 특정 클라이언트에 대한 시크릿을 생성한 다음 애플리케이션 측의 keycloak.json 파일에 이 시크릿을 붙여넣을 수 있습니다.

"credentials": {
    "secret": "19666a4f-32dd-4049-b082-684c74115f28"
}

2.1.14.2. 서명 JWT를 사용한 클라이언트 인증

이는 RFC7523 사양을 기반으로 합니다. 이 방법은 다음과 같습니다.

  • 클라이언트에는 개인 키와 인증서가 있어야 합니다. Red Hat Single Sign-On의 경우 클라이언트 애플리케이션의 클래스 경로 또는 파일 시스템 위치에서 사용할 수 있는 기존 키 저장소 파일을 통해 사용할 수 있습니다.
  • 클라이언트 애플리케이션이 시작되면 http://myhost.com/myapp가 클라이언트 애플리케이션의 기본 URL이라고 가정하면 http://myhost.com/myapp/k_jwks과 같은 URL을 사용하여 JWKS 형식으로 공개 키를 다운로드할 수 있습니다. 이 URL은 Red Hat Single Sign-On에서 사용할 수 있습니다(아래 참조).
  • 인증 중에 클라이언트는 JWT 토큰을 생성하여 개인 키를 사용하여 서명하고 client_assertion 매개변수의 특정 백채널 요청(예: code-to-token 요청)에서 Red Hat Single Sign-On으로 보냅니다.
  • Red Hat Single Sign-On에는 JWT의 서명을 확인할 수 있도록 클라이언트의 공개 키 또는 인증서가 있어야 합니다. Red Hat Single Sign-On에서 클라이언트의 클라이언트 자격 증명을 구성해야 합니다. 먼저 Admin Console의 Credentials (자격 증명) 탭에서 클라이언트를 인증하는 방법으로 Signed JWT 를 선택해야 합니다. 그런 다음 다음 탭에서 선택할 수 있습니다.

    • Red Hat Single Sign-On이 클라이언트의 공개 키를 다운로드할 수 있는 JWKS URL을 구성합니다. http://myhost.com/myapp/k_jwks과 같은 URL일 수 있습니다(위의 세부 정보 참조). 클라이언트가 언제든지 키를 회전시키고 Red Hat Single Sign-On은 구성을 변경하지 않고도 항상 새 키를 다운로드할 수 있기 때문에 이 옵션이 가장 유연합니다. 보다 정확하게 말해 Red Hat Single Sign-On은 알 수 없는 키(Key ID)가 서명한 토큰이 표시될 때 새 키를 다운로드합니다.
    • 클라이언트의 공개 키 또는 인증서를 JWK 형식 또는 키 저장소에서 PEM 형식으로 업로드합니다. 이 옵션을 사용하면 공개 키가 하드 코딩되므로 클라이언트가 새 키 쌍을 생성할 때 변경해야 합니다. Red Hat Single Sign-On 관리 콘솔에서 자체 키 저장소를 생성할 수도 있습니다. Red Hat Single Sign-On 관리 콘솔을 설정하는 방법에 대한 자세한 내용은 서버 관리 가이드를 참조하십시오.

어댑터 측에 설정하려면 keycloak.json 파일에 다음과 같은 내용이 있어야 합니다.

"credentials": {
  "jwt": {
    "client-keystore-file": "classpath:keystore-client.jks",
    "client-keystore-type": "JKS",
    "client-keystore-password": "storepass",
    "client-key-password": "keypass",
    "client-key-alias": "clientkey",
    "algorithm": "RS256",
    "token-expiration": 10
  }
}

이 구성을 사용하면 WAR의 classpath에서 키 저장소 파일 keystore-client.jks 를 사용할 수 있어야 합니다. 접두사 classpath 를 사용하지 않는 경우 클라이언트 애플리케이션이 실행 중인 파일 시스템에서 파일을 가리킬 수 있습니다.

algorithm 필드는 Signed JWT에 사용되는 알고리즘을 지정하고 기본값은 RS256 입니다. 이 필드는 키 쌍과 동기화되어야 합니다. 예를 들어, RS256 알고리즘에는 ES256 알고리즘에 EC 키 쌍이 필요한 반면 RSA 키 쌍이 필요합니다. 자세한 내용은 디지털 서명 및 MAC에 대한 IRQ 그래픽 알고리즘 을 참조하십시오.

2.1.15. 멀티 테넌시

Red Hat의 컨텍스트에서 Multi Tenancy는 여러 Red Hat Single Sign-On 영역으로 단일 대상 애플리케이션(WAR)을 보호할 수 있음을 의미합니다. 이 영역은 동일한 Red Hat Single Sign-On 인스턴스 또는 다른 인스턴스에 있을 수 있습니다.

실제로 애플리케이션에는 여러 keycloak.json 어댑터 구성 파일이 있어야 합니다.

다른 컨텍스트 경로에 배포된 다양한 어댑터 구성 파일이 있는 WAR 인스턴스가 여러 개 있을 수 있습니다. 그러나 이 방법은 불편할 수 있으며 context-path 이외의 다른 항목을 기반으로 영역을 선택할 수도 있습니다.

Red Hat Single Sign-On을 사용하면 사용자 정의 구성 해결 프로그램을 사용할 수 있으므로 각 요청에 사용되는 어댑터 구성을 선택할 수 있습니다.

이를 위해 먼저 org.keycloak.adapters.KeycloakConfigResolver 구현을 생성해야 합니다. 예를 들면 다음과 같습니다.

package example;

import org.keycloak.adapters.KeycloakConfigResolver;
import org.keycloak.adapters.KeycloakDeployment;
import org.keycloak.adapters.KeycloakDeploymentBuilder;

public class PathBasedKeycloakConfigResolver implements KeycloakConfigResolver {

    @Override
    public KeycloakDeployment resolve(OIDCHttpFacade.Request request) {
        if (path.startsWith("alternative")) {
            KeycloakDeployment deployment = cache.get(realm);
            if (null == deployment) {
                InputStream is = getClass().getResourceAsStream("/tenant1-keycloak.json");
                return KeycloakDeploymentBuilder.build(is);
            }
        } else {
            InputStream is = getClass().getResourceAsStream("/default-keycloak.json");
            return KeycloakDeploymentBuilder.build(is);
        }
    }

}

web.xmlkeycloak.config.resolver context-param과 함께 사용할 KeycloakConfigResolver 구현을 구성해야 합니다.

<web-app>
    ...
    <context-param>
        <param-name>keycloak.config.resolver</param-name>
        <param-value>example.PathBasedKeycloakConfigResolver</param-value>
    </context-param>
</web-app>

2.1.16. 애플리케이션 클러스터링

이 장에서는 JBoss EAP에 배포된 클러스터된 애플리케이션 지원과 관련이 있습니다.

애플리케이션이 다음과 같은지 여부에 따라 몇 가지 옵션을 사용할 수 있습니다.

  • 상태 비저장 또는 상태 저장
  • 배포 가능(복제 가능 http 세션) 또는 배포되지 않음
  • 로드 밸런서에서 제공하는 고정 세션에 사용
  • Red Hat Single Sign-On과 동일한 도메인에서 호스팅

클러스터링을 처리하는 것은 일반 애플리케이션에서처럼 간단하지 않습니다. 주로 브라우저와 서버 측 애플리케이션이 Red Hat Single Sign-On에 요청을 전송하므로 로드 밸런서에서 고정 세션을 활성화하는 것처럼 간단하지 않습니다.

2.1.16.1. 상태 비저장 토큰 저장소

기본적으로 Red Hat Single Sign-On에서 보호하는 웹 애플리케이션은 HTTP 세션을 사용하여 보안 컨텍스트를 저장합니다. 즉, 고정 세션을 활성화하거나 HTTP 세션을 복제해야 합니다.

HTTP 세션에 보안 컨텍스트를 저장하는 대안으로 어댑터를 구성할 수 있습니다. 대신 이를 쿠키 내에 저장하도록 어댑터를 구성할 수 있습니다. 이 기능은 애플리케이션을 상태 비저장으로 설정하거나 HTTP 세션에 보안 컨텍스트를 저장하지 않으려면 유용합니다.

보안 컨텍스트를 저장하기 위해 쿠키 저장소를 사용하려면, 애플리케이션 ^ -INF/keycloak.json 을 편집하고 다음을 추가합니다.

"token-store": "cookie"
참고

token-store 의 기본값은 HTTP 세션에 보안 컨텍스트를 저장하는 세션입니다.

쿠키 저장소 사용의 한 가지 제한은 전체 보안 컨텍스트가 모든 HTTP 요청에 대해 쿠키로 전달된다는 것입니다. 이는 성능에 영향을 미칠 수 있습니다.

또 다른 작은 제한은 Single-Sign Out에 대한 지원이 제한됩니다. 어댑터가 KEYCLOAK_ADAPTER_STATE 쿠키를 삭제하므로 애플리케이션 자체에서 서블릿 logout(HttpServletRequest.logout)을 초기화하면 문제 없이 작동합니다. 그러나 다른 애플리케이션에서 초기화된 백 채널 로그는 Red Hat Single Sign-On에서 쿠키 저장소를 사용하는 애플리케이션에 전파되지 않습니다. 따라서 액세스 토큰 시간 초과에 짧은 값을 사용하는 것이 좋습니다(예: 1분).

참고

일부 로드 밸런서에서는 Amazon ALB와 같은 고정 세션 쿠키 이름 또는 콘텐츠의 구성을 허용하지 않습니다. 이러한 경우 shouldAttachRoute 옵션을 false 로 설정하는 것이 좋습니다.

2.1.16.2. 상대 URI 최적화

Red Hat Single Sign-On과 애플리케이션이 동일한 도메인에서 호스팅되는 배포 시나리오에서는 클라이언트 구성에서 상대 URI 옵션을 사용하는 것이 편리합니다.

상대 URI를 사용하면 Red Hat Single Sign-On에 액세스하는 데 사용되는 URL에 상대적으로 URI가 확인됩니다.

예를 들어 애플리케이션의 URL이 https://acme.org/myapp 이고 Red Hat Single Sign-On의 URL이 https://acme.org/auth 인 경우 https://acme.org/myapp 대신 redirect-uri /myapp 을 사용할 수 있습니다.

2.1.16.3. 관리자 URL 구성

특정 클라이언트의 관리자 URL은 Red Hat Single Sign-On 관리 콘솔에서 구성할 수 있습니다. Red Hat Single Sign-On 서버에서는 로그아웃 사용자 또는 해지 정책과 같은 다양한 작업의 백엔드 요청을 애플리케이션에 보내는 데 사용됩니다.

예를 들어 backchannel logout 작동 방식은 다음과 같습니다.

  1. 사용자가 하나의 애플리케이션에서 로그 아웃 요청을 보냅니다.
  2. 애플리케이션이 Red Hat Single Sign-On에 로그 아웃 요청을 보냅니다.
  3. Red Hat Single Sign-On 서버에서 사용자 세션 무효화
  4. Red Hat Single Sign-On 서버는 세션과 연결된 관리자 URL이 있는 애플리케이션에 백채널 요청을 보냅니다.
  5. 애플리케이션에서 로그아웃 요청을 수신하면 해당 HTTP 세션이 무효화됩니다.

관리자 URL에 ${application.session.host} 가 포함된 경우 HTTP 세션과 연결된 노드의 URL로 교체됩니다.

2.1.16.4. 애플리케이션 노드 등록

이전 섹션에서는 Red Hat Single Sign-On이 특정 HTTP 세션과 연결된 노드에 로그 아웃 요청을 보내는 방법을 설명합니다. 그러나 경우에 따라 admin은 둘 중 하나만이 아닌 등록된 모든 클러스터 노드에 관리 작업을 전파할 수 있습니다. 예를 들어 정책 이전의 새 정책을 애플리케이션에 내보내거나 애플리케이션에서 모든 사용자를 로그아웃하는 경우입니다.

이 경우 Red Hat Single Sign-On은 모든 애플리케이션 클러스터 노드를 알고 있어야 하므로 이벤트를 모든 사용자에게 보낼 수 있습니다. 이를 위해 자동 검색 메커니즘을 지원합니다.

  1. 새 애플리케이션 노드가 클러스터에 참여하면 Red Hat Single Sign-On 서버에 등록 요청을 보냅니다.
  2. 구성된 주기적인 간격으로 Red Hat Single Sign-On에 다시 요청을 받을 수 있습니다.
  3. Red Hat Single Sign-On 서버에서 지정된 시간 초과 내에 재등록 요청을 수신하지 못하면 특정 노드를 자동으로 등록 취소합니다.
  4. Red Hat Single Sign-On에서 노드는 노드 종료 또는 애플리케이션 배포 취소 중인 등록 취소 요청을 보낼 때 Red Hat Single Sign-On에서 등록되지 않습니다. 이 작업은 undeployment 리스너가 호출되지 않은 경우 강제 종료 시 제대로 작동하지 않을 수 있으므로 자동 등록 해제가 필요합니다.

시작 등록 및 정기적인 재등록 전송은 일부 클러스터된 애플리케이션에만 필요하므로 기본적으로 비활성화됩니다.

기능 편집을 활성화하려면 애플리케이션에 대해 WEB-INF/keycloak.json 파일을 추가하고 다음을 추가합니다.

"register-node-at-startup": true,
"register-node-period": 600,

즉 어댑터는 시작시 등록 요청을 보내고 10분마다 다시 등록합니다.

Red Hat Single Sign-On 관리 콘솔에서 최대 노드 재등록 시간 초과를 지정할 수 있습니다( 어댑터 구성에서 register-node-period 보다 커야 함). 자동 등록 기능을 사용하지 않거나 자동 등록 기능을 사용하지 않는 경우 유용한 관리 콘솔을 통해 클러스터 노드를 수동으로 추가하고 삭제할 수도 있습니다.

2.1.16.5. 각 요청에서 토큰 새로 고침

기본적으로 애플리케이션 어댑터는 만료된 경우에만 액세스 토큰을 새로 고칩니다. 그러나 모든 요청에서 토큰을 새로 고치도록 어댑터를 구성할 수도 있습니다. 애플리케이션이 Red Hat Single Sign-On 서버에 더 많은 요청을 전송하므로 성능에 영향을 미칠 수 있습니다.

기능 편집을 활성화하려면 애플리케이션에 대해 WEB-INF/keycloak.json 파일을 추가하고 다음을 추가합니다.

"always-refresh-token": true
참고

이는 성능에 큰 영향을 미칠 수 있습니다. 정책 전에 로그아웃을 전파하기 위해 백채널 메시지를 사용할 수 없는 경우에만 이 기능을 활성화합니다. 고려해야 할 또 다른 사항은 기본적으로 액세스 토큰에 단기 만료가 있으므로 로그아웃 후 토큰이 전파되지 않더라도 로그아웃 후 몇 분 내에 토큰이 만료된다는 것입니다.