3.6. SAML을 사용하여 애플리케이션 보안
SAML(Security Assertion Markup Language)은 두 당사자 간에 인증 및 권한 부여 정보를 교환할 수 있는 데이터 형식 및 프로토콜 역할을 합니다. 이러한 두 당사자는 일반적으로 ID 공급자와 서비스 공급자가 포함됩니다. 이 정보는 어설션이 포함된 SAML 토큰의 형태를 취합니다. ID 공급자는 이러한 SAML 토큰을 주체에 발행하여 이러한 주체가 서비스 공급자로 인증할 수 있도록 합니다. 주체는 SAML v2에서 브라우저 기반 Single Sign-On을 활성화하는 여러 서비스 공급자와 SAML 토큰을 재사용할 수 있습니다.
Keycloak SAML 어댑터 기능 팩에서 제공하는 Galleon 계층을 사용하여 웹 애플리케이션을 보호할 수 있습니다.
Keycloak SAML 어댑터 기능 팩에 대한 자세한 내용은 SAML을 사용하여 애플리케이션 보안을 위한 Keycloak SAML 어댑터 기능 팩을 참조하십시오.
3.6.1. SAML을 사용하여 애플리케이션 보안을 위한 Keycloak SAML 어댑터 기능 팩 링크 복사링크가 클립보드에 복사되었습니다!
Keycloak SAML 어댑터 Galleon 팩은 keycloak-saml 계층을 포함하는 Galleon 기능 팩입니다. 기능 팩에 keycloak-saml 계층을 사용하여 JBoss EAP에 필요한 모듈 및 구성을 설치합니다. SAML을 사용할 때 Red Hat build of Keycloak을 SSO(Single Sign-On) ID 공급자로 사용하려면 이러한 모듈과 구성이 필요합니다. S2I(Source-to-Image)에 keycloak-saml SAML 어댑터 Galleon 계층을 사용하는 경우 Keycloak의 Red Hat 빌드와 같은 IDP(Identity Service Provider)로 자동 등록할 수 있는 SAML 클라이언트 기능을 선택적으로 사용할 수 있습니다.
3.6.2. OpenShift의 SAML 공급자로 Red Hat build of Keycloak 구성 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat build of Keycloak은 SSO(Single Sign-On)로 웹 애플리케이션을 보호하기 위한 ID 및 액세스 관리 공급자입니다. OAuth 2.0 및 SAML에 대한 확장인 OpenID Connect를 지원합니다.
다음 절차에서는 SAML을 사용하여 애플리케이션을 보호하는 데 필요한 필수 단계를 간략하게 설명합니다. 자세한 내용은 Red Hat build of Keycloak 문서를 참조하십시오.
사전 요구 사항
- Red Hat build of Keycloak에 대한 관리자 액세스 권한이 있습니다.
- Red Hat build of Keycloak이 실행 중입니다. 자세한 내용은 Red Hat build of Keycloak Operator 를 참조하십시오.
-
oclogin 명령을 사용하여 OpenShift에 로그인했습니다.
프로세스
- Single Sign-On 영역, 사용자 및 역할을 생성합니다.
Java
keytool명령을 사용하여 키 및 인증서를 생성합니다.keytool -genkeypair -alias saml-app -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -storepass password -dname "CN=saml-basic-auth,OU=EAP SAML Client,O=Red Hat EAP QE,L=MB,S=Milan,C=IT" -ext ku:c=dig,keyEncipherment -validity 365키 저장소를 JKS(Java KeyStore) 형식으로 가져옵니다.
keytool -importkeystore -deststorepass password -destkeystore keystore.jks -srckeystore keystore.p12 -srcstoretype PKCS12 -srcstorepass passwordOpenShift에서 키 저장소에 대한 시크릿을 생성합니다.
$ oc create secret generic saml-app-secret --from-file=keystore.jks=./keystore.jks --type=opaque
이러한 단계는 자동 SAML 클라이언트 등록 기능을 사용하는 경우에만 필요합니다. JBoss EAP에서 새 SAML 클라이언트를 client-admin 사용자로 Red Hat 빌드에 등록할 때 JBoss EAP는 새 SAML 클라이언트의 인증서를 Red Hat build of Keycloak 클라이언트 구성에 저장해야 합니다. 이를 통해 JBoss EAP는 Red Hat build of Keycloak에 공개 인증서를 저장하는 동안 개인 키를 유지할 수 있으며, 이를 통해 Red Hat build of Keycloak과의 통신에 대해 인증된 클라이언트를 설정할 수 있습니다.
3.6.3. SAML으로 보안된 애플리케이션 생성 링크 복사링크가 클립보드에 복사되었습니다!
SAML(Security Assertion Markup Language)을 사용하여 웹 애플리케이션 보안을 강화할 수 있습니다. SAML은 효과적인 사용자 인증 및 권한 부여 기능을 제공하며 SSO(Single Sign-On) 기능과 함께 웹 애플리케이션 강화를 위한 신뢰할 수 있는 선택이 가능합니다.
사전 요구 사항
- Maven이 설치되어 있어야 합니다. 자세한 내용은 Apache Maven 다운로드를 참조하십시오.
프로세스
mvn명령을 사용하여 Maven 프로젝트를 설정합니다. 이 명령은 프로젝트에 대한 디렉터리 구조와pom.xml구성 파일을 둘 다 생성합니다.구문
$ mvn archetype:generate \ -DgroupId=${group-to-which-your-application-belongs} \ -DartifactId=${name-of-your-application} \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false예제
$ mvn archetype:generate \ -DgroupId=com.example.app \ -DartifactId=simple-webapp-example \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false애플리케이션 루트 디렉터리로 이동합니다.
구문
$ cd <name-of-your-application>예제
$ cd simple-webapp-example생성된
pom.xml파일의 내용을 다음 텍스트로 바꿉니다.<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.app</groupId> <artifactId>simple-webapp-example</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>simple-webapp-example Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <version.maven.war.plugin>3.3.2</version.maven.war.plugin> <version.eap.plugin>1.0.0.Final-redhat-00014</version.eap.plugin> <version.server>8.0.0.GA-redhat-00009</version.server> <version.bom.ee>${version.server}</version.bom.ee> </properties> <repositories> <repository> <id>jboss</id> <url>https://maven.repository.redhat.com/ga/</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>jboss</id> <url>https://maven.repository.redhat.com/ga/</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> <dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.bom</groupId> <artifactId>jboss-eap-ee-with-tools</artifactId> <version>${version.bom.ee}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.wildfly.security</groupId> <artifactId>wildfly-elytron-auth-server</artifactId> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>${version.maven.war.plugin}</version> </plugin> <plugin> <groupId>org.jboss.eap.plugins</groupId> <artifactId>eap-maven-plugin</artifactId> <version>${version.eap.plugin}</version> <configuration> <channels> <channel> <manifest> <groupId>org.jboss.eap.channels</groupId> <artifactId>eap-8.0</artifactId> </manifest> </channel> </channels> <feature-packs> <feature-pack> <location>org.jboss.eap:wildfly-ee-galleon-pack</location> </feature-pack> <feature-pack> <location>org.jboss.eap.cloud:eap-cloud-galleon-pack</location> </feature-pack> <feature-pack> <location>org.keycloak:keycloak-saml-adapter-galleon-pack</location> </feature-pack> </feature-packs> <layers> <layer>cloud-server</layer> <layer>keycloak-saml</layer> </layers> <galleon-options> <jboss-fork-embedded>true</jboss-fork-embedded> </galleon-options> </configuration> <executions> <execution> <goals> <goal>package</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>참고-
<
version.eap.plugin>1.0.0.Final-redhat-00014</version.eap.plugin>은 JBoss EAP Maven 플러그인의 예제 버전입니다. JBoss EAP Maven 플러그인 릴리스에 대한 자세한 내용은 Red Hat Maven 리포지토리를 참조하십시오. https://maven.repository.redhat.com/earlyaccess/all/org/jboss/eap/plugins/eap-maven-plugin/.
-
<
Java 파일을 저장할 디렉터리를 만듭니다.
구문
$ mkdir -p src/main/java/<path_based_on_artifactID>예제
$ mkdir -p src/main/java/com/example/app새 디렉터리로 이동합니다.
구문
$ cd src/main/java/<path_based_on_artifactID>예제
$ cd src/main/java/com/example/app다음 설정이 포함된
SecuredServlet.java파일을 생성합니다.package com.example.app; import java.io.IOException; import java.io.PrintWriter; import java.security.Principal; import java.util.Set; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.wildfly.security.auth.server.SecurityDomain; import org.wildfly.security.auth.server.SecurityIdentity; import org.wildfly.security.authz.Attributes; /** * A simple secured HTTP servlet. It returns the user name and * attributes obtained from the logged-in user's Principal. If * there is no logged-in user, it returns the text * "NO AUTHENTICATED USER". */ @WebServlet("/secured") public class SecuredServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try (PrintWriter writer = resp.getWriter()) { Principal user = req.getUserPrincipal(); SecurityIdentity identity = SecurityDomain.getCurrent().getCurrentSecurityIdentity(); Attributes identityAttributes = identity.getAttributes(); Set <String> keys = identityAttributes.keySet(); String attributes = "<ul>"; for (String attr : keys) { attributes += "<li> " + attr + " : " + identityAttributes.get(attr).toString() + "</li>"; } attributes+="</ul>"; writer.println("<html>"); writer.println(" <head><title>Secured Servlet</title></head>"); writer.println(" <body>"); writer.println(" <h1>Secured Servlet</h1>"); writer.println(" <p>"); writer.print(" Current Principal '"); writer.print(user != null ? user.getName() : "NO AUTHENTICATED USER"); writer.print("'"); writer.print(user != null ? "\n" + attributes : ""); writer.println(" </p>"); writer.println(" </body>"); writer.println("</html>"); } } }web.xml파일의 디렉터리 구조를 생성합니다.mkdir -p src/main/webapp/WEB-INF cd src/main/webapp/WEB-INF애플리케이션 리소스를 보호하도록 애플리케이션의
web.xml파일을 구성합니다.예제
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" 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_2_5.xsd" metadata-complete="false"> <security-constraint> <web-resource-collection> <web-resource-name>secured</web-resource-name> <url-pattern>/secured</url-pattern> </web-resource-collection> <auth-constraint> <role-name>user</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>KEYCLOAK-SAML</auth-method> </login-config> <security-role> <role-name>user</role-name> </security-role> </web-app>이 예에서는
사용자역할이 있는 사용자만 애플리케이션에 액세스할 수 있습니다.
검증
애플리케이션을 생성한 후 원격 Git 리포지토리에 커밋합니다.
-
https://github.com/your-username/simple-webapp-example과 같은 Git 리포지토리를 생성합니다. 원격 리포지토리 및 Git에 대한 자세한 내용은 Git 시작하기 - 원격 리포지토리 정보를 참조하십시오. 애플리케이션의 루트 폴더에서 다음 Git 명령을 실행합니다.
git init -b main git add pom.xml src git commit -m "First commit" git remote add origin git@github.com:your-username/simple-webapp-example.git git remote -v git push -u origin main
이러한 단계는 애플리케이션을 원격 리포지토리에 커밋하여 온라인으로 액세스할 수 있도록 합니다.
3.6.4. OpenShift에서 SAML 보안 애플리케이션 빌드 및 배포 링크 복사링크가 클립보드에 복사되었습니다!
JBoss EAP 및 SSO(Single Sign-On) Galleon 계층을 사용하여 OpenShift에서 SAML으로 보안된 애플리케이션을 빌드하고 배포할 수 있습니다.
사전 요구 사항
- Helm이 설치되어 있어야 합니다. 자세한 내용은 Helm 설치를 참조하십시오.
- SAML 애플리케이션 프로젝트를 생성하고 Git 리포지토리에서 액세스할 수 있도록 했습니다.
관리 CLI에 이 명령을 입력하여 JBoss EAP Helm 차트 리포지토리를 설치했습니다.
$ helm repo add jboss-eap https://jbossas.github.io/eap-charts/
프로세스
- 애플리케이션 코드를 Git 리포지토리에 배포합니다.
필요한 환경 변수가 포함된 OpenShift 시크릿을 생성합니다.
apiVersion: v1 kind: Secret metadata: name: saml-secret type: Opaque stringData: SSO_REALM: "saml-basic-auth" SSO_USERNAME: "client-admin" SSO_PASSWORD: "client-admin" SSO_SAML_CERTIFICATE_NAME: "saml-app" SSO_SAML_KEYSTORE: "keystore.jks" SSO_SAML_KEYSTORE_PASSWORD: "password" SSO_SAML_KEYSTORE_DIR: "/etc/sso-saml-secret-volume" SSO_SAML_LOGOUT_PAGE: "/simple-webapp-example" SSO_DISABLE_SSL_CERTIFICATE_VALIDATION: "true"-
제공된 YAML 콘텐츠를
saml-secret.yaml과 같은 파일에 저장합니다. 다음 명령을 사용하여 저장된 YAML 파일을 적용합니다.
oc apply -f saml-secret.yaml다음 설정이 포함된
helm.yaml파일을 생성합니다.build: uri: [WEB ADDRESS TO YOUR GIT REPOSITORY] deploy: volumes: - name: saml-keystore-volume secret: secretName: saml-app-secret volumeMounts: - name: saml-keystore-volume mountPath: /etc/sso-saml-secret-volume readOnly: true envFrom: - secretRef: name: saml-secret참고http://www.redhat.com과 같은 HTTP 형식으로 웹 주소를 지정합니다. maven 미러를 사용하는 경우 다음과 같이 웹 주소를 지정합니다.build: uri: [WEB ADDRESS TO YOUR GIT REPOSITORY] env: - name: "MAVEN_MIRROR_URL" value: "http://..."JBoss EAP Helm 차트를 사용하여 예제 애플리케이션을 배포합니다.
$ helm install saml-app -f helm.yaml jboss-eap/eap8saml-secret.yaml파일에 환경 변수를 추가하여 Keycloak 서버 URL 및 애플리케이션 경로를 구성합니다.stringData: ... HOSTNAME_HTTPS: <saml-app application route> SSO_URL: https://<host of the Keycloak server><
;saml-app 애플리케이션 route> 및 <host of the Keycloak server>를 적절한 값으로 바꿉니다.HOSTNAME_HTTPS의 값은 다음 출력에 해당합니다.echo $(oc get route saml-app --template='{{ .spec.host }}')SSO_URL의 값은 다음 출력에 해당합니다.echo https://$(oc get route sso --template='{{ .spec.host }}')참고이 명령을 사용할 수 없는 경우
oc get routes를 사용하여 사용 가능한 경로를 나열하고 Keycloak 인스턴스의 Red Hat 빌드 경로를 선택합니다.-
oc apply -f saml-secret.yaml을 사용하여 시크릿을 업데이트합니다.
검증
애플리케이션을 다시 배포하여 OpenShift에서 새 환경 변수를 사용하는지 확인합니다.
$ oc rollout restart deploy saml-app브라우저에서 애플리케이션 URL로 이동합니다. 예를 들어
https://<saml-app route>/simple-webapp-example.Keycloak 로그인 페이지의 Red Hat 빌드로 리디렉션됩니다.
웹 주소를 가져오려면 다음 명령을 사용하여 보안 서블릿에 액세스합니다.
echo https://$(oc get route saml-app --template='{{ .spec.host }}')/simple-webapp-example/secured다음 인증 정보로 로그인합니다.
username: demo password: demo보안 주체 ID가 포함된 페이지가 표시됩니다.
이제 SAML을 사용하여 애플리케이션이 보호됩니다.
3.6.5. SSO 영역, 사용자 및 역할 생성 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat build of Keycloak 환경에서 SSO(Single Sign-On) 영역을 구성하고, 사용자 역할을 정의하고, 액세스 제어를 관리할 수 있습니다. 이러한 작업을 통해 보안을 강화하고 사용자 액세스 관리를 단순화하여 인증 환경을 간소화할 수 있습니다. 이는 SSO 설정을 최적화하고 사용자 인증 프로세스를 개선하는 데 중요합니다.
사전 요구 사항
- Red Hat build of Keycloak에 대한 관리자 액세스 권한이 있습니다.
- Red Hat build of Keycloak이 실행 중입니다.
프로세스
-
URL을 사용하여 Keycloak 관리 콘솔의 Red Hat 빌드에 로그인합니다.
https://<SSO route>/. Red Hat build of Keycloak에 영역을 만듭니다(예:
saml-basic-auth). 나중에 이 영역을 사용하여 필요한 사용자, 역할 및 클라이언트를 생성할 수 있습니다.자세한 내용은 영역 생성을 참조하십시오.
saml-basic-auth영역에 역할을 생성합니다. 예를 들어사용자.자세한 내용은 영역 역할 생성을 참조하십시오.
사용자를 생성합니다. 예를 들면
데모입니다.자세한 내용은 사용자 생성 을 참조하십시오.
사용자의 암호를 만듭니다. 예를 들면
데모입니다.암호가 임시가 아닌지 확인합니다. 자세한 내용은 사용자의 암호 설정을 참조하십시오.
로그인 액세스를 위해
사용자역할을데모사용자에게 할당합니다.자세한 내용은 역할 매핑 할당을 참조하십시오.
사용자를 생성합니다. 예를 들어
client-admin은 다음과 같습니다.JBoss EAP 서버가 시작될 때 Keycloak 서버에서 SAML 클라이언트를 생성하려면 추가 권한이 필요한
client-admin사용자를 사용할 수 있습니다. 자세한 내용은 사용자 생성 을 참조하십시오.사용자의 암호를 만듭니다. 예를 들어
client-admin은 다음과 같습니다.암호가 임시가 아닌지 확인합니다. 자세한 내용은 사용자의 암호 설정을 참조하십시오.
-
클라이언트 역할드롭다운 목록에서realm-management를 선택합니다. create-client,manage-clients,manage-realm역할을client-admin사용자에게 할당합니다.자세한 내용은 역할 매핑 할당을 참조하십시오.
3.6.6. SAML 하위 시스템 구성을 위한 환경 변수 링크 복사링크가 클립보드에 복사되었습니다!
다음 변수를 이해하고 사용하여 환경 내에서 Keycloak 서버 통합을 최적화할 수 있습니다. 이렇게 하면 애플리케이션에 대한 원활하고 안전한 Keycloak 설정을 수행할 수 있습니다.
| 환경 변수 | 설명 | 필수 항목 |
|---|---|---|
|
| 배포 이름에서 파생된 클라이언트 이름에 접두사로 사용됩니다. | 선택 사항 |
|
|
HTTP OpenShift 경로에 대한 사용자 정의 | 선택 사항 |
|
|
HTTPS OpenShift 경로에 대한 사용자 정의 | 선택 사항 |
|
|
Keycloak 서버 인증서의 검증을 활성화하거나 비활성화하려면 | 선택 사항 |
|
|
Keycloak 영역과 상호 작용하고 클라이언트를 생성하고 등록할 수 있는 권한이 있는 사용자의 암호입니다. 예를 들어 | True |
|
|
애플리케이션 클라이언트를 연결하는 SSO 영역입니다. 예를 들면 | 선택 사항 |
|
|
SAML 클라이언트 키 저장소의 개인 키 및 인증서의 별칭입니다. 예를 들면 | True |
|
|
키 저장소 파일의 이름입니다. 예를 들어 | True |
|
|
클라이언트 키 저장소가 포함된 디렉터리입니다. 예를 들면 | True |
|
|
키 저장소 암호입니다. 예: | True |
|
|
로그 아웃 페이지. 예를 들면 | True |
|
|
서명의 유효성을 검사하려면 | 선택 사항 |
|
|
undertow 및 Cryostat 하위 시스템을 보호하는 데 사용되는 보안 도메인의 이름입니다. | 선택 사항 |
|
| 서버 인증서가 포함된 truststore 파일 이름입니다. | 선택 사항 |
|
| 신뢰 저장소 내의 인증서 별칭입니다. | 선택 사항 |
|
| truststore가 포함된 디렉터리입니다. | 선택 사항 |
|
|
truststore 및 인증서의 암호입니다. 예를 들면 | 선택 사항 |
|
|
SSO 서버의 URL입니다. 예를 들어 < | True |
|
|
Keycloak 영역과 상호 작용하고 클라이언트를 생성하고 등록할 수 있는 권한이 있는 사용자의 사용자 이름입니다. 예를 들어 | True |
3.6.7. JBoss EAP 서버의 경로 검색 링크 복사링크가 클립보드에 복사되었습니다!
JBoss EAP 서버의 경로 검색 기능을 사용하여 서버의 성능을 최적화하고 지정된 네임스페이스에서 경로 구성을 간소화할 수 있습니다. 이 기능은 특히 HOSTNAME_HTTPS 변수가 지정되지 않은 경우 보다 원활한 운영 환경을 제공하기 위해 서버 효율성을 개선하는 데 중요합니다.
HOSTNAME_HTTPS 변수가 설정되지 않은 경우 JBoss EAP 서버는 경로 검색을 자동으로 시도합니다. 경로 검색을 활성화하려면 필요한 권한을 생성해야 합니다.
oc create role routeview --verb=list --resource=route -n YOUR_NAME_SPACE
oc policy add-role-to-user routeview system:serviceaccount:YOUR_NAME_SPACE:default --role-namespace=YOUR_NAME_SPACE -n YOUR_NAME_SPACE