• Thứ Sáu, 09/01/2004 10:33 (GMT+7)

    Chống xâm nhập bất hợp pháp Linux

    Giới Thiệu

    Cùng với sự phát triển của các hệ thống chạy Linux trên internet, người ta đã và đang tìm ra ngày càng nhiều lỗ hổng bảo mật của các phần mềm miễn phí trên các hệ thống này. Hiện có rất nhiều kiểu tấn công, xâm nhập hệ thống Linux như: tấn công gây tràn bộ đệm (Buffer Over Flow), tấn công kiểu từ chối các dịch vụ (Denial of Services), tấn công dựa vào cửa sau (Back door)... Một khi kẻ tấn công chiếm được quyền ‘root’ (tài khoản người dùng có quyền cao nhất trên hệ thống), toàn bộ hệ thống đó bị đặt dưới quyền điều khiển của kẻ xâm nhập. Vậy các nhà quản trị phải làm gì để bảo vệ hệ thống của mình? Làm sao ngăn chặn được người dùng có quyền root phá hoại các thành phần quan trọng của hệ thống?

    Hệ thống Linux thông thường có một số nhược điểm sau:

    Người chiếm được quyền root sẽ có quyền quyết định số phận tất cả các thành phần của hệ thống: chấm dứt các tiến trình (kill), xoá bỏ bất cứ tập tin nào, thay đổi bất cứ tập tin cấu hình nào. Với người quản trị hệ thống thực sự thì điều đó là cần thiết, nhưng với kẻ xâm nhập thì điều này vô vùng nguy hiểm.

    Các tập tin quan trọng của hệ thống không được bảo vệ chống truy nhập (đọc/ghi) bất hợp pháp. Những tập tin cực kỳ quan trọng trên hệ thống như init, login... hay các tập tin cấu hình, thiết lập tường lửa, thiết lập về thông tin mạng (IP, network, routting, name server...), bị thay đổi thì không thể lường trước được hậu quả.

    Các tiến trình không được bảo vệ. Trên các máy chủ Linux, có rất nhiều tiến trình quan trọng phải được chạy thường trực để phục vụ khách hàng: Tiến trình httpd thực hiện chức năng của web server, tiến trình ftpd cung cấp truy cập tập tin theo giao thức FTP, tiến trình named thực hiện dịch vụ giải nghĩa tên/địa chỉ máy tính (Domain Name Service)... Nếu người dùng có quyền thích hợp (quyền root chẳng hạn), họ có thể chấm dứt các tiến trình bất cứ lúc nào (ví dụ: killall httpd), điều này gây ảnh hưởng vô cùng lớn đối với các hệ thống phục vụ nhiều người dùng như máy chủ web, máy chủ thư điện tử (mail server), máy chủ giải nghĩa tên (Name Server)...

    Các nhược điểm trên là do Linux thừa hưởng kiến trúc, thiết kế cơ bản từ hệ thống UNIX. Rất may, nhờ lợi ích của phần mềm mã nguồn mở, người ta đã nhanh chóng khắc phục nhược điểm này bằng cách thay đổi trong mã nguồn của nhân (kernel) Linux, tích hợp vào đó các tính năng mới và cung cấp một số công cụ quản trị,  được đặt tên là LIDS (Linux Intrusion Detection System). Mã nguồn của LIDS và các tài liệu có liên quan có tại website http://www.lids.org.

    Mặc dù cho đến nay Linus Torvard và những người có trách nhiệm duy trì sự phát triển của nhân Linux vẫn chưa chính thức quyết định tích hợp các tính năng mới vào phiên bản Linux kernel hiện tại, nhưng LIDS đã được một số nhà phân phối Linux chính thức sử dụng trong sản phẩm của mình, điển hình  là  EnGarde  (http://www.engardelinux.com).

     

    Các Thành Phần Và Tính Năng Của Lids

    LIDS bao gồm:

    - Một phần mã được tích hợp trong Linux kernel, được patch vào mã nguồn của kernel

    - Công cụ quản trị có tên là lidsadm (LIDS Admin Tool) cùng một số tập tin cấu hình trong thư mục /etc/lids/  dùng để thiết lập, thay đổi cấu hình của LIDS.

    LIDS cho phép người quản trị hệ thống:

    - Bảo vệ các tập tin, thư mục trên hệ thống (không phụ thuộc vào kiểu hệ thống tập tin chứa tập tin/thư mục đó là ext2, ext3 hay vfat..) khỏi sự truy cập bất hợp pháp, kể cả người sử dụng có quyền root.

    - Bảo vệ các tiến trình không bị chấm dứt (kill) bởi các tiến trình khác do bất cứ người dùng nào thực hiện.

    - Kiểm soát và ngăn chặn các thao tác vào ra mức thấp do các chương trình không mong muốn thực hiện.

     

    Cài Đặt Lids

    Khi tải về mã nguồn LIDS, bạn phải chọn phiên bản phù hợp với phiên bản của Linux kernel. Ví dụ, với kernel-2.4.18 bạn phải tải về phiên bản LIDS có phần version là 2.4.18. LIDS được phát triển dựa trên các bản Linux kernel chính thức từ http://www.kernel.org.

    Tích hợp LIDS vào mã nguồn của Linux kernel:

    Tải về mã nguồn của LIDS và Linux kernel. Nên để mã nguồn của Linux Kernel tại thư mục /usr/src/linux để các chương trình khác có thể truy cập đến. Giải nén LIDS (tại một thư mục khác), bạn sẽ thấy trong đó có một tập tin có đuôi là .patch, chép tập tin này vào thư mục /usr/src/linux và chuyển vào thư mục chứa mã nguồn Linux kernel để tiến hành patch và biên dịch lại.

     

    #cd /usr/src/linux

    #patch -p1 < lids_version-kernel_version.patch

    (lids_version là phiên bản của LIDS, kernel_version là phiên bản của Linux kernel)

     

    Cấu hình các tính năng của kernel:

    #make menuconfig hoặc make config (make xconfig nếu bạn đang ở trong môi trường X Window)

     

    Nhớ bật các tuỳ chọn:

    <*>Prompt for development and/or incomplete code/drivers

    <*>Sysctl support

    <*>Linux Intrusion Detection System support  (EXPERIMENTAL) (NEW).

     

    Biên dịch kernel:

    #make dep

    #make bzImage

    #make modules

    #make modules_install

     

    Quá trình biên dịch diễn ra nhanh hay chậm phụ thuộc vào cấu hình máy tính, phiên bản của kernel và các tuỳ chọn mà bạn chọn khi cấu hình kernel.

    Cài đặt kernel mới:

    Sau khi quá trình trên kết thúc, chép tập tin bzImage trong thư mục /usr/src/linux/boot/arch/i386 (nếu CPU là Intel) vào thư mục /boot và có thể đổi tên, ví dụ như secu_kernel.

    Nếu dùng lilo để khởi động hệ thống, bạn phải soạn lại tập tin /etc/lilo.conf và thêm một mục mới như sau:

     

    image=/boot/secu_kernel

      label=secu

      read-only

      root=/dev/hda2

    (/dev/hda2 là phân vùng chứa thư mục gốc “ / “, bạn thay nó bằng tên phân vùng gốc của bạn, nếu không biết phân vùng gốc, gõ lệnh mount không tham số, bạn sẽ nhận được danh sách các phân vùng đang được kết gán, trong đó có cả phân vùng gốc).

    Sau đó thực hiện lệnh /sbin/lilo để cập nhật mục mới đó.

    Biên dịch các công cụ quản trị của LIDS:

    Chuyển vào thư mục chứa mã nguồn của LIDS, thực hiện cấu hình, biên dịch và cài đặt LIDS.

     

    #configure

    #make

    #make install

     

    Thông thường lidsadm được cài đặt vào thư mục /sbin, các tập tin cấu hình được cài đặt trong thư mục /etc/lids. Bạn có thể thay đổi các tập tin cấu hình này và thực hiện lệnh:

     

    #lidsadm -U

     

    để cập nhật sự thay đổi đó.

    Khởi động lại hệ thống với kernel mới (secu_kernel) bằng cách chọn secu tại dấu nhắc lilo.

     

    Sử Dụng Lids

    Bảo vệ hệ  thống:

    Sau khi hệ thống khởi động xong, bạn kích hoạt chế độ bảo vệ của LIDS bằng lệnh

     

    #lidsadm -I

     

    Để lệnh trên được thực hiện mỗi khi khởi động hệ thống, bạn có thể thêm lệnh đó vào tập tin /etc/rc.d/rc.local hoặc tập tin nào đó tương tự trên bản Linux của bạn.

    Thay đổi chế độ:

    Sau khi hệ thống được bảo vệ, nếu bạn cần chuyển sang chế độ thông thường để thay đổi các tập tin cấu hình, các tập tin được bảo vệ, bạn dùng lênh:

     

    # /sbin/lidsadm -S — -LIDS

    Sau đó kích hoạt lại hệ thống bảo vệ:

     

    # /sbin/lidsadm -S — +LIDS

     

    Nếu bạn thay đổi các tập tin cấu hình của lids, sử dụng lệnh sau để nạp các thông tin đó vào vùng bộ nhớ của kernel:

     

    # /sbin/lidsadm -S — +RELOAD_CONF

     

    Các tập tin cấu hình của LIDS:

    - lids.conf: định nghĩa các đối tượng được bảo vệ và hành động bảo vệ mà LIDS cần thực hiện; có thể thêm, bớt các đối tượng bằng lidsadm.

    - lids.cap: chứa các tính năng được lids sử dụng; bạn có thể thêm, bớt các tính năng bằng cách đặt dấu + hoặc - trước tên các tính năng đó.

    - lids.net: định nghĩa cách thức mà LIDS sẽ gửi email cho bạn khi có sự kiện gì đó xảy ra trên hệ thống mà bạn cần quan tâm, nó chứa tên mail server, địa chỉ của bạn, tiêu đề của bức thư... Tập tin này cần có khi bạn biên dịch kernel với tuỳ chọn cầu hình là “Send security alerts through network”.

    - lids.pw: chứa mật khẩu của nhà quản trị, dùng để kích hoạt lệnh lidsadm. Tập tin này cần có khi bạn biên dịch kernel với tùy chọn “Allow switching LIDS protections”.

    Sử dụng lệnh lidsadm -P để thay đổi passwd của lidsadm.

     

    Bảo vệ tập tin/thư mục:

    Lệnh sau cho phép bảo vệ một tập tin, thư mục nào đó, ví dụ tập tin /etc/lilo.conf, không cho ai biết sự có mặt của nó trên hệ thống, kể cả root:

     

    # lidsadm -A -o /etc/lilo.conf -j DENY

     

    Cập nhật lại cấu hình bằng lệnh:

     

    # /sbin/lidsadm -S — +RELOAD_CONF

     

    Bạn sẽ không thể thấy tập tin /etc/lilo:

     

    #cat /etc/lilo.conf

    cat: /etc/lilo.conf: No such file or directory

     

    Ngoài tuỳ chọn DENY, bạn có thể thay vào đó các tuỳ chọn bảo vệ khác như:

    READ: Chỉ được đọc

    WRITE: Có thể đọc, ghi

    APPEND: Chỉ có thể thêm vào các dữ liệu mới ở cuối tập tin (có ích với các tập tin log như /var/log/message ,/var/log/secure...)

    Cho phép một tập tin, thư mục nào đó được một chương trình nào đó đọc hoặc ghi:

    Ví dụ: Bạn cấm tất cả các đối tượng khác đọc/ghi thư mục /var/www/html vì nó là thư mục chứa các tài liệu web quan trọng. Nhưng nó cần được web server sử dụng để cung cấp các thông tin cho mọi người:

     

    (Cấm tất cả mọi người đọc/ghi)

    # lidsadm -A -o /home/httpd -j DENY

    (Cho phép web server đọc)

    # lidsadm -A -s /usr/sbin/httpd -o /var/www/html -j READ

     

    Bảo vệ các tiến trình:

    Các tiến trình là tiến trình con của init có thể được bảo vệ khỏi bị kill với tuỳ chọn: -29:CAP_INIT_KILL trong tập tin /etc/lids/lids.cap

    Ngoài ra, bạn có thể giấu một tiến trình nào đó khi chạy bằng lệnh:

     

    #lidsadm -A -s <đường dẫn tới chương trình> -t -o CAP_HIDDEN -j INHERIT

     

    Ví dụ, che giấu tiến trình httpd:

    #lidsadm -A -s /usr/sbin/httpd -t -o CAP_HIDDEN -j INHERIT

     

    Các tiến trình được giấu sẽ không thể nhìn thấy được bằng lệnh ps hoặc bị lưu lại tại tập tin nào đó trong thư mục /proc.

    Ngoài ra còn nhiều tính năng hữu ích nữa được thiết lập trong /etc/lids/lids.cap để bảo vệ các thao tác vào ra cấp thấp, thay đổi cấu hình mạng... Bạn nên xem chi tiết trong phiên bản LIDS của mình.

    Phát hiện kẻ xâm nhập và thông báo cho người quản trị:

    Kẻ xâm nhập có thể bị phát hiện bởi một trong các hành động sau:

    - Sử dụng công cụ quét cổng như nmap, satan, super scan...

    - Sử dụng thao tác vào ra cấp thấp với các cổng truy nhập...

    - Thực hiện thao tác trái phép với các đối tượng đã được LIDS bảo vệ...

    Các hành động trên sẽ được ghi lại trong hệ thống thông qua các tập tin log, LIDS còn cho phép gửi các thông báo trên tới người quản trị thông qua email (khai báo trong tập tin /etc/lids/lids.net)

    Nếu kẻ xâm nhập chiếm được truy nhập mức console, LIDS sẽ chấm dứt hoạt động của phiên làm việc đó.

     

    Lời Kết

    Công cụ bảo mật tốt nhất vẫn chỉ là công cụ và nó có thể bị bẻ gẫy bởi một hacker nào đó. Không có một bức tường lửa nào là an toàn mãi mãi trên internet, không có một hệ thống nào là bất khả mãi mãi xâm phạm... Việc lập chính sách bảo mật tốt và có quy trình giám sát, theo dõi chặt chẽ của con người vẫn là điều quan trọng hơn cả.

     

    Nguyễn Thành Biên

    ID: A0210_90
    Ý kiến của bạn? Ý kiến của bạn?
    Tin ngày :