Red Hat Linux và những kinh nghiệm bảo mật

Hiện nay Linux đang dần trở thành một hệ điều hành khá phổ biến, bởi tính kinh tế, khả năng bảo mật và sự uyển chuyển cao. Thế nhưng, mọi hệ thống dù an toàn đến đâu cũng dễ dàng bị xâm nhập nếu người dùng (và nhất là người quản trị – root) không đặt sự bảo mật lên hàng đầu. Sau đây là một số kinh nghiệm về bảo mật trên hệ điều hành Red Hat tôi muốn chia sẻ cùng các bạn và hi vọng công việc quản trị của bạn sẽ an toàn hơn.

PHẦN I (BÁO E-CHÍP SỐ 73, 24/02/2004)

1. Không cho phép sử dụng tài khoản root từ console

Sau khi cài đặt, tài khoản root sẽ không có quyền kết nối telnet vào dịch vụ telnet trên hệ thống, trong khi đó tài khoản bình thường lại có thể kết nối, do nội dung tập tin /etc/securetty chỉ quy định những console được phép truy nhập bởi root và chỉ liệt kê những console truy xuất khi ngồi trực tiếp tại máy chủ. Để tăng cường bảo mật hơn nữa, hãy soạn thảo tập tin /etc/securetty và bỏ đi những console bạn không muốn root truy nhập.

2. Xóa bớt tài khoản và nhóm đặc biệt

Người quản trị nên xóa bỏ tất cả tài khoản và nhóm được tạo sẵn trong hệ thống nhưng không có nhu cầu sử dụng (ví dụ: lp, sync, shutdown, halt, news, uucp, operator, games, gopher…). Thực hiện việc xóa bỏ tài khoản bằng lệnh userdel và xóa bỏ nhóm với lệnh groupdel.

3. Tắt các dịch vụ không sử dụng

Một điều khá nguy hiểm là sau khi cài đặt, hệ thống tự động bật chạy khá nhiều dịch vụ, trong đó đa số là các dịch vụ không mong muốn, dẫn đến tiêu tốn tài nguyên và sinh ra nên nhiều nguy cơ về bảo mật. Vì vậy người quản trị nên tắt các dịch vụ không dùng tới (ntsysv) hoặc xóa bỏ các gói dịch vụ không sử dụng bằng lệnh rpm.

4. Không cho "su" lên root

Lệnh su (Substitute User) cho phép người dùng chuyển sang một tài khoản khác. Nếu không muốn người dùng "su" thành root thì thêm hai dòng sau vào tập tin /etc/pam.d/su:

auth sufficient /lib/security/pam_rootok.so debug

auth required /lib/security/Pam_wheel.so group=tên_nhóm_root

5. Che giấu tập tin mật khẩu

Giai đoạn đầu, mật khẩu toàn bộ tài khoản đã từng được lưu trong tập tin /etc/password, tập tin mà mọi người dùng đếu có quyền đọc. Đây là kẽ hở lớn trong bảo mật mặc dù mật khẩu được mã hóa nhưng việc giải mã không phải là không thể thực hiện được. Do đó, hiện nay các nhà phát triển Linux đã đặt riêng mật khẩu mã hóa vào tập tin /etc/shadow chỉ có root mới đọc được, nhưng yêu cầu phải chọn Enable the shadow password khi cài đặt RedHat.

6. Luôn nâng cấp cho nhân (kernel) Linux

Linux không hẳn được thiết kế với các tính năng bảo mật chặt chẽ, khá nhiều lỗ hổng có thể bị lợi dụng bởi tin tặc. Vì vậy, việc sử dụng một hệ điều hành với nhân được nâng cấp là rất quan trọng vì một khi nhân – phần cốt lõi nhất của hệ điều hành – được thiết kế tốt thì nguy cơ bị phá hoại sẽ giảm đi rất nhiều. Bạn có thể tham khảo các bài viết trước để biết cách cập nhật nhân hệ thống.

7. Tự động thoát khỏi shell

Người quản trị hệ thống và kể cả người dùng bình thường rất hay quên thoát ra khỏi dấu nhắc shell khi kết thúc công việc. Thật nguy hiểm nếu có một kẻ phá hoại chờ sẵn và hiển nhiên kẻ này sẽ có toàn quyền truy xuất hệ thống mà chẳng tốn chút công sức nào cả. Do vậy người quản trị nên cài đặt tính năng tự động thoát khỏi shell khi không có sự truy xuất trong khoảng thời gian định trước bằng cách sử dụng biến môi trường TMOUT và gán một giá trị quy định số giây hệ thống duy trì dấu nhắc. Tốt nhất, bạn nên đặt vào tập tin /etc/profile để lệnh luôn có tác dụng trong mọi phiên làm việc.

