메뉴 건너뛰기

Bigdata, Semantic IoT, Hadoop, NoSQL

Bigdata, Hadoop ecosystem, Semantic IoT등의 프로젝트를 진행중에 습득한 내용을 정리하는 곳입니다.
필요한 분을 위해서 공개하고 있습니다. 문의사항은 gooper@gooper.com로 메일을 보내주세요.


*출처 : http://bloodguy.tistory.com/entry/Hadoop-%EB%B3%B4%EC%95%88%EC%84%A4%EC%A0%95-security-kerberos-spnego-ssl


1. Namenode HA: http://bloodguy.tistory.com/948

2. ResourceManager HA: http://bloodguy.tistory.com/949

3. Kerberos Server Replication: http://bloodguy.tistory.com/954

4. Zookeeper Kerberos 보안설정: http://bloodguy.tistory.com/957

5. Hadoop 보안 설정 : http://bloodguy.tistory.com/entry/Hadoop-%EB%B3%B4%EC%95%88%EC%84%A4%EC%A0%95-security-kerberos-spnego-ssl



2.6.0 버전인 현재 Hadoop 보안의 경우 설정 등이 대단히 복잡하고,

퍼포먼스 하락도 눈에 띌 만큼 발생하므로 그다지 추천하고 싶지는 않지만,

여하튼 보안은 필요한 부분이므로 삽질한 결과를 남겨둠.


프로세스 실행이나 RPC 통신 암호화 및 HTTPS 설정 등 Hadoop 보안관련 종합선물세트임.

단, 저장 데이터 자체에 대한 암호화는 제외.




[가정사항]

아래처럼 HA 구성 상태이며 Kerberos가 설치되어 있고,

Zookeeper는 이미 보안설정이 되어 있다고 가정함.


Namenode HAhttp://bloodguy.tistory.com/948

ResourceManager HAhttp://bloodguy.tistory.com/949

Kerberos Server Replicationhttp://bloodguy.tistory.com/954

Zookeeper Kerberos 보안설정http://bloodguy.tistory.com/957




[사용자/그룹 추가]

전체 서버에 아래와 같은 사용자/그룹이 추가되어야 함.

// group은 hadoop

[root@server01]# groupadd hadoop

// user는 hdfs, yarn

[root@server01]# useradd hdfs -g hadoop

[root@server01]# useradd yarn -g hadoop


// 전체 서버에 모두 추가





[Kerberos]


principal 생성

서버가 많으면 개고생하므로 스크립트로 만들어서 처리할 것을 권장.


필요한 principal은 아래와 같음.

FQDN(FullyQualifiedDomainName)별로 생성하므로 서버별로 각 3개씩의 principal이 필요함.

hdfs/FQDN

yarn/FQDN

HTTP/FQDN


// principal 추가

// 전체 서버별로 principal 3개씩 생성.


// kadmin으로 접속

[root@server01]# kadmin -p admin/admin@BLOODGUY.COM

// server01

kadmin: addprinc -randkey hdfs/server01.bloodguy.com@BLOODGUY.COM

kadmin: addprinc -randkey yarn/server01.bloodguy.com@BLOODGUY.COM

kadmin: addprinc -randkey HTTP/server01.bloodguy.com@BLOODGUY.COM

// server02

kadmin: addprinc -randkey hdfs/server02.bloodguy.com@BLOODGUY.COM

kadmin: addprinc -randkey yarn/server02.bloodguy.com@BLOODGUY.COM

kadmin: addprinc -randkey HTTP/server02.bloodguy.com@BLOODGUY.COM

// ~~~ serverNN 까지 생성



keytab 생성

각 서버마다 아래와 같은 principal을 포함하는 2개의 keytab 파일이 필요함.

hdfs.keytab = hdfs/FQDN + HTTP/FQDN

yarn.keytab = yarn/FQDN + HTTP/FQDN


// 1. 설치된 Kerberos가 -norandkey 옵션을 지원할 경우엔 아래처럼 여러 principal을 동시에 포함하여 필요한 keytab 파일을 각각 생성하면 됨

// _____________________________________________________________________________________________

