Java EE 6:アプリケーションセキュリティの強化

5174 ワード

JEE 6は、WebコンテナのセキュリティとJavaアプリケーション開発における認証とライセンスの面で、いくつかの新しいセキュリティ特性を導入しています.これらの特性は,Web層にプログラミングと宣言のセキュリティ強化を導入した.
サーブレット3.0仕様(JSR 315)に基づいて、Java EE 6 Webアプリケーションは、新しいプログラミングおよび宣言式のセキュリティ特性、およびこれまでEJB 3.xで導入されてきたセキュリティ注釈を利用することができる.Webアプリケーションはまた、サーブレットコンテナの一部として機能するJSR 196ベースのプラグイン式の認証/認可モジュールを使用することもできる.
Webモジュールセキュリティ
Webモジュールセキュリティの実装には、プログラミング(HttpサーブレットRequestに新しく追加されたセキュリティメソッドを使用する)と宣言(新しいセキュリティ注釈を使用する)が含まれます.
プログラミングセキュリティ
HTTPサーブレットRequestに新しく追加されたメソッドを使用して、コンテナコンテキストにプログラミングでアクセスできます.サーブレット3.0仕様は、HttpサーブレットRequestインタフェースにおいて、Webアプリケーションにおいてユーザのアイデンティティを認証する方法を定義する.
  • authenticate:このメソッドは、サーブレットContextで構成されたコンテナログインメカニズムを使用してユーザー要求を認証します.この方法では、HttpServeretResponseを変更してコミットできます.基本タイプのアイデンティティ認証を適用すると、ログインダイアログボックスが表示され、ユーザー名とパスワードが収集され、認証されます.
  • login:loginメソッドは、Webコンテナで使用されるセキュリティドメイン(realm)でユーザー名とパスワードを検証します.アプリケーションは、この方法を使用してユーザー名とパスワード情報を取得できます.これにより、アプリケーションのデプロイメント記述子にフォームベースの認証方法を指定するほか、プログラミング方式で制御することもできます.
  • logout:Webアプリケーションは、このメソッドを使用してリクエスト者のアイデンティティ情報をリセットできます.同じリクエストでgetUserPrincipal、getRemoteUser、getAuthTypeなどのメソッドが呼び出された場合、これらのメソッドの戻り値をnullに設定します.

  • HttpServiceletRequestインタフェースの次の方法では、コンポーネント呼び出し元のセキュリティ情報にもアクセスできます.
  • getRemoteUser:この方法では、クライアントが認証したユーザー名を取得できます.このメソッドは、コンテナによってリクエストに関連付けられたリモート・ユーザーの名前を返します.ユーザーがアイデンティティ認証に合格していない場合はnullを返します.
  • isUserInRole:このメソッドは、リモート・ユーザーが特定のセキュリティ・ロールを持っているかどうかを判定します.ユーザーがアイデンティティ認証に合格していない場合はfalseを返します.このメソッドは、ユーザーロール名の文字列パラメータを受け入れます.デプロイ記述子にsecurity-role-ref要素を宣言する必要があります.サブ要素role-nameには、メソッドに渡されるロール名が含まれています.
  • getUserPrincipal:getUserPrinicipalメソッドは、現在のユーザーのprincipal名を判断し、java.security.Principalオブジェクトを返します.ユーザーがアイデンティティ認証に合格していない場合はnullを返します.getUserPrincipalが返すPrincipalオブジェクトを呼び出すgetNameメソッドは、リモートユーザー名を返します.

  • 宣言型セキュリティ
    新しい注釈は、Webモジュールのセキュリティを強化するためにも使用できます.Java EE 6が提供する注釈とデプロイ記述子によって、認証、認可、およびトランスポート層暗号化を行うことができます.Java EE 6の新しい注釈は以下のように列挙されている.
  • @サーブレットSecurity:@サーブレットSecurityは、サーブレットの実装クラスで使用できます.サーブレットコンテナがHTTPプロトコルメッセージを検証するセキュリティ制約を指定します.サーブレットコンテナは、一致するサーブレットに対応するurl-patternsにこれらの制約を適用します.
  • @HttpMethodConstraint:@HttpMethodConstraint@サーブレットSecurity注記の内部に使用され、特定のHTTPプロトコルメッセージに加えられたセキュリティ制約が記述されています.HTTPメソッドの特定の制約を指定した配列です.
  • @HttpConstraint:この注記は@ServertSecurity注記の内部に使用され、すべてのHTTPメソッド(ServertSecurity注記の内部に対応するHttpMethodConstraint要素が指定されている以外)に対して保護されるセキュリティ制約を記述しています.
  • @DeclareRoles:@DeclareRolesはクラスレベルの注記です.これはCommon Annotations 1.0(JSR 250)仕様の一部で、アプリケーションで使用される役割を定義するsecurity-role要素の効果と似ています.特定のロールを参照する他の場所よりも先に定義する必要があります.
  • @RunAs:@RunAs注記もCommons Annotations 1.0の一部であり、特殊なコンポーネントのrun-asロールを規定するために使用されます.呼び出し者のセキュリティIDを使用するべきか、それとも特定のrun-as IDを使用して企業beanの特定の方法を実行すべきかを規定できます.この注釈もクラスレベルの注釈です.

  • Webアプリケーションがサーブレットで構成されている場合、@サーブレットSecurity注記の内部で@HttpConstraint注記と@HttpMethodConstraint注記(場合によっては)を使用してアプリケーションのセキュリティ制約を規定すればよい.他のWebアプリケーションでは、デプロイメント記述子でsecurity-constraint要素を使用してアプリケーションのセキュリティ制約を規定します.
    セキュリティ役割の宣言
    セキュリティロール(security role)の名前は、デプロイメント記述子のsecurity-role要素を使用して宣言できます.セキュリティロールリファレンス(security role reference)は、isUserInRole(String role)メソッドを呼び出すときにWebコンポーネントが使用するロール名と、アプリケーションに対して定義されたセキュリティロール名とのマッピングを定義します.たとえば、セキュリティ・ロールが「cut」を参照し、ロール名が「bankCustomer」のセキュリティ・ロールとマッピングするには、次のようにします.
    
    <servlet>
    ...
        <security-role-ref>
            <role-name>cust</role-name>
            <role-link>bankCustomer</role-link>
        </security-role-ref>
    
    ...
    </servlet>

    「bankCustomer」セキュリティロールに属するユーザーがこのservletを呼び出すと、メソッドisUserInRole(「cust」)はtrueを返します.security-role-ref要素のrole-link要素は、同じweb.xmlデプロイメント記述子にあるsecurity-role要素で定義されたrole-nameと一致する必要があります.
    
    <security-role>
        <role-name>bankCustomer</role-name>
    
    </security-role>
    

    強制転送セキュリティ
    トランスポート・セキュリティは、サービス・エンドがクライアントに送信したり、クライアントから受信したデータを改ざんしたりする人がいないことを保証します.Java EE仕様により、開発者は、Web.xmlファイルの「ユーザーデータ制約(user data constraint)」要素と「トランスポート保証(transport guarantee)」要素、または@HttpConstraint注釈の「transportGuarantee」属性を使用して、トランスポートのセキュリティを強制できます.ユーザデータ制約(user data constraint)は、制限された要求が保護された伝送層リンクを介して伝送されるべきである必要性を満たす.必要な防護力は、トランスポート保証要素の値によって定義されます.内部クラスTransportGuaranteeで定義した値は次のとおりです.
  • CONFIDENTIAL:この伝送は、コンテンツの機密性の要件を満たすために使用されることを保証します.データが暗号化されていることを確認し、サードパーティによってデータが解読されません.
  • NONE:このレベルの伝送はSSLを使用しないことを保証し、データの通常の伝送を許可する.これは、コンテナが任意の接続(保護されていない接続を含む)を受信したときに、制約された要求を受け入れなければならないことを示します.

  • 「user-data-constraint」要素(トランスポートレイヤ保護が必要なリソースを含むsecurity-constraintラベルの内部に置くべき)を使用することができます.Web.xmlにトランスポート・レイヤのセキュリティを追加します.たとえば、security-constraintの内部に次のコード・クリップを追加すると、ユーザーが管理リソースにアクセスすると、SSLが強制的に使用されます.
    
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
    

    Java EE 6のセキュリティ機能については、サーブレット3.0仕様ドキュメントの「セキュリティ」章(13章)とJava EE 6チュートリアル(24章)を参照してください.DZoneは最近、Java EEの強化されたセキュリティ機能について、リファレンスドキュメント(reference card)を発表しました(ユーザーがウェブサイトからファイルをダウンロードするには、先に登録する必要があることを示しています).
    Java EE 6:Application Security Enhancements<