Hadoop 은 기본적으로 하나의 계정을 이용해서 작업하는 것이 매우 편한 구조이지만, 저장공간 및 병렬처리 Application을 Platform의 형태로 다양한 사용자에게 서비스를 제공하기 위해서는 반드시 Multi tenant가 지원되어야 하며 이를 위해서 스터디를 진행했던 내용으로 정리합니다.



Hadoop은 별도의 group정보를 가지고 있지 않습니다. 따라서 GroupMapping을 위해서 다음과 같은 방법들이 권장되고 있는데 이 중에서 추천되고 있는 LDAP - SSSD 연계방안을 테스트해보았습니다.

http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html#Group_Mapping


https://docs.hortonworks.com/HDPDocuments/Ambari-2.2.2.18/bk_ambari-security/content/setting_up_hadoop_group_mappping_for_ldap_ad.html



1. OpenLDAP

사용자가 늘어날 때 마다 매번 OS에 사용자를 만드는 작업은 부담이 될 수 있으며 portal, OS, HDFS등 여러 곳에 사용자 정보가 있을경우 관리Point가 늘어나기 때문에 LDAP으로 저장소를 통일합니다.



- 기본환경 설정

yum update;

yum upgrade;

/etc/init.d/iptables save;

/etc/init.d/iptables stop;

chkconfig iptables off;

yum install -y ntp;

chkconfig --level 3 ntpd on;

service ntpd start;

yum update –y openssl


- OpenLDAP설치

yum install openldap-servers

yum install openldap-clients



- OpenLDAP설정 및 실행

service slapd start 



- 환경변수 설정 OpenLDAP설정

LDAP 설정 참조 


- 사용자/그룹 추가

LDAP 설정 참조 



- Config 및 Entry 조회

ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config 

ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn
ldapsearch -x -D "cn=Manager,dc=company,dc=com " -w admin123 -b dc=company,dc=com


* OS와 연동을 위해서 posixGroup 생성을 추천



2. SSSD 설치 및 LDAP 연동

- 참고사이트


- NSS 설정 (/etc/nsswitch.conf)

passwd:     files sss

group:      files sss


- SSSD 설치 및 설정(/etc/sssd/sssd.conf)

 yum install sssd


[sssd]

services = nss, pam
sbus_timeout = 30
domains = LDAP
 
[nss]
filter_users = root
filter_groups = root
 
[domain/LDAP]
enumerate = true
cache_credentials = TRUE
 
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
 
ldap_uri = ldap://
ldap_user_search_base = dc=company,dc=com
tls_reqcert = demand
ldap_tls_cacert = /etc/pki/tls/certs/ca-bundle.crt


service sssd start




3. 실제 HDFS 환경 테스트

- UGI 생성 테스트 코드

 public class UGI {

        public static void main(String[] args){
                try {
                        String username = "john";
                        UserGroupInformation ugi
                                        = UserGroupInformation.createRemoteUser(username);
                        ugi.doAs(new PrivilegedExceptionAction<Void>() {
                                public Void run() throws Exception {
                                        Configuration conf = new Configuration();
                                        conf.set("fs.defaultFS""hdfs://host01:8020");
                                        conf.set("hadoop.job.ugi", username);
                                        FileSystem fs = FileSystem.get(conf);
                                        fs.createNewFile(new Path("/user/john/test"));
                                        FileStatus[] status = fs.listStatus(new Path("/user/john"));
                                        for(int i=0;i<status.length;i++){
                                                System.out.println(status[i].getPath());
                                        }
                                        return null;
                                }
                        });
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
}


- UGI 조회 테스트 코드

 public class UGIRead {

        public static void main(String[] args){
                try {
                        String username = "john";
                        UserGroupInformation ugi
                                        = UserGroupInformation.createRemoteUser(username);
                        ugi.doAs(new PrivilegedExceptionAction<Void>() {
                                public Void run() throws Exception {
                                        Configuration conf = new Configuration();
                                        conf.set("fs.defaultFS""hdfs://host01:8020");
                                        conf.set("hadoop.job.ugi", username);
                                        FileSystem fs = FileSystem.get(conf);
                                        InputStream stream = fs.open(new Path("/user/john/test"));
                    BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
                    System.out.println(reader.readLine());
                                        reader.close();
                    stream.close();
                    fs.close();
                                        return null;
                                }
                        });
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
}

 

- hadoop fs 명령어 테스트

hadoop fs -ls /user/john

hadoop fs -cat /user/john/test


4. 기타 참고사항
LDAP에 있는 사용자들이 실제 OS는 존재하지 않기 때문에 home 디렉토리가 없는 상태이기 때문에 자동으로 생성해줄수 있도록 패키지 설치 및 환경설정이 필요합니다.

yum install oddjob-mkhomedir oddjob

chkconfig oddjobd on
service oddjobd start
authconfig --enablemkhomedir --update



5. 결과내용
- 프로세스를 기동한 OS계정이 아닌 LDAP에 등록되어 있는 계정으로 HDFS 사용이 가능합니다.
 (Java API 및 hadoop fs 명령어 모두 사용가능)
- Hadoop의 namenode가 판단하기 때문에 sssd는 namenode에 설치되어야 합니다.
- 실제 작업이 수행될 때 YARN Queue에 사용자/그룹별로 queue name을 지정해서 수행해야 할텐데 이부분은 추가 테스트가 필요합니다.
- 사용자 인증에 대한 부분이나 기타 보안사항에 대해서는 추가 보완이 필요합니다.
- 단일 Hadoop Cluster에 대한 multi tenant내용이기 때문에 서로 다른 Hadoop Cluster 연계에 대한 부분은 아닙니다.


참고)

A. createRemoteUser

1. OS에 없는 계정으로 시도 : 오류발생

2. OS에 있는 계정으로 하면 성공  : createRemoteUser API의 인자를 user 로 인식함

 

B. ugi.doAs

- createRemoteUser와 Configuration의 hadoop.job.ugi 가 다를 경우 : 별도 오류는 발생하지 않음

 

- FileSystem.createNewFile 시도시 권한없으면 오류 발생 

 ex) jane 계정으로  /user/hdfs/test22파일생성 시도

  Permission denied: user=jane, access=EXECUTE, inode="/user/hdfs/test22":hdfs:hdfs:drwx------

 

- FileSystem.listStatus 시도시 권한 없으면 오류 발생

 ex) jane 계정으로 /user/hdfs 조회시도

  Permission denied: user=jane, access=READ_EXECUTE, inode="/user/hdfs":hdfs:hdfs:drwx------

 

- 적합한 계정으로 작업할 경우 모두 성공


'BigData' 카테고리의 다른 글

Hadoop Security for Multi tenant #3  (0) 2017.03.24
Hadoop Securiy for Multi tenant #2  (0) 2017.01.20
Flume-Kafka-Elasticsearch 테스트  (0) 2016.03.14
Storm특징 및 Spark와의 차이점  (0) 2014.12.12
CAP 정리  (0) 2014.11.28

+ Recent posts