1.5. JAAS 영역 생성
1.5.1. Elytron의 JAAS 영역 링크 복사링크가 클립보드에 복사되었습니다!
JAAS(Java Authentication and Authorization Service) 영역 jaas-realm 은 사용자의 인증 정보 확인 및 사용자 역할을 할당하기 위해 elytron 하위 시스템에서 사용자 정의 로그인 모듈을 구성하는 데 사용할 수 있는 보안 영역입니다.
jaas-realm 을 사용하여 JBoss EAP 관리 인터페이스와 배포된 애플리케이션을 모두 보호할 수 있습니다.
JAAS 영역은 JAAS 구성 파일에 지정된 로그인 모듈을 사용하는 javax.security.auth.login.LoginContext 를 초기화하여 사용자 자격 증명을 확인합니다.
로그인 모듈은 javax.security.auth.login.LoginContext.LoginModule 인터페이스의 구현입니다. 이러한 구현을 서버에 JBoss EAP 모듈로 추가하고 JAAS 구성 파일에 지정합니다.
JAAS 구성 파일의 예
test {
loginmodules.CustomLoginModule1 optional;
loginmodules.CustomLoginModule2 optional myOption1=true myOption2=exampleOption;
};
- 1
jaas-realm을 구성할 때 사용하는 항목의 이름입니다.- 2
- 선택적 플래그가 있는 로그인 모듈입니다. JAAS에서 정의한 모든 플래그를 사용할 수 있습니다. 자세한 내용은 Oracle Java SE 문서의 JAAS 로그인 구성 파일을 참조하십시오.
- 3
- 선택적 플래그 및 옵션이 있는 로그인 모듈입니다.
로그인 모듈의 주체 매핑 및 역할 연관의 주체
제목의 주체를 사용하여 로그인 모듈에서 가져온 ID에 속성을 추가할 수 있습니다. 주체 는 인증된 사용자이며 주체는 제목에 포함된 사용자 이름과 같은 식별자입니다.
Elytron은 다음과 같이 ID를 확보하고 매핑합니다.
-
로그인 모듈은
javax.security.auth.Subject를 사용하여 인증되는 주체 를 나타냅니다. -
주체 는 연결된
java.security.Principal라는 여러 인스턴스가 있을 수 있습니다. -
Elytron은
org.wildfly.security.auth.server.SecurityIdentity를 사용하여 인증된 사용자를 나타냅니다. Elytron은SecurityIdentity의 적용을 받습니다.
주체의 주체는 다음 규칙을 사용하여 보안 ID의 속성에 매핑됩니다.
-
특성의
키는principal.getClass().getSimpleName()호출에서 가져온 간단한 클래스 이름입니다. -
값은principal.getName()호출에서 가져온 주요 's name)입니다. - 동일한 유형의 보안 주체s의 경우 속성 키 아래에 값이 컬렉션에 추가됩니다.
1.5.2. 사용자 정의 JAAS 로그인 모듈 개발 링크 복사링크가 클립보드에 복사되었습니다!
사용자 지정 JAAS(Java Authentication and Authorization Service) 로그인 모듈을 생성하여 사용자 정의 인증 및 권한 부여 기능을 구현할 수 있습니다.
Elytron 하위 시스템에서 jaas-realm 을 통해 사용자 지정 JAAS 로그인 모듈을 사용하여 JBoss EAP 관리 인터페이스 및 배포된 애플리케이션을 보호할 수 있습니다. 로그인 모듈은 배포의 일부가 아니며 JBoss EAP 모듈로 포함됩니다.
다음 절차는 예제로만 제공됩니다. 보안하려는 애플리케이션이 이미 있는 경우 이를 건너뛰고 애플리케이션에 인증 및 권한 부여 추가로 직접 이동할 수 있습니다.
1.5.2.1. JAAS 로그인 모듈 개발을 위한 Maven 프로젝트 생성 링크 복사링크가 클립보드에 복사되었습니다!
사용자 지정 JAAS(Java Authentication and Authorization Service) 로그인 모듈을 생성하려면 필요한 종속성 및 디렉터리 구조가 포함된 Maven 프로젝트를 생성합니다.
사전 요구 사항
- Maven이 설치되어 있어야 합니다. 자세한 내용은 Apache Maven 다운로드를 참조하십시오.
프로세스
CLI에서
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-simple \ -DinteractiveMode=false예제
$ mvn archetype:generate \ -DgroupId=com.example.loginmodule \ -DartifactId=example-custom-login-module \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-simple \ -DinteractiveMode=false애플리케이션 루트 디렉터리로 이동합니다.
구문
$ cd <name-of-your-application>예제
$ cd example-custom-login-module생성된
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>custom.loginmodules</groupId> <artifactId>custom-login-modules</artifactId> <version>1.0</version> <dependencies> <dependency> <groupId>org.wildfly.security</groupId> <artifactId>wildfly-elytron</artifactId> <version>1.17.2.Final</version> </dependency> <dependency> <groupId>jakarta.security.enterprise</groupId> <artifactId>jakarta.security.enterprise-api</artifactId> <version>3.0.0</version> </dependency> </dependencies> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> </project>이 예제에 필요하지 않으므로 디렉터리
사이트및테스트를제거합니다.$ rm -rf src/site/ $ rm -rf src/test/
검증
애플리케이션 루트 디렉터리에 다음 명령을 입력합니다.
$ mvn install다음과 유사한 출력이 표시됩니다.
... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.404 s [INFO] Finished at: 2022-04-28T13:55:18+05:30 [INFO] ------------------------------------------------------------------------
이제 사용자 지정 JAAS 로그인 모듈을 생성할 수 있습니다.
1.5.2.2. 사용자 정의 JAAS 로그인 모듈 생성 링크 복사링크가 클립보드에 복사되었습니다!
javax.security.auth.spi.LoginModule 인터페이스를 구현하는 클래스를 생성하여 사용자 정의 JAAS(Java Authentication and Authorization Service) 로그인 모듈을 생성합니다. 또한 사용자 정의 로그인 모듈에 대한 플래그 및 옵션을 사용하여 JAAS 구성 파일을 생성합니다.
이 절차에서 < ;application_home >은 애플리케이션의 pom.xml 구성 파일이 포함된 디렉터리를 나타냅니다.
사전 요구 사항
Maven 프로젝트를 생성했습니다.
자세한 내용은 JAAS 로그인 모듈 개발을 위한 Maven 프로젝트 생성 을 참조하십시오.
프로세스
Java 파일을 저장할 디렉터리를 만듭니다.
구문
$ mkdir -p src/main/java/<path_based_on_artifactID>예제
$ mkdir -p src/main/java/com/example/loginmodule소스 파일이 포함된 디렉터리로 이동합니다.
구문
$ cd src/main/java/<path_based_on_groupID>예제
$ cd src/main/java/com/example/loginmodule생성된
App.java파일을 삭제합니다.$ rm App.java사용자 정의 로그인 모듈 소스에 대한
ExampleCustomLoginModule.java파일을 생성합니다.package com.example.loginmodule; import org.wildfly.security.auth.principal.NamePrincipal; import javax.security.auth.Subject; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.PasswordCallback; import javax.security.auth.callback.UnsupportedCallbackException; import javax.security.auth.login.LoginException; import javax.security.auth.spi.LoginModule; import java.io.IOException; import java.security.Principal; import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class ExampleCustomLoginModule implements LoginModule { private final Map<String, char[]> usersMap = new HashMap<String, char[]>(); private Principal principal; private Subject subject; private CallbackHandler handler; /** * In this example, identities are created as fixed Strings. * * The identities are: * user1 has the password passwordUser1 * user2 has the password passwordUser2 * * Use these credentials when you secure management interfaces * or applications with this login module. * * In a production login module, you would get the identities * from a data source. * */ @Override public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) { this.subject = subject; this.handler = callbackHandler; this.usersMap.put("user1", "passwordUser1".toCharArray()); this.usersMap.put("user2", "passwordUser2".toCharArray()); } @Override public boolean login() throws LoginException { // obtain the incoming username and password from the callback handler NameCallback nameCallback = new NameCallback("Username"); PasswordCallback passwordCallback = new PasswordCallback("Password", false); Callback[] callbacks = new Callback[]{nameCallback, passwordCallback}; try { this.handler.handle(callbacks); } catch (UnsupportedCallbackException | IOException e) { throw new LoginException("Error handling callback: " + e.getMessage()); } final String username = nameCallback.getName(); this.principal = new NamePrincipal(username); final char[] password = passwordCallback.getPassword(); char[] storedPassword = this.usersMap.get(username); if (!Arrays.equals(storedPassword, password)) { throw new LoginException("Invalid password"); } else { return true; } } /** * user1 is assigned the roles Admin, User and Guest. * In a production login module, you would get the identities * from a data source. * */ @Override public boolean commit() throws LoginException { if (this.principal.getName().equals("user1")) { this.subject.getPrincipals().add(new Roles("Admin")); this.subject.getPrincipals().add(new Roles("User")); this.subject.getPrincipals().add(new Roles("Guest")); } return true; } @Override public boolean abort() throws LoginException { return true; } @Override public boolean logout() throws LoginException { this.subject.getPrincipals().clear(); return true; } /** * Principal with simple classname 'Roles' will be mapped to the identity's attribute with name 'Roles'. */ private static class Roles implements Principal { private final String name; Roles(final String name) { this.name = name; } /** * @return name of the principal. This will be added as a value to the identity's attribute which has a name equal to the simple name of this class. In this example, this value will be added to the attribute with a name 'Roles'. */ public String getName() { return this.name; } } }< ;application_home > 디렉터리에서 JAAS 구성 파일
JAAS-login-modules.conf를 만듭니다.exampleConfiguration { com.example.loginmodule.ExampleCustomLoginModule optional; };-
exampleConfiguration은 Entry 이름입니다. -
com.example.loginmodule.ExampleCustomLoginModule은 로그인 모듈입니다. -
선택사항은 플래그입니다.
-
로그인 모듈을 컴파일합니다.
$ mvn package ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.321 s [INFO] Finished at: 2022-04-28T14:16:03+05:30 [INFO] ------------------------------------------------------------------------
이제 로그인 모듈을 사용하여 JBoss EAP 관리 인터페이스 및 배포된 애플리케이션을 보호할 수 있습니다.
1.5.3. Elytron에서 jaas-realm 만들기 링크 복사링크가 클립보드에 복사되었습니다!
JAAS(Java Authentication and Authorization Service) 호환 사용자 로그인 모듈에서 지원하는 Elytron 보안 영역을 생성하여 JBoss EAP 서버 인터페이스 또는 배포된 애플리케이션을 보호합니다. 보안 영역을 사용하여 보안 도메인을 생성합니다.
사전 요구 사항
JAR로 사용자 정의 로그인 모듈을 패키징했습니다.
로그인 모듈 예제는 사용자 정의 JAAS 로그인 모듈 개발을 참조하십시오.
- JBoss EAP가 실행 중입니다.
프로세스
관리 CLI를 사용하여 로그인 모듈 JAR을 모듈로 추가합니다.
구문
module add --name=<name_of_the_login_moudle> --resources=<path_to_the_login_module_jar> --dependencies=org.wildfly.security.elytron예제
module add --name=exampleLoginModule --resources=<path_to_login_module>/custom-login-modules-1.0.jar --dependencies=org.wildfly.security.elytron로그인 모듈과 JAAS 로그인 구성 파일에서
jaas-realm을 생성합니다.구문
/subsystem=elytron/jaas-realm=<jaas_realm_name>:add(entry=<entry-name>,path=<path_to_module_config_file>,module=<name_of_the_login_module>,callback-handler=<name_of_the_optional_callback_handler>)예제
/subsystem=elytron/jaas-realm=exampleSecurityRealm:add(entry=exampleConfiguration,path=<path_to_login_module>/JAAS-login-modules.conf,module=exampleLoginModule)jaas-realm을 참조하는 보안 도메인을 만듭니다.구문
/subsystem=elytron/security-domain=<security_domain_name>:add(default-realm=<jaas_realm_name>,realms=[{realm=<jaas_realm_name>}],permission-mapper=default-permission-mapper)예제
/subsystem=elytron/security-domain=exampleSecurityDomain:add(default-realm=exampleSecurityRealm,realms=[{realm=exampleSecurityRealm}],permission-mapper=default-permission-mapper) {"outcome" => "success"}
이제 생성된 보안 도메인을 사용하여 관리 인터페이스 및 애플리케이션에 인증 및 권한 부여를 추가할 수 있습니다. 자세한 내용은 관리 인터페이스 및 애플리케이션 보안을 참조하십시오.