Hadoop Auth, Java HTTP SPNEGO - 서버 측 설정
Hadoop Auth, Java HTTP SPNEGO - 서버 측 설정
AuthenticationFilter 필터는 Hadoop Auth의 서버 측 컴포넌트예요. 이 필터는 인증된 요청이 필요한 모든 웹 애플리케이션 리소스 앞에 구성되어야 해요.
출처: 문서
본문
서버 측 설정 설치 (Server Side Configuration Setup)
AuthenticationFilter 필터는 Hadoop Auth의 서버 측 컴포넌트예요. 이 필터는 인증된 요청이 필요한 모든 웹 애플리케이션 리소스 앞에 구성되어야 해요. 예를 들어:
- Hadoop Auth와 의존 JAR 파일은 웹 애플리케이션 클래스패스(보통
WEB-INF/lib디렉터리)에 있어야 해요. - Hadoop Auth는 로깅에 SLF4J-API를 사용해요. Auth Maven POM 의존성은 SLF4J API 의존성을 정의하지만 구체적인 로깅 구현에 대한 의존성은 정의하지 않아요. 이것은 웹 애플리케이션에 명시적으로 추가해야 해요. 예를 들어 웹 애플리케이션이 Log4j를 사용한다면
SLF4J-LOG4J12와LOG4Jjar 파일이 Log4j 구성 파일과 함께 웹 애플리케이션 클래스패스의 일부여야 해요.
공통 구성 파라미터 (Common Configuration parameters)
config.prefix: 지정하면 다른 모든 구성 파라미터 이름이 접두사로 시작해야 해요. 기본값은 접두사 없음이에요.[PREFIX.]type: 인증 유형 키워드(simple또는kerberos) 또는 Authentication handler 구현.[PREFIX.]signature.secret.file:signer.secret.provider가file로 설정되면, HTTP cookie를 서명하는 데 사용되는 비밀을 포함한 파일 위치예요.[PREFIX.]token.validity: 생성된 인증 토큰의 유효 기간(초). 기본값은 36000초예요.signer.secret.provider가random또는zookeeper로 설정될 때 롤오버 간격으로도 사용돼요.[PREFIX.]cookie.domain: 인증 토큰을 저장하는 HTTP cookie에 사용할 도메인.[PREFIX.]cookie.path: 인증 토큰을 저장하는 HTTP cookie에 사용할 경로.signer.secret.provider: 사용할SignerSecretProvider클래스의 이름을 나타내요. 가능한 값:file,random,zookeeper, 또는 클래스 이름. 지정하지 않으면file구현이 사용되고, 그게 실패하면random구현이 사용돼요."file"을 사용하려면signature.secret.file을 지정해 비밀 파일을 가리켜야 해요.
Kerberos 구성 (Kerberos Configuration)
중요: KDC가 구성되고 실행 중이어야 해요. Kerberos SPNEGO를 인증 메커니즘으로 사용하려면 다음과 같은 init param으로 인증 필터를 구성해야 해요 (Kerberos 관련):
[PREFIX.]type: 키워드kerberos.[PREFIX.]kerberos.principal: HTTP 서비스 principal. Kerberos HTTP SPNEGO 사양에 따라HTTP/로 시작해야 해요.[PREFIX.]kerberos.keytab: HTTP 서비스 principal의 크리덴셜이 있는 keytab 파일의 경로.
예:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
...
<filter>
<filter-name>kerberosFilter</filter-name>
<filter-class>org.apache.hadoop.security.authentication.server.AuthenticationFilter</filter-class>
<init-param>
<param-name>type</param-name>
<param-value>kerberos</param-value>
</init-param>
<init-param>
<param-name>token.validity</param-name>
<param-value>30</param-value>
</init-param>
<init-param>
<param-name>cookie.domain</param-name>
<param-value>.foo.com</param-value>
</init-param>
<init-param>
<param-name>cookie.path</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>kerberos.principal</param-name>
<param-value>HTTP/localhost@LOCALHOST</param-value>
</init-param>
<init-param>
<param-name>kerberos.keytab</param-name>
<param-value>/tmp/auth.keytab</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>kerberosFilter</filter-name>
<url-pattern>/kerberos/*</url-pattern>
</filter-mapping>
...
</web-app>
Pseudo/Simple 구성 (Pseudo/Simple Configuration)
Pseudo/Simple을 인증 메커니즘으로 사용하려면(쿼리 문자열 파라미터 'user.name'의 값을 신뢰), 인증 필터를 다음 init param으로 구성해야 해요:
[PREFIX.]type: 키워드simple.[PREFIX.]simple.anonymous.allowed: 익명 요청 허용 여부를 나타내는 boolean 파라미터. 기본값은false.
예:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
...
<filter>
<filter-name>simpleFilter</filter-name>
<filter-class>org.apache.hadoop.security.authentication.server.AuthenticationFilter</filter-class>
<init-param>
<param-name>type</param-name>
<param-value>simple</param-value>
</init-param>
<init-param>
<param-name>token.validity</param-name>
<param-value>30</param-value>
</init-param>
<init-param>
<param-name>cookie.domain</param-name>
<param-value>.foo.com</param-value>
</init-param>
<init-param>
<param-name>cookie.path</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>simple.anonymous.allowed</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>simpleFilter</filter-name>
<url-pattern>/simple/*</url-pattern>
</filter-mapping>
...
</web-app>
AltKerberos 구성 (AltKerberos Configuration)
중요: KDC가 구성되고 실행 중이어야 해요.
AltKerberos 인증 메커니즘은 Kerberos SPNEGO 인증 메커니즘의 일부 구현된 파생물로, 비브라우저는 Kerberos SPNEGO를 사용하고 브라우저는 대체 형태의 인증(사용자가 구현)을 사용하는 "혼합" 인증 형태를 허용해요.
AltKerberos를 인증 메커니즘으로 사용하려면(구현을 제공하는 것 외에), 앞서 언급한 Kerberos SPNEGO init param에 더해 다음 init param으로 인증 필터를 구성해야 해요:
[PREFIX.]type: 사용할AltKerberosAuthenticationHandler구현의 전체 클래스 이름.[PREFIX.]alt-kerberos.non-browser.user-agents: 비브라우저로 간주해야 할 user-agent의 쉼표로 구분된 목록.
예:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
...
<filter>
<filter-name>kerberosFilter</filter-name>
<filter-class>org.apache.hadoop.security.authentication.server.AuthenticationFilter</filter-class>
<init-param>
<param-name>type</param-name>
<param-value>org.my.subclass.of.AltKerberosAuthenticationHandler</param-value>
</init-param>
<init-param>
<param-name>alt-kerberos.non-browser.user-agents</param-name>
<param-value>java,curl,wget,perl</param-value>
</init-param>
<init-param>
<param-name>token.validity</param-name>
<param-value>30</param-value>
</init-param>
<init-param>
<param-name>cookie.domain</param-name>
<param-value>.foo.com</param-value>
</init-param>
<init-param>
<param-name>cookie.path</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>kerberos.principal</param-name>
<param-value>HTTP/localhost@LOCALHOST</param-value>
</init-param>
<init-param>
<param-name>kerberos.keytab</param-name>
<param-value>/tmp/auth.keytab</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>kerberosFilter</filter-name>
<url-pattern>/kerberos/*</url-pattern>
</filter-mapping>
...
</web-app>
LDAP 구성 (LDAP Configuration)
중요: LDAP 서버가 구성되고 실행 중이어야 해요. LDAP 서버와의 통신에 TLS가 활성화되면(ldaps 스킴 또는 'start TLS' 확장을 통해서든), 로컬 truststore에서 LDAP 서버의 공인 인증서를 구성해요.
LDAP 인증 메커니즘은 HTTP Basic 인증 방식을 사용해 사용자가 지정한 자격 증명을 구성된 LDAP(또는 Active Directory) 서버에 대해 검증해요. 인증 필터는 다음 init param으로 구성해야 해요:
[PREFIX.]type: 키워드ldap.[PREFIX.]ldap.providerurl: LDAP 서버의 URL.[PREFIX.]ldap.basedn: LDAP 서버에 사용할 기본 distinguished name (DN). 이 값은 인증 목적으로 제공된 사용자 ID에 추가돼요. Active Directory 서버의 경우 이 속성은 유용하지 않아요.[PREFIX.]ldap.binddomain: LDAP 서버에 사용할 LDAP 바인드 도메인 값. 이 속성은 선택 사항이며 Active Directory 서버(예:example.com)의 경우에만 유용해요.[PREFIX.]ldap.enablestarttls: LDAP 서버가 'StartTLS' 확장을 지원하는지 정의하는 boolean 값.
예:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
...
<filter>
<filter-name>authFilter</filter-name>
<filter-class>org.apache.hadoop.security.authentication.server.AuthenticationFilter</filter-class>
<init-param>
<param-name>type</param-name>
<param-value>ldap</param-value>
</init-param>
<init-param>
<param-name>ldap.providerurl</param-name>
<param-value>ldap://ldap-server-host:8920</param-value>
</init-param>
<init-param>
<param-name>ldap.basedn</param-name>
<param-value>ou=users,dc=example,dc=com</param-value>
</init-param>
<init-param>
<param-name>ldap.enablestarttls</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>authFilter</filter-name>
<url-pattern>/ldap/*</url-pattern>
</filter-mapping>
...
</web-app>
다중-스킴 구성 (Multi-scheme Configuration)
중요: 이 구성은 여러 인증 메커니즘(예: kerberos, ldap 등)을 함께 지원해요. 각 개별 스킴에 대한 구성 관련 세부 정보는 각 스킴의 문서를 참고하세요.
multi-scheme 인증 메커니즘은 HTTP auth 협상 메커니즘(RFC-2616 참고)을 구현해 여러 인증 메커니즘(예: kerberos, ldap 등)을 지원해요. 각 유형의 인증 메커니즘(예: ldap)을 활성화하려면 해당 인증 핸들러를 구성해야 해요. 다음 구성 파라미터를 참고하세요:
[PREFIX.]type: 키워드multi-scheme.[PREFIX.]multi-scheme-auth-handler.schemes: 이 핸들러가 지원하는 HTTP 인증 메커니즘의 쉼표로 구분된 목록. 필수 파라미터이며 기본값이 없어요 (예:multi-scheme-auth-handler.schemes=basic,negotiate).[PREFIX.]multi-scheme-auth-handler.schemes.<scheme-name>.handler: 지정된 인증 스킴에 사용할 인증 핸들러 구현. 기본값이 없어요 (예:multi-scheme-auth-handler.schemes.negotiate.handler=kerberos). 구성된 각 스킴에 이 핸들러 구성을 추가해요.
이 파라미터들 외에 구성된 각 핸들러에 대한 init param도 지정해야 해요.
예:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
...
<filter>
<filter-name>authFilter</filter-name>
<filter-class>org.apache.hadoop.security.authentication.server.AuthenticationFilter</filter-class>
<init-param>
<param-name>type</param-name>
<param-value>multi-scheme</param-value>
</init-param>
<init-param>
<param-name>multi-scheme-auth-handler.schemes</param-name>
<param-value>basic,negotiate</param-value>
</init-param>
<init-param>
<param-name>multi-scheme-auth-handler.basic.handler</param-name>
<param-value>ldap</param-value>
</init-param>
<init-param>
<param-name>multi-scheme-auth-handler.negotiate.handler</param-name>
<param-value>kerberos</param-value>
</init-param>
<init-param>
<param-name>ldap.providerurl</param-name>
<param-value>ldap://ldap-server-host:8920</param-value>
</init-param>
<init-param>
<param-name>ldap.basedn</param-name>
<param-value>ou=users,dc=example,dc=com</param-value>
</init-param>
<init-param>
<param-name>ldap.enablestarttls</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>token.validity</param-name>
<param-value>30</param-value>
</init-param>
<init-param>
<param-name>cookie.domain</param-name>
<param-value>.foo.com</param-value>
</init-param>
<init-param>
<param-name>cookie.path</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>kerberos.principal</param-name>
<param-value>HTTP/localhost@LOCALHOST</param-value>
</init-param>
<init-param>
<param-name>kerberos.keytab</param-name>
<param-value>/tmp/auth.keytab</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>authFilter</filter-name>
<url-pattern>/multi-scheme/*</url-pattern>
</filter-mapping>
...
</web-app>
SignerSecretProvider 구성 (SignerSecretProvider Configuration)
SignerSecretProvider는 HTTP Cookies를 서명하는 데 사용되는 비밀에 대해 더 고급 동작을 제공하는 데 사용돼요. 관련 구성 속성은 다음과 같아요:
signer.secret.provider: 사용할SignerSecretProvider클래스의 이름. 가능한 값:"file","random","zookeeper", 또는 클래스 이름. 지정하지 않으면"file"구현이 사용되고, 그게 실패하면"random"구현이 사용돼요."file"을 사용하려면signature.secret.file을 지정해 비밀 파일을 가리켜야 해요.[PREFIX.]signature.secret.file:signer.secret.provider가file로 설정되거나 지정되지 않으면, HTTP cookie를 서명하는 데 사용되는 비밀 값.[PREFIX.]token.validity: 생성된 인증 토큰의 유효 기간(초). 기본값 36000초.signer.secret.provider가random또는zookeeper로 설정될 때 롤오버 간격으로도 사용돼요.
zookeeper 구현에 특화된 구성 속성:
signer.secret.provider.zookeeper.connection.string: 연결할 ZooKeeper 연결 문자열. 기본값localhost:2181.signer.secret.provider.zookeeper.path: 비밀을 저장하고 검색하는 데 사용할 ZooKeeper 경로. 비밀을 조정해야 하는 모든 서버는 같은 경로를 가리켜야 해요.signer.secret.provider.zookeeper.auth.type: 사용할 인증 유형. 지원 값은none과sasl. 기본값은none.signer.secret.provider.zookeeper.kerberos.keytab: Kerberos keytab 파일 경로로 설정. Kerberos를 사용할 때만 필요해요.signer.secret.provider.zookeeper.kerberos.principal: 사용할 Kerberos principal로 설정. Kerberos를 사용할 때만 필요해요.signer.secret.provider.zookeeper.ssl.enabled:SignerSecretProvider가zookeeper라면 서버와 Zookeeper 사이의 SSL/TLS 통신을 활성화하려면true로 설정.
file 구현 예시:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
...
<filter>
<!-- AuthenticationHandler configs not shown -->
<init-param>
<param-name>signer.secret.provider</param-name>
<param-value>file</param-value>
</init-param>
<init-param>
<param-name>signature.secret.file</param-name>
<param-value>/myapp/secret_file</param-value>
</init-param>
</filter>
...
</web-app>
random 구현 예시:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
...
<filter>
<!-- AuthenticationHandler configs not shown -->
<init-param>
<param-name>signer.secret.provider</param-name>
<param-value>random</param-value>
</init-param>
<init-param>
<param-name>token.validity</param-name>
<param-value>30</param-value>
</init-param>
</filter>
...
</web-app>
zookeeper 구현 예시:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
...
<filter>
<!-- AuthenticationHandler configs not shown -->
<init-param>
<param-name>signer.secret.provider</param-name>
<param-value>zookeeper</param-value>
</init-param>
<init-param>
<param-name>token.validity</param-name>
<param-value>30</param-value>
</init-param>
<init-param>
<param-name>signer.secret.provider.zookeeper.connection.string</param-name>
<param-value>zoo1:2181,zoo2:2181,zoo3:2181</param-value>
</init-param>
<init-param>
<param-name>signer.secret.provider.zookeeper.path</param-name>
<param-value>/myapp/secrets</param-value>
</init-param>
<init-param>
<param-name>signer.secret.provider.zookeeper.kerberos.keytab</param-name>
<param-value>/tmp/auth.keytab</param-value>
</init-param>
<init-param>
<param-name>signer.secret.provider.zookeeper.kerberos.principal</param-name>
<param-value>HTTP/localhost@LOCALHOST</param-value>
</init-param>
</filter>
...
</web-app>
더 알아보기 (Learn more)
- 원문: 문서