kadmin: xst -norandkey -k hdfs.keytab hdfs/server01.bloodguy.com@BLOODGUY.COM HTTP/server01.bloodguy.com@BLOODGUY.COM

kadmin: xst -norandkey -k yarn.keytab yarn/server01.bloodguy.com@BLOODGUY.COM HTTP/server01.bloodguy.com@BLOODGUY.COM


// 2. 설치된 Kerberos가 -norandkey 옵션을 지원하지 않을 경우 아래처럼 keytab을 각 principal별로 따로 만든 후 ktutil로 합쳐야 함.

// _____________________________________________________________________________________________

kadmin: xst -k HTTP.keytab HTTP/server01.bloodguy.com@BLOODGUY.COM

kadmin: xst -k hdfs-unmerged.keytab hdfs/server01.bloodguy.com@BLOODGUY.COM

kadmin: xst -k yarn-unmerged.keytab yarn/server01.bloodguy.com@BLOODGUY.COM

kadmin: quit


[root@server01]# ktutil


// hdfs.keytab

ktutil: rkt hdfs-unmerged.keytab

ktutil: rkt HTTP-unmerged.keytab

ktutil: wkt hdfs.keytab

ktutil: clear

// yarn.keytab

ktutil: rkt yarn-unmerged.keytab

ktutil: rkt HTTP-unmerged.keytab

ktutil: wkt yarn.keytab

ktutil: quit


// 필요없는 keytab 파일 삭제

[root@server01]# rm -rf *-unmerged.keytab

[root@server01]# rm -rf HTTP.keytab


생성된 keytab 파일의 퍼미션을 설정하고 적절한 위치로 이동.

각 서버마다 반복.

// 퍼미션 설정

[root@server01]# chown hdfs:hadoop hdfs.keytab

[root@server01]# chmod 400 hdfs.keytab

[root@server01]# chown yarn:hadoop yarn.keytab

[root@server01]# chmod 400 yarn.keytab


// keytab 파일은 hadoop 설정 디렉토리에 넣는다고 가정함.

[root@server01]# mv *.keytab /home/hadoop/etc/hadoop






[Directory Permission]


HDFS (로컬 디렉토리가 아니라 HDFS 디렉토리임에 주의)

/* 

/    = hdfs:hadoop (775)

*/

/home/hadoop/bin/hdfs dfs -chown hdfs:hadoop /

/home/hadoop/bin/hdfs dfs -chmod 775 /


/* 

/tmp = hdfs:hadoop (777)

*/

/home/hadoop/bin/hdfs dfs -chown hdfs:hadoop /tmp

/home/hadoop/bin/hdfs dfs -chmod 777 /tmp


/* 

/user = hdfs:hadoop (755)

*/

/home/hadoop/bin/hdfs dfs -chown hdfs:hadoop /user

/home/hadoop/bin/hdfs dfs -chmod 755 /user


/*

yarn.nodemanager.remote-app-log-dir[/tmp/logs] = yarn:hadoop (777)

*/

/home/hadoop/bin/hdfs dfs -chown yarn:hadoop /tmp/logs

/home/hadoop/bin/hdfs dfs -chmod 777 /tmp/logs


/home/hadoop/bin/hdfs dfs -chown yarn:hadoop /tmp/hadoop-yarn

/home/hadoop/bin/hdfs dfs -chmod 777 /tmp/hadoop-yarn


Local (전체 서버 대상)

각 디렉토리 경로는 설정에 맞게.

// dfs.namenode.name.dir = hdfs:hadoop (700)

[root@server01]# chown -R hdfs:hadoop /home/hadoop/data/dfs/name

[root@server01]# chmod 700 /home/hadoop/data/dfs/name


// dfs.datanode.data.dir = hdfs:hadoop (700)

[root@server01]# chown -R hdfs:hadoop /home/hadoop/data/dfs/data

[root@server01]# chmod 700 /home/hadoop/data/dfs/data


// dfs.journalnode.edits.dir = hdfs:hadoop (700)

[root@server01]# chown -R hdfs:hadoop /home/hadoop/data/dfs/journalnode

[root@server01]# chmod 700 /home/hadoop/data/dfs/journalnode


// $HADOOP_LOG_DIR       = hdfs:hadoop (775)

