Welcome to rocktonam

Sunday, January 15, 2006

JASS, bảo mật Web Component

Web application phải được phát triển với sự bảo mật ngay từ khi bắt đầu. Các developer nên lập kế hoạch bảo mật một web application với cả web server và application server. Việc bảo mật một J2EE application có thể trông rất phức tạp, tuy nhiên trong article này, phần đầu tiên sẽ giải thích làm thế nào để bảo mật các web component của J2EE.
1.“Phòng bệnh tốt hơn chữa bệnh”
Câu ngạn ngữ cổ xưa này vẫn đúng thậm chí cho đến ngày hôm nay, đặc biệt trong trường hợp các web application. Deface site chỉ là một cách tấn công website. Nó không phải là điềm báo trước nếu như bảo mật một application cần được quan tâm đầu tiên sau một cuộc tấn công. Các application phải được phát triển với khả năng bảo mật của chúng được định ra ở mức độ cao.

Cho đến một vài năm trước đây, bảo mật có nghĩa là bảo mật web server. Nhưng với sự trông đợi của lập trình server-side, bảo mật không thể là giới hạn tài nguyên bên trong web server, mà hầu hết yêu cầu xử lý và dịch vụ được thực hiện bằng việc thực thi mã bên trong application server. Trong trường hợp của J2EE, bảo mật một web application có thể phức tạp: một J2EE application có thể chứa một hay nhiều hơn các component khác nhau, mỗi component cung cấp dịch vụ cho một layer khác nhau. Thế giải pháp là gì? Giải pháp đến từ hai package khác nhau:
  • Declareative security : nếu một application tuân theo cách này, thì tất cả những xác lập bảo mật nằm trong file web.xml của application. Container đọc những xác lập này và thực thi truy cập điều khiển cho application cụ thể
  • Programmatic security : Dưới mô hình này, trách nhiệm bảo mật web application thuộc về duy nhất lập trình viên. Lô gic ủy quyền và phân chia quyền hạn user được nhúng vào trong application. Nó có thể tồn tại một dịch vụ toàn bộ application hoặc trong mỗi module.


Bảo mật dựa trên Realm có trước, trong khi bảo mật dựa trên Java Authentication and Authorization Services (JASS) đến sau.Câu hỏi rõ ràng kế tiếp đặt ra là cái nào tốt hơn? Câu trả lời , thường lặp lại, đó là ngữ cảnh xác định việc xử dụng. Nếu việc bảo mật mã ít hơn thì declarative security là tốt hơn. Nếu điều khiển từng phần được yêu cầu thì programmatic security là sự lựa chọn tốt nhất.

Quay về ngữ cảnh J2EE component, chúng được chia thành Web Components và Business Components. Các Servlet và JSP là những Web Component trái lại Enterprise Java Beans (EJB) là những Business Component. Phương thức bảo mật các Web Component khác với cách bảo mật các Business Component. Trong tutorial này, tôi sẽ thảo luận về làm thế nào để bảo mật các Web Component bằng việc sử dụng JAAS. Trước khi bắt đầu thảo luận, tốt hơn là làm quen với JAAS, tổng quan về nó và từ vựng của nó.

2.JAAS là gì?
Theo truyền thống, bảo mật cung cấp bởi bảo mật dựa trên mã Java(tôi sẽ sử dụng Java khi đề cập đến J2SE). Trong bảo mật dựa trên mã, chữ ký của mã cung với mã gốc được chứng thực. Các đặc quyền của user chạy mã không bao giờ được kiểm tra. Vì thế điều khiển truy cập không bao giờ có hiệu lực. Để vượt qua giới hạn này, package JAAS được giới thiệu. Trong phiên bản hiện thời, JAAS là một trong những module cốt lõi của Java Development Kit. JAAS có hai component: một authentication component (xác nhận), và một authorization component (phân quyền).
Authentication component cung cấp các dịch vụ để xác nhận định danh user người đang thực thi mã. Authorization component bổ sung những đặc điểm bảo mật mã tồn tại bằng việc hạn chế mã từ việc thực thi các tác nhiệm hệ thống. Điều này được thực hiện bằng cách tăng hiệu lực điều khiển truy cập dựa trên việc xác nhận. Module authorization có thể cung cấp dịch vụ này cho bất kỳ kiểu mã nào mà nó có đang được thực thi từ bên trong một application hay không, applet và servlet hay cho EJB. Một phần bên ngoài, JAAS thực hiện việc xác nhận và phân quyền của nó trong một kiểu pluggable. Những đặc điểm này của JAAS làm cho nó tốt hơn trong việc bảo mật các ứng dụng J2EE.