PHẦN 2 (BÁO E-CHÍP SỐ 75, 02/3/2004)

8. Không có phép truy cập tập tin kịch bản khởi động Linux

Khi hệ điều hành Linux khởi đông, các tập tin kịch bản (script) được đặt tại thư mục /etc/rc.d/init.d sẽ được gọi thực thi. Vì thế, để tránh những sự tò mò không cần thiết từ phía người dùng, với tư cách là người quản trị, bạn nên hạn chế quyền truy xuất tới những tập tin này và chỉ cho phép tài khoản root xử lý bằng lệnh sau:

# chmod –R 700 /etc/rc.d/init.d*

9. Giới hạn việc tự ý ghi nhận thông tin từ shell

Theo mặc định, tất cả lệnh được thực thi tại dấu nhắc shell của tài khoản đều được ghi vào tập tin .bash_history (nếu sử dụng bash shell) trong thư mục cá nhân của từng tài khoản. Điều này gây nên vô sô nguy hiểm tiềm ẩn, đặc biệt đối với những ứng dụng đòi hỏi người dùng phải gõ thông tin mật khẩu. Do đó, người quản trị nên giới hạn việc tự ý ghi nhận thông tin từ shell dựa vào hai biến môi trường HISTFILESIZE và HISTSIZE:

– Biến môi trường HISTFILESIZE quy định số lệnh gõ tại dấu nhắc shell sẽ được lưu lại cho số lần truy cập sau.

– Biến môi trường HISTSIZE quy định số lệnh sẽ được ghi nhớ trong phiên làm việc hiện hành.

Vì vậy, ta sẽ phải giảm giá trị của HISTSIZE và cho giá trị của HISTFILESIZE bằng 0 để giảm thiểu tối đa những nguy hiểm. Bạn thực hiện công việc này bằng cách thay đổi giá trị hai biến nêu trên trong tập tin /etc/profile như sau:

HISTFILESIZE=0

HISTSIZE=xx

Trong đó xx là số lệnh mà shell sẽ ghi nhớ, đồng thời không ghi lại bất kỳ một lệnh nào do người dùng đã gõ khi người dùng ấy thoát ra khỏi shell.

10. Tắt các tiến trình SUID/SGID không sử dụng

Bình thường, các tiến trình được thực hiện dưới quyền của tài khoản gọi thực thi ứng dụng ấy. Đó là dưới Windows, nhưng Unix/Linux lại sử dụng một kỹ thuật đặc biệt cho phép một số chương trình được thực hiện dưới quyền của người quản lý chương trình chứ không phải người gọi thực thi chương trình. Và đây là chính là lý do tại sao tất cả mọi người dùng trong hệ thống đều có thể đổi mật khẩu của mình trong khi không hề có quyền truy xuất lên tập tin /etc/shadow, đó là vì lệnh passwd đã được gán thuộc tính SUID và được quản lý bởi root, mà root lại là người dùng duy nhất có quyền truy xuất /etc/shadow.

Tuy thế, khả năng tiên tiến này có thể gây nên những nguy cơ khá phức tạp vì nếu một chương trình có tính năng thực thi được quản lý bởi root, do thiết kế tối hoặc do được cài đặt cố tình bởi những kẻ phá hoại mà lại được đặt thuộc tính SUID thì mọi điều “khủng khiếp” đều có thể xảy ra. Thực tế cho thấy có khá nhiều kỹ thuật xâm nhập hệ thống mà không có quyền root được thực hiện nhờ kỹ thuật này: kẻ phá hoại bằng cách nào đó tạo một shell được quản lý bởi root, có thuộc tính SUID, kế đó mọi truy xuất phá hoại sẽ được thực hiện qua shell vừa tạo vì mọi lệnh thực hiện trong shell sẽ được thực hiện giống như dưới quyền của root.

Thuộc tính SGID cũng tương tự như SUID: các chương trình được thực hiện dưới quyền nhóm quản lý  chương trình chứ không phải nhóm của người chạy chương trình. Như vậy, người quản trị sẽ phải thường xuyên kiểm tra xem trong hệ thống có những ứng dụng nào có thuộc tính SUID hoặc SGID mà không được sự quản lý của root không, nếu phát hiện được tập tin có thuộc tính SUID/SGID “ngoài luồng”, bạn có thể loại bỏ các thuộc tính này bằng lệnh:

# chmod a-s

PHẦN 3 (BÁO E-CHÍP SỐ 77, 09/3/2004)

11. Không để hệ thống tiết lộ thông tin qua dịch vụ truy cập từ xa Telnet

