• Thứ Tư, 27/04/2005 14:42 (GMT+7)

    Bảo mật: Chung sống với mã ngoại lai

    Sự phát triển của Internet và các công nghệ dựa trên Internet đem đến nhiều vận hội nhưng cũng ẩn chứa vô vàn những thách thức. Trong môi trường trao đổi thông tin số, các đoạn mã máy tính, gọi tắt là mã, được di cư từ máy này sang máy khác. Điều này thực tế đã mang đến nhiều rủi ro hơn cho các đối tượng tham gia. Nhiều mô hình bảo mật đã được đưa ra để giải quyết vấn đề này.


    Sự phát triển của Internet và các công nghệ dựa trên Internet đem đến nhiều vận hội nhưng cũng ẩn chứa vô vàn những thách thức. Trong môi trường trao đổi thông tin số, các đoạn mã máy tính, gọi tắt là mã (code), được di cư từ máy này sang máy khác. Điều này thực tế đã mang đến nhiều rủi ro hơn cho các đối tượng tham gia. Nhiều mô hình bảo mật đã được đưa ra để giải quyết vấn đề này.

    Mã ngoại lai (Foreign Code) và vấn đề bảo mật

    Foreign code là mã bất kỳ không sinh ra tại máy làm việc nhưng bằng cách này hay cách khác tới được máy và chạy trên đó. Các loại Applets, ActiveX, các file đính kèm với thư điện tử, TclScript, JavaScript, PostScript, các macro Word, Excel là các ví dụ cho foreign code. Hình 1 mô tả mô hình foreign code tổng quát.

    Trong mô hình, code producer là nơi cung cấp và code consumer là môi trường chạy foreign code. Ví dụ, trong kiến trúc web: Web server được xem xét như code producer, web browser được xem như code consumer, và applet là foreign code.

    Bản chất tự nhiên của foreign code là di trú, foreign code thường đến từ phía bên ngoài hệ thống, đi qua nhiều môi trường và thường là từ các môi trường không an toàn chẳng hạn như Internet. Chúng di cư đến máy làm việc và thực thi tương tự như một chương trình thông thường. Mọi chuyện sẽ không có gì đáng nói nếu thế giới của chúng ta toàn người tốt, nhưng thực tế không được như vậy! Vì vậy chúng ta luôn phải đề phòng, nhất là ta thường không biết được xuất xứ, tác giả của foreign code. Trên thực tế, chấp nhận foreign code là chấp nhận rủi ro. Do đó để đảm bảo an toàn bảo mật cho hệ thống máy tính khi chạy foreign code chúng ta phải có các biện pháp an ninh nhất định.

    Các giải pháp bảo mật

    Để bảo vệ một hệ thống máy tính, trước hết chúng ta cần phải kiểm soát việc truy xuất hệ thống. Giải pháp là dùng cách nào đó giới hạn các truy xuất của foreign code tới các dữ liệu và tài nguyên của hệ thống.

    Chúng ta biết rằng mọi tiến trình đều cần có một môi trường nhất định để thực thi. Đương nhiên một chương trình không bao giờ thực thi sẽ chẳng bao giờ làm hư hại đến hệ thống. Chương trình càng bị giới hạn truy xuất tới hệ thống thì hệ thống càng ít nguy cơ rủi ro. Do vậy nguyên tắc chung của chúng ta là kiểm soát nghiêm ngặt việc truy xuất của các chương trình tới hệ thống. Có rất nhiều mô hình bảo mật, chẳng hạn như Bell-LaPadula, Biba, Clack-Wilson...

    Để kiểm soát foreign code, trước hết cần giả thiết rằng môi trường thực thi các luật bảo mật là tin cậy và tất cả các loại foreign code là không tin cậy. Trong thực tế chúng ta kiểm soát foreign code theo cách đầy mâu thuẫn. Một mặt chúng ta muốn thực thi chúng một cách an toàn, vì vậy việc truy xuất của foreign code tới dữ liệu và tài nguyên hệ thống phải bị giới hạn nghiêm ngặt. Mặt khác chúng ta lại muốn chúng có nhiều sức mạnh hơn, do đó sự truy xuất của foreign code cần được nới rộng. Một vành đai bảo mật ảo được áp đặt lên các hệ thống máy tính. Trong đó mã cục bộ sinh ra tại máy làm việc được xem xét là tin cậy và foreign code được xem là không tin cậy. Trường hợp lý tưởng nhất có lẽ là foreign code được xử lý như local code. Đây có lẽ là mục đích của hầu hết các giải pháp cho foreign code. Tuy nhiên tin cậy không có nghĩa là an toàn. Tiếp theo chúng ta sẽ bàn về bốn mô hình bảo mật điển hình để kiểm soát foreign code.

    Các mô hình bảo mật

    1. Kiểm soát truy xuất

    Trước khi nói về các mô hình bảo mật, chúng ta cùng nhìn lại khái niệm về "kiểm soát truy xuất" (access control). Đây là một kỹ thuật cơ bản trong bảo vệ thông tin của hầu hết các hệ thống máy tính. Access control có thể được hình dung như là tình huống trong đó một chủ thể chủ động (subject) truy xuất một đối tượng bị động (object) với một phép truy xuất nào đó. Trong khi một bộ điều khiển tham chiếu (reference monitor) sẽ cho phép hoặc từ chối các yêu cầu truy xuất. Mô hình cơ sở của access control được đưa ra bởi Lampson như hình 2.

    Trong các hệ thống máy tính, chủ thể là người sử dụng hay các tiến trình. Đối tượng là file, bộ nhớ, các thiết bị ngoại vi, các nút mạng,... Các phép truy xuất điển hình là đọc (read), ghi (write), bổ sung (append) và thực thi (execute). Quyền thực hiện một phép truy xuất nhất định trên một đối tượng được gọi là quyền truy xuất (access right). Các luật bảo mật (security policy) được định nghĩa như một bộ điều phối quyền truy xuất cho các chủ thể.

    2. Mô hình Sandboxing

    Thuật ngữ "sandboxing" chỉ sự giam giữ một tiến trình trong miền quản lý của nó nhằm mục đích bảo đảm an toàn cho bộ nhớ. Để hiểu rõ về mô hình này, chúng ta cùng xem xét mô hình sandbox nổi tiếng được phát triển cho Java.

    Java sử dụng thuật ngữ "sandboxing" theo nghĩa rộng hơn để chỉ sự giới hạn truy xuất tới bất kỳ tài nguyên nào của hệ thống chứ không chỉ đơn thuần là bộ nhớ. Mô hình bảo mật của Java dựa trên mô hình truy xuất tùy ý (Discretionary Access Control) với nhiều mức quyền truy xuất tới vùng được bảo vệ.

    Mô hình bảo mật của Java gồm ba thành phần: bộ kiểm duyệt (byte code verifier), tải (class loader) và bộ quản lý bảo mật (security manager). Theo mô hình cơ sở của access control, ba thành phần này làm việc như một bộ điều khiển tham chiếu. Mô hình bảo mật của Java (JDK phiên bản 1.0) giới hạn nghiêm ngặt quyền truy xuất của tất cả các applet trong một sandbox (hình 3). Tuy nhiên việc này sẽ làm hạn chế các khả năng của applet. Do vậy phiên bản JDK 1.1 đã mở rộng hơn bằng cách đưa vào khái niệm mới: signed applet. Đây là một khái niệm mới sử dụng công nghệ chữ ký điện tử chúng ta sẽ xem xét kỹ hơn ở phần sau.

    Trong mô hình JDK 1.1, applet được chia thành hai loại. Signed applet được xử lý như mã cục bộ và unsigned applet được đưa vào xử lý trong sandbox (Hình 4).
    Mô hình bảo mật hiện nay của Java (JDK phiên bản 1.2) phân loại foreign code ngay tại đầu vào thành các lớp khác nhau. Cấp đặc quyền cho mỗi lớp và xử lý từng lớp theo các đặc quyền đã cấp. Chúng ta có thể thấy rõ điều này trong hình 5.

    3. Mô hình Code Signing

    Mô hình này có cách tiếp cận khác với mô hình chúng ta đã xét ở trên. Để bảo đảm sự an toàn cho hệ thống, nơi sử dụng mã (code consumer) phải nhận được sự cam đoan rằng nguồn sản xuất foreign code là đáng tin cậy và bản thân foreign code không bị làm giả. Yêu cầu này có thể được đáp ứng bằng cách sử dụng công nghệ chữ ký điện tử. Kỹ thuật áp dụng cho mô hình này được mô tả như sau:

    Trong trường hợp tổng quát, quá trình mã hoá mã (hay ký mã) được hoàn thiện bởi một giải thuật chữ ký công khai/bí mật chẳng hạn như RSA (hình 6). Bất cứ khi nào tác giả muốn xuất bản mã (foreign code), họ phải sử dụng khoá bí mật riêng để ký mã. Tuy nhiên do bất tiện của việc xử lý với những đoạn mã dài, hơn nữa còn cần bảo đảm tính toàn vẹn của mã, đoạn mã dài cần được chia nhỏ (hash) và mỗi đoạn chia này sau đó sẽ được ký riêng rẽ. Cuối cùng mã và các đoạn chia đã ký được xuất bản.

    Tại phía code consumer, một quá trình so sánh được hoàn tất để đảm bảo các giá trị hash tính toán được tại đó và giá trị hash được gửi từ code producer là giống nhau. Khi đó foreign code sẽ được phép thực thi, bằng không nó sẽ bị loại bỏ. Foreign code thoả mãn quá trình kiểm tra sẽ được xử lý như mã cục bộ nghĩa là không bị giới hạn truy xuất tới hệ thống.

    4. Mô hình Firewalling

    Hiện nay rất nhiều tổ chức đã và đang triển khai tường lửa (firewall) để bảo vệ mạng cục bộ trước những nguy cơ tấn công từ bên ngoài. Tường lửa có thể được triển khai dưới dạng phần mềm hoặc phần cứng. Nó nằm giữa mạng cục bộ hoặc máy trạm và phần còn lại của mạng Internet. Chức năng chính của tường lửa là điều khiển luồng dữ liệu đi vào hệ thống được bảo vệ. Nó sẽ lọc bỏ các chương trình không tin cậy và chỉ cho phép những chương trình tin cậy đi qua (hình 7).

    Cách tiếp cận này được biết đến như một cách kiểm tra sự an toàn của foreign code, các luật bảo mật được công thức hoá như các đặc tính dùng để phân tích. Các đơn vị foreign code phải đi qua một chương trình phân tích để kiểm tra sự an toàn trước khi tới được code consumer. Chương trình phân tích này thường được gọi là bộ kiểm tra sẽ lọc ra các chương trình bị coi là không an toàn. Những đơn vị mã vượt qua được bộ kiểm tra này sẽ đến được máy trạm và được đối xử như mã cục bộ.


    5. Mô hình Proof-Carrying Code

    Để giải quyết vấn đề bảo mật cho foreign code. Các luật bảo mật phải được thống nhất từ trước giữa hai phía code consumer và code producer, theo đó code producer sẽ tạo ra một bằng chứng chứng minh sự an toàn của foreign code.

    Trong tất cả các mô hình đã xem xét, cách tiếp cận mới này có vẻ như ít khả thi nhất vì sự mâu thuẫn xảy ra ngay trong bản thân các yêu cầu kỹ thuật. Một mặt chúng ta muốn mọi thứ thật đơn giản để không làm ảnh hưởng tới hiệu năng làm việc của hệ thống. Mặt khác chúng ta muốn bằng chứng (proof) phải bảo đảm. Sự thật là chẳng thể có bằng chứng gì đảm bảo với một công nghệ đơn giản. Chúng ta cùng xem xét mô hình Proof-Carrying Code hình 8.

    Như mô tả trong hình 8, trước hết một thoả thuận về các luật bảo mật (safe policy) cần phải đạt được giữa code consumer và code producer. Sau đó code producer sẽ điền thêm các chú thích vào mã được biên dịch. Các luật bảo mật sẽ được áp dụng cho các mã được chú thích này để sinh ra một điều kiện kiểm chứng (verification condition) cho tính tương thích của bằng chứng. Tiếp theo, các luật bảo mật được tiếp tục sử dụng để mã hoá điều kiện kiểm chứng. Cuối cùng mã được chú thích và bằng chứng được sản sinh sẽ được gửi tới code consumer.

    Một quá trình xử lý tương tự sẽ được thực hiện tại phía code consumer. Tuy nhiên thay vì sản sinh ra bằng chứng, quá trình sẽ kiểm tra nó. Trong trường hợp bằng chứng là tương thích, mã sẽ được tích hợp vào hệ thống máy trạm. 

    Các công việc liên quan

    Trong các môi trường không được bảo mật, việc lây nhiễm virus (hay chính là các đoạn foreign code có hại) là không thể tránh khỏi, vì vậy chúng ta chỉ có thể hy vọng phát hiện được chúng và giới hạn sự lây nhiễm. Một trong những giải pháp hiệu quả nhất hiện nay là Integrity Shell. Giải pháp này sử dụng công nghệ mã hoá để phát hiện ra sự thay đổi của thông tin, nhờ đó phát hiện ra virus và ngăn ngừa sự lây lan tiếp theo.

    Một số xu hướng nghiên cứu mới theo quan điểm hạn chế tối đa ảnh hưởng của foreign code tới hệ thống bằng cách xây dựng các môi trường cách ly. Đây là các môi trường trung gian giữa foreign code và hệ thống người dùng. Mọi yêu cầu truy xuất của foreign code tới hệ điều hành đều được kiểm soát bởi các môi trường này do vậy bảo đảm an toàn cho hệ thống.

    Kết luận

    Các loại foreign code có hại (virus, trojan horse và internet worm) đang được triển khai ngày đêm phục vụ cho mục đích tấn công không ngừng nghỉ của giới tin tặc. Hiểu rõ về foreign code và các mô hình bảo mật là yêu cầu tối cần thiết đối với các nhà quản trị mạng và cả người dùng. Bài viết này cung cấp một cái nhìn tổng quan về các mô hình bảo mật đã và đang được triển khai nhằm mang lại một thế giới an toàn hơn, bảo mật hơn.

    Nguyễn Đình Hân
    nguyendinh.han@ait.ac.th
    Khoa CNTT - ĐH SPKT Hưng Yên

    ID: A0501_102