最近为了解决本地发布测试代码到服务器的问题,试用了下JAAS(Java Authencation and Authorization Service,Java授权与验证服务)和GSSAPI来完成Kerberos登录验证。完成了身份验证以后,就可以使用ant标准任务SCP来完成发布操作了。
关于Kerberos验证机制请参考:一个不错的Kerberos机制讲解blog(虽然头像有点,但不要以貌取文)
基于Kerberos的验证机制,需要两步来完成登录服务器身份验证:
1、通过JAAS完成客户端与KDC服务器的验证工作,并获得登录服务器的ticket
2、使用GSSAPI登录服务器
注:以下代码能够正常执行的前提是,执行的机器上已经正常配置了Kerberos登录的文件,可以参考Kerberos登录软件的配置方式,确保使用Kerberos的登录软件可以正常登录服务器之后再尝试以下代码。下面的代码只是用于辅助自动登录,并不包含具体Kerberos登录的配置
1、使用JAAS登录Kerberos账号
关于JAAS的详细信息请参考:Sun的Jaas和Gssapi指南
。
我使用的代码与指南中的基本相同,所以具体内容的详细解释请参考:Jaas验证样例
使用JAAS登录Kerberos登录的步骤如下:
- JAAS服务中已经提供了Kerberos登录的实现,需要在启动程序时添加配置文件信息来指定登录的模式为Kerberos,例如:-Djava.security.auth.login.config=/data/jaas.conf,或者配置System属性也可以。
- jaas.conf的内容很简单,只是指定了登录模式为Kerberos:
KerberosLogin
{
com.sun.security.auth.module.Krb5LoginModule required debug=true;
};
- 使用JAAS服务需要调用LoginContext(javax.security.auth.login包)来尝试登录,代码如下:
LoginContext lc = null;
try {
lc = new LoginContext
("KerberosLogin
", new TextCallbackHandler()); //“KerberosLogin”这个名称必须与配置文件中的名称相同
} catch (LoginException le) {
System.err.println("Cannot create LoginContext. " + le.getMessage());
System.exit(-1);
} catch (SecurityException se) {
System.err.println("Cannot create LoginContext. " + se.getMessage());
System.exit(-1);
}
try {
// attempt authentication
lc.login();
} catch (LoginException le) {
System.err.println("Authentication failed:");
System.err.println(" " + le.getMessage());
System.exit(-1);
}
- 如果正确的配置了Kerberos的登录信息,则以上代码如果正常运行完就表示客户端与KDC的通讯已经成功完成。
2、使用GSSAPI完成SSH的身份验证
完成了客户端与KDC的通讯后,剩下的任务就是登录服务器了。以下的代码必须在成功完成步骤1之后进行,具体步骤为:
- 在subject的权限下进行登录。完成了步骤一之后,我们可以从login context中获得身份验证的一个subject对象,这个对象中包含了当前用户的权限,接下来的登录服务器操作必须在这个subject的权限范围内完成,如
Subject.doAsPrivileged(lc.getSubject()
,
new java.security.PrivilegedExceptionAction<Object>() {
@Override
public Object run() throws Exception {
//登录操作
}
}
}
- 构建GSS context对象。这个context对象包含了用于登录服务器的ticket以及客户端的相关信息。
try {
GSSManager manager = GSSManager.getInstance();
//Kerberos的oid
Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2");
GSSName serverName = manager.createName("host/" + hostName, null);
GssContext context = manager.createContext(serverName, krb5Mechanism, null, GSSContext.DEFAULT_LIFETIME);
context.requestMutualAuth(true); // Mutual authentication
context.requestConf(true); // Will use confidentiality later
context.requestInteg(true); // Will use integrity later
} catch (GSSException e) {
// catch Exception
}
- 拥有了GSS context对象之后,就可以进行SSH的身份验证,完成了身份验证之后就可以像普通的SCP一样进行操作了。下面的代码只包含了SSH中使用GSSAPI进行验证的过程,不包含SSH的建立,交换key以及后续的sftp操作。
/*
* 使用GSSAPI进行SSH验证的基本顺序是
* 1、询问user-auth服务
* 2、获得确认后传输验证的方式
* 3、进行Kerberos的验证操作
*/
1、询问user-auth服务
请求数据: 5 byte
“ssh-userauth” String
响应标志 6
2、请求身份验证方法为Kerberos
50 byte
username string 登录服务器的名称,不是登录Kerberos的名称
"ssh-connection" string
"gssapi-with-mic" string
1 int 表示只有一种类型的oid在后面
new Oid("1.2.840.113554.1.2.2").getDER() Kerberos的oid的DER编码
响应标志 60 表示支持Kerberos登录
3、进行Kerberos验证,这里需要使用刚才构建的GSS context对象
byte[] token = new byte[0];
while (!context.isEstablished()) {
try {
token = context.init(token, 0, token.length);
} catch (JSchException e) {
e.printStackTrace();
return;
}
if (token != null) {
// 会写数据
// 61 byte
// token string
}
if (!context.isEstablished()) {
// 读取返回信息,忽略错误和失败的情况
// 以下代码代表读取返回信息,并设置给token,用与继续context的初始化参数
buf.getInt();
buf.getByte();
buf.getByte();
token = buf.getString();
}
}
注:这段代码省略了关于SSH通讯数据的解析和输出部分,具体关于SSH的通讯格式请参数wikipedia的SSH页面
。
分享到:
相关推荐
_Jaas_Kerber_jaas_KERBEROS_kerberos_Java_login.a"压缩包文件包含了关于如何在Java环境中使用JAAS实现Kerberos登录和委托的示例代码。Kerberos是一种广泛使用的网络身份验证协议,它提供了强大的安全性,通过一次...
JAAS强调的是通过验证谁在运行代码以及他/她的权限来保护系统面受用户的攻击。它让你能够将一些标准的安全机制,例如Solaris NIS(网络信息服务)、Windows NT、LDAP(轻量目录存取协议),Kerberos等通过一种通用...
配置文件中指定Kerberos登录模块,并提供必要的Kerberos服务名和服务位置信息。 - **使用KerberosLoginModule** 在Java代码中,通过`Subject`对象和`LoginContext`来调用KerberosLoginModule进行登录操作。登录...
3. **自定义登录模块**:JAAS允许开发者创建自己的登录模块,以适应特定的认证机制,如LDAP、数据库或Kerberos。开发者需要实现 javax.security.auth.login.LoginModule 接口,并在配置文件中指定。 4. **配置文件*...
- 使用`LoginContext`和配置的JAAS配置文件进行登录操作,这将执行Kerberos认证流程。 - 登录成功后,可以从`Subject`中获取`KerberosTicket`,并用它来请求服务票证。 5. **Kerberos与Java SSO** - 在Java应用...
1. **配置安全策略**:开发者需要定义一个安全策略文件,指定哪些类和方法需要进行安全性检查,以及使用哪个登录模块(Login Module)进行认证。 2. **创建Subject对象**:Subject是JAAS中的核心类,代表了与安全...
### JAAS登录验证知识点 #### 一、JAAS概述 Java Authentication and Authorization Service(JAAS)是Java平台提供的一种安全框架,它允许开发者为应用程序添加认证和授权功能。与传统的基于容器的身份验证不同,...
- 使用`FlinkKafkaConsumer`类来创建消费者实例,传入Kafka的topic名称、消费者的配置(包含Kerberos相关配置)以及序列化器。 - 在Flink的作业中,添加这个消费者作为源,如`stream.addSource(consumer)`。 4. *...
4. **配置文件(Configuration File)**:JAAS 使用配置文件来指定哪些登录模块应用于哪个主体(Subject,代表用户或实体),以及它们的配置选项。 现在,让我们来看看如何使用纯 Java 文件实现一个简单的 JAAS ...
在这个关于JAAS的学习资料中,我们将探讨如何使用JAAS实现一个简单的登录模块。 首先,我们看到一个名为"simp.config"的文件,这通常是JAAS配置文件。在JAAS中,配置文件定义了认证系统的行为,包括用于认证的模块...
登录模块可以是基于数据库的、LDAP目录的,甚至可以是kerberos等更复杂的身份验证机制。 **2. JAAS配置** - **jaas.conf文件**:这是JAAS的主要配置文件,定义了不同的安全领域( realms )和对应的登录模块。 - **...
- **登录模块(Login Modules)**:登录模块是实现认证的具体逻辑,是JAAS的核心组件。它们实现了 `javax.security.auth.spi.LoginModule` 接口,负责实际的用户验证工作。每个登录模块都有其特定的认证方式,如使用...
这个主题涉及到Java Authentication and Authorization Service (JAAS)的安全框架,以及它如何在企业级应用服务器环境中确保安全登录。 Java Authentication and Authorization Service (JAAS) 是Java平台提供的一...
以上就是CDH 5.15.1启用Kerberos的完整过程,以及Kafka在Kerberos环境中的配置和使用方法。确保遵循每个步骤,并根据实际情况调整配置,以保证系统的安全性和稳定性。参考链接中提供了更详细的指南,可进一步了解...
- 添加 Realm 和 Principal:通过管理员用户,添加你的Kerberos Realm,以及需要认证的用户和服务。 5. **客户端配置**: - 配置客户端:在 `/etc/krb5.conf` 文件中,设置正确的 Realm 和 KDC 地址。 - 测试...
本文将详细介绍如何为 Kafka 配置 Kerberos 安全认证,包括安装 Kerberos 服务、配置 Zookeeper 的 Kerberos 认证以及最终配置 Kafka 的 Kerberos 认证。 #### 二、整体架构设计 Kerberos 的部署通常需要一个中心化...
在本文的示例中,我们展示了一个基于Web的Java应用程序如何使用JAAS实现健壮而灵活的登录和身份验证模块。该示例中,关系数据库被用来保存用户的登录信息,通过JAAS的支持,我们能够轻松实现一个强大而灵活的身份...
配置文件通常在`jaas.conf`中编写,它指定了使用哪个登录模块以及其配置。例如: ``` MyApp { mypackage.MyLoginModule required; }; ``` 这里,`MyApp`是安全域的名称,`mypackage.MyLoginModule`是登录模块的全...
在实际开发中,一些工具和库可以帮助简化JAAS的使用,例如使用Spring Security整合JAAS,或者利用开源的登录模块实现。这些工具通常提供更高级别的抽象,使得安全设置更加容易和灵活。 总结,Java Authentication ...