Trên tất cả các hệ điều hành, telnet là một dịch vụ tuy không xuất hiện công khai nhưng hầu như đều được cài đặt sẵn. Để mở telnet trên Windows, bạn chỉ đơn giản vào DOS Prompt (hoặc Command Prompt) rồi gõ lệnh telnet. Dịch vụ telnet cho phép truy xuất hệ thống từ xa (terminal). Vì thế, nó rất có khả năng tiết lộ những thông tin về hệ thống hoặc dễ dàng tạo điều kiện cho những kẻ phá hoại (hacker) tấn công dựa vào những điểm yếu phát hiện từ hệ thống. Quả thật không có gì là khó cả bởi khi một người dùng telnet kết nối từ xa vào dịch vụ telnet trên máy khác đều nhận được thông tin về tên máy, phiên bản hệ điều hành và cả phiên bản nhân (kernel) của máy chủ (hiển nhiên nếu nhân hệ thống không an toàn thì chắc chắn việc xâm nhập sẽ không còn gì để bàn nữa).

Nhằm tránh tạo ra những điều kiện không muốn có ấy, bạn cần thực hiện việc kích hoạt dịch vụ telnetd (Telnet Server) với tham số –h để ngăn không cho telnet tiết lộ các thông tin và chỉ in ra mỗi dấu nhắc “Login:” cho những người kết nối từ xa thông qua dịch vụ này. Do các phiên bản Red Hat 7.x khi chạy dịch vụ telnetd  không còn sử dụng inetd nữa mà sử dụng dịch vụ xinetd – một phiên bản nâng cấp và có nhiều cải tiến so với inetd, nên cách cấu hình lại telnetd sẽ khác nhau tùy theo phiên bản Red Hat đang sử dụng.

– Với các phiên bản Red Hat 6.x và trước đó, bạn thực hiện các bước sau:

    + Bạn sửa đổi trong tập tin /etc/inetd.conf dòng: “telnet stream tcp nowait root /usr/sbin/tcpdin.telnetd” thành “telnet stream tcp nowait root /usr/sbin/tcpdin.telnetd –h”

    + Sau đó khởi động lại dịch vụ inetd bằng câu lệnh: “/etc/rc.d/init.d/inetd restart”

– Với các phiên bản Red Hat 7.x, bạn thực hiện bước sau:

    Thêm tùy chọn “server_args = –h” vào trong tập tin /etc/xinetd.d/telnet. Cuối cùng, nội dung tập tin sẽ có dạng như sau:

service telnet
{
disable = yes
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
server_args = -h
}
 

    Kế đến khởi động lại dịch vụ xinetd bằng lệnh “/etc/rc.d/init.d/xinetd restart”.

12. Giới hạn việc sử dụng các dịch vụ không mã hóa thông tin trên đường truyền

Mặc dù bạn đã có cách ngăn không cho dịch vụ telnet tiết lộ những thông tin về hệ thống cho người dùng đăng nhập từ xa; nhưng tốt nhất, bạn nên tuyệt đối tránh việc sử dụng những dịch vụ kiểu như telnet, ftp (ngoại trừ dịch vụ fpt anonymous) vì những dịch vụ này hoàn toàn không hề có cơ chế mã hóa mật khẩu khi truyền thông tin qua mạng. Do đó bất kỳ một kẻ phá hoại nào cũng có thể dễ dàng “bắt cóc” được mật khẩu của bạn chỉ bằng những công cụ nghe lén đơn giản như sniffer chẳng hạn.

Trong những người hợp có thể, bạn nên sử dụng dịch vụ ssh thay thế cho cả ftp và telnet vì dịch vụ SSH (Secure Shell) dùng cơ chế mã hóa công khai để bảo mật thông tin, thực hiện việc mã hóa cho cả mật khẩu lẫn những thông tin truyền đi trên đường truyền. Gói phần mềm SSH hiện đang được sử dụng khá rộng rãi và được kèm chung trong hầu hết các phiên bản Linux gần đây. Các phiên bản Red Hat từ 7.0 trở lên đầu mặc định cài đặt phiên bản mã nguồn mở miễn phí OpenSSH (www.openssh.org).

Thêm nữa, bạn cũng không nên sử dụng những dịch vụ rsh, rcp và rlogin vì các dịch vụ này ngoài việc truyền mật khẩu không mã hóa, chúng còn thực hiện luôn việc kiểm tra quyền truy xuất dựa trên địa chỉ máy kết nối, đây là việc làm vô cùng nguy hiểm. Bởi nếu sử dụng kỹ thuật spoofing thì bất kỳ một kẻ phá hoại nào cũng có thể dễ dàng đánh lừa được cách kiểm tra này một khi giả mạo địa chỉ của máy truy xuất dịch vụ hợp lệ.

TRẦN ANH VŨ
(báo e-CHÍP)

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s