3.Tại sao sử dụng JAAS?
Trong J2EE, câu trả lời nằm ở những cơ sở dưới đây:

  • Như đã được mô tả, JAAS bao gồm những đặc điểm bảo mật đựơc cung cấp bởi Java
  • Nó thích hợp với bảo mật J2EE. Việc tích hợp của JAAS với J2EE cũng rất dễ dàng
  • Việc xác nhận thực hiện bởi JAAS theo phương cách thiết kế Pluggable Authentication Module. Cách làm này Java có được từ kỹ thuật xác nhận mà sự thay đổi trong kỹ thuật này có thể đạt được mà không phải viết lại mã
  • 4.Subject, principals và credentials
    Ba điều này là những thuật ngữ thường xuyên nhất của JAAS. Chúng cũng là những class cốt lõi của package này. Trong phần này, tôi sẽ thảo luận về những thuật ngữ này và cách sử dụng chúng trong trong tiến trình cung cấp bảo mật.

    Subject

    Nói một cách ngắn gọn, một subject liên quan đến một cá thể, ví dụ một user hoặc một hệ thống khác. Những user của hệ thống phụ thuộc trên những tài nguyên khác nhau được cung cấp bởi hệ thống để thực thi những tác nhiệm tính toán khác nhau. Các tài nguyên này hầu hết luôn luôn nằm trong một dạng của các Service. Trong những trường hợp nào đó, bản thân một hệ thống phải phụ thuộc vào những service chạy trên những hệ thống khác. Vì thế, trong cả hai trường hợp, dù đó là một cá thể sử dụng các service hệ thống hoặc hệ thống khác thì JAAS phải chứng thực nó. Vì thế trong thuật ngữ của JAAS, cả hai trở thành những subject.

    Principal
    Một service luôn luôn được kết hợp với tên của subject đang sử dụng service đó. Và mỗi subject có thể sử dụng nhiều service khác nhau dưới những tên khác nhau. Vì thế, principal, về thực chất là tên được kết hợp với một subject. Nói một cách khác, tên kết hợp một subject và một service chính là principal. Giống như subject, principal là một trong những class cốt lõi.


    Credential
    Một service, tại nhiều thời điểm, sẽ đính kèm những thuộc tính bảo mật (cũng đồng thời là dữ liệu) cho một subject khác với principal. Hầu hết các thời điểm những thuộc tính này thường không có gì, nhưng thông tin được hỗ trợ bởi subject cho authentication (việc chứng thực). Những thuộc tính như thế là những credential được giới hạn. Credential có thể là bất kỳ kiểu đối tượng nào. Chúng có thể bao gồm password (mật khẩu), Kerberos ticket, và các public key certificate (khóa xác nhận). Các đặc điềm pluggable (cắm & xài) này của JAAS đảm bảo rằng việc bổ sung credential của bên thứ ba có thể được tập hợp vào bên trong JAAS mà không phải tốn nhiều công sức.


    Câu hỏi kế tiếp này sinh hiển nhiên là, chúng quan hệ thế nào trong code? Hãy cùng nhìn một chút.
    Như tôi đã thảo luận, mỗi subject có thể có nhiều tên. Một subject sẽ có một tập các principal

    public interface Principal {
    public String getName();
    }
    public final class Subject {
    public Set getPrincipals() {
    }
    }


    Tương tự như thế:
    public final class Subject {
    ...
    public Set getPublicCredentials() { }// không kiểm tra bảo mật
    public Set getPrivateCredentials() { } // kiểm tra bảo mật
    }



    Trong nhiều thuật ngữ cần giải thích hơn, class Subject có một method trả về những principal được kết hợp với subject, kiểu trả về là một collection – Set. Class subject có những method tốt hơn cho các Credential. Có hai kiểu credential trong ví dụ trên: các public credential và private credential. Các public credential chứa các Public key, các Kerberos ticket của instance Subject vân vân... trong khi các private credential chứa các Private Key, các password vân vân... Vì thế, subject chứa những method để lấy những credential và principal được kết hợp với nó.

    5.Bổ sung module bảo mật JAAS
    Đã lý luận quá nhiều, bây giờ là thời gian để xem xét những bước đòi hỏi việc bổ sung JAAS như một module. Việc bổ sung mà tôi thảo luận dưới đây đã được phát triển để cung cấp bảo mật cho một ứng dụng Java Mail mà hiện thời tôi đang cố gắng sử dụng cho cá nhân tôi. Để viết những bổ sung tùy biến, sử dụng những bước sau:

    * Bổ sung LoginModule

    * Viết CallBackHandler

    * Cung cấp các bổ sung tùy biến cho Principal và Action (đây là lựa chọn)

    * Cấu hình file JAAS policy

    * Cấu hình J2EE Application Server

    Trước khi đi vào chi tiết của bổ sung, package mà bạn cần phải import là javax.security

    Bổ sung LoginModule
    LoginModule là một trong những module cốt lõi của JAAS. Nó đóng gói tính logic của việc chứng thực dành cho JAAS framework. Để bổ sung LoginModule, một trong bốn method sau phải được override.

    * login()

    Method này thực thi các tác nhiệm trong việc thu thập thông tin đăng nhập và việc chứng thực user. Nói một cách ngắn gọn, tính logic để chứng thực một user là ở đây. Việc thu thập thông tin đăng nhập được thực hiện như dưới đây

    Callback[] callbacks=new Callbacks[2];
    Callbacks[0] = new NameCallback(“userModule username:”);
    Callbacks[0] = new NameCallback(“userModule password:”,false);
    callbackHandler.handle(calls);

    Hiển nhiên là trong đoạn mã ở trên, thông tin đăng nhập được thu thập sử dụng CallBackHandler. Một khi thông tin đăng nhập được tập hợp với nhau, method login sẽ cố gắng để kết nối với server. Nếu kết nối được, method sẽ trả về true. Đoạn mã nhỏ dưới đây chỉ ra thủ tục đó:

    boolean succeeded=false;
    try {
    user=((NameCallback)callbacks[0]).getName();
    passwd=((NameCallback)callbacks[0]).getPassword();
    props.put(Context.SECURITY_PRINCIPAL,user);
    props.put(Context.SECURITY_CREDENTIALS,passwd);
    ctx = new InitialDirContext(props);
    succeeded =true;
    }…
    return succeeded;

    Trong khối lênh try – catch, nó cố gắng để kết nối với LDAP server với thông tin đã được tập hợp. Nếu kết nối thành công (dĩ nhiên, method InitialDirContext() không ném ra các ngoại lệ), biến chứng thực được set là true. Ở đây, thay vì LDAP server, database server được sử dụng như là server dành cho việc chứng thực.


    * commit()

    Method này set username đã được kiểm tra trong session context. Mã thể hiện subject với các vai trò và các credential (chẳng hạn như các private key) bất kỳ cũng ở đây.

    if(!succeeded) {
    return false;
    } else {
    userPrincipal=new userPrincipal(user);
    if(!subject.getPrincipals().contains(userPrincipal) {
    subject.getPrincipals().add(userPrincipal);
    ...
    }
    commitSucceeded=true;
    return true;
    }

    * abort()

    Method này được gọi khi việc chứng thực LoginContext bị lỗi. Method này cũng được tự động thực thi bởi runtime nếu như một runtime exception xảy ra. Để tạo nên xử lý tùy biến trong trường hợp việc chứng thực bị lỗi này, đoạn mã thực hiện như sau


    if(!succeed) {//this is for authentication failure
    return false;
    } else if(succeeded&&commitSucceeded==false) {//this is for //runtime //error
    user=null;
    passwd=null;
    throw new FailedLoginException(“Exception in Processin”);
    }


    * logout()

    Bất kỳ khi nào user đăng xuất, method này sẽ được gọi. Vì thế, nếu bạn muốn gỡ bỏ một vài credential hay giải phóng tài nguyên nắm giữ bởi user bạn có thể thực hiện ở đây. Đoạn mã mà tôi sử dụng như dưới đây:
    subject.getPrincipals.remove(userPrincipal);
    succeeded = false;
    succeeded = commitSucceeded;
    user = null;
    if(password!=null) {
    password=null;
    }
    userPrincipal=null;
    return true;

    Class bao đoạn mã như sau:
    public class MyLoginModule implements LoginModule {
    }

0 Comments:

Post a Comment

<< Home


 

   Copyright © 2005 rocktonam. Contact me at rocktonam@yahoo.com or rocktonam@gmail.com

   Or now you can send your massages to me [rocktonam] -->

   Ghi rõ nguồn rocktonam.blogspot.com khi phát hành lại thông tin từ trang blog này.