프록시 사용자 - 다른 사용자를 대신하는 슈퍼유저
프록시 사용자 - 다른 사용자를 대신하는 슈퍼유저
이 문서는 슈퍼유저가 다른 사용자를 대신해 작업을 제출하거나 HDFS에 접근하는 방법을 설명합니다.
소개 (Introduction)
슈퍼유저가 다른 사용자를 대신해 작업을 제출하거나 HDFS에 접근하는 방법을 안내합니다.
사용 사례 (Use Case)
다음 절에서 설명하는 코드 예시는 다음 사용 사례에 적용됩니다.
super라는 이름의 슈퍼유저가 joe라는 사용자를 대신해 작업을 제출하고 HDFS에 접근하려고 합니다. 슈퍼유저는 kerberos 자격 증명을 가지고 있지만 사용자 joe는 아무것도 없습니다. 태스크는 사용자 joe로 실행되어야 하며, namenode에서의 모든 파일 접근도 사용자 joe로 수행되어야 합니다. 사용자 joe가 super의 kerberos 자격 증명으로 인증된 연결을 통해 namenode나 job tracker에 연결할 수 있어야 합니다. 다시 말해 super가 사용자 joe를 가장(impersonate)하는 것입니다.
Apache Oozie 같은 일부 제품이 이를 필요로 합니다.
코드 예시 (Code example)
이 예시에서는 super의 자격 증명으로 로그인하고 joe를 위한 프록시 사용자 ugi 객체를 만듭니다. 작업은 이 프록시 사용자 ugi 객체의 doAs 메서드 안에서 수행됩니다.
...
//Create ugi for joe. The login user is 'super'.
UserGroupInformation ugi =
UserGroupInformation.createProxyUser("joe", UserGroupInformation.getLoginUser());
ugi.doAs(new PrivilegedExceptionAction<Void>() {
public Void run() throws Exception {
//Submit a job
JobClient jc = new JobClient(conf);
jc.submitJob(conf);
//OR access hdfs
FileSystem fs = FileSystem.get(conf);
fs.mkdir(someFilePath);
}
}
설정 (Configurations)
프록시 사용자는 hadoop.proxyuser.$superuser.hosts 속성과 함께 hadoop.proxyuser.$superuser.groups 및/또는 hadoop.proxyuser.$superuser.users 속성을 사용해 구성할 수 있습니다.
core-site.xml에 아래처럼 지정하면, super라는 슈퍼유저가 host1과 host2에서만 연결해 group1과 group2에 속한 사용자를 가장할 수 있습니다.
<property>
<name>hadoop.proxyuser.super.hosts</name>
<value>host1,host2</value>
</property>
<property>
<name>hadoop.proxyuser.super.groups</name>
<value>group1,group2</value>
</property>
이 설정들이 없으면 가장(impersonation)이 허용되지 않고 연결이 실패합니다.
더 느슨한 보안을 원한다면 와일드카드 값 *를 사용해 어떤 호스트에서든 또는 어떤 사용자든 가장을 허용할 수 있습니다. 예를 들어 core-site.xml에 아래처럼 지정하면 oozie라는 사용자가 어떤 호스트에서 접근하든 어떤 그룹에 속한 어떤 사용자든 가장할 수 있습니다.
<property>
<name>hadoop.proxyuser.oozie.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.oozie.groups</name>
<value>*</value>
</property>
hadoop.proxyuser.$superuser.hosts는 IP 주소 목록, CIDR 형식의 IP 주소 범위 및/또는 호스트 이름을 받습니다. 예를 들어 아래처럼 지정하면 super라는 사용자가 10.222.0.0-10.222.255.255 범위와 10.113.221.221의 호스트에서 접근하여 user1과 user2를 가장할 수 있습니다.
<property>
<name>hadoop.proxyuser.super.hosts</name>
<value>10.222.0.0/16,10.113.221.221</value>
</property>
<property>
<name>hadoop.proxyuser.super.users</name>
<value>user1,user2</value>
</property>
주의사항 (Caveats)
클러스터가 보안 모드(Secure Mode)에서 실행 중이라면 슈퍼유저는 다른 사용자를 가장하기 위해 kerberos 자격 증명을 가져야 합니다.
이 기능에는 위임 토큰(delegation token)을 사용할 수 없습니다. 슈퍼유저가 자신의 위임 토큰을 프록시 사용자 ugi에 추가하는 것은 잘못된 것입니다. 프록시 사용자가 슈퍼유저의 권한으로 서비스에 연결할 수 있게 되기 때문입니다.
그러나 슈퍼유저가 joe에게 위임 토큰을 주고 싶다면, 위의 코드 예시처럼 먼저 joe를 가장해 joe를 위한 위임 토큰을 받은 다음 joe의 ugi에 추가해야 합니다. 이렇게 하면 위임 토큰의 소유자가 joe가 됩니다.