Sử dụng chroot để hạn chế các dịch vụ

QuanTriMang.com - Sandbox có thể là một công cụ hữu dụng cho việc trợ giúp bảo vệ hệ thống chống lại sự thỏa hiệp, miễn là bạn sử dụng nó sáng suốt. Trong bài này Quản Trị Mạng sẽ giới thiệu cho các bạn một Sandbox cụ thể, chroot, đây là một Sandbox đơn giản, dễ sử dụng, cũng như khả năng có sẵn cao.

Nhiều vấn đề bảo mật ứng dụng liên quan đến việc cho phép. Nếu ai đó tăng sự cho phép để thực hiện một số nhiệm vụ nào đó trên máy tính mà thực sự bạn không muốn người này có khả năng đó, thứ gì xay ra chắc bạn đã biết, bạn đã bị thỏa hiệp.

Việc chọn các ứng dụng được biết đến hoặc chí ít là được tin là được thiết kế an toàn hơn so với các sản phẩm khác là một hành động cần thực hiện để bảo đảm an toàn cho hệ thống của bạn. Thêm vào đó là cần phải quan tâm đến việc cấu hình đúng cách mọi thứ, để những người dùng không có thẩm quyền không có được sự cho phép không cần thiết. Mặc dù khi đã áp dụng tất các bước hợp lý để bảo mật nhưng vẫn có khả năng thứ gì đó có thể đi sai đường. Dù có siêng năng đến cỡ nào bạn cũng cần phải biết được rằng hệ thống của bạn có thể là hệ thống đầu tiên một số kẻ tấn công mã độc test lỗ hổng mới được khám phá với một khai thác zero-day. Do đó để không gặp phải vấn đề này, bạn cần phải được bảo vệ trước những gì có thể xảy ra.

Những nỗ lực luôn được thực hiện để có được nhiều cách bảo vệ chống lại những gì không mong đợi. Một hệ thống biệt lập với đặc quyền mạnh được xây dựng trong một hệ điều hành, chẳng hạn như trường hợp với các hệ thống Unix điển hình, là một ví dụ cho kiểu suy nghĩ này. Những hành động bảo vệ này không bị hạn chế trong việc bảo vệ chống lại các tấn công bảo mật mã độc; chúng cũng có thể cung cấp sự bảo vệ chống lại những người dùng không manh mối, và những lỗi đơn giản xảy ra bởi quản trị viên hệ thống và những vấn đề khác. Một phương pháp để bảo vệ bản thân bạn với những gì không mong đợi đến từ sandbox.

Trong thuật ngữ bảo mật ứng dụng, sandbox là một cơ chế kỹ thuật mà với cơ chế đó, một số hoạt động của các ứng dụng có thể được cô lập với phần còn lại của hệ thống theo một cách nào đó, hy vọng nó sẽ bảo vệ hệ thống của bạn chống lại được bất cứ ác tâm hay những điều không may có thể rơi vào các ứng dụng đó.

Các máy ảo chẳng hạn như VirtualBox cung cấp một phương pháp khá thú vị và hoàn chỉnh cho việc sandbox, nơi toàn bộ một hệ điều hành được load vào một sandbox được duy trì bên trong môi trường hệ điều hành khác. Theo lý thuyết, bất cứ ứng dụng nào chạy bên trong máy ảo đều tránh được sự ảnh hưởng của bất cứ thứ gì chạy bên ngoài sandbox máy ảo.

Các sandbox đặc biệt hơn, chẳng hạn như Sandboxie cũng tồn tại, cho phép ai đó có thể chạy một ứng dụng cụ thể bên trong một ứng dụng sandbox.

