Biểu đồ lớp biểu diễn các quan tâm an ninh

Một phần của tài liệu Phương pháp hướng đối tượng và phân tích thiết kế an ninh hệ thống (Trang 61 - 67)

lập trình hiện đại.

Công nghệ AOP cho phép chúng ta xen các xử lý ở một đơn thể ngoài (aspect module) vào trong luồng xử lý của một đơn thể khác. Việc trình bày đầy đủ về AOP nằm ngoài phạm vi luận văn này, nên chúng ta chỉ xem xét qua một ví dụ.

Trong một hệ thống ngân hàng, luồng xử lý chính của đơn thể chuyển tiền là:

1. kiểm tra số tồn

2. thực hiện trừ số ở tài khoản nguồn; và

3. thực hiện cộng số ở tài khoản đích

Một ví dụ mã chương trình là 4.1:

Ví dụ mã 4.1: Thực hiện chuyển khoản

1 void t r a n s f e r ( Account fromAcc , Account toAcc , i n t amount )

2 throws E x c e p t i o n {

3 i f ( fromAcc . g e t B a l a n c e ( ) < amount ) {

4 throw new I n s u f f i c i e n t F u n d s E x c e p t i o n ( ) ;

5 }

6 fromAcc . withdraw ( amount ) ;

7 toAcc . d e p o s i t ( amount ) ;

8 }

Tuy nhiên, bên cạnh luồng xử lý chính trên, có rất nhiều thao tác khác phải thực hiện, ví dụ đơn giản là ghi nhật ký, hoặc đảm bảo giao dịch không bị ngắt quãng. Ví dụ: sau khi thực hiện kiểm tra và trừ ở tài khoản nguồn thành công, đột nhiên hệ thống bị lỗi, không thể cộng ở tài khoản đích, kết quả là một số tiền bị mất ở tài khoản nguồn mà không thấy ở tài khoản đích.

Nếu sử dụng kỹ thuật lập trình bình thường, chúng ta phải xen vào các đoạn mã thực hiện giao dịch, quản lý giao dịch, và phục hồi giao dịch nếu gặp lỗi, như ví dụ 4.2.

Ví dụ mã 4.2: Thực hiện chuyển khoản có quản lý giao dịch

1 void t r a n s f e r ( Account fromAcc , Account toAcc , i n t amount )

2 throws E x c e p t i o n {

3 t r a n s a c t i o n M a n a g e r . b e g i n ( ) ;

Phương pháp hướng đối tượng và phân tích thiết kế anh ninh hệ thống 59

5 throw new I n s u f f i c i e n t F u n d s E x c e p t i o n ( ) ;

6 }

7 try{

8 fromAcc . withdraw ( amount ) ;

9 toAcc . d e p o s i t ( amount ) ; 10 }catch( E x c e p t i o n e ) { 11 t r a n s a c t i o n M a n a g e r . r o l l b a c k ( ) ; 12 } 13 t r a n s a c t i o n M a n a g e r . commit ( ) ; 14 }

Trong ví dụ mã 4.2, người lập trình phải tự lo việc thêm các đoạn quản lý giao dịch, và nếu người lập trình quên thì việc kiểm thử cũng rất khó để phát hiện ra lỗi này. Ngoài ra, để cho người lập trình thêm các mã quản lý giao dịch vào chương trình, thì ở mức phân tích và mức thiết kế, người phân tích, thiết kế phải đề cập ngay khía cạnh kỹ thuật này vào trong bản phân tích, thiết kế.

Lập trình hướng khía cạnh (AOP) cho phép ta giải quyết bài toán quản lý giao dịch và các bài toán tương tự, một cách toàn cục, mà không phải thêm vào các đoạn mã rải rác đâu đó trong chương trình. Xét về mặt nghiệp vụ chính của chương trình chuyển tiền, việc đảm bảo giao dịch thành công là một nhiệm vụ của hệ thống nền tảng (framework), chứ không phải của chương trình.