[root@server01]# chown -R hdfs:hadoop /home/hadoop/logs

[root@server01]# chmod 775 /home/hadoop/logs


// $YARN_LOG_DIR         = yarn:hadoop (775)

// 위와 동일한 경로(/home/hadoop/logs)로 세팅했으므로 생략.


// yarn.nodemanager.local-dirs = yarn:hadoop (755)

[root@server01]# chown -R yarn:hadoop /home/hadoop/data/yarn/nm-local-dir

[root@server01]# chmod 755 /home/hadoop/data/yarn/nm-local-dir


// yarn.nodemanager.log-dirs   = yarn:hadoop (755)

// 위와 동일한 경로(/home/hadoop/logs)로 세팅했으므로 생략.






[container-executor 빌드]


먼저 hadoop 소스코드와 빌드할 수 있는 환경이 세팅되어 있어야 함.

참고: http://bloodguy.tistory.com/939


소스코드가 있고 빌드환경 세팅이 완료되었다면 아래와 같은 과정을 거쳐 빌드 및 설정.

// /home/src/hadoop-2.6.0-src 디렉토리에 소스코드 압축이 풀려있다고 가정함.


// 빌드

[root@server01]# cd /home/src/hadoop-2.6.0-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/

[root@server01]# mvn package -Dcontainer-executor.conf.dir=/home/hadoop/etc/hadoop -DskipTests -Pnative


// 빌드 결과물 옮기기

[root@server01]# cp target/native/target/usr/local/bin/* /home/hadoop/bin


// 퍼미션

[root@server01]# cd /home/hadoop/bin

[root@server01]# chown root:hadoop container-executor 

[root@server01]# chmod 6050 container-executor


// cfg 파일 설정

[root@server01]# vi /home/hadoop/etc/hadoop/container-executor.cfg


yarn.nodemanager.linux-container-executor.group=hadoop

#banned.users=

min.user.id=500

#allowed.system.users=


// cfg 파일 퍼미션 설정

[root@server01]# chown root:hadoop /home/hadoop/etc/hadoop/container-executor.cfg

[root@server01]# chmod 0400 /home/hadoop/etc/hadoop/container-executor.cfg


// cfg 파일의 경우 전체 서버에 배포.

// 빌드된 실행파일의 경우 서버들의 하드웨어, 커널버전 등이 동일하다면 실행파일만 배포하고, 아니라면 각 서버마다 빌드를 해줘야 함.








[설정파일]


설정파일 수정 전에 먼저 secret file을 생성해줘야 함.

// core-site.xml의 hadoop.http.authentication.signature.secret.file property에 지정할 secret 파일 생성

[root@server01]# dd if=/dev/urandom of=/home/hadoop/etc/hadoop/hadoop-http-auth-signature-secret bs=1024 count=1


// 퍼미션 설정

// 데몬을 실행시킬 user 소유로 변경

// 아래는 hdfs 라는 user로 데몬들을 실행시킨다는 가정

[root@server01]# chown hdfs:hadoop /home/hadoop/etc/hadoop/hadoop-http-auth-signature-secret

[root@server01]# chmod 400 /home/hadoop/etc/hadoop/hadoop-http-auth-signature-secret


// 생성 후 전체 서버 배포



아래는 각 설정파일별로 보안설정에 필요한 property만 나열함.


core-site.xml

<!-- 보안설정 -->
<property>
    <name>hadoop.security.authentication</name>
    <value>kerberos</value>
</property>
<property>
    <name>hadoop.security.authorization</name>
    <value>true</value>
</property>
<property>
    <name>hadoop.rpc.protection</name>
    <value>privacy</value>
</property>
 
<!-- SPNEGO/Kerberos - 웹접속 관련 보안설정 -->
<property>
    <name>hadoop.http.filter.initializers</name>
    <value>org.apache.hadoop.security.AuthenticationFilterInitializer</value>
</property>
<property>
    <name>hadoop.http.authentication.type</name>
    <value>kerberos</value>
</property>
<property>
    <name>hadoop.http.authentication.token.validity</name>
    <value>36000</value>
