7. 1.1 하둡이란?
OLTP, ERP,
CRM
Document,
E-mail
Web
Log,Click
Stream
Social
Networks
Sensor Data
Geo-location
Data
8. 1.2 기존 방식의 문제점
Identity
클라이언트 어플리케이션을 실행하는 OS 계정
[hadoop@grute`r01~]$ whoami
hadoop
[hadoop@gruter01~]$ id
uid=508(hadoop) gid=508(hadoop) groups=508(hadoop)
Authorization
MR ACL, HDFS Permission
9. 1.2 기존 방식의 문제점
Simple Mode
No Authentication (core-site.xml)
<property>
<name>hadoop.security.authentication</name>
<value>simple</value>
<description>Possible values
are simple (no authentication), and kerberos
</description>
</property>
10. 1.2 기존 방식의 문제점
• Examples
[hadoop@localhost hadoop-2.4.0]$ ./bin/hdfs dfs -
copyToLocal /user/hadoop/crm/user /backup/crm/user
[hadoop@localhost hadoop-2.4.0]$ ./bin/hdfs dfs -rm
-r /user/hadoop
[mapreduce@localhost hadoop-2.4.0]$ ./bin/hadoop
jar Xyz.jar mypackage.Attack
12. 2.1 Hadoop Security Definition
Security in Apache Hadoop is defined by four key
pillars: authentication, authorization,
accountability, and data protection.
- 2014 HadoopSummit: Vinay Shukla -
15. 3.1 커버로스란?
- 컴퓨터 네트워크 내에서 서비스 요구를 인증하기 위한 안
전한 방법으로, 미국 MIT의 Athena 프로젝트에서 개발
-사용자가 인증과정으로부터 암호화된 '티켓'을 요청 할 수
있게 해주는데, 이 티켓은 서버에 특정 서비스를 요구하는데
사용될 수 있고, 사용자의 암호는 네트워크를 통할 필요가 없
음
- LDAP, 윈도우 AD(Active Directory)와 같은 표준 엔터프라
이즈 디렉터리 서비스와 통합 가능
16. 3.2 커버로스 구성요소
구성요소 내용
KDC
(Key Distribution Center)
키 분배 서버, TGS와 AS 구성
모든 사용자와 서비스들의 암호화키를 보유
AS (Authentication
Service)
사용자에 대한 인증을 수행
TGS (Ticket Granting
Service)
티켓을 부여하고, 티켓을 분배
티켓(Ticket)
사용자에 대한 신원과 인증을 확인하는 토큰
사용자가 서비스와 통신할 때, 패스워드를 입
력하지 않게 함
영역(Realm)
커버로스 시스템에 속해 있는 클라이언트와
서버들의 범위
17. 3.3 커버로스 아키텍처
KDC
AS
TGS
서버
1.인증요청
2.티켓 승인 티켓(TGT)
클라이언트
3. 티켓 승인 티켓
4. 서비스 티켓 (TGS)
5. 서비스 티켓
6. 접속 허락
18. 3.3 커버로스 아키텍처
Principal
- 티켓을 할당하기 위한 유니크한 식별자
- 표현 형식
- primary/instance@REALM
- primary: 사용자 혹은 호스트
- instance: primary를 서술, REALM: 커버로스 영역
- ex) tajo/server01.tajo.org@TAJO.ORG
KeyTabs
- KDC에서 부여받은 암호화된 키와 Princial로 구성
- KeyTabs의 키는 티켓을 복호화할 때 사용함
20. 4.1 사용자 서비스 인증
클라이언트
마스터 서버
NameNode
JobTracker
KDC ResourceManager
인증 및
서비스 티켓 요청
커버로스
서비스 티켓
21. 4.2 개별 서비스 인증
마스터 서버
NameNode
JobTracker
ResourceManager
슬레이브서버
DataNode
TaskTracker
NodeManager
커버로스
KeyTab
22. 4.3 Delegation Token
슬레이브 서버
마스터 서버
NameNode JobTracker ResourceManager
슬레이브 서버
TaskTracker NodeManager
Task Task Container Container
접속
요청
접속
요청
접속
요청
클라이언트
인증 및 토큰 생성
23. 4.3 Delegation Token
- NameNode가 커버로스 인증을 한 클라이언트에게 부여
- 한 번의 접속으로 모든 작업을 수행
- 클라이언트가 맵리듀스잡을 실행할 경우, JobTracker
및 ResourceManager에게 공유함
- 하나의 맵리듀스잡에 포함된 모든 태스크는 동일한 DT
를 사용함, 해당 DT로 NameNode에 접근
- JobTracker와 ResourceManager는 DT 연장 가능
-
24. 4.4 Job Token
마스터 서버
슬레이브 서버
TaskTracker
Task Task
JobTracker
토큰 공유
슬레이브 서버
TaskTracker
Task Task
클라이언트
MR 실행 및
토큰 생성
토큰 공유
토큰 인증
25. 4.4 Job Token
- MR Job 실행이 요청될 때, JobTraker가 생성
- TaskTracker에 공유
- Task가 TaskTracker와 통신을 할 때 사용
26. 4.5 Block Access Token
슬레이브 서버
DataNode
슬레이브 서버
TaskTracker
Task Task
클라이언트
토큰 인증
토큰 부여
토큰 인증 NameNode
토큰 부여
토큰 부여
27. 4.5 Block Access Token
- 인증된 클라이언트의 블록 접근 허용
- 인증된 클라이언트가 HDFS의 파일을 접근할 때,
NameNode가 클라이언트에게 부여함
- BAT는 DataNode에 공유됨
- 클라이언트(App, Map & Reduce Task)가 DataNode 블
록 접근시 토큰 제출
34. 5.2 커버로스 설치
2) 커버로스 데이터베이스 설치
- kdb5_util create -r TAJO.ORG -s
Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm
'TAJO.ORG',
master key name 'K/M@TAJO.ORG'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key:
Re-enter KDC database master key to verify:
36. 5.2 커버로스 설치
3) ACL 변경
• /var/kerberos/krb5kdc/kadm5.acl
*/admin@TAJO.ORG *
4) 커버로스 서버 구동
- service kadmin start
- service krb5kdc start
- chkconfig krb5kdc on
- chkconfig kadmin on
38. 5.2 커버로스 설치
- /usr/sbin/authconfig --update --enablekrb5 --
krb5kdc=namenode01 --krb5realm=TAJO.ORG
- /etc/ssh/sshd_config 변경
PasswordAuthentication no
KerberosAuthentication yes
KerberosOrLocalPasswd no
KerberosTicketCleanup yes
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
GSSAPIKeyExchange yes
UsePAM yes
- service sshd restart
39. 5.2 커버로스 설치
6) 방화벽 정책 추가
- iptables -I INPUT -m state --state NEW -m tcp -p
tcp --dport 88 -j ACCEPT
- iptables -I INPUT -m state --state NEW -m udp -p
udp --dport 88 -j ACCEPT
- iptables -I INPUT -m state --state NEW -m tcp -p tcp
--dport 749 -j ACCEPT
- service iptables save
-
40. 5.3 커버로스 코맨드
구성요소 내용
kadmin
원격의 커버로스 데이터베이스에 접속하여
principal 및 keytab을 관리함. 원격 접속 가능
kadmin.local
로컬 커버로스 데이터베이스에 접속하여
principal 및 keytab을 관리함
klist 로컬 호스트에 캐시되어 있는 티켓 목록 출력
kinit 커버로스 로그인 수행
kdestroy 로컬 티켓 캐시 삭제
kpasswd 커버로스 패스워드 변경
41. 5.4 principal 및 keytab 생성
1) 쉘 스크립트 작성
• /usr/local/kerberos/slaves
namenode01
datanode01
• /usr/local/kerberos/make_keytab.sh
#!/bin/sh
realm=TAJO.ORG
for slave in $(cat slaves); do
echo ${slave}
install -o root -g root -m 0700 -d ${slave}
42. 5.4 principal 및 keytab 생성
• /usr/local/kerberos/make_keytab.sh
kadmin.local <<EOF
addprinc -randkey host/${slave}@${realm}
addprinc -randkey hadoop/${slave}@${realm}
ktadd -k ${slave}/hadoop.keytab -norandkey
hadoop/${slave}@${realm} host/${slave}@${realm}
EOF
done
- 스크립스 실행: ./make_keytab.sh
- 호스트명 디렉토리의 파일을 해당 호스트로 복사
scp, rsync, pssh 등 이용
43. 5.5 keytab 배포
1) 배포
- 생성된 hadoop.keytab 파일을 scp, rsync 등으로 배포
- 각 서버의 /home/hadoop/hadoop-
2.5.1/etc/hadoop/security 디렉터리에 복사
-- 배포 스크립트를 만들어서 배포할 것
2) Keytab 파일 권한 변경
- chmod 400 hadoop.keytab
44. 5.6 하둡 클러스터 설정
1) hadoop-env.sh
export JSVC_HOME=/usr/bin
기존에 설치된 jsvc가 없을 경우 yum jsvc로 설치
export HADOOP_SECURE_DN_USER=hadoop
export HADOOP_SECURE_DN_PID_DIR
=/home/hadoop/pids/secure
export HADOOP_SECURE_DN_LOG_DIR=/home/hadoop/hadoop-
2.5.1/logs/secure
58. 5.6 하둡 클러스터 설정
7) container-executor.cnf 설정
- root 로 작업 진행
- mkdir /usr/local/yarn_conf
- cd /usr/local/yarn_conf
- vi container-executor.cfg
#yarn.nodemanager.local-dirs=/tmp/yarn/local
#yarn.nodemanager.log-dirs=/tmp/yarn/logs
yarn.nodemanager.linux-container-executor.group=hadoop
#banned.users=
min.user.id=500
#allowed.system.users=
- chmod 400 container-executor.cfg
59. 5.7 하둡 클러스터 실행
1) NameNode
- sbin/hadoop-daemon.sh start namenode
2) DataNode
- sudo sbin/hadoop-daemon.sh start datanode
• visudo
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
hadoop ALL=(ALL) ALL
61. 5.7 Trouble Shooting
1) 커버로스 설치
- 기존에 설치된 커버로스를 함부로 삭제하지 말 것
- python-krbV-1.0.90-3.el6.x86_64
[root@namenode01 local]# wget
wget: error while loading shared libraries: libgssapi_krb5.so.2:
cannot open shared object file: No such file or directory
[root@namenode01 lib]# yum clean all
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:
libgssapi_krb5.so.2: cannot open shared object file: No such
file
62. 5.7 Trouble Shooting
2) SSH 버전
- SSH 버전마다 설정 파일 경로 및 파일명이 상이함
- SSH1: /etc/ssh/ssh_config
- SSH2: /etc/ssh/sshd_config
3) 커버로스 버전
- 커버로스도 여러 배포 버전이 존재함
- 커버로스 버전에 따라서 kadmim, kadmin.local의 지원 옵
션이 상이함
63. 5.7 Trouble Shooting
4) Keytab 파일에 이상이 있을 경우
- 지정된 위치에 없거나
- 다른 서버의 Keytab 파일을 복사해온 경우
java.io.IOException: Login failure for
hadoop/datanode01@TAJO.ORG from keytab
/home/hadoop/hadoop-2.5.1/etc/hadoop/hadoop.keytab
at
org.apache.hadoop.security.UserGroupInformation.loginUserFrom
Keytab(UserGroupInformation.java:921)
at
org.apache.hadoop.security.SecurityUtil.login(SecurityUtil.java:24
2)
at
org.apache.hadoop.security.SecurityUtil.login(SecurityUtil.java:20
6)
64. 5.7 Trouble Shooting
5) DataNode 구동
- 커버로스를 활성화 시킨 경우, 반드시 root로 실행
14/09/28 06:33:49 INFO security.UserGroupInformation: Login successful
for user hadoop/datanode01@TAJO.ORG using keytab file
/home/hadoop/hadoop-2.5.1/etc/hadoop/hadoop.keytab
14/09/28 06:33:49 INFO impl.MetricsConfig: loaded properties from
hadoop-metrics2.properties
14/09/28 06:33:50 INFO impl.MetricsSystemImpl: Scheduled snapshot
period at 10 second(s).
14/09/28 06:33:50 INFO datanode.DataNode: Configured hostname is
datanode01
14/09/28 06:33:50 FATAL datanode.DataNode: Exception in secureMain
java.lang.RuntimeException: Cannot start secure cluster without privileged
resources.
at
org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNod
e.java:737)
65. 5.7 Trouble Shooting
6) JSVC 클래스 패스 설정
- 클래스 패스가 문제 있는 경우
- JSVC 버전 별로, -cp 에서 * 설정이 적용안 될 수 있음
28/09/2014 23:22:00 3203 jsvc.exec error: Cannot find daemon loader
org/apache/commons/daemon/support/DaemonLoader
java.lang.ClassNotFoundException:
org.apache.hadoop.hdfs.server.datanode.SecureDataNodeStarter
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
67. 5.7 Trouble Shooting
- bin/hdfs에 스크립트 추가 (2/2)
JSVC_CLASSPATH=$HADOOP_HOME/etc/hadoop
for d in $HADOOP_MODULE_DIRS; do
for f in $d/*; do
JSVC_CLASSPATH=${JSVC_CLASSPATH}:$f;
done
done;
exec "$JSVC"
-Dproc_$COMMAND -outfile "$JSVC_OUTFILE"
-errfile "$JSVC_ERRFILE"
-pidfile "$HADOOP_SECURE_DN_PID"
-nodetach
-user "$HADOOP_SECURE_DN_USER"
-cp "$JSVC_CLASSPATH"
68. 5.7 Trouble Shooting
7) DataNode의 소유자는?
- sudo로 실행했더라도, hadoop으로 소유자가 변경됨
- hadoop 계정으로 jps, kill, hadoop-deamon.sh stop 모
두 적용 가능
8) SSH 인증키 복사는?
- 기존대로 마스터 서버의 SSH 인증키를 슬레이브 서버에
복사
데몬 제어는 여전히 SSH 프로토콜
69. 5.7 Trouble Shooting
8) AES-256 알고리즘 이슈
-kdc.conf에서 aes-256을 삭제하거나, 암호화 파일을 모든
서버에 설치 $JAVA_HOME/jre/lib/security
2014-09-29 02:51:11,641 WARN
SecurityLogger.org.apache.hadoop.ipc.Server: Auth failed for
192.168.56.101:60399:null (GSS initiate failed)
2014-09-29 02:51:11,643 INFO org.apache.hadoop.ipc.Server:
Socket Reader #1 for port 9010: readAndProcess from client
192.168.56.101 threw exception
[javax.security.sasl.SaslException: GSS initiate failed [Caused
by GSSException: Failure unspecified at GSS-API level
(Mechanism level: Encryption type AES256 CTS mode with
HMAC SHA1-96 is not supported/enabled)]]
70. 5.7 Trouble Shooting
9) TaskTracker 로컬 디렉터리 생성 실패
- mapred-site.xml의 mapred.local.dir와
taskcontroller.cfg의 yarn.nodemanager.local-dirs이 일치
하지 않을 때 발생
INFO mapred.TaskController: Failed to create directory
/var/log/hadoop/cache/mapred/mapred/local1/taskTracker/atm - No such
file or directory
11/08/17 14:44:06 WARN mapred.TaskTracker: Exception while localization
java.io.IOException: Job initialization failed (20)
at
org.apache.hadoop.mapred.LinuxTaskController.initializeJob(LinuxTaskControl
ler.java:191)
at
org.apache.hadoop.mapred.TaskTracker$4.run(TaskTracker.java:1199)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
71. 5.7 Trouble Shooting
10) TaskTracker 로그 디렉터리 생성 실패
- mapred-site.xml의 mapred.local.dir와
taskcontroller.cfg의 yarn.nodemanager.local-dirs이 일치
하지 않을 때 발생
INFO mapred.TaskController: Failed to create directory
/var/log/hadoop/cache/mapred/mapred/local1/taskTracker/atm - No such
file or directory
14/09/27 14:44:06 WARN mapred.TaskTracker: Exception while localization
java.io.IOException: Job initialization failed (20)
72. 결론
1. 커버로스가 정말 필요한 환경인지, 진지하게 고
민하세요.
2. 충분히 연습하세요.
3. 관리도구를 적절히 활용하세요.
4. 계정 관리는 LDAP, 액티브 디렉터리와 연동하
는 것이 좋습니다.
5. 게이트웨이 서버(Knox, Sentry)를 활용하세요.