Cloudera CDH/CDP 및 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 HA: http://bloodguy.tistory.com/948
ResourceManager HA: http://bloodguy.tistory.com/949
Kerberos Server Replication: http://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.