JAAS Authorization文档
本指南擴展了在JAAS Authentication文檔中的程序和policy文件,展示了JAAS Authorization組件,這個組件確保被認證的調用者對后續的安全敏感的操作有訪問控制的權利(權限)。因為授權組件首先需要用戶認證操作完成,請先閱讀JAAS Authentication的doc。
本教程剩下的部分包含目錄列出的內容:
如果你想先看下教程代碼的運行,你可以直接跳到運行代碼的部分,然后再回來看其他的部分了解更多。
?
什么是JAAS Authorization?
JAAS授權擴展了已經存在的JAVA安全機構,已存在的安全架構用一個策略文件來指定執行的代碼被授予什么訪問權限。在Java 2平臺中介紹的這個架構是以代碼為中心的。也就是說,權限基于代碼的特性被授予:代碼從哪里來,是否有數字簽名,如果有,是誰簽的。我們在JAAS Authentication教程的jassacn.policy文件中看到的例子。這個文件包含下面的內容:
[html] view plain copy授權JaasAcn.jar中的代碼指定的權限(沒有指定簽名者,所有代碼簽不簽名不重要)。
JAAS授權增加新的用戶中心的訪問權限到已存在的代碼中心的訪問權限。權限的授予標準不僅基于什么代碼在運行而且考慮到誰在運行它。
當一個應用用JAAS認證來認證一個用戶(或者其他的實體,比如一個服務),一個Subject被創建作為結果。Subject的作用是代替被認證的用戶。一個Subject由很多Principal組成,每一個Principal代表那個用戶的一個身份。例如。一個Subject可以有一個名字身份(“Susan Smith“)和一個社會安全號碼(”987-65-4321“),因此,可以區分于其他的Subject。
權限可以被策略文件來授予給特定的Principal。在用戶被認證后,應用可以將一個Subject和當前的訪問控制環境聯系。對于后續的安全檢查操作,(例如,一個本地的文件訪問),java運行時環境將自動判定策略是否授權給一個特定的Principal需要的權限,如果授權了,操作將被允許,只有在與Subject連接的訪問控制上下文中包含指定的Principal。
JAAS授權如何工作?
一個授權操作,需要下面的步驟:
1.??????用戶必須被認證,就像在JAAS Authentication tutorial里描述的
2.??????安全策略必須配置基于Principal的條目
3.??????認證的結果,Subject必須與當前的訪問控制環境連接。
基于Principal的策略文件怎么寫?
策略文件的grant語句可以選擇性的包含一個或者多個Principal字段。Principal字段聲明用戶或者被特定Principal代表的其他實體,執行特定的代碼,有指定的權限。
因此,grant語句基本的格式是:
[html] view plain copy每一個簽名。CodeBase和Principal字段所在的位置是可選的,字段間的順序也不重要:
一個Principal字段可以像下面這樣:
也就是說,單詞Principal(位置不重要),緊跟著一個Principal類和一個Principal的名字。
一個Principal類是一個實現了java.security.Principal接口的類。所有的Principal對象有一個相關聯的名字,這個名字可以調用它的getName方法得到。名字所用的格式依賴于每一個Principal的實現。
本教程中使用的Kerberos的認證機制創建的Subject中的Principal的類型是javax.security.auth.kerberos.KerberosPrincipal,也就是應該被用作grant語句的Principal_class的部分。KerberosPrincipals?的用戶名是” name@realm “格式。所以,如果用戶名是mjones,Realm是KRBNT-OPS.ABC.COM,那么grant語句中使用的principal_name就是mjones@KRBNT-OPS.ABC.COM。
在一個grant語句中可能包含多個Principal字段。如果多個Principal字段被指定,grant語句中的權限僅在Subject包含所有這些Principal時被授予。
為了給不同的Principal授予同樣的權限,創建多個只包含一個Principal字段的grant語句。
本教程的策略文件包含一個只有一個Principal字段的grant語句:
[html] view plain copy***各種***Permission
將Kerberos的用戶名和Realm替換成你自己的。
上邊的配置指出,顯式授予指定的Principal執行SampleAction.jar中的代碼的權限。
如果將一個Subject和訪問控制上下文關聯?
為了創建和用訪問控制上下文關聯一個Subject,你需要下面的過程:
1.??????用戶必須先被認證,就是JAAS Authentication joc中描述的。
2.??????Subject類的靜態的doAs方法必須被調用,傳給其一個認證了的Subject和一個java.security.PrivilegedAction或者java.security.PrivilegedExceptionAction。((See?API for PrivilegedBlocks?fora comparison of PrivilegedAction and PrivilegedExceptionAction.))。doAs方法用當前的訪問控制上下文關聯給定的Subject,然后調用Action的run方法。Run方法的實現包含作為指定的Subject,所有被執行的代碼。這樣Action以特定的Subject執行。
Subject類的靜態的doAsPrivileged?方法可以代替doAs方法被調用。除了傳給doAs方法的參數外,doAsPrivileged?需要第三個參數:一個AccessControlContext對象。不想doAs方法,用當前的訪問控制上下文聯系Subject,方法doAsPrivileged?用給定的訪問控制上下文聯系Subject。See?doAs vs. doAsPrivileged?in theJAAS Reference Guide for a comparison of those methods。
授權教程代碼
本教程的代碼包含兩個文件:
1.??????JaasAzn.java除了Subject.doAsPrivileged調用中額外的代碼,與JAASAuthentication教程中的JaasAcn.java文件一樣。
2.??????SampleAction.java包含SampleAction類。這個類實現了PrivilegedAction,有一個run方法,這個方法包含了所有我們想基于Principal認證檢查執行的代碼。
JaasAzn.java
JaasAzn.java與之前的教程中用的到JaasAcn.java完全一樣,除了在mian方法的在認證完成后語句之后增加了3條語句。這些語句使一個帶表一個通過認證的用戶的Subject與當前訪問控制上下文關聯,然后執行SampleAction的run方法中的一些代碼。用訪問控制表關聯Subject使SampleAction的run方法中安全敏感的操作(任何run方法中直接或間接調用的代碼)在代表一個認證的用戶的Principal被在當前的策略中被授予必要的權限時被執行。
跟JaasAcn.java一樣,JaasAzn.java初始化一個LoginContext lc和調用它的login方法來執行認證。如果成功,被認證的Subject(包含一個代表這個用戶的Principal)通過LoginContext的getSubject方法獲得。
[html] view plain copy然后,Main方法調用Subject.doAsPrivileged,將通過認證的Subjectmysubject傳給它,一個PrivilegedAction(SampleAction)和一個null AccessControlContext,就像下邊的描述:
SampleAction?通過下面的方式被初始化:
[html] view plain copySubject.doAsPrivileged?通過下面的方式被執行:
[html] view plain copydoAsPrivileged?方法調用PrivilegedAction?action?(SampleAction)? 的run方法開始執行剩下的代碼,這些代碼被認為是代表mySubject執行。
傳給doAsPrivileged?方法一個null作為第三個參數AccessControlContext?表明mySubject應用與一個新的空的AccessControlContext關聯。這個結果是以mySubject運行時,發生在SampleAction執行期間的安全檢查將只需要SampleAction自己的代碼(或者其他它調用的代碼)權限。注意,doAsPrivileged?的調用者在執行期間不需要任何的權限。
SampleAction.java
SampleAction.java包含SampleAction類。這個類實現了java.security.PrivilegedAction,有一個包含所有mySubject想執行的所有代碼。對于本教程,我們將做3個步驟,每一個步驟都只有在代碼被授予必要的權限的情況下才能做。我們將:
1.??????讀和打印java.home系統屬性值
2.??????讀和打印user.name的系統屬性值
3.??????判斷foo.txt文件在當前目錄是否存在
這是代碼:
[html] view plain copy登錄配置文件
本教程使用的登錄配置文件與在JAAS Authentication教程中使用的完全一樣。因此,我們可以用jaas.conf文件,文件僅包含一個條目:
[html] view plain copy這個條目被命名為“JaasSample”,也就是我們的教程的應用程序JaasAcn和JaasAzn應用的名字。這個條目指定了用來做認證的LoginModule?是com.sun.security.auth.module包中的Krb5LoginModule?,為了使認證被認為是成功的,Krb5LoginModule需?要“succeed”。 Krb5LoginModule只有在用戶提供的用戶名和密碼成功的登錄到Kerberos KDC時才成功。
策略文件
授權教程保羅兩個類,JaasAzn和SampleAction。每個類中的代碼包含一些安全敏感的操作,因此,相關的權限需要在一個策略文件中被執行,以使操作被允許執行。
JaasAzn需要的權限
JaasAzn類的main方法做了兩個操作需要權限的操作:
1.??????創建了一個LoginContext
2.??????調用Subject類的doAsPrivileged?靜態方法
LoginContext的創建與認證教程中的方式一樣,因此,它需要與createLoginContext.JaasSample相同的權限javax.security.auth.AuthPermission。
為了調用Subject類的doAsPrivileged?方法,你需要對doAsPrivileged有一個javax.security.auth.AuthPermission對象。
假設JaasAzn類被放到jaasAzn.jar文件中,這些權限需要通過策略文件中配置grant語句來授權:
[html] view plain copySampleAction需要的權限
SampleAction代碼做了3個需要權限的操作:
1.??????讀取java.home系統屬性
2.??????讀取user.home系統屬性
3.??????檢查當前文件中是否有foo.txt的文件
這些操作需要的權限如下:
[html] view plain copy我們需要給中的SampleAction.class代碼授予權限,我們將吧SampleAction.class放到SampleAction.jar文件中。然而,對于這個特定的grant語句,我們希望不僅授權給代碼,而且授權給執行代碼的特定的用戶,來指定如何限制一個特定用戶的訪問權限。
因此,就像在中?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。
策略文件的全部內容
[html] view plain copy 運行授權教程的代碼
為了執行我們的JAAS授權教程代碼,所有你需要做的是:
1.??????將下面的文件到一個文件夾
·????????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認證機制將登錄到Kerberos。如果你的登錄成功,你講看到Authenticationsucceeded!信息,如果不是,你將看到AuthenticationFailed。
一旦認證成功,程序剩下的部分(SampleAction)將代表你這個用戶執行,需要你已經被授權合適的權限。Jassazn.policy策略文件將授權給你必要的權限,所以你將看到java.home?and?user.home和你的當前文件夾是否有一個名叫foo.txt的文件的值被顯示。
總結
以上是生活随笔為你收集整理的JAAS Authorization文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我所理解的闭包
- 下一篇: 纠错——【Singleton array