Keytab可以理解为密钥cache。Keytab一般给service使用,这样service在认证自己或者给客户端认证的时候,不用输入密钥。该文件是加密的,存储在服务器的本地磁盘上。Keytab文件的默认路径是/etc/krb5.keytab。
下图示例了如何建立一个keytab文件,该文件允许location.example.com这个服务器认证sample服务:
location% /usr/local/sbin/kadmin
kadmin5: ktadd sample/location.example.com@EXAMPLE.COM
kadmin: Entry for principal sample/location.example.com @EXAMPLE.COM
with kvno 3, encryption type DES-CBC-CRC added to keytab
WRFILE:/etc/krb5.keytab.
kadmin5: quit
location %
Clientconfigure
客户端配置时需要注意的一点是,如果服务端和客户端不在一个机器上,那么客户端需要在其/etc/services文件中添加所需服务的条目。
Serverconfigure
服务器配置的时候需要注意,一定要有keytab文件,并且keytab文件中有所需的服务的entry在里面。可以通过klist –k查看默认keytab中有哪些principal的entry。
JavaAuthentication and Authorization Service
JAAS提供了一种可扩展的能力。针对认证和基于认证实体的访问控制,JAAS提供了一种可插卸的框架和编程接口。
JAAS框架可以分成两个部分,一是认证组件,一是授权组件。JAAS认证组件提供安全确认当前代码运行用户的身份的能力,不论这段代码是Application,Applet,bean还是servlet。JAAS授权组件增加了安全可靠性,提供了代码执行的限制。特定代码只能由特定用户执行。
JAAS认证框架基于可插卸认证模块(Pluggable Authentication Module)。基于这种架构,系统管理员可以以插卸的方式增加或者减少认证模块。这使得Java程序可以独立于底层的认证机制。新认证模块的增加可以避免修改代码,只需修改配置文件即可。
JAAS认证框架同时支持可堆叠模块。多种安全模块可以以配置文件中指定的顺序调用。
Subject是JAAS中属于,它指代任何请求访问资源的实体。一个subject可能是一个用户或者一个服务。由于一个实体可能会有很多名字或者principal,JAAS使用subject作为一个上层的封装。因此,一个subject中会有一堆principal。
Subject中也会有一些安全相关的credential,这些credential中有公有的,也有私有的。敏感的数据存储在私有集合中。Subject类有一些方法可以检索principal,以及其对应的公有credential或者私有credential。
Java2使用java.lang.SecurityManager增强了运行时访问控制。在任何敏感操作发生时,SecurityManager都会进行审查。SecurityManager将审查授权给java.security.AccessController去做。AccessController会获得一个AccessControlContext的运行时镜像,来检查操作是否有效。
JAAS提供了两个方法doAs和doAsPrivileged去实现一个subject和AccessControlContext的动态关联。doAs方法关联subject和当前线程访问控制环境,随后的访问控制检查基于代码运行的方法以及运行这段代码的subject。doAsPrivileged基本上和doAs相同,除了前者可以指定一个线程环境。
由于访问控制环境是基于线程的,JVM中不同的线程可以看做不同的实体。一个访问控制环境关联的subject可以通过getSubject函数获得。
LoginContext类提供了基本的subject认证方法。它使得应用程序独立于具体的认证机制。LoginContext通过查看配置文件决定使用何种认证方法。如果没有指定认证方法,默认选择配置文件中的“other”条目。
LoginModule为了支持堆叠式的认证方式,LoginContext通过两个阶段来认证subject。第一个阶段中,程序会尝试调用所有配置过的认证方法,如果所有的认证模块调用通过,那么进入第二个阶段,再次调用这些模块提供正式的认证请求。在这个阶段中,subject会存储所有的principal以及相应的credential。如果中间任意一次失败,程序会逐步释放所有的存储空间并销毁相应条目。
由JAAS调用的登录模块需要一个回调函数接收一些信息。例如kerberos登录时需要用户输入用户名和密码来认证。LoginContext允许应用程序指定回调函数和用户进行交互。
Sun提供了UnixLoginModule, NTLoginModule,JNDILoginModule, KeyStoreLoginModule 以及Krb5LoginModule 这几种登录模块的实现。com.sun.security.auth.module.Krb5LoginModule类是Sun对kerberosv5登录模块的实现。一旦认证成功,TGT会存储到subject的私有credential集合中,principal会存储到subject的principal集合中。