</property>
<property>
    <name>hadoop.http.authentication.signature.secret.file</name>
    <value>/home/hadoop/etc/hadoop/hadoop-http-auth-signature-secret</value>
</property>
<property>
    <name>hadoop.http.authentication.cookie.domain</name>
    <value>bloodguy.com</value>
</property>
<property>
    <name>hadoop.http.authentication.simple.anonymous.allowed</name>
    <value>false</value>
</property>
<property>
    <name>hadoop.http.authentication.kerberos.principal</name>
    <value>HTTP/_HOST@BLOODGUY.COM</value>
</property>
<property>
    <name>hadoop.http.authentication.kerberos.keytab</name>
    <value>/home/hadoop/etc/hadoop/hdfs.keytab</value>
</property>
 
<!-- Encrypted Shuffle - Map->Reduce 데이터 전달시 암호화 -->
<property>
    <name>hadoop.ssl.require.client.cert</name>
    <value>false</value>
    <final>true</final>
</property>
<property>
    <name>hadoop.ssl.hostname.verifier</name>
    <value>DEFAULT</value>
    <final>true</final>
</property>
<property>
    <name>hadoop.ssl.keystores.factory.class</name>
    <value>org.apache.hadoop.security.ssl.FileBasedKeyStoresFactory</value>
    <final>true</final>
</property>
<property>
    <name>hadoop.ssl.server.conf</name>
    <value>ssl-server.xml</value>
    <final>true</final>
</property>
<property>
    <name>hadoop.ssl.client.conf</name>
    <value>ssl-client.xml</value>
    <final>true</final>
</property>


hdfs-site.xml



<!-- SECURITY -->
<property>
    <name>dfs.block.access.token.enable</name>
    <value>true</value>
</property>
<property>
    <name>dfs.data.transfer.protection</name>
    <value>privacy</value>
</property>
<property>
    <name>dfs.http.policy</name>
    <value>HTTPS_ONLY</value>
</property>
<!-- JournalNode -->
<property>
    <name>dfs.journalnode.keytab.file</name>
    <value>/home/hadoop/etc/hadoop/hdfs.keytab</value>
</property>
<property>
    <name>dfs.journalnode.kerberos.principal</name>
    <value>hdfs/_HOST@BLOODGUY.COM</value>
</property>
<property>
    <name>dfs.journalnode.kerberos.internal.spnego.principal</name>
    <value>HTTP/_HOST@BLOODGUY.COM</value>
</property>
<!-- NameNode -->
<property>
    <name>dfs.namenode.https-address.hadoop-cluster.nn1</name>
    <value>server01.bloodguy.com:50470</value>
</property>
<property>
    <name>dfs.namenode.https-address.hadoop-cluster.nn2</name>
    <value>server02.bloodguy.com:50470</value>
</property>
<property>
    <name>dfs.namenode.keytab.file</name>
    <value>/home/hadoop/etc/hadoop/hdfs.keytab</value>
</property>
<property>
    <name>dfs.namenode.kerberos.principal</name>
    <value>hdfs/_HOST@BLOODGUY.COM</value>
</property>
<property>
    <name>dfs.namenode.kerberos.internal.spnego.principal</name>
    <value>${dfs.web.authentication.kerberos.principal}</value>
</property>
<!-- DataNode -->
<property>
    <name>dfs.datanode.data.dir.perm</name>
    <value>700</value>
</property>
<property>
    <name>dfs.datanode.https.address</name>
    <value>0.0.0.0:50475</value>
</property>
<property>
    <name>dfs.datanode.keytab.file</name>
    <value>/home/hadoop/etc/hadoop/hdfs.keytab</value>
</property>
<property>
    <name>dfs.datanode.kerberos.principal</name>
    <value>hdfs/_HOST@BLOODGUY.COM</value>
</property>
<!-- Web -->
<property>
    <name>dfs.web.authentication.kerberos.keytab</name>
    <value>/home/hadoop/etc/hadoop/hdfs.keytab</value>
</property>
<property>
    <name>dfs.web.authentication.kerberos.principal</name>
    <value>HTTP/_HOST@BLOODGUY.COM</value>
</property>

mapred-site.xml

<!-- JobHistoryServer 보안설정 -->
<property>
    <name>mapreduce.jobhistory.keytab</name>
    <value>/home/hadoop/etc/hadoop/hdfs.keytab</value>
</property>
<property>
    <name>mapreduce.jobhistory.principal</name>
    <value>hdfs/_HOST@BLOODGUY.COM</value>
</property>
<property>
    <name>mapreduce.jobhistory.http.policy</name>
    <value>HTTPS_ONLY</value>
</property>
<property>
    <name>mapreduce.jobhistory.webapp.https.address</name>
    <value>server01.bloodguy.com:19888</value>
</property>
<!-- Map/Reduce Shuffle SSL 설정 -->
<property>
    <name>mapreduce.shuffle.ssl.enabled</name>
    <value>true</value>
    <final>true</final>
</property>


출처: http://bloodguy.tistory.com/entry/Hadoop-보안설정-security-kerberos-spnego-ssl [Bloodguy]


yarn-site.xml

<!-- ResourceManager 보안설정 -->
<property>
    <name>yarn.resourcemanager.keytab</name>
    <value>/home/hadoop/etc/hadoop/yarn.keytab</value>
</property>
<property>
    <name>yarn.resourcemanager.principal</name>
    <value>yarn/_HOST@BLOODGUY.COM</value>
</property>
<!-- NodeManager 보안설정 -->
<property>
    <name>yarn.nodemanager.keytab</name>
    <value>/home/hadoop/etc/hadoop/yarn.keytab</value>
</property>
<property>
    <name>yarn.nodemanager.principal</name>
    <value>yarn/_HOST@BLOODGUY.COM</value>
</property>
<!-- ContainerExecutor 관련 -->
<property>
    <name>yarn.nodemanager.container-executor.class</name>
    <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
</property>
<property>
    <name>yarn.nodemanager.linux-container-executor.group</name>
    <value>hadoop</value>
</property>
<property>
    <name>yarn.nodemanager.linux-container-executor.path</name>
    <value>/home/hadoop/bin/container-executor</value>
</property>
<!-- WEB 관련 -->
<property>
    <name>yarn.http.policy</name>
    <value>HTTPS_ONLY</value>
</property>
<property>
    <name>yarn.resourcemanager.webapp.https.address</name>
    <value>0.0.0.0:8090</value>
</property>
<property>
    <name>yarn.nodemanager.webapp.https.address</name>
    <value>0.0.0.0:8042</value>
</property>
<property>
    <name>yarn.log.server.url</name>
    <value>https://server01.bloodguy.com:19888/jobhistory/logs</value>


[SSL 인증서]


보안통신을 위한 SSL 인증서가 필요함.

third party의 진짜 리얼 인증서를 이용하거나, self-signed 를 이용하는 방법도 있지만,

여기선 openssl을 이용한 internal CA를 이용하는 방법을 사용함.


// internal CA setup

[root@server01]# openssl genrsa -out ca.key 8192

[root@server01]# openssl req -new -x509 -extensions v3_ca -key ca.key -out ca.crt -days 18250

[root@server01]# mkdir -m 0700 /root/CA /root/CA/certs /root/CA/crl /root/CA/newcerts /root/CA/private

[root@server01]# mv ca.key /root/CA/private

[root@server01]# mv ca.crt /root/CA/certs

[root@server01]# touch /root/CA/index.txt ; echo 1000 >> /root/CA/serial

[root@server01]# chmod 0400 /root/CA/private/ca.key


// openssl 설정파일 수정

[root@server01]# vi /etc/pki/tls/openssl.cnf


#######################################################################################

[ CA_default ]


dir         = /root/CA          # Where everything is kept

certs       = $dir/certs        # Where the issued certs are kept

crl_dir     = $dir/crl          # Where the issued crl are kept

database    = $dir/index.txt    # database index file.

#unique_subject = no            # Set to 'no' to allow creation of

                                # several ctificates with same subject.

new_certs_dir = $dir/newcerts   # default place for new certs.


certificate = $dir/cacert.pem   # The CA certificate

serial      = $dir/serial       # The current serial number

crlnumber   = $dir/crlnumber    # the current crl number

                                # must be commented out to leave a V1 CRL

crl         = $dir/crl.pem           # The current CRL

private_key = $dir/private/cakey.pem # The private key

RANDFILE    = $dir/private/.rand     # private random number file


x509_extensions = usr_cert      # The extentions to add to the cert

#######################################################################################


// cluster trust store 

[root@server01]# openssl genrsa -out clusterCA.key 2048

[root@server01]# openssl req -x509 -new -key clusterCA.key -days 18250 -out clusterCA.pem

[root@server01]# keytool -importcert -alias clusterCA -file clusterCA.pem -keystore clusterTrustStore -storepass "비밀번호"


[root@server01]# mkdir /home/hadoop/etc/hadoop/security

[root@server01]# mv clusterCA.key clusterCA.pem clusterTrustStore /home/hadoop/etc/hadoop/security

[root@server01]# cd /home/hadoop/etc/hadoop/security


// host key store

[root@server01]# keytool -genkeypair -alias `hostname -s` -keyalg RSA -keysize 1024 -dname "CN=`hostname -f`,OU=foo,O=corp" -keypass "비밀번호" -keystore hostKeyStore -storepass "비밀번호" -validity 18250

[root@server01]# keytool -keystore hostKeyStore -alias `hostname -s` -certreq -file host.cert -storepass "비밀번호" -keypass "비밀번호"

[root@server01]# openssl x509 -req -CA clusterCA.pem -CAkey clusterCA.key -in host.cert -out host.signed -days 18250 -CAcreateserial

[root@server01]# keytool -keystore hostKeyStore -storepass "비밀번호" -alias clusterCA -import -file clusterCA.pem 

[root@server01]# keytool -keystore hostKeyStore -storepass "비밀번호" -alias `hostname -s` -import -file host.signed -keypass "비밀번호"


// 나머지 전체 서버들 동일하게 세팅

// 전체 서버 대상으로

// 디렉토리 만들고

[root@server01]# ssh root@server02.bloodguy.com mkdir -p /home/hadoop/etc/hadoop/security

// 필요한 파일 전송

[root@server01]# scp clusterCA.key clusterCA.pem clusterTrustStore root@server02.bloodguy.com:/home/hadoop/etc/hadoop/security


// 각 서버별 key store 생성 

[root@server02]# cd /home/hadoop/etc/hadoop/security

[root@server02]# keytool -genkeypair -alias `hostname -s` -keyalg RSA -keysize 1024 -dname "CN=`hostname -f`,OU=foo,O=corp" -keypass "비밀번호" -keystore hostKeyStore -storepass "비밀번호" -validity 18250

[root@server02]# keytool -keystore hostKeyStore -alias `hostname -s` -certreq -file host.cert -storepass "비밀번호" -keypass "비밀번호"

[root@server02# openssl x509 -req -CA clusterCA.pem -CAkey clusterCA.key -in host.cert -out host.signed -days 18250 -CAcreateserial

[root@server02]# keytool -keystore hostKeyStore -storepass "비밀번호" -alias clusterCA -import -file clusterCA.pem 

[root@server02]# keytool -keystore hostKeyStore -storepass "비밀번호" -alias `hostname -s` -import -file host.signed -keypass "비밀번호"



SSL 관련 설정파일 세팅

// 예제 파일을 복사해서 설정파일로 사용함.

[root@server01]# cd /home/hadoop/etc/hadoop

[root@server01]# cp ssl-client.xml.example ssl-client.xml

[root@server01]# cp ssl-server.xml.example ssl-server.xml


ssl-client.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 
<configuration>
 
<property>
  <name>ssl.client.truststore.location</name>
  <value>/home/hadoop/etc/hadoop/security/clusterTrustStore</value>
</property>
<property>
  <name>ssl.client.truststore.password</name>
  <value>비밀번호</value>
</property>
<property>
  <name>ssl.client.truststore.type</name>
  <value>jks</value>
</property>
<property>
  <name>ssl.client.truststore.reload.interval</name>
  <value>10000</value>
</property>
<property>
  <name>ssl.client.keystore.location</name>
  <value>/home/hadoop/etc/hadoop/security/hostKeyStore</value>
</property>
<property>
  <name>ssl.client.keystore.password</name>
  <value>비밀번호</value>
</property>
<property>
  <name>ssl.client.keystore.keypassword</name>
  <value>비밀번호</value>
</property>
<property>
  <name>ssl.client.keystore.type</name>
  <value>jks</value>
</property>
 
</configuration>


ssl-server.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 
<configuration>
 
<property>
  <name>ssl.server.truststore.location</name>
  <value>/home/hadoop/etc/hadoop/security/clusterTrustStore</value>
</property>
<property>
  <name>ssl.server.truststore.password</name>
  <value>비밀번호</value>
</property>
<property>
  <name>ssl.server.truststore.type</name>
  <value>jks</value>
</property>
<property>
  <name>ssl.server.truststore.reload.interval</name>
  <value>10000</value>
</property>
<property>
  <name>ssl.server.keystore.location</name>
  <value>/home/hadoop/etc/hadoop/security/hostKeyStore</value>
</property>
<property>
  <name>ssl.server.keystore.password</name>
  <value>비밀번호</value>
</property>
<property>
  <name>ssl.server.keystore.keypassword</name>
  <value>비밀번호</value>
</property>
<property>
  <name>ssl.server.keystore.type</name>
  <value>jks</value>
</property>
 
</configuration>





여기까지 설정 후 ssl-client.xml과 ssl-server.xml을 전체 서버에 배포.






[확인]


위 설정을 완료하고 클러스터 재시작.


hdfs

콘솔에서 예전처럼 그냥 hdfs 명령어를 실행할 경우 엄청난 양의 보안관련 에러 메세지를 볼 수 있음.

보안설정 이후엔 아래처럼 Kerberos 인증을 완료한 후 적절한 user로 명령어를 실행해야 함.

[root@server01]# sudo -u hdfs kinit -k -t /home/hadoop/etc/hadoop/hdfs.keytab hdfs/server01.bloodguy.com@BLOODGUY.COM

[root@server01]# sudo -u hdfs /home/hadoop/bin/hdfs dfs -ls / 



Map/Reduce

hdfs와 마찬가지로 보안설정 이후엔 Map/Reduce 실행도 Kerberos 인증을 완료하고 해야하고,

거기에 더하여 system 계정 등은 사용할 수 없는 좀 더 까다로운 부분이 있음.

그냥 yarn 계정으로 해버리면 됨.

[root@server01]# sudo -u yarn kinit -k -t /home/hadoop/etc/hadoop/yarn.keytab yarn/server01.bloodguy.com@BLOODGUY.COM

[root@server01]# sudo -u yarn MAPREDUCE_SCRIPT


만약 Map/Reduce가 실패할 경우 경험상 거의 전부 퍼미션 관련 오류였음. 

로그를 뒤져보고 HDFS 각 디렉토리의 퍼미션을 잘 맞춰볼 것.

/user/yarn 이라든가, MapReduce 결과가 저장될 result 디렉토리 라든가..


그리고 혹시나 해서 보안설정 여부에 따른 Map/Reduce 수행시간을 비교해봤는데,

약 1.7배 가량의 수행시간 차이가 나는 것을 확인했음.

1G 정도 되는 텍스트 파일을 이용한 테스트였는데,

수행시간은 각각 보안설정을 하지 않았을 경우 98초, 보안설정을 했을 경우 166초가 걸렸음.

일단 테스트용으로 구성한 클러스터 환경이 정확한 테스트를 하기엔 매우 부적절한 환경이라 전부 믿을 수는 없지만,

예상을 뛰어넘는 퍼포먼스 하락이 발생하여 약간 멘붕...;



Web

각종 모니터링 웹페이지 역시 Kerberos 인증을 거친 뒤 https로 접속해야 접근이 가능함.


내 Windows PC는 사용가능한 Active Directory 서버가 없어서 Kerberos 인증을 통한 SPNEGO 접속이 안되므로,

그냥 VirtualBox에 Linux 설치 후 Kerberos 인증하고 접속 성공.

(Windows에서 어떻게든 해보려고 완전 개삽질한 걸 엄청나게 후회하고 있음...)


SPNEGO로 접근하려면 브라우저에서도 뭔가 설정을 해줘야 함.

나는 FireFox를 사용했는데 아래처럼 설정함.

(각 브라우저별로 설정방법이 다르므로 나머지 브라우저는 각자 구글링을 통해 알아서 해결하면 됨)


// FireFox SPNEGO 세팅하는 법


1. 주소창에 about:config 입력하고 설정 페이지 진입


2. network.negotiate-auth.trusted-uris 항목에 접속하고자 하는 hostname 입력.

ex) server01.bloodguy.com,server02.bloodguy.com


[주의]

*.domain.com 이런 건 안 먹힘. hostname을 정확히 기입해야 함. 여러개일 경우 쉼표(,)로 연결.





[해결하지 못한 것]


브라우저로 namenode에 접근했을 때 다 되는데,

/logs 만 접근이 실패함.

아래와 같은 에러 메세지.

HTTP ERROR 403

Problem accessing /logs/. Reason:

    User $USERNAME is unauthorized to access this page.




번호 제목 글쓴이 날짜 조회 수
67 [Hadoop Encryption] Encryption Zone에 생성된 table에 Hue에서 insert 수행시 User:hdfs not allowed to do 'DECRYPT_EEK' ON 'testkey' 오류 gooper 2023.11.01 12
66 hadoop nfs gateway설정 (Cloudera 6.3.4, CentOS 7.4 환경에서) 총관리자 2022.01.07 115
65 missing block및 관련 파일명 찾는 명령어 총관리자 2021.02.20 153
64 W/F수행후 Logs not available for 1. Aggregation may not to complete. 표시되며 로그내용이 보이지 않은 경우 총관리자 2020.05.08 2110
63 A Cluster의 HDFS 디렉토리및 파일을 사용자및 권한 유지 하여 다운 받아서 B Cluster에 넣기 총관리자 2020.05.06 77
62 기준일자 이전의 hdfs 데이타를 지우는 shellscript 샘플 총관리자 2019.06.14 359
61 Error: java.lang.RuntimeException: java.lang.OutOfMemoryError 오류가 발생하는 경우 총관리자 2018.09.20 215
60 physical memory used되면서 mapper가 kill되는 경우 오류 발생시 조치 총관리자 2018.09.20 1518
59 resouce manager에 dr.who가 아닌 다른 사용자로 로그인 하기 총관리자 2018.06.28 1207
58 hadoop 클러스터 실행 스크립트 정리 총관리자 2018.03.20 608
» HA(Namenode, ResourceManager, Kerberos) 및 보안(Zookeeper, Hadoop) 총관리자 2018.03.16 93
56 [Decommission]시 시간이 많이 걸리면서(수일) Decommission이 완료되지 않는 경우 조치 총관리자 2018.01.03 5182
55 [2.7.2] distribute-exclude.sh사용할때 ssh 포트변경에 따른 오류발생시 조치사항 총관리자 2018.01.02 89
54 hadoop cluster에 포함된 노드중에서 문제있는 decommission하는 방법및 절차 file 총관리자 2017.12.28 653
53 Hadoop 2.7.x에서 사용할 수 있는 파일/디렉토리 관련 util성 클래스 파일 총관리자 2017.09.28 70
52 editLog의 문제로 발생하는 journalnode 기동 오류 발생시 조치사항 총관리자 2017.09.14 313
51 hadoop cluster구성된 노드를 확인시 Capacity를 보면 색이 붉은색으로 표시되어 있는 경우나 Unhealthy인 경우 처리방법 총관리자 2017.08.30 46
50 Windows7 64bit 환경에서 Apache Hadoop 2.7.1설치하기 총관리자 2017.07.26 235
49 갑자기 DataNode가 java.io.IOException: Premature EOF from inputStream를 반복적으로 발생시키다가 java.lang.OutOfMemoryError: Java heap space를 내면서 죽는 경우 조치방법 총관리자 2017.07.19 1661
48 mapreduce appliction을 실행시 "is running beyond virtual memory limits" 오류 발생시 조치사항 총관리자 2017.05.04 16888

A personal place to organize information learned during the development of such Hadoop, Hive, Hbase, Semantic IoT, etc.
We are open to the required minutes. Please send inquiries to gooper@gooper.com.

위로