Để giải quyết việc quản lý giao dịch trên, ta sử dụng công nghệ AOP và đóng gói tất cả các lớp xử lý nghiệp vụ thành một giao dịch (transaction). Các lớp thể hiện nghiệp vụ sẽ kế thừa từ lớp AbstractBLogic (business logic) và lớp này sẽ khai báo giao dịch bằng annotation, như ví dụ mã 4.3. (adsbygoogle = window.adsbygoogle || []).push({});

Ví dụ mã 4.3: Định nghĩa lớp trừu tượng khai báo giao dịch

1 @ T r a n s a c t i o n a l ( r o l l b a c k F o r=j a v a . l a n g . E x c e p t i o n .c l a s s}

2 abstract c l a s s A b s t r a c t B L o g i c {

3 }

Như vậy, khi một lớp kế thừa từ lớp AbstractBLogic thì đối tượng của lớp đó đã được đặt vào bên trong một giao dịch. Và khi có một ngoại lệ (exception) xảy ra thì nền tảng quản

lý giao dịch sẽ tự động hủy giao dịch (rollback). Cụ thể ta có ví dụ mã 4.4.

Trong ví dụ mã 4.4, nội dung của mã không có gì thay đổi, ngoài việc kế thừa lớp xử lý giao dịch từ AbstractBLogic để giúp cho nền tảng AOP có thể xen vào các mã có thể xen vào các mã quản lý giao dịch.

Ví dụ mã 4.4: Thực hiện chuyển khoản quản lý giao dịch qua AOP

1 c l a s s B a n k T r a n s f e r B L o g i c extends A b s t r a c t B L o g i c {

2 public void e x e c u t e ( Account fromAcc , Account toAcc ,

3 i n t amount ) throws E x c e p t i o n {

4 i f ( fromAcc . g e t B a l a n c e ( ) < amount ) {

5 throw new I n s u f f i c i e n t F u n d s E x c e p t i o n ( ) ;

6 }

7 fromAcc . withdraw ( amount ) ;

8 toAcc . d e p o s i t ( amount ) ;

9 }

10 }

Với việc sử dụng kỹ thuật AOP, ta có thể xen các mối quan tâm an ninh vào các mã chương trình một cách nhẹ nhàng và có hệ thống hơn.

4.3.2. Sử dụng AOP đối với các mối quan tâm an ninh

Việc đưa các mối quan tâm an ninh vào chương trình thông qua AOP là một giải pháp đã được nhiều tác giả nghiên cứu [4] [5].

Trong bài toán của chúng ta, từ biểu đồ hoạt động của các trường hợp sử dụng, ta xác định được các điểm cắt (pointcut) mà các mối quan tâm an ninh của chúng ta sẽ được xen vào. Chúng ta xây dựng các quy ước đặt tên lớp như sau:

• Mỗi một nghiệp vụ của người dùng thường gồm một số bước và mỗi bước sẽ xuất hiện một yêu cầu (vật lý) gửi tới máy chủ. Ví dụ, với trường hợp MS01_01 thì các yêu cầu là:

1. Hiển thị màn hình (MS01_01_01)

2. Gửi dữ liệu lên (MS01_01_02)

Phương pháp hướng đối tượng và phân tích thiết kế anh ninh hệ thống 61

Để rõ hơn các yêu cầu thì ta có thể nhìn vào bảng mô tả trường hợp sử dụng. Mỗi mũi tên vẽ từ tác nhân sang hệ thống là một yêu cầu. Tuy nhiên, ta quy ước đối với yêu cầu hiển thị màn hình thì trứoc và sau là cùng số, vì đó là yêu cầu hiển thị cùng một màn hình.

• Các lớp thực hiện các nghiệp vụ của người sử dụng sẽ đặt tên là UC_*BLogic, và mỗi yêu cầu sẽ là một lớp.

• Trong mỗi lớp chỉ có một phương thức tên làexecute. Ví dụ cụ thể ta cóMS01_01_01BLogic là tên lớp và execute là tên phương thức.

Với các quy ước như vậy, ta định nghĩa các điểm cắt như ví dụ mã 4.5. (adsbygoogle = window.adsbygoogle || []).push({});

Ví dụ mã 4.5: Định nghĩa mối quan tâm và điểm cắt

1 @Aspect

2 abstract c l a s s S e c u r i t y A s p e c t {

3 @Before ( " bean (∗BLogic ) "

4 public void c h e c k ( J o i n P o i n t j p ) { 5 O b j e c t t a r g e t = j p . g e t T a r g e t ( ) ; 6 C l a s s <? extends A b s t r a c t S e c u r i t y G u a r d > t a r g e t C l a s s = 7 ( C l a s s <? extends A b s t r a c t S e c u r i t y G u a r d >) t a r g e t . g e t C l a s s ( ) ; 8 S t r i n g className = t a r g e t C l a s s . getCanonicalName ( ) ; 9 S t r i n g u c I d = className . s u b s t r i n g ( 4 1 , 4 7 ) ; 10 A b s t r a c t S e c u r i t y G u a r d [ ] g u a r d s = 11 A b s t r a c t S e c u r i t y G u a r d . getGuards ( u c I d ) ; 12 f o r( A b s t r a c t S e c u r i t y G u a r d g : g u a r d s ) { 13 g . c h e c k ( ) ;// t h r o w u n a u t h o r i z e d e x c e p t i o n i f any 14 } 15 } 16 }

Trong phương thức check(), chúng ta thực hiện các kiểm tra cần thiết và tạo ngoại lệ truy cập (UnauthorizedException) khi người dùng hiện tại không được phép thực hiện hành động đó.

4.4. Một số chi tiết trong cài đặt chương trình

Chương trình mà chúng tôi đưa ra làm ví dụ minh họa là một hệ thống đã được xây dựng và không sử dụng phương pháp phân tich thiết kế an ninh hệ thống.

Để thực hiện ý tưởng minh họa, chúng tôi tiến hành thêm vào các thành phần (lớp) kiểm tra anh ninh mà không ảnh hưởng tới mã hiện tại của chương trình.

Để phục vụ việc cài đặt các dấu đặc trưng an ninh, chương trình tổ chức một bảng cơ sở dữ liệu (“security_concern”), có cấu trúc như bảng 4.4.

Tên cột Kiểu dữ liệu Giải thích

use_case_id varchar(10) Tên trường hợp sử dụng

sec_stereotype varchar(10) Dấu đặc trưng an ninh tương ứng request_parameter varchar(50) Cách lấy tham số từ yêu cầu HTTP

guard_bean varchar(120) Tên đối tượng kiểm tra trong Spring context

Bảng 4.4: Định nghĩa bảng CSDL mối quan tâm an ninh

Khi mối quan tâm an ninh được gọi qua @Aspect và @Before, phương thức check sẽ sử dụng bảng 4.4 để tìm xem trường hợp sử dụng đang được truy xuất tới thuộc về mối quan tâm an ninh nào để tiến hành gọi lớp kiểm tra an ninh tương ứng.

Trong ví dụ mà chúng tôi đưa ra dưới đây, chúng tôi thử kiểm tra với trường hợp mối quan tâm an ninh là việc truy xuất vào thông tin của công ty không liên quan. Giả sử bằng cách nào đó, người dùng biết được mã số hóa đơn (I/V) của hai công ty A và B và định truy xuất vào hóa đơn đó.

Tiến hành đăng nhập vào hệ thống bằng một người dùng thuộc hai trường hợp:

1. Người dùng (tên đăng nhập: abc) thuộc công ty 4, công ty 4 này thuộc về một kế hoạch vận chuyển trong đó có công ty 2 và công ty 5 (4 là thầu phụ của 2) (Hình 4.9). Trong trường hợp này, hệ thống cho phép công ty 4 được nhìn thấy hóa đơn của công ty 2 và 5, ví dụ: gõ thẳng đường dẫn chứa số I/V đó để vào hệ thống (Hình 4.10).

2. Người dùng (tên đăng nhập: other) thuộc công ty 7, công ty này không có liên quan gì tới 2 và 5. Nếu ta gõ thẳng đường dẫn chứa số I/V đó vào, thì hệ thống phải cho ra một ngoại lệ truy cập (Hình 4.11).

Phương pháp hướng đối tượng và phân tích thiết kế anh ninh hệ thống 63

Một phần của tài liệu Phương pháp hướng đối tượng và phân tích thiết kế an ninh hệ thống (Trang 61 - 67)