self application通过kerbeos认证的四种方式
Simple Hadoop Client
- 这种方法不包含任何的认证,他依赖于当前机器已经取得TGT,这对于服务或者需要长时间运行的程序不适用,因为TGT可能会过期。每个用户在使用时都需要kinit先获取TGT
Service Account Authorization
- 这种方法为Kerberos创建一个service account(服务的principal),所有的用户都将使用这个service account来进行认证,而不是每个用户都需要使用自己的账户进行认证。随之带来的问题是,由于所有的用户都使用相同的service account来进行认证,无法在HDFS上建立基于用户的权限控制。 步骤如下
- 1.创建Service Principal
kadmin -q "addprinc -randkey myapplication/myhost@CLOUDERA"
Authenticating as principal cloudera-scm/admin@CLOUDERA with password.
Password for cloudera-scm/admin@CLOUDERA:
WARNING: no policy specified for myapplication/myhost@CLOUDERA; defaulting to no policy
Principal "myapplication/myhost@CLOUDERA" created.
注: 其中-randkey是为了使用一个随机的密钥进行加密,而不是使用用户的密码加密。
- 2.为了查看Principal是否生成,可以执行以下代码
kadmin -q "getprinc myapplication/myhost"
Principal: myapplication/myhost@CLOUDERA
Expiration date: [never]
Last password change: Tue Jul 28 14:35:16 PDT 2015
- 3.然后,将此Principal倒入keytab文件。后面我们将使用这个keytab文件来认证。
kadmin -q "xst -k myapplication.keytab myapplication/myhost"
注:上面的xts是指对所有的加密方式都生成一个Principal。
* 4.可以通过Klist查看keytab
klist -ke myapplication.keytab
- 5.示例代码如下:
class FileCount {
public static void main(final String[] args) throws IOException, FileNotFoundException, InterruptedException{
UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("myapplication/myhost", "myapplication.keytab");
ugi.doAs( new PrivilegedExceptionAction() {
public Void run() throws Exception {
String path = "/";
if( args.length > 0 )
path = args[0];
FileSystem fs = FileSystem.get(new C