JAAS Authorization文档
本指南擴(kuò)展了在JAAS Authentication文檔中的程序和policy文件,展示了JAAS Authorization組件,這個(gè)組件確保被認(rèn)證的調(diào)用者對后續(xù)的安全敏感的操作有訪問控制的權(quán)利(權(quán)限)。因?yàn)槭跈?quán)組件首先需要用戶認(rèn)證操作完成,請先閱讀JAAS Authentication的doc。
本教程剩下的部分包含目錄列出的內(nèi)容:
如果你想先看下教程代碼的運(yùn)行,你可以直接跳到運(yùn)行代碼的部分,然后再回來看其他的部分了解更多。
?
什么是JAAS Authorization?
JAAS授權(quán)擴(kuò)展了已經(jīng)存在的JAVA安全機(jī)構(gòu),已存在的安全架構(gòu)用一個(gè)策略文件來指定執(zhí)行的代碼被授予什么訪問權(quán)限。在Java 2平臺(tái)中介紹的這個(gè)架構(gòu)是以代碼為中心的。也就是說,權(quán)限基于代碼的特性被授予:代碼從哪里來,是否有數(shù)字簽名,如果有,是誰簽的。我們在JAAS Authentication教程的jassacn.policy文件中看到的例子。這個(gè)文件包含下面的內(nèi)容:
[html] view plain copy授權(quán)JaasAcn.jar中的代碼指定的權(quán)限(沒有指定簽名者,所有代碼簽不簽名不重要)。
JAAS授權(quán)增加新的用戶中心的訪問權(quán)限到已存在的代碼中心的訪問權(quán)限。權(quán)限的授予標(biāo)準(zhǔn)不僅基于什么代碼在運(yùn)行而且考慮到誰在運(yùn)行它。
當(dāng)一個(gè)應(yīng)用用JAAS認(rèn)證來認(rèn)證一個(gè)用戶(或者其他的實(shí)體,比如一個(gè)服務(wù)),一個(gè)Subject被創(chuàng)建作為結(jié)果。Subject的作用是代替被認(rèn)證的用戶。一個(gè)Subject由很多Principal組成,每一個(gè)Principal代表那個(gè)用戶的一個(gè)身份。例如。一個(gè)Subject可以有一個(gè)名字身份(“Susan Smith“)和一個(gè)社會(huì)安全號(hào)碼(”987-65-4321“),因此,可以區(qū)分于其他的Subject。
權(quán)限可以被策略文件來授予給特定的Principal。在用戶被認(rèn)證后,應(yīng)用可以將一個(gè)Subject和當(dāng)前的訪問控制環(huán)境聯(lián)系。對于后續(xù)的安全檢查操作,(例如,一個(gè)本地的文件訪問),java運(yùn)行時(shí)環(huán)境將自動(dòng)判定策略是否授權(quán)給一個(gè)特定的Principal需要的權(quán)限,如果授權(quán)了,操作將被允許,只有在與Subject連接的訪問控制上下文中包含指定的Principal。
JAAS授權(quán)如何工作?
一個(gè)授權(quán)操作,需要下面的步驟:
1.??????用戶必須被認(rèn)證,就像在JAAS Authentication tutorial里描述的
2.??????安全策略必須配置基于Principal的條目
3.??????認(rèn)證的結(jié)果,Subject必須與當(dāng)前的訪問控制環(huán)境連接。
基于Principal的策略文件怎么寫?
策略文件的grant語句可以選擇性的包含一個(gè)或者多個(gè)Principal字段。Principal字段聲明用戶或者被特定Principal代表的其他實(shí)體,執(zhí)行特定的代碼,有指定的權(quán)限。
因此,grant語句基本的格式是:
[html] view plain copy每一個(gè)簽名。CodeBase和Principal字段所在的位置是可選的,字段間的順序也不重要:
一個(gè)Principal字段可以像下面這樣:
也就是說,單詞Principal(位置不重要),緊跟著一個(gè)Principal類和一個(gè)Principal的名字。
一個(gè)Principal類是一個(gè)實(shí)現(xiàn)了java.security.Principal接口的類。所有的Principal對象有一個(gè)相關(guān)聯(lián)的名字,這個(gè)名字可以調(diào)用它的getName方法得到。名字所用的格式依賴于每一個(gè)Principal的實(shí)現(xiàn)。
本教程中使用的Kerberos的認(rèn)證機(jī)制創(chuàng)建的Subject中的Principal的類型是javax.security.auth.kerberos.KerberosPrincipal,也就是應(yīng)該被用作grant語句的Principal_class的部分。KerberosPrincipals?的用戶名是” name@realm “格式。所以,如果用戶名是mjones,Realm是KRBNT-OPS.ABC.COM,那么grant語句中使用的principal_name就是mjones@KRBNT-OPS.ABC.COM。
在一個(gè)grant語句中可能包含多個(gè)Principal字段。如果多個(gè)Principal字段被指定,grant語句中的權(quán)限僅在Subject包含所有這些Principal時(shí)被授予。
為了給不同的Principal授予同樣的權(quán)限,創(chuàng)建多個(gè)只包含一個(gè)Principal字段的grant語句。
本教程的策略文件包含一個(gè)只有一個(gè)Principal字段的grant語句:
[html] view plain copy***各種***Permission
將Kerberos的用戶名和Realm替換成你自己的。
上邊的配置指出,顯式授予指定的Principal執(zhí)行SampleAction.jar中的代碼的權(quán)限。
如果將一個(gè)Subject和訪問控制上下文關(guān)聯(lián)?
為了創(chuàng)建和用訪問控制上下文關(guān)聯(lián)一個(gè)Subject,你需要下面的過程:
1.??????用戶必須先被認(rèn)證,就是JAAS Authentication joc中描述的。
2.??????Subject類的靜態(tài)的doAs方法必須被調(diào)用,傳給其一個(gè)認(rèn)證了的Subject和一個(gè)java.security.PrivilegedAction或者java.security.PrivilegedExceptionAction。((See?API for PrivilegedBlocks?fora comparison of PrivilegedAction and PrivilegedExceptionAction.))。doAs方法用當(dāng)前的訪問控制上下文關(guān)聯(lián)給定的Subject,然后調(diào)用Action的run方法。Run方法的實(shí)現(xiàn)包含作為指定的Subject,所有被執(zhí)行的代碼。這樣Action以特定的Subject執(zhí)行。
Subject類的靜態(tài)的doAsPrivileged?方法可以代替doAs方法被調(diào)用。除了傳給doAs方法的參數(shù)外,doAsPrivileged?需要第三個(gè)參數(shù):一個(gè)AccessControlContext對象。不想doAs方法,用當(dāng)前的訪問控制上下文聯(lián)系Subject,方法doAsPrivileged?用給定的訪問控制上下文聯(lián)系Subject。See?doAs vs. doAsPrivileged?in theJAAS Reference Guide for a comparison of those methods。
授權(quán)教程代碼
本教程的代碼包含兩個(gè)文件:
1.??????JaasAzn.java除了Subject.doAsPrivileged調(diào)用中額外的代碼,與JAASAuthentication教程中的JaasAcn.java文件一樣。
2.??????SampleAction.java包含SampleAction類。這個(gè)類實(shí)現(xiàn)了PrivilegedAction,有一個(gè)run方法,這個(gè)方法包含了所有我們想基于Principal認(rèn)證檢查執(zhí)行的代碼。
JaasAzn.java
JaasAzn.java與之前的教程中用的到JaasAcn.java完全一樣,除了在mian方法的在認(rèn)證完成后語句之后增加了3條語句。這些語句使一個(gè)帶表一個(gè)通過認(rèn)證的用戶的Subject與當(dāng)前訪問控制上下文關(guān)聯(lián),然后執(zhí)行SampleAction的run方法中的一些代碼。用訪問控制表關(guān)聯(lián)Subject使SampleAction的run方法中安全敏感的操作(任何run方法中直接或間接調(diào)用的代碼)在代表一個(gè)認(rèn)證的用戶的Principal被在當(dāng)前的策略中被授予必要的權(quán)限時(shí)被執(zhí)行。
跟JaasAcn.java一樣,JaasAzn.java初始化一個(gè)LoginContext lc和調(diào)用它的login方法來執(zhí)行認(rèn)證。如果成功,被認(rèn)證的Subject(包含一個(gè)代表這個(gè)用戶的Principal)通過LoginContext的getSubject方法獲得。
[html] view plain copy然后,Main方法調(diào)用Subject.doAsPrivileged,將通過認(rèn)證的Subjectmysubject傳給它,一個(gè)PrivilegedAction(SampleAction)和一個(gè)null AccessControlContext,就像下邊的描述:
SampleAction?通過下面的方式被初始化:
[html] view plain copySubject.doAsPrivileged?通過下面的方式被執(zhí)行:
[html] view plain copydoAsPrivileged?方法調(diào)用PrivilegedAction?action?(SampleAction)? 的run方法開始執(zhí)行剩下的代碼,這些代碼被認(rèn)為是代表mySubject執(zhí)行。
傳給doAsPrivileged?方法一個(gè)null作為第三個(gè)參數(shù)AccessControlContext?表明mySubject應(yīng)用與一個(gè)新的空的AccessControlContext關(guān)聯(lián)。這個(gè)結(jié)果是以mySubject運(yùn)行時(shí),發(fā)生在SampleAction執(zhí)行期間的安全檢查將只需要SampleAction自己的代碼(或者其他它調(diào)用的代碼)權(quán)限。注意,doAsPrivileged?的調(diào)用者在執(zhí)行期間不需要任何的權(quán)限。
SampleAction.java
SampleAction.java包含SampleAction類。這個(gè)類實(shí)現(xiàn)了java.security.PrivilegedAction,有一個(gè)包含所有mySubject想執(zhí)行的所有代碼。對于本教程,我們將做3個(gè)步驟,每一個(gè)步驟都只有在代碼被授予必要的權(quán)限的情況下才能做。我們將:
1.??????讀和打印java.home系統(tǒng)屬性值
2.??????讀和打印user.name的系統(tǒng)屬性值
3.??????判斷foo.txt文件在當(dāng)前目錄是否存在
這是代碼:
[html] view plain copy登錄配置文件
本教程使用的登錄配置文件與在JAAS Authentication教程中使用的完全一樣。因此,我們可以用jaas.conf文件,文件僅包含一個(gè)條目:
[html] view plain copy這個(gè)條目被命名為“JaasSample”,也就是我們的教程的應(yīng)用程序JaasAcn和JaasAzn應(yīng)用的名字。這個(gè)條目指定了用來做認(rèn)證的LoginModule?是com.sun.security.auth.module包中的Krb5LoginModule?,為了使認(rèn)證被認(rèn)為是成功的,Krb5LoginModule需?要“succeed”。 Krb5LoginModule只有在用戶提供的用戶名和密碼成功的登錄到Kerberos KDC時(shí)才成功。
策略文件
授權(quán)教程保羅兩個(gè)類,JaasAzn和SampleAction。每個(gè)類中的代碼包含一些安全敏感的操作,因此,相關(guān)的權(quán)限需要在一個(gè)策略文件中被執(zhí)行,以使操作被允許執(zhí)行。
JaasAzn需要的權(quán)限
JaasAzn類的main方法做了兩個(gè)操作需要權(quán)限的操作:
1.??????創(chuàng)建了一個(gè)LoginContext
2.??????調(diào)用Subject類的doAsPrivileged?靜態(tài)方法
LoginContext的創(chuàng)建與認(rèn)證教程中的方式一樣,因此,它需要與createLoginContext.JaasSample相同的權(quán)限javax.security.auth.AuthPermission。
為了調(diào)用Subject類的doAsPrivileged?方法,你需要對doAsPrivileged有一個(gè)javax.security.auth.AuthPermission對象。
假設(shè)JaasAzn類被放到j(luò)aasAzn.jar文件中,這些權(quán)限需要通過策略文件中配置grant語句來授權(quán):
[html] view plain copySampleAction需要的權(quán)限
SampleAction代碼做了3個(gè)需要權(quán)限的操作:
1.??????讀取java.home系統(tǒng)屬性
2.??????讀取user.home系統(tǒng)屬性
3.??????檢查當(dāng)前文件中是否有foo.txt的文件
這些操作需要的權(quán)限如下:
[html] view plain copy我們需要給中的SampleAction.class代碼授予權(quán)限,我們將吧SampleAction.class放到SampleAction.jar文件中。然而,對于這個(gè)特定的grant語句,我們希望不僅授權(quán)給代碼,而且授權(quán)給執(zhí)行代碼的特定的用戶,來指定如何限制一個(gè)特定用戶的訪問權(quán)限。
因此,就像在中?How Do You Make Principal-BasedPolicy File Statements?,描述的,我們的grant語句看起來像下面這樣:
[html] view plain copy用你的Kerberos用戶名和Realm代替。例如,如果你的用戶名是“mjones”,Realm是“KRBNT-OPERATIONS.ABC.COM”。你將用mjones@KRBNT-OPERATIONS.ABC.COM。
策略文件的全部內(nèi)容
[html] view plain copy 運(yùn)行授權(quán)教程的代碼
為了執(zhí)行我們的JAAS授權(quán)教程代碼,所有你需要做的是:
1.??????將下面的文件到一個(gè)文件夾
·????????The?JaasAzn.java?sourcefile.
·????????The?SampleAction.java?sourcefile.
·????????The?jaas.conf?loginconfiguration file.
·????????The?jaasazn.policy?policyfile.
2.????Replace "your_user_name@your_realm"in?jaasazn.policy?with youruser name and realm.
3.????Compile?SampleAction.java?and?JaasAzn.java:
javac SampleAction.java JaasAzn.java
4.????Create a JAR file named?JaasAzn.jar?containing?JaasAzn.class:
[html] view plain copy5.????Create a JAR file named?SampleAction.jar?containing?SampleAction.class:
[html] view plain copy6.????Execute the?JaasAzn?application,specifying
1.????by anappropriate?-classpath?clause that classes should be searched for intheJaasAzn.jar?and?SampleAction.jar?JAR files,
2.????by?-Djava.security.manager?thata security manager should be installed,
3.????by?-Djava.security.krb5.realm=<your_realm>?thatyour Kerberos realm is the one specified.
4.????by?-Djava.security.krb5.kdc=<your_kdc>?thatyour Kerberos KDC is the one specified.
5.????by?-Djava.security.policy=jaasazn.policy?thatthe policy file to be used isjaasazn.policy, and
6.????by?-Djava.security.auth.login.config=jaas.conf?thatthe login configuration file to be used is?jaas.conf.
下面是Windows下全部的命令:
[html] view plain copy這是UNIX下全部的命令
[html] view plain copy將這些命令放到一行里。
你將被提示輸入Kerberos的用戶名和密碼,指定在登錄配置文件中的底層的Kerberos認(rèn)證機(jī)制將登錄到Kerberos。如果你的登錄成功,你講看到Authenticationsucceeded!信息,如果不是,你將看到AuthenticationFailed。
一旦認(rèn)證成功,程序剩下的部分(SampleAction)將代表你這個(gè)用戶執(zhí)行,需要你已經(jīng)被授權(quán)合適的權(quán)限。Jassazn.policy策略文件將授權(quán)給你必要的權(quán)限,所以你將看到java.home?and?user.home和你的當(dāng)前文件夾是否有一個(gè)名叫foo.txt的文件的值被顯示。
總結(jié)
以上是生活随笔為你收集整理的JAAS Authorization文档的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我所理解的闭包
- 下一篇: 纠错——【Singleton array