Hầu hết các hệ điều hành được thiết lập để trở thành một thực thi cho hình thức lý tưởng Platonic mà chúng ta biết đến như Unix đều đi kèm với một chroot()system call, một thành phần có thể được sử dụng để tạo nên các sandbox cho riêng bạn. Một số ứng dụng được thiết kế đặc biệt để có thể tự triệu gọi chroot() cho bản thân chúng khi được khởi chạy, tự động sandboxing. Mặc dù vậy cũng có một tiện ích dòng lệnh chroot có thể được sử dụng để truy cập vào system call (một system call là cách một chương trình yêu cầu một dịch vụ từ nhân của hệ điều hành mà bình thường không được phép chạy), để nó có thể được sử dụng trong việc sandbox các ứng dụng đặc biệt khi cần.

Tiện ích chroot thường là một cách đơn giản nhất, nhanh nhất và có thể nói là dễ dàng nhất cho việc sandbox một ứng dụng nào đó – đặc biệt một máy chủ - nơi vấn đề bảo mật là quan trọng hàng đầu.

Khi sử dụng chroot, một mẩu phần mềm sẽ được khởi chạy bên trong một kiểu cấu trúc thư mục root lỗi, theo lý thuyết là làm cho phần mềm bị “đánh lừa” và nghĩ rằng không có gì bên ngoài cấu trúc thư mục đó, vì vậy sẽ cách ly phần còn lại của hệ thống với bất cứ vấn đề có tiềm ẩn sự ảnh hưởng gây hại trong việc chạy phần mềm này. Bất cứ quá trình nào được chroot root đều tránh được sự truy nhập trực tiếp vào cấu trúc thư mục root lỗi của nó, tuy nhiên vẫn tiềm ẩn một số ứng dụng có thể chạy phần mềm khác và được lợi dụng để tạo các quá trình có thể phá hủy môi trường chroot. Phương pháp kinh điển để phá hủy sandbox đó là bảo tạo khả năng có thể gắn lại (remount) thư mục hiện hành.

Với những hạn chế của chroot() system call, chúng ta cần phải thật cẩn thận về cách nó được sử dụng như thế nào trước khi dựa vào nó để bảo mật cho hệ thống của mình. Bạn luôn phải nhớ rằng các sandbox không an toàn như những gì chúng tuyên bố, mà việc sử dụng một sandbox là một cố gắng để bảo đảm rằng các lỗi bảo mật trong ứng dụng được sandbox sẽ không thể ảnh hưởng đến bất cứ thứ gì khác ngoài môi trường được sandbox.

Những ví dụ dưới đây, chúng tôi sẽ giả định bạn muốn chạy sh, một shell chuẩn POSIX, bên trong một chroot sandbox. Việc chạy một shell bên trong bất cứ thứ gì không phải một hành động hệ điều hành khi cố gắng sandbox nó là một sự mơ hồ, đặc biệt cần phải xem xét điều cuối cùng mà bạn muốn thực hiện khi chạy phần mềm bên trong một sandbox được tạo bởi chroot() system call cho mục đích bảo mật là để chạy nó như một root, tuy nhiên nó lại phục vụ như một ví dụ đơn giản cho các mục đích giải thích cách sử dụng tiện ích chroot. Các ví dụ được tạo ra trên hệ thống FreeBSD 8.0; đầu ra có thể khác nhau đôi chút đối với các hệ thống khác nhau.

Thứ đầu tiên bạn cần sử dụng chroot để sandbox một số ứng dụng là một thư mục được sử dụng làm thư mục root lỗi cho ứng dụng của mình. Để thực hiện điều này, chỉ cần sử dụng lệnh mkdir để tạo một thư mục mà bạn muốn sử dụng cho mục đích đó. Cho ví dụ, bạn có thể sử dụng lệnh dưới đây để tạo một thư mục có mang tên false_root bên trong thư mục root thực của hệ thống: 

# mkdir /false_root

Do cách làm việc của chroot(), mọi thứ bạn cần để chạy phần mềm được sandbox cần phải nằm bên trong thư mục root lỗi. Bước đầu tiên để đạt được yêu cầu đó là copy file thực thi sh vào thư mục root lỗi của bạn. Đầu tiên, tạo thư mục bin giống như thư mục bình thường nó cư trú trên hệ thống, sau đó copy file thực thi vào trong thư mục này:  

# mkdir /false_root/bin# cp /bin/sh /false_root/bin/

Đơn giản, bạn có thể thử sử dụng chroot để chạy thực thi sh lúc này, tuy sẽ gặp thất bại nhưng dù sao chúng ta sẽ thấy được cách làm việc (hoặc đúng hơn là vì sao nó không làm việc) và thực hiện điều chỉnh sao cho nó làm việc:

# chroot /false_root/ /bin/sh    ELF interpreter /libexec/ld-elf.so.1 not found
Abort

Bước tiếp theo là bảo đảm bạn có file ld-elf.so.1

# mkdir /false_root/libexec
# cp /libexec/ld-elf.so.1 /false_root/libexec/

Sau đó thử lại:

# chroot /false_root/ /bin/sh
/libexec/ld-elf.so.1: Shared object "libedit.so.7" not found, required by "sh"

Liệu có cách nào tốt hơn ngoài cách thực hiện thử và lỗi như trên! Quả thực có một cách tốt hơn như vậy. Đó chính là cách sử dụng tiện ích ldd. Nó là một công cụ được sử dụng để liệt kê sự phụ thuộc cho một đối tượng động. Nói cách khác, nó liệt kê tất cả những vấn đề phụ thuộc vào thư viện liên kết động cho một mẩu phần mềm nào đó trên hệ thống để bạn có thể giải quyết tất cả chúng một lúc:

# ldd /bin/sh
/bin/sh:
    libedit.so.7 => /lib/libedit.so.7 (0x280a9000)
    libncurses.so.8 => /lib/libncurses.so.8 (0x280be000)
    libc.so.7 => /lib/libc.so.7 (0x280fe000)
# mkdir /false_root/lib
# cp /lib/libedit.so.7 /false_root/lib/
# cp /lib/libncurses.so.8 /false_root/lib/
# cp /lib/libc.so.7 /false_root/lib/
Thử chroot sh lần nữa:
# chroot /false_root/ /bin/sh
#

Nó đã làm việc! Lúc này bạn đã có một quá trình chroot sh đang chạy, với nhắc lệnh đang chờ bạn để nhập tiếp các lệnh khác. Lệnh cần nhập tiếp ở đây là gì? Có thể là ls, để biết được những gì nằm trong thư mục hiện hành:

# ls
ls: not found

Không có lệnh ls bên trong sh shell – nó là một tiện ích thực thi nhị phân riêng biệt không được copy vào môi trường sandbox. Kiểu hoạt động đơn giản trong môi trường sandbox của chroot() system call này cho phép bạn biến đổi nó theo nhu cầu cụ thể, bỏ lại bất cứ thứ gì không cần thiết bên trong sandbox, vì vậy có thể nâng cao được vấn đề bảo mật qua hình thức đơn giản hóa.

Trong thực tế, chroot() system call thường được sử dụng cho các máy chủ quan trọng, như một phương pháp để bảo vệ hệ thống tránh các ảnh hưởng không mong muốn có thể xảy ra. Nó thường được sử dụng bởi các chuyên gia phát triển phần mềm, người cần test các đoạn mã nào đó được dự định có thể tương tác với các file được lưu trên filesystem mà không gây nguy hiểm cho các file quan trọng, chẳng hạn như khi viết mã tạo rất nhiều file tạm thời và test xem tất cả chúng có được xóa hết hay không.

Việc sử dụng là vấn đề của riêng bạn. Như với bất kỳ phần mềm bảo mật, nó có các khả năng cụ thể cũng như một số hạn chế nào đó, và không bao giờ được coi như một “chiếc áo giáp đạn bắn không thủng” trước vấn đề thỏa hiệp – tuy nhiên nó cũng có thể được sử dụng một cách hiệu quả nếu được sử dụng sáng suốt và với những hiểu biết đầy đủ rằng nó không là gì ngoài một công cụ trong hộp công cụ bảo mật.

Thứ Hai, 26/07/2010 08:20
34 👨 2.087