보안 모드의 Hadoop
보안 모드의 Hadoop (Hadoop in Secure Mode)
소개 (Introduction)
기본 구성에서 공격자가 모든 네트워크 접근을 제한함으로써 Hadoop 클러스터에 접근하지 못하도록 해야 합니다. 원격으로 데이터에 접근하거나 작업을 제출할 수 있는 사람에 대한 제한을 원한다면, 이 문서에 설명된 대로 Hadoop 클러스터의 인증과 접근을 반드시 보안해야 합니다.
Hadoop이 보안 모드에서 실행되도록 구성되면 각 Hadoop 서비스와 각 사용자는 Kerberos로 인증되어야 합니다.
모든 서비스 호스트에 대한 정방향 및 역방향 호스트 조회는 서비스가 서로 인증할 수 있도록 올바르게 구성되어야 합니다. 호스트 조회는 DNS 또는 /etc/hosts 파일을 사용해 구성할 수 있습니다. 보안 모드에서 Hadoop 서비스를 구성하기 전에 Kerberos와 DNS에 대한 실무 지식이 권장됩니다.
Hadoop의 보안 기능은 인증(Authentication), 서비스 레벨 인가(Service Level Authorization), 웹 콘솔 인증(Authentication for Web Consoles), 데이터 기밀성(Data Confidentiality)으로 구성됩니다.
인증 (Authentication)
최종 사용자 계정 (End User Accounts)
서비스 레벨 인증이 켜지면 최종 사용자는 Hadoop 서비스와 상호작용하기 전에 자신을 인증해야 합니다. 가장 간단한 방법은 Kerberos kinit 명령으로 사용자가 대화식으로 인증하는 것입니다. kinit로 대화식 로그인이 불가능할 때는 Kerberos keytab 파일을 사용한 프로그래밍 방식 인증을 사용할 수 있습니다.
Hadoop 데몬용 사용자 계정
HDFS과 YARN 데몬이 hdfs와 yarn 같은 서로 다른 Unix 사용자로 실행되도록 하세요. 또한 MapReduce JobHistory 서버가 mapred 같은 서로 다른 사용자로 실행되도록 하세요.
그것들이 hadoop 같은 Unix 그룹을 공유하는 것이 좋습니다. 그룹 관리는 "user에서 group으로의 매핑(Mapping from user to group)"도 참고하세요.
| 사용자:그룹 | 데몬 |
|---|---|
| hdfs:hadoop | NameNode, Secondary NameNode, JournalNode, DataNode |
| yarn:hadoop | ResourceManager, NodeManager |
| mapred:hadoop | MapReduce JobHistory Server |
Hadoop 데몬용 Kerberos 프린시펄
각 Hadoop Service 인스턴스는 자체 Kerberos 프린시펄과 keytab 파일 위치로 구성되어야 합니다.
서비스 프린시펄의 일반 형식은 ServiceName/[email protected]입니다. 예: dn/[email protected].
Hadoop은 서비스 프린시펄의 호스트 이름 구성요소를 _HOST 와일드카드로 지정할 수 있게 하여 구성 파일 배포를 단순화합니다. 각 서비스 인스턴스는 런타임에 _HOST를 자신의 완전한 호스트 이름으로 대체합니다. 이렇게 하면 관리자가 모든 노드에 동일한 구성 파일 집합을 배포할 수 있습니다. 그러나 keytab 파일은 서로 다릅니다.
HDFS
각 NameNode 호스트의 NameNode keytab 파일은 다음과 같아야 합니다.
$ klist -e -k -t /etc/security/keytab/nn.service.keytab
Keytab name: FILE:/etc/security/keytab/nn.service.keytab
KVNO Timestamp Principal
4 07/18/11 21:08:09 nn/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 nn/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 nn/[email protected] (ArcFour with HMAC/md5)
4 07/18/11 21:08:09 host/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 host/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 host/[email protected] (ArcFour with HMAC/md5)
그 호스트의 Secondary NameNode keytab 파일은 다음과 같아야 합니다.
$ klist -e -k -t /etc/security/keytab/sn.service.keytab
Keytab name: FILE:/etc/security/keytab/sn.service.keytab
KVNO Timestamp Principal
4 07/18/11 21:08:09 sn/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 sn/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 sn/[email protected] (ArcFour with HMAC/md5)
4 07/18/11 21:08:09 host/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 host/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 host/[email protected] (ArcFour with HMAC/md5)
각 호스트의 DataNode keytab 파일은 다음과 같아야 합니다.
$ klist -e -k -t /etc/security/keytab/dn.service.keytab
Keytab name: FILE:/etc/security/keytab/dn.service.keytab
KVNO Timestamp Principal
4 07/18/11 21:08:09 dn/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 dn/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 dn/[email protected] (ArcFour with HMAC/md5)
4 07/18/11 21:08:09 host/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 host/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 host/[email protected] (ArcFour with HMAC/md5)
YARN
ResourceManager 호스트의 ResourceManager keytab 파일은 다음과 같아야 합니다.
$ klist -e -k -t /etc/security/keytab/rm.service.keytab
Keytab name: FILE:/etc/security/keytab/rm.service.keytab
KVNO Timestamp Principal
4 07/18/11 21:08:09 rm/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 rm/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 rm/[email protected] (ArcFour with HMAC/md5)
4 07/18/11 21:08:09 host/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 host/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 host/[email protected] (ArcFour with HMAC/md5)
각 호스트의 NodeManager keytab 파일은 다음과 같아야 합니다.
$ klist -e -k -t /etc/security/keytab/nm.service.keytab
Keytab name: FILE:/etc/security/keytab/nm.service.keytab
KVNO Timestamp Principal
4 07/18/11 21:08:09 nm/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 nm/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 nm/[email protected] (ArcFour with HMAC/md5)
4 07/18/11 21:08:09 host/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 host/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 host/[email protected] (ArcFour with HMAC/md5)
MapReduce JobHistory Server
그 호스트의 MapReduce JobHistory Server keytab 파일은 다음과 같아야 합니다.
$ klist -e -k -t /etc/security/keytab/jhs.service.keytab
Keytab name: FILE:/etc/security/keytab/jhs.service.keytab
KVNO Timestamp Principal
4 07/18/11 21:08:09 jhs/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 jhs/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 jhs/[email protected] (ArcFour with HMAC/md5)
4 07/18/11 21:08:09 host/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 host/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 07/18/11 21:08:09 host/[email protected] (ArcFour with HMAC/md5)
Kerberos 프린시펄에서 OS 사용자 계정으로의 매핑
Hadoop은 hadoop.security.auth_to_local에 지정된 규칙을 사용해 Kerberos 프린시펄을 OS 사용자(시스템) 계정에 매핑합니다. Hadoop이 이 규칙을 어떻게 평가하는지는 hadoop.security.auth_to_local.mechanism의 설정에 의해 결정됩니다.
기본 hadoop 모드에서 Kerberos 프린시펄은 '@' 또는 '/'가 없는 사용자 계정 이름인 단순 형태로 프린시펄을 변환하는 규칙과 일치해야 합니다. 그렇지 않으면 프린시펄이 인가되지 않고 오류가 기록됩니다. MIT 모드의 경우 규칙은 Kerberos 구성 파일(krb5.conf)의 auth_to_local과 같은 방식으로 작동하며 hadoop 모드의 제한은 적용되지 않습니다. MIT 모드를 사용한다면 기본 영역(default realm)의 일부로 /etc/krb5.conf에 지정된 것과 동일한 auth_to_local 규칙을 사용하고 동기화를 유지하는 것이 좋습니다. hadoop과 MIT 모드 모두에서 규칙은(DEFAULT 제외) 지정된 영역과 관계없이 모든 프린시펄에 적용됩니다. 또한 auth_to_local 규칙을 ACL로 의존해서는 안 되고 적절한(OS) 메커니즘을 사용해야 합니다.
auth_to_local의 가능한 값:
RULE:exp로컬 이름은 exp로부터 구성됩니다. exp의 형식은[n:string](regexp)s/pattern/replacement/g입니다. 정수 n은 대상 프린시펄이 가져야 할 구성요소 수를 나타냅니다. 일치하면 string에서 문자열이 구성되며, 프린시펄의 realm을 $0으로, 프린시펄의 n번째 구성요소를 $n으로 대체합니다(예: 프린시펄이 johndoe/admin이면 [2:$2$1foo]는 adminjohndoefoo 문자열을 만듭니다). 이 문자열이 regexp와 일치하면 s//[g] 치환 명령이 문자열에 대해 실행됩니다. 선택적 g는 문자열에서 첫 번째 일치만 바꾸는 대신 치환을 문자열 전체에 적용하게 합니다. MIT에 대한 확장으로 Hadoop auth_to_local 매핑은 반환된 이름을 소문자로 만드는 /L 플래그를 지원합니다.DEFAULTrealm이 default_realm(보통 /etc/krb5.conf에 정의)과 일치하는 경우에만 프린시펄 이름의 첫 번째 구성요소를 시스템 사용자 이름으로 선택합니다. 예: 기본 규칙은 default realm이 MYREALM.TLD이면 프린시펄 host/[email protected]를 시스템 사용자 host로 매핑합니다.
규칙이 지정되지 않으면 Hadoop은 DEFAULT를 기본으로 사용하며, 이는 대부분의 클러스터에 적합하지 않을 수 있습니다.
Hadoop은 여러 기본 영역을 지원하지 않습니다(Heimdal처럼). 또한 Hadoop은 로컬 시스템 계정이 존재하는지 매핑에 대해 검증하지 않습니다.
규칙 예시 (Example rules)
일반적인 클러스터에서 HDFS와 YARN 서비스는 각각 시스템 사용자 hdfs와 yarn으로 시작됩니다. hadoop.security.auth_to_local은 다음과 같이 구성할 수 있습니다.
<property>
<name>hadoop.security.auth_to_local</name>
<value>
RULE:[2:$1/$2@$0]([ndj]n/.*@REALM.\TLD)s/.*/hdfs/
RULE:[2:$1/$2@$0]([rn]m/.*@REALM\.TLD)s/.*/yarn/
RULE:[2:$1/$2@$0](jhs/.*@REALM\.TLD)s/.*/mapred/
DEFAULT
</value>
</property>
이것은 REALM.TLD 영역의 모든 호스트에 있는 어떤 nn, dn, jn 프린시펄도 로컬 시스템 계정 hdfs에 매핑합니다. 두 번째로 REALM.TLD의 모든 호스트에 있는 어떤 rm, nm 프린시펄을 로컬 시스템 계정 yarn에 매핑합니다. 세 번째로 REALM.TLD 영역의 모든 호스트에 있는 jhs 프린시펄을 로컬 시스템 계정 mapred에 매핑합니다. 마지막으로 default 영역의 모든 호스트에 있는 어떤 프린시펄이든 그 프린시펄의 사용자 구성요소에 매핑됩니다.
사용자 지정 규칙은 hadoop kerbname 명령으로 테스트할 수 있습니다. 이 명령은 프린시펄을 지정하고 Hadoop의 현재 auth_to_local 규칙 집합을 적용할 수 있게 합니다.
사용자에서 그룹으로의 매핑
시스템 사용자에서 시스템 그룹으로의 매핑 메커니즘은 hadoop.security.group.mapping으로 구성할 수 있습니다. 자세한 내용은 Hadoop Groups Mapping을 참고하세요.
실질적으로 보안 모드의 Hadoop에 대해 Kerberos와 함께 LDAP를 사용해 SSO 환경을 관리해야 합니다.
프록시 사용자 (Proxy user)
최종 사용자를 대신해 Hadoop의 서비스를 접근하는 Apache Oozie 같은 일부 제품은 최종 사용자를 가장(impersonate)할 수 있어야 합니다. 자세한 내용은 프록시 사용자 문서를 참고하세요.
보안 DataNode (Secure DataNode)
DataNode 데이터 전송 프로토콜은 Hadoop RPC 프레임워크를 사용하지 않으므로, DataNode는 dfs.datanode.address와 dfs.datanode.http.address로 지정된 특권 포트를 사용해 스스로를 인증해야 합니다. 이 인증은 공격자가 DataNode 호스트에서 root 권한을 얻을 수 없다는 가정에 기반합니다.
hdfs datanode 명령을 root로 실행하면 서버 프로세스가 먼저 특권 포트에 바인딩한 다음 특권을 버리고 HDFS_DATANODE_SECURE_USER가 지정한 사용자 계정으로 실행됩니다. 이 시작 프로세스는 JSVC_HOME에 설치된 jsvc 프로그램을 사용합니다. 시작 시 HDFS_DATANODE_SECURE_USER와 JSVC_HOME을 환경 변수(hadoop-env.sh)로 지정해야 합니다.
버전 2.6.0부터 SASL을 사용해 데이터 전송 프로토콜을 인증할 수 있습니다. 이 구성에서는 보안 클러스터가 더 이상 root로 jsvc를 사용해 DataNode를 시작하고 특권 포트에 바인딩할 필요가 없습니다. 데이터 전송 프로토콜에서 SASL을 활성화하려면 hdfs-site.xml에 dfs.data.transfer.protection을 설정하세요. SASL 활성화 DataNode는 보안 모드에서 두 가지 방법으로 시작할 수 있습니다. 1. dfs.datanode.address에 비특권 포트를 설정. 2. dfs.http.policy를 HTTPS_ONLY로 설정하거나 dfs.datanode.http.address를 특권 포트로 설정하고 시작 시 HDFS_DATANODE_SECURE_USER와 JSVC_HOME 환경 변수가 적절히 지정되었는지 확인(hadoop-env.sh).
root 인증을 사용했던 기존 클러스터를 SASL을 사용하도록 마이그레이션하려면, 먼저 버전 2.6.0 이상이 모든 클러스터 노드와 클러스터에 연결해야 하는 외부 애플리케이션에 배포되었는지 확인하세요. HDFS 클라이언트의 2.6.0 이상 버전만 데이터 전송 프로토콜 인증에 SASL을 사용하는 DataNode에 연결할 수 있으므로, 마이그레이션 전에 모든 호출자가 올바른 버전을 가지는 것이 매우 중요합니다. 2.6.0 이상이 모든 곳에 배포된 후 외부 애플리케이션의 구성을 업데이트해 SASL을 활성화하세요. HDFS 클라이언트가 SASL로 활성화되면 root 인증이나 SASL 인증으로 실행되는 DataNode 모두에 성공적으로 연결할 수 있습니다. 모든 클라이언트에 대한 구성 변경은 DataNode의 이후 구성 변경이 애플리케이션을 방해하지 않도록 보장합니다. 마지막으로 각 개별 DataNode는 구성 변경과 재시작으로 마이그레이션할 수 있습니다. 이 마이그레이션 기간 동안 일부 DataNode는 root 인증으로, 일부는 SASL 인증으로 실행되는 혼합이 허용됩니다. SASL로 활성화된 HDFS 클라이언트는 둘 다에 연결할 수 있기 때문입니다.
데이터 기밀성 (Data confidentiality)
RPC 데이터 암호화
hadoop 서비스와 클라이언트 사이에 전송되는 데이터는 wire에서 암호화될 수 있습니다. core-site.xml에서 hadoop.rpc.protection을 privacy로 설정하면 데이터 암호화가 활성화됩니다.
블록 데이터 전송 암호화
DataNode의 데이터 전송 프로토콜에 대한 데이터 암호화를 활성화하려면 hdfs-site.xml에서 dfs.encrypt.data.transfer를 true로 설정해야 합니다.
선택적으로 dfs.encrypt.data.transfer.algorithm을 3des 또는 rc4로 설정해 특정 암호화 알고리즘을 선택할 수 있습니다. 지정하지 않으면 시스템에 구성된 JCE 기본값(보통 3DES)이 사용됩니다.
dfs.encrypt.data.transfer.cipher.suites를 AES/CTR/NoPadding으로 설정하면 AES 암호화가 활성화됩니다. 기본적으로 지정되지 않으므로 AES는 사용되지 않습니다. AES를 사용할 때 dfs.encrypt.data.transfer.algorithm에 지정된 알고리즘은 초기 키 교환 중에 여전히 사용됩니다. AES 키 비트 길이는 dfs.encrypt.data.transfer.cipher.key.bitlength를 128, 192 또는 256으로 설정해 구성할 수 있습니다. 기본값은 128입니다.
AES는 최고의 암호화 강도와 최상의 성능을 제공합니다. 현재 3DES와 RC4가 Hadoop 클러스터에서 더 자주 사용되었습니다.
dfs.encrypt.data.transfer.cipher.suites를 SM4/CTR/NoPadding으로 설정해 SM4 암호화를 활성화할 수도 있습니다. 기본적으로 지정되지 않습니다. SM4 키 비트 길이는 dfs.encrypt.data.transfer.cipher.key.bitlength를 128, 192 또는 256으로 설정해 구성할 수 있습니다. 기본값은 128입니다.
HTTP 데이터 암호화
웹 콘솔과 클라이언트 사이의 데이터 전송은 SSL(HTTPS)을 사용해 보호됩니다. SSL 구성은 권장되지만 Kerberos로 Hadoop 보안을 구성하는 데 필수는 아닙니다.
HDFS 데몬의 웹 콘솔에 SSL을 활성화하려면 hdfs-site.xml에서 dfs.http.policy를 HTTPS_ONLY 또는 HTTP_AND_HTTPS로 설정하세요. KMS와 HttpFS는 이 파라미터를 따르지 않습니다. KMS over HTTPS 및 HttpFS over HTTPS 활성화 지침은 각각 Hadoop KMS와 Hadoop HDFS over HTTP - Server Setup을 참고하세요.
YARN 데몬의 웹 콘솔에 SSL을 활성화하려면 yarn-site.xml에서 yarn.http.policy를 HTTPS_ONLY로 설정하세요.
MapReduce JobHistory 서버의 웹 콘솔에 SSL을 활성화하려면 mapred-site.xml에서 mapreduce.jobhistory.http.policy를 HTTPS_ONLY로 설정하세요.
구성 (Configuration)
HDFS 및 로컬 파일시스템 경로에 대한 권한
다음 표는 HDFS 및 로컬 파일시스템(모든 노드에서)의 다양한 경로와 권장 권한을 나열합니다.
| 파일시스템 | 경로 | 사용자:그룹 | 권한 |
|---|---|---|---|
| local | dfs.namenode.name.dir | hdfs:hadoop | drwx------ |
| local | dfs.datanode.data.dir | hdfs:hadoop | drwx------ |
| local | $HADOOP_LOG_DIR | hdfs:hadoop | drwxrwxr-x |
| local | $YARN_LOG_DIR | yarn:hadoop | drwxrwxr-x |
| local | yarn.nodemanager.local-dirs | yarn:hadoop | drwxr-xr-x |
| local | yarn.nodemanager.log-dirs | yarn:hadoop | drwxr-xr-x |
| local | container-executor | root:hadoop | --Sr-s--* |
| local | conf/container-executor.cfg | root:hadoop | r-------* |
| hdfs | / | hdfs:hadoop | drwxr-xr-x |
| hdfs | /tmp | hdfs:hadoop | drwxrwxrwxt |
| hdfs | /user | hdfs:hadoop | drwxr-xr-x |
| hdfs | yarn.nodemanager.remote-app-log-dir | yarn:hadoop | drwxrwxrwxt |
| hdfs | mapreduce.jobhistory.intermediate-done-dir | mapred:hadoop | drwxrwxrwxt |
| hdfs | mapreduce.jobhistory.done-dir | mapred:hadoop | drwxr-x--- |
공통 구성 (Common Configurations)
hadoop에서 RPC 인증을 켜려면 hadoop.security.authentication 속성 값을 "kerberos"로 설정하고 아래 나열된 보안 관련 설정을 적절히 설정합니다.
다음 속성은 클러스터의 모든 노드 core-site.xml에 있어야 합니다.
| 파라미터 | 값 | 설명 |
|---|---|---|
| hadoop.security.authentication | kerberos | simple : 인증 없음. (기본값) kerberos : Kerberos로 인증 활성화. |
| hadoop.security.authorization | true | RPC 서비스 레벨 인가 활성화. |
| hadoop.rpc.protection | authentication | authentication : 인증만(기본값); integrity : 인증에 더해 무결성 검사; privacy : 무결성에 더해 데이터 암호화. |
| hadoop.security.auth_to_local | RULE:exp1 RULE:exp2 … DEFAULT | 새 행 문자를 포함하는 문자열 값. exp 형식은 Kerberos 문서를 참고하세요. |
| hadoop.proxyuser.superuser.hosts | (비어 있음) | 슈퍼유저 접근이 가장(impersonation)을 허용하는 호스트의 쉼표 구분 목록. *는 와일드카드. |
| hadoop.proxyuser.superuser.groups | (비어 있음) | 슈퍼유저가 가장한 사용자가 속한 그룹의 쉼표 구분 목록. *는 와일드카드. |
NameNode
| 파라미터 | 값 | 설명 |
|---|---|---|
| dfs.block.access.token.enable | true | 보안 작업을 위해 HDFS 블록 접근 토큰 활성화. |
| dfs.namenode.kerberos.principal | nn/[email protected] | NameNode의 Kerberos 프린시펄 이름. |
| dfs.namenode.keytab.file | /etc/security/keytab/nn.service.keytab | NameNode의 Kerberos keytab 파일. |
| dfs.namenode.kerberos.internal.spnego.principal | HTTP/[email protected] | NameNode가 웹 UI SPNEGO 인증에 사용하는 서버 프린시펄. SPNEGO 서버 프린시펄은 관례상 HTTP/ 접두사로 시작. 값이 '*'이면 웹 서버가 keytab 파일 dfs.web.authentication.kerberos.keytab에 지정된 모든 프린시펄로 로그인을 시도. 대부분의 배포에서 ${dfs.web.authentication.kerberos.principal} 즉 dfs.web.authentication.kerberos.principal의 값으로 설정할 수 있음. |
| dfs.web.authentication.kerberos.keytab | /etc/security/keytab/spnego.service.keytab | NameNode의 SPNEGO keytab 파일. HA 클러스터에서는 이 설정이 Journal Nodes와 공유됩니다. |
다음 설정은 NameNode 웹 UI에 대한 SSL 접근을 구성할 수 있습니다(선택 사항).
| 파라미터 | 값 | 설명 |
|---|---|---|
| dfs.http.policy | HTTP_ONLY 또는 HTTPS_ONLY 또는 HTTP_AND_HTTPS | HTTPS_ONLY는 http 접근을 끕니다. root로 DataNode를 실행하고 특권 포트를 사용하는 대신 SASL로 데이터 전송 프로토콜을 인증한다면, HTTP 서버의 인증을 보장하기 위해 이 속성을 HTTPS_ONLY로 설정해야 합니다. (dfs.data.transfer.protection 참고.) |
| dfs.namenode.https-address | 0.0.0.0:9871 | 이 파라미터는 비-HA 모드이고 페더레이션이 없는 경우에 사용됩니다. 자세한 내용은 HDFS High Availability와 HDFS Federation을 참고하세요. |
Secondary NameNode
| 파라미터 | 값 | 설명 |
|---|---|---|
| dfs.namenode.secondary.http-address | 0.0.0.0:9868 | Secondary NameNode의 HTTP 웹 UI 주소. |
| dfs.namenode.secondary.https-address | 0.0.0.0:9869 | Secondary NameNode의 HTTPS 웹 UI 주소. |
| dfs.secondary.namenode.keytab.file | /etc/security/keytab/sn.service.keytab | Secondary NameNode의 Kerberos keytab 파일. |
| dfs.secondary.namenode.kerberos.principal | sn/[email protected] | Secondary NameNode의 Kerberos 프린시펄 이름. |
| dfs.secondary.namenode.kerberos.internal.spnego.principal | HTTP/[email protected] | Secondary NameNode가 웹 UI SPNEGO 인증에 사용하는 서버 프린시펄. SPNEGO 서버 프린시펄은 관례상 HTTP/ 접두사로 시작. 값이 '*'이면 웹 서버가 keytab 파일 dfs.web.authentication.kerberos.keytab에 지정된 모든 프린시펄로 로그인을 시도. 대부분의 배포에서 ${dfs.web.authentication.kerberos.principal}로 설정할 수 있음. |
JournalNode
| 파라미터 | 값 | 설명 |
|---|---|---|
| dfs.journalnode.kerberos.principal | jn/[email protected] | JournalNode의 Kerberos 프린시펄 이름. |
| dfs.journalnode.keytab.file | /etc/security/keytab/jn.service.keytab | JournalNode의 Kerberos keytab 파일. |
| dfs.journalnode.kerberos.internal.spnego.principal | HTTP/[email protected] | Kerberos 보안이 활성화될 때 JournalNode가 웹 UI SPNEGO 인증에 사용하는 서버 프린시펄. SPNEGO 서버 프린시펄은 관례상 HTTP/ 접두사로 시작. 값이 '*'이면 웹 서버가 keytab 파일 dfs.web.authentication.kerberos.keytab에 지정된 모든 프린시펄로 로그인을 시도. |
| dfs.web.authentication.kerberos.keytab | /etc/security/keytab/spnego.service.keytab | JournalNode의 SPNEGO keytab 파일. HA 클러스터에서는 이 설정이 Name Nodes와 공유됩니다. |
| dfs.journalnode.https-address | 0.0.0.0:8481 | JournalNode의 HTTPS 웹 UI 주소. |
DataNode
| 파라미터 | 값 | 설명 |
|---|---|---|
| dfs.datanode.data.dir.perm | 700 | |
| dfs.datanode.address | 0.0.0.0:1004 | 보안 DataNode는 서버가 안전하게 시작되었는지 보장하기 위해 특권 포트를 사용해야 합니다. 즉 서버가 jsvc를 통해 시작되어야 합니다. 또는 SASL로 데이터 전송 프로토콜을 인증한다면 비특권 포트로 설정해야 합니다. (dfs.data.transfer.protection 참고.) |
| dfs.datanode.http.address | 0.0.0.0:1006 | 보안 DataNode는 서버가 안전하게 시작되었는지 보장하기 위해 특권 포트를 사용해야 합니다. 즉 서버가 jsvc를 통해 시작되어야 합니다. |
| dfs.datanode.https.address | 0.0.0.0:9865 | Data Node의 HTTPS 웹 UI 주소. |
| dfs.datanode.kerberos.principal | dn/[email protected] | DataNode의 Kerberos 프린시펄 이름. |
| dfs.datanode.keytab.file | /etc/security/keytab/dn.service.keytab | DataNode의 Kerberos keytab 파일. |
| dfs.encrypt.data.transfer | false | 데이터 암호화를 사용할 때 true로 설정 |
| dfs.encrypt.data.transfer.algorithm | (비어 있음) | 데이터 암호화 사용 시 암호화 알고리즘을 제어하기 위해 선택적으로 3des 또는 rc4로 설정 |
| dfs.encrypt.data.transfer.cipher.suites | (비어 있음) | 데이터 암호화 사용 시 AES 암호화를 활성화하기 위해 선택적으로 AES/CTR/NoPadding으로 설정 |
| dfs.encrypt.data.transfer.cipher.key.bitlength | (비어 있음) | 데이터 암호화로 AES를 사용할 때 키 비트 길이를 제어하기 위해 선택적으로 128, 192 또는 256으로 설정 |
| dfs.data.transfer.protection | (비어 있음) | authentication : 인증만; integrity : 인증에 더해 무결성 검사; privacy : 무결성에 더해 데이터 암호화. 이 속성은 기본적으로 지정되지 않습니다. 이 속성을 설정하면 데이터 전송 프로토콜 인증을 위한 SASL을 활성화합니다. 활성화되면 dfs.datanode.address는 비특권 포트를 사용해야 하고, dfs.http.policy는 HTTPS_ONLY로 설정되어야 하며, HDFS_DATANODE_SECURE_USER 환경 변수가 적절히 설정되어야 합니다. |
WebHDFS
| 파라미터 | 값 | 설명 |
|---|---|---|
| dfs.web.authentication.kerberos.principal | http/[email protected] | WebHDFS의 Kerberos 프린시펄 이름. HA 클러스터에서 이 설정은 일반적으로 SPNEGO로 JournalNode HTTP 서버 접근을 보호하기 위해 JournalNodes가 사용합니다. |
| dfs.web.authentication.kerberos.keytab | /etc/security/keytab/http.service.keytab | WebHDFS의 Kerberos keytab 파일. HA 클러스터에서 이 설정은 일반적으로 SPNEGO로 JournalNode HTTP 서버 접근을 보호하기 위해 JournalNodes가 사용합니다. |
ResourceManager
| 파라미터 | 값 | 설명 |
|---|---|---|
| yarn.resourcemanager.principal | rm/[email protected] | ResourceManager의 Kerberos 프린시펄 이름. |
| yarn.resourcemanager.keytab | /etc/security/keytab/rm.service.keytab | ResourceManager의 Kerberos keytab 파일. |
| yarn.resourcemanager.webapp.https.address | ${yarn.resourcemanager.hostname}:8090 | 비-HA용 RM 웹 애플리케이션의 https 주소. HA 클러스터에서는 각 ResourceManager에 대해 yarn.resourcemanager.webapp.https.address.rm-id를 사용하세요. 자세한 내용은 ResourceManager High Availability를 참고하세요. |
NodeManager
| 파라미터 | 값 | 설명 |
|---|---|---|
| yarn.nodemanager.principal | nm/[email protected] | NodeManager의 Kerberos 프린시펄 이름. |
| yarn.nodemanager.keytab | /etc/security/keytab/nm.service.keytab | NodeManager의 Kerberos keytab 파일. |
| yarn.nodemanager.container-executor.class | org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor | LinuxContainerExecutor를 사용. |
| yarn.nodemanager.linux-container-executor.group | hadoop | NodeManager의 Unix 그룹. |
| yarn.nodemanager.linux-container-executor.path | /path/to/bin/container-executor | Linux container executor 실행 파일의 경로. |
| yarn.nodemanager.webapp.https.address | 0.0.0.0:8044 | NM 웹 애플리케이션의 https 주소. |
WebAppProxy 구성
WebAppProxy는 애플리케이션이 내보낸 웹 애플리케이션과 최종 사용자 사이의 프록시를 제공합니다. 보안이 활성화되면 잠재적으로 안전하지 않은 웹 애플리케이션에 접근하기 전에 사용자에게 경고합니다. 프록시를 사용한 인증과 인가는 다른 특권 웹 애플리케이션과 마찬가지로 처리됩니다.
| 파라미터 | 값 | 설명 |
|---|---|---|
| yarn.web-proxy.address | WebAppProxy host:port | AM 웹 앱으로의 프록시용. 이것이 yarn.resourcemanager.webapp.address와 같거나 정의되지 않으면 ResourceManager가 프록시를 실행하고, 그렇지 않으면 독립형 프록시 서버를 시작해야 합니다. |
| yarn.web-proxy.keytab | /etc/security/keytab/web-app.service.keytab | WebAppProxy의 Kerberos keytab 파일. |
| yarn.web-proxy.principal | wap/[email protected] | WebAppProxy의 Kerberos 프린시펄 이름. |
LinuxContainerExecutor
YARN 프레임워크가 사용하는 ContainerExecutor로, 컨테이너가 어떻게 시작되고 제어되는지 정의합니다. Hadoop YARN에서 사용 가능한 것들은 다음과 같습니다.
| ContainerExecutor | 설명 |
|---|---|
| DefaultContainerExecutor | YARN이 컨테이너 실행을 관리하는 데 사용하는 기본 실행자. 컨테이너 프로세스는 NodeManager와 같은 Unix 사용자를 가집니다. |
| LinuxContainerExecutor | GNU/Linux에서만 지원. 이 실행자는 완전 보안이 활성화되면 애플리케이션을 제출한 YARN 사용자로, 완전 보안이 활성화되지 않으면 전용 사용자(기본값 nobody)로 컨테이너를 실행합니다. 완전 보안이 활성화되면 이 실행자는 컨테이너가 시작되는 클러스터 노드에 모든 사용자 계정이 생성되어야 합니다. Hadoop 배포판에 포함된 setuid 실행 파일을 사용합니다. NodeManager는 이 실행 파일을 사용해 컨테이너를 시작하고 종료합니다. setuid 실행 파일은 애플리케이션을 제출한 사용자로 전환되어 컨테이너를 시작하거나 종료합니다. 최대 보안을 위해 이 실행자는 컨테이너가 사용하는 로컬 파일과 디렉터리(공유 객체, jar, 중간 파일, 로그 파일 등)에 제한된 권한과 사용자/그룹 소유권을 설정합니다. 이 때문에 애플리케이션 소유자와 NodeManager를 제외한 어떤 사용자도 분산 캐시의 일부로 지역화된 것들을 포함한 어떤 로컬 파일/디렉터리에도 접근할 수 없습니다. |
LinuxContainerExecutor 실행 파일을 빌드하려면 다음을 실행합니다.
$ mvn package -Dcontainer-executor.conf.dir=/etc/hadoop/
-Dcontainer-executor.conf.dir에 전달된 경로는 setuid 실행 파일의 구성 파일이 위치해야 할 클러스터 노드의 경로여야 합니다. 실행 파일은 $HADOOP_YARN_HOME/bin에 설치되어야 합니다.
실행 파일은 특정 권한을 가져야 합니다: 6050 또는 --Sr-s--- 권한으로, 사용자 소유는 root(슈퍼유저), 그룹 소유는 NodeManager Unix 사용자가 구성원이고 일반 애플리케이션 사용자는 아닌 특별 그룹(예: hadoop)이어야 합니다. 어떤 애플리케이션 사용자가 이 특별 그룹에 속하면 보안이 손상됩니다. 이 특별 그룹 이름은 conf/yarn-site.xml과 conf/container-executor.cfg 모두에서 구성 속성 yarn.nodemanager.linux-container-executor.group에 지정해야 합니다.
예를 들어 NodeManager가 users와 hadoop 그룹의 구성원인 yarn 사용자로 실행된다고 합시다(둘 중 하나가 기본 그룹). users에는 yarn과 다른 사용자(애플리케이션 제출자) alice가 모두 구성원이고, alice는 hadoop에 속하지 않는다고 합시다. 위 설명에 따라 setuid/setgid 실행 파일은 사용자 소유 yarn, 그룹 소유 hadoop(구성원으로 yarn을 가짐)으로 6050 또는 --Sr-s---로 설정되어야 합니다. (users가 아니라. users에는 yarn 외에 alice도 구성원이므로.)
LinuxTaskController는 yarn.nodemanager.local-dirs와 yarn.nodemanager.log-dirs에 지정된 디렉터리로 이어지는 경로를 포함하는 경로가 위의 디렉터리 권한 표에 설명된 대로 755 권한으로 설정되도록 요구합니다.
- conf/container-executor.cfg
실행 파일은 위에서 언급한 mvn 타깃에 전달된 구성 디렉터리에 container-executor.cfg라는 구성 파일이 있어야 합니다.
구성 파일은 NodeManager를 실행하는 사용자(위 예의 user yarn)가 소유해야 하고, 그룹 소유는 누구든 상관없으며, 권한은 0400 또는 r--------이어야 합니다.
실행 파일은 conf/container-executor.cfg 파일에 다음 구성 항목이 있어야 합니다. 항목은 한 줄에 하나씩 간단한 key=value 쌍으로 언급해야 합니다.
| 파라미터 | 값 | 설명 |
|---|---|---|
| yarn.nodemanager.linux-container-executor.group | hadoop | NodeManager의 Unix 그룹. container-executor 바이너리의 그룹 소유자가 이 그룹이어야 합니다. NodeManager가 구성된 값과 같아야 합니다. 이 구성은 container-executor 바이너리의 보안 접근 검증에 필요합니다. |
| banned.users | hdfs,yarn,mapred,bin | 차단된 사용자. |
| allowed.system.users | foo,bar | 허용된 시스템 사용자. |
| min.user.id | 1000 | 다른 슈퍼유저 방지. |
요약하면, LinuxContainerExecutor와 관련된 다양한 경로에 필요한 로컬 파일시스템 권한은 다음과 같습니다.
| 파일시스템 | 경로 | 사용자:그룹 | 권한 |
|---|---|---|---|
| local | container-executor | root:hadoop | --Sr-s--* |
| local | conf/container-executor.cfg | root:hadoop | r-------* |
| local | yarn.nodemanager.local-dirs | yarn:hadoop | drwxr-xr-x |
| local | yarn.nodemanager.log-dirs | yarn:hadoop | drwxr-xr-x |
MapReduce JobHistory Server
| 파라미터 | 값 | 설명 |
|---|---|---|
| mapreduce.jobhistory.address | MapReduce JobHistory Server host:port | 기본 포트는 10020. |
| mapreduce.jobhistory.keytab | /etc/security/keytab/jhs.service.keytab | MapReduce JobHistory Server의 Kerberos keytab 파일. |
| mapreduce.jobhistory.principal | jhs/[email protected] | MapReduce JobHistory Server의 Kerberos 프린시펄 이름. |
다중 홈 (Multihoming)
각 호스트가 DNS에 여러 호스트 이름(예: 공용 및 사설 네트워크 인터페이스에 해당하는 서로 다른 호스트 이름)을 가지는 다중 홈 구성은 Kerberos 인증이 작동하도록 추가 구성이 필요할 수 있습니다. HDFS Support for Multihomed Networks를 참고하세요.
문제 해결 (Troubleshooting)
Kerberos는 설정이 어렵고 — 디버깅은 더 어렵습니다. 흔한 문제는
- 네트워크와 DNS 구성.
- 호스트의 Kerberos 구성(/etc/krb5.conf).
- Keytab 생성과 유지보수.
- 환경 설정: JVM, 사용자 로그인, 시스템 클록 등.
JVM의 오류 메시지가 본질적으로 무의미하다는 사실은 그러한 문제를 진단하고 고치는 데 도움이 되지 않습니다.
클라이언트와 어떤 서비스에 대해 추가 디버깅 정보를 활성화할 수 있습니다.
환경 변수 HADOOP_JAAS_DEBUG를 true로 설정합니다.
export HADOOP_JAAS_DEBUG=true
Hadoop의 보안 패키지를 DEBUG 레벨로 로그하도록 log4j.properties 파일을 편집합니다.
log4j.logger.org.apache.hadoop.security=DEBUG
일부 시스템 속성을 설정해 JVM 레벨 디버깅을 활성화합니다.
export HADOOP_OPTS="-Djava.net.preferIPv4Stack=true -Dsun.security.krb5.debug=true -Dsun.security.spnego.debug"
KDiag로 문제 해결
Hadoop에는 설정 검증을 돕는 도구가 있습니다: KDiag.
이 도구는 JVM의 구성과 환경에 대한 일련의 프로브를 포함하고, 일부 시스템 파일(/etc/krb5.conf, /etc/ntp.conf)을 덤프하고, 일부 시스템 상태를 출력한 다음 현재 사용자로, 또는 명명된 keytab의 특정 프린시펄로 Kerberos에 로그인을 시도합니다.
명령의 출력은 로컬 진단에 사용하거나 클러스터를 지원하는 사람에게 전달할 수 있습니다.
KDiag 명령은 자체 진입점이 있습니다. bin/hadoop 명령에 kdiag를 전달해 호출합니다. 따라서 그 명령을 호출하는 데 사용된 kerberos 클라이언트 상태를 표시합니다.
hadoop kdiag
이 명령은 성공적인 진단 실행에 대해 상태 코드 0을 반환합니다. 이는 Kerberos가 작동한다는 뜻이 아니라, KDiag 명령이 제한된 프로브 집합에서 문제를 식별하지 못했다는 뜻입니다. 특히 원격 서비스에 연결하려 시도하지 않으므로 클라이언트가 어떤 서비스에 신뢰받는지 검증하지 않습니다.
실패하면 종료 코드는
- -1: 명령이 알 수 없는 이유로 실패
- 41: Unauthorized (== HTTP의 401). KDiag가 Kerberos가 작동하지 않게 하는 조건을 감지했습니다. 문제를 식별하려면 출력을 검사하세요.
사용법 (Usage)
KDiag: Diagnose Kerberos Problems
[-D key=value] : Define a configuration option.
[--jaas] : Require a JAAS file to be defined in java.security.auth.login.config.
[--keylen <keylen>] : Require a minimum size for encryption keys supported by the JVM. Default value : 256.
[--keytab <keytab> --principal <principal>] : Login from a keytab as a specific principal.
[--nofail] : Do not fail on the first problem.
[--nologin] : Do not attempt to log in.
[--out <file>] : Write output to a file.
[--resource <resource>] : Load an XML configuration resource.
[--secure] : Require the hadoop configuration to be secure.
[--verifyshortname <principal>]: Verify the short name of the specific principal does not contain '@' or '/'
--jaas
--jaas가 설정되면 Java 시스템 속성 java.security.auth.login.config가 JAAS 파일로 설정되어야 합니다. 이 파일은 존재해야 하고, 0바이트가 아닌 단순 파일이어야 하며, 현재 사용자가 읽을 수 있어야 합니다. 더 상세한 검증은 수행되지 않습니다.
JAAS 파일은 Hadoop 자체에는 필요하지 않지만, 일부 서비스(예: Zookeeper)는 보안 동작에 필요로 합니다.
--keylen
JVM이 이 길이를 지원하지 않으면 명령이 실패합니다.
기본값은 AES256 암호화 방식에 필요하므로 256입니다. Java Cryptography Extensions가 설치되지 않은 JVM은 그러한 키 길이를 지원하지 않습니다. Kerberos는 더 짧은 키 길이의 암호화 방식을 사용하도록 구성되지 않는 한 작동하지 않습니다.
--keytab --principal
특정 프린시펄로 keytab에서 로그인합니다.
- 파일은 명명된 호스트를 포함한 특정 프린시펄을 포함해야 합니다. 즉 _HOST에서 현재 호스트 이름으로의 매핑이 없습니다.
- KDiag는 로그아웃하고 다시 로그인을 시도합니다. 이는 과거에 존재했던 JVM 호환성 문제를 잡아냅니다. (Hadoop의 Kerberos 지원은 JVM 특정 클래스의 사용/인트로스펙션이 필요합니다.)
--nofail
KDiag는 첫 번째 문제에서 멈추는 대신 모든 Kerberos 문제를 진단하려는 최선의 노력을 합니다.
이것은 다소 제한적입니다. 문제가 드러나는 순서대로 검사가 이루어지므로(예: keylength가 먼저 검사됨), 초기 실패가 훨씬 더 많은 문제를 유발할 수 있습니다. 그러나 더 상세한 보고서를 생성합니다.
--nologin
로그인 시도를 건너뜁니다. 이는 --keytab 옵션보다 우선하며, 현재 kinited 사용자로 kerberos에 로그인하는 것도 비활성화합니다.
이는 애플리케이션 내에서 KDiag 명령이 호출될 때 유용합니다. Hadoop의 정적 보안 상태를 설정하지 않고 기본 Kerberos 전제 조건만 확인하기 때문입니다.
--out outfile
hadoop kdiag --out out.txt
진단 정보의 대부분은 JRE(에서 stderr로)와 Log4j(에서 stdout으로)로부터 나옵니다. 모든 출력을 얻으려면 이 두 출력 스트림을 모두 같은 파일로 리디렉션하고 --out 옵션을 생략하는 것이 가장 좋습니다.
hadoop kdiag --keytab zk.service.keytab --principal zookeeper/devix.example.org@REALM > out.txt 2>&1
그래도 여러 스레드에서 방출되는 두 스트림의 출력은 다소 혼란스러울 수 있습니다. 연습하면 나아질 것입니다. Log4j 출력에서 스레드 이름을 보고 백그라운드 스레드와 메인 스레드를 구별하는 것은 hadoop 수준에서 도움이 되지만, JVM 레벨 로깅에서는 도움이 되지 않습니다.
--resource
XML 구성 파일을 로드하기 위해 이 옵션을 사용할 수 있습니다. 기본적으로 core-default와 core-site XML 리소스만 로드됩니다. 추가 구성 파일에 Kerberos 관련 구성이 있을 때 도움이 됩니다.
hadoop kdiag --resource hbase-default.xml --resource hbase-site.xml
작동 중 추가 로깅을 위해 "Troubleshooting"에 나열된 값으로 logging과 HADOOP_JAAS_DEBUG 환경 변수를 설정하세요. JVM 옵션은 KDiag에서 자동으로 설정됩니다.
--secure
클러스터의 인증 메커니즘이 명시적으로든 암시적으로든 "simple"로 설정되면 실패합니다.
<property>
<name>hadoop.security.authentication</name>
<value>simple</value>
</property>
말할 필요도 없이 이렇게 구성된 애플리케이션은 보안 Hadoop 클러스터와 통신할 수 없습니다.
--verifyshortname
프린시펄의 짧은 이름이 "@" 또는 "/" 문자를 포함하지 않음을 검증합니다.
예시 (Example)
hadoop kdiag \
--nofail \
--resource hdfs-site.xml --resource yarn-site.xml \
--keylen 1024 \
--keytab zk.service.keytab --principal zookeeper/devix.example.org@REALM
이것은 조기에 실패하지 않고 모든 진단을 수행하고, HDFS와 YARN XML 리소스를 로드하고, 최소 키 길이 1024바이트를 요구하고, 키가 keytab zk.service.keytab에 있어야 하는 프린시펄 zookeeper/devix.example.org@REALM으로 로그인하려고 시도합니다.
참고 자료 (References)
- O'Malley O et al. Hadoop Security Design
- O'Malley O, Hadoop Security Architecture
- Troubleshooting Kerberos on Java 7
- Troubleshooting Kerberos on Java 8
- Java 7 Kerberos Requirements
- Java 8 Kerberos Requirements
- Loughran S., Hadoop and Kerberos: The Madness beyond the Gate