CHƯƠNG 8 - HDH Windows Linux PDF

Summary

This document details the maintenance, troubleshooting, monitoring, and security enhancement procedures for Linux/Unix operating systems. It covers updates, troubleshooting approaches, monitoring tools, remote administration tools, and security strengthening methods, along with shell scripting. The document also discusses backup and restoration strategies, error handling, security aspects, and administration tools.

Full Transcript

CHƯƠNG 8. BẢO TRÌ, KHẮC PHỤC LỖI, GIÁM SÁT HOẠT ĐỘNG VÀ TĂNG CƯỜNG BẢO MẬT TRÊN LINUX/UNIX Chương này giúp sinh viên làm quen với các nhiện vụ đảm bảo hệ thống hoạt động an toàn và ổn định. Mở đầu chương giới thiệu các cách thức giúp cài đặt các bản vá và cập nhật của hệ điều hành. Ph...

CHƯƠNG 8. BẢO TRÌ, KHẮC PHỤC LỖI, GIÁM SÁT HOẠT ĐỘNG VÀ TĂNG CƯỜNG BẢO MẬT TRÊN LINUX/UNIX Chương này giúp sinh viên làm quen với các nhiện vụ đảm bảo hệ thống hoạt động an toàn và ổn định. Mở đầu chương giới thiệu các cách thức giúp cài đặt các bản vá và cập nhật của hệ điều hành. Phần kế tiếp trình bày cách tiếp cận để xử lý sự cố trong quá trình vận hành hệ thống và các công cụ giúp theo dõi các chương trình và người dùng hoạt động trong hệ thống. Cuối cùng là các công cụ hỗ trợ quản trị từ xa, các phương pháp tăng cường bải mật cho hệ điều hành Linux/Unix và ngôn ngữ lập trình shell. 8.1 Cập nhật các bản vá Trong quá trình hoạt động và vận hành hệ thống, người quản trị liên tục phải tiến hành việc cập nhật các phần mềm ứng dụng cũng như hệ thống. Việc này cần thiết do các phần mềm đều có chu kỳ thay đổi nhất định. Khi này, các phần mềm thường sẽ được bổ sung các tính năng mới và sửa chữa những vấn đề mắc phải xuất hiện trong quá trình sử dụng. Ngoài ra, các hãng và công ty sản xuất phần mềm thường xuyên thực hiện các sửa chữa phần mềm nhằm đối phó với các lỗ hổng hay vấn đề tương thích với các phần mềm khác. Việc này nhằm giảm thiểu các rủi ro về an toàn và bảo mật cho chương trình và đảm bảo các phần mềm hoạt động ổn định. Ở góc độ kỹ thuật, việc quản lý các thay đổi phần mềm trong Linux/Unix có thể được thực hiện từ: ▪ Mã nguồn: đây là cách thức truyền thống. Người dùng thực hiện việc biên dịch và cài đặt phần mềm theo các hướng dẫn đi kèm trong gói phần mềm cập nhật. ▪ Gói quản lý phần mềm RPM (Redhat Package Manager): đây là công cụ quản lý phần mềm phổ biến cho các phiên bản Linux dựa trên RedHat ▪ Hệ thống quản lý phần mềm DPMS (Debian Package Management System): dùng cho các phiên bản Linux dựa trên Debian. Việc sử dụng mã nguồn cho việc cập nhật đòi hỏi người quản trị có hiểu biết chắc chắn về các thư viện mà bản cập nhật sẽ sử dụng như vị trí lưu trữ và việc chia sẻ với các phần mềm khác. Mặt khác, người quản trị cũng cần nắm vững cách thức cấu hình cho việc biên dịch và cài đặt. Các thông tin này thường được nhúng trong file make. Trong khi cài đặt, người quản trị sẽ phải đối phó với tình huống như mã nguồn bị lỗi hay thiếu thư viện làm cho việc biên dịch không thành công. Gói quản lý phần mềm như RPM hay DPMS giảm thiểu gánh nặng cho người quản trị và làm cho quá trình cập nhật được dễ dàng và thuận tiện hơn. DPMS cung cấp câu lệnh dpkg cho phép người dùng Linux nắm được các phần mềm đã được cài đặt cũng như thực hiện các thao tác cài đặt phần mềm: ▪ Liệt kê các gói phần mềm được cài đặt: dpkg –l ▪ Liệt kê các file được cài đặt bỏi một gói phần mềm: dpkg –L phần_mềm ▪ Liệt kê gói phần mềm cài đặt file dpkg –S /etc/hosts.conf ▪ Cài đặt gói phần mềm: sudo dpkg –i phần_mềm.deb ▪ Gõ bỏ gói phần mềm: sudo dpkg –r phần_mềm Mặt khác, người dùng Ubuntu có thể tương tác với các gói phần mềm được quản lý trên nền dpkg. Người dùng Ubuntu có thể sử dụng các câu lệnh sau thể quản lý việc cập nhật các phần mềm: ▪ Cài đặt gói phần mềm: sudo apt-get install phần_mềm ▪ Gõ bỏ phần mềm: sudo apt-get remove phần_mềm ▪ Cập nhật thông tin về kho phần mềm: sudo apt-get update ▪ Nâng cấp gói phần mềm: sudo apt-get upgrade Ngoài giao diện dòng lệnh, người dùng Ubuntu có thể thực hiện việc cập nhật và sửa đổi các phần mềm qua giao diện đồ họa của Trung tâm phần mềm Ubuntu (Ubuntu Software Center). Hình 8-1. Trung tâm phần mềm Ubuntu Để thuận tiện cho người quản trị, các phần mềm có thể được cài đặt cho việc tự động cập nhật hay cảnh bảo cho người dùng về các bản sửa chữa hay cập nhật mới như trong hình dưới đây. Hình 8-2. Lựa chọn tự động hóa cập nhật Qua giao diện, người có thể lựa chọn các phần cập nhật theo mức độ quan trọng của bản cập nhật, thực hiện việc kiểm tra theo các chu kỳ khác nhau như ngày hay tuần cũng như cách thức thông báo về các bản cập nhật. 8.2 Sao lưu và khôi phục dự phòng Thực hiện sao lưu là trách nhiệm tối quan trọng đối với bất kỳ người dùng thông thường và đặc biệt với quản trị hệ thống. Khi tiến hành sao lưu người quản trị cần quan tâm tới một số vấn đề sau: ▪ Khối lượng dữ liệu. Đây luôn là thách thức với người quản trị do nhu cầu và tình hình phát triển của cơ quan/tổ chức mà khối lượng dữ liệu biến động. Ngoài ra tần suất và khối lượng biến động dữ liệu có thể thay đổi tùy theo thời điểm hoạt động. Mặt khác tính chất của dữ liệu cũng là vấn đề khó khăn khi thực hiện sao lưu như dữ liệu cá nhân hay của nhóm, dữ liệu có nén hay không. ▪ Phần cứng và phương tiện sao lưu. Tính chất vật lý của các phương tiện sao lưu ảnh hưởng tối quyết định hay tổ chức thực hiện sao lưu. Các đĩa DVD hay Bluray có chi phí thấp song tuổi thọ ngắn; Ổ cứng hay ổ đĩa theo kiểu RAID có tốc độ cao song chi phí cao hơn; Các ổ đĩa mạng lệ thuộc vào hạ tầng mạng. ▪ Năng lực (băng thông) mạng. Để đảm bảo băng thông chung của hệ thống khi sao lưu không nên sao lưu hai máy tính trong cùng một phân đoạn mạng. ▪ Tốc độ và khả năng khôi phục dữ liệu. Sao lưu vào ổ cứng cho tốc độ cao hơn so với các phương tiện lưu trữ tháo lắp như đĩa DVD. Tuy nhiên với các thao tác như khôi phục phần mềm hệ thống như hệ điều hành của máy tính thì việc thực hiện trên đĩa DVD lại thuận tiện hơn. Thêm vào đó, người dùng bình thường cũng sẽ dễ dàng sử dụng đĩa DVD hơn là ổ cứng. Từ dòng lệnh người quản trị có thể dùng lệnh dump và restore để thực hiện việc sao lưu/khôi phục toàn bộ hệ thống file Linux. Lệnh dump thực hiện sao lưu tăng dần và sử dụng tham số cấp độ sao lưu từ 0 đến 9 như sau: ▪ Cấp 0: sao lưu toàn bộ ▪ Cấp 1: sao lưu bổ sung so với cấp 0 ▪ Cấp 9: cấp cao nhất Thông tin về các file sao lưu ghi trong file /etc/dumpdates cho biết thông tin về các file sao lưu của hệ thống. Dưới đây là câu lệnh sao lưu toàn bộ phân vùng của ổ đĩa vật lý thứ nhất vào ổ đĩa vật lý thứ hai: dump -0 –f /dev/sdb1 /dev/sda1 Lệnh restore đọc file tạo ra từ phần mềm dump và trích ra các file và thư mục tùy theo tham số được sử dụng. Các tham số tiêu biểu như sau ▪ -i: Chế độ tương tác. Phần mềm cung cấp giao diện cho phép người quản trị lựa chọn thư mục và file để khôi phục ▪ -r: Khôi phục lại hệ thống file ▪ -f tên_file: Đọc từ file sao lưu ▪ -v: Hiển thị kết quả khôi phục Khôi phục file và thư mục được thực hiện qua câu lệnh restore –ivf /dev/sdb1. Hay để khôi phục lại hệ thống file, người quản trị sử dụng câu lệnh restore –rf /dev/sdb1. Ngoài câu lệnh, người dùng Ubuntu có thể sử dụng phần mềm sao lưu và khôi phục qua giao diện đồ họa như trong hình dưới đây. Hình 8-3. Giao diện đồ họa cho việc sao lưu và khôi phục Thông qua giao diện, người dùng có thể xác định nội dung cần được sao lưu cũng như thực hiện việc sao lưu tới các ổ đĩa cục bộ cũng như qua mạng. Nội dung sao lưu có thể được bảo vệ qua việc sử dụng mật khẩu. Việc sao lưu có thể được tiến hành tự động theo thời gian người dùng xác định. Ngoài ra, còn có các bộ phần mềm sao lưu và khôi phục với các tính năng đa dạng và phong phú khác hoạt động trên môi trường Linux. AMANDA (Advanced Maryland Automatic Network Disk Archiver) là hệ thống sao lưu cho phép dùng một máy chủ sao lưu để sao lưu nhiều máy qua mạng vào ổ đĩa hay băng từ hay ổ quang. Dirvish là hệ thống sao lưu ra đĩa cứng viết bằng ngôn ngữ Perl sử dụng tiện ích sao lưu của Linux. Hệ thống này thuận tiện cho việc tự động hóa sao lưu và dễ dàng khôi phục lại và thích hợp cho việc sao lưu file và thư mục. Hình 8-4. Giao diện màn hình làm việc chính BackupPC BackupPC hỗ trợ sao lưu cho Linux ra ổ cứng trên máy chủ sử dụng giao diện Web. BackupPC cho phép sao lưu file và thư mục. Để tăng khả năng sao lưu, BackupPB sử dụng giải pháp nén đĩa để tăng khả năng sao lưu. 8.3 Khắc phục các sự cố Trong quá trình cài đặt và vận hành hệ thống Linux/Unix, người quản trị có thể gặp phải nhiều vấn đề khiến cho việc triển khai phần mềm không được thuận lợi. Để hạn chế tình trạng này và giúp cho việc khắc phục, người quản trị cần có kế hoạch triển khai đầy đủ và rõ ràng. Tuy nhiên, khi xảy ra tình trạng lỗi cần ghi nhận tình trạng lỗi một cách đầy đủ nhất bằng cách đơn giản như dùng trình soạn thảo văn bản hay chép màn hình để ghi lại các thông báo lỗi hay các cảnh báo của hệ thống và các phần mềm. Ngoài ra, người quản trị có thể tìm kiếm thông tin về tình trạng hoạt động trong các file nhật ký. Các file này thường được lưu trữ trong thư mục /var/log. Với mỗi ứng dụng cụ thể, người quản trị đều có thể yêu cầu chương trình ghi lại tình trạng hoạt động với các mức độ khác nhau. Người quản trị có thể sửa đổi cấu hình này để kiểm tra nguyên nhân khi chương trình hoạt động không ổn định. Bên cạnh đó, quá trình sử dụng của người dùng cũng thường được lưu lại trong các file như.bash_history và.xsession. Các file này cung cấp thông tin cụ thể về phiên làm việc của người dùng. Sau khi có thông tin về tình trạng lỗi, người quản trị có thể tìm kiếm giải pháp xử lý thông qua các trang mạng của nhà sản xuất như help.ubuntu.com hay các trang cộng đồng. Các trang này thường được cập nhật và cung cấp các biện pháp xử lý một cách liên tục. Sau khi lựa chọn giải pháp, người quản trị cần lên chi tiết các bước thực hiện nhằm tránh tình trạng gây hư hỏng thêm và không thẩm tra được việc sửa chữa và khắc phục lỗi. Đĩa cài Ubuntu cung cấp công cụ cho phép kiểm tra. Công cụ này cho phép người quản trị truy nhập tạm thời vào hệ thống file và thực hiện một số thao tác kiểm tra và sửa lỗi cơ bản như lỗi lô-gíc của hệ thống file, cập nhật lại gói phần mềm bị lỗi, khởi động hệ thống ở chế độ tối thiểu… như trong hình 8-5. Hình 8-5. Các chức năng khắc phục lỗi cơ bản 8.4 Giám sát hoạt động và kiểm toán Với dịch vụ máy chủ, điều quan trọng với người quản trị là duy trì tình trạng hoạt động ổn định. Tuy nhiên, trong quá trình vận hành các dịch vụ máy chủ sẽ có thể bị trục trặc và tạm dừng. Khi việc này sẽ hay sắp xảy ra, người quản trị cần phải được cảnh báo hay dự đoán trước để có biện pháp xử lý. Các công cụ giám sát và kiểm toán không chỉ giúp người quản trị được thông báo kịp thời về tình trạng chung của hệ thống mà còn có thông tin chính xác để khắc phục hay giúp cho các dịch vụ và hệ thống hoạt động được đảm bảo hơn. 8.4.1 Giám sát Các file nhật ký cung cấp thông tin về tình trạng hoạt động chung của các dịch vụ và hệ thống máy chủ và được lưu trong thư mục “var/log/” như ▪ syslog: nhật ký về hoạt động chung của hệ thống ▪ mail: nhật ký về hệ thống thư điện tử Dưới đây là ví dụ về thông tin lưu trong file nhật ký hệ thống. Hình 8-6. Nhật ký hệ thống Bên cạnh đó Linux/Unix cung cấp một số công cụ cho phép theo dõi tình trạng sử dụng các tài nguyên hệ thống của các chương trình và dịch vụ qua các câu lệnh: ▪ ps: liệt kê các chương trình đang hoạt động và số lượng tài nguyên hệ thống chúng sử dụng ▪ df: cho biết dung lượng lưu trữ đã được sử dụng trong hệ thống ▪ netstat: cho biết thông tin về các cổng và các giao thức mạng đang hoạt động của hệ thống Hình 8-7. Kết quả của câu lệnh netstat Ngoài ra, sysstat là công cụ giám sát hiệu năng tốt cho môi trường Linux. Công cụ này cho phép ghi lại các thống kê tình trạng hệ thống tiêu biểu như : ▪ Tải của bộ xử lý ▪ Thao tác vào/ra và tốc độ truyền theo từng chương trình, ổ đĩa, kết nối mạng... ▪ Sử dụng bộ nhớ và bộ nhớ hoán đổi ▪ Bộ nhớ ảo, lỗi trang ▪ Sử dụng mạng Bộ công cụ sysstat cung cấp các tiện ích để thực hiện các thao tác giám sát cụ thể như ▪ iostat: lập báo cáo thống kê về bộ xử lý, các thiết bị vào ra và hệ thống file mạng ▪ mpstat: lập báo cáo chung hay riêng rẽ về các bộ xử lý ▪ pidstat: lập báo cáo về các công việc được thực thi của Linux. ▪ sar: thu thập, lập báo cáo và ghi lại các thông tin về hoạt động của hệ thống ▪ sa2: lập báo cáo hàng ngày về hoạt động của hệ thống ▪ sadf: hiển thị dữ liệu thu thập bởi sar theo các định dạng khác nhau Để cài đặt công cụ này, người quản trị cần sử dụng câu lệnh sudo apt-get install sysstat và sudo dpkg-reconfigure sysstat để cấu hình. Để lấy thông tin về các thao tác vào/ra, người quản trị có thể sử dụng câu lệnh sar –b. Kết quả của câu lệnh cho biết tốc độ trao đổi dữ liệu tính theo giao dịch (đọc hay ghi) và tốc độ tính theo đơn vị dữ liệu trên giây như trong hình dưới đây. Hình 8-8. Thống kê vào/ra đĩa 8.4.2 Kiểm toán Việc kiểm toán hệ thống cho phép người quản trị thực hiện các nhiệm vụ tiêu biểu như sau: ▪ Theo dõi truy nhập file và thay đổi ▪ Giám sát các lời gọi và chức năng hệ thống ▪ Phát hiện các bất thường như các tiến trình bị hỏng/ngưng. ▪ Các câu lệnh thực hiện bởi người dùng Mục tiêu cơ bản của việc kiểm toán là đảm bảo hệ thống được vận hành một cách an toàn, giảm thiểu các rủi ro, và ứng phó một cách hữu hiệu khi có trục trặc xảy ra. Bộ công cụ auditd cho phép người quản trị thực hiện các thao tác kiểm toán trong môi trường Linux và được cài đặt thông qua câu lệnh sudo apt-get install auditd. Bộ công cụ này cung cấp các tiện ích như sau ▪ auditd: dịch vụ ghi nhận các sự kiện (file log) ▪ auditctl: công cụ cấu hình auditd ▪ aureport: công cụ báo cáo từ file log ▪ ausearch: xem các sự kiện ▪ ausyscall: cho biết ID lời gọi hệ thống và tên ▪ audit.rules: các luật kiểm toán ▪ autrace: kiểm tra vết của chương trình ▪ auditd.conf: file cấu hình Việc giám sát các thao tác được thực hiện thông việc xây dựng các luật từ người quản trị và đưa vào trong hệ thống auditd qua file cấu hình hoặc tiện ích auditctl. Dưới đây là một số tình huống cụ thể. Giám sát các thay đổi trong việc truy nhập file và thư mục. Câu lệnh thiết lập các luật việc giám sát các thay đổi ở file passwd là sudo auditctl -w /etc/passwd -p rwxa trong đó các tham số có ý nghĩa như sau ▪ -w đường_dẫn: thêm vào danh sách theo dõi file được mô tả trong đường dẫn ▪ -p: các kiểu truy nhập cần được giám sát gồm có r: đọc, w: ghi, x: thực thi, a: thuộc tính Để giám sát thư mục, người quản trị sử dụng câu lệnh sudo auditctl -w /var/www/html. Tại bất kỳ thời điểm nào, người quản trị có thể theo dõi các giám sát đã được thiết lập thông qua câu lệnh sử dụng đặc quyền như trong hình dưới đây. Hình 8-9. Danh sách các luật đã thiết lập Khi muốn xem các truy nhập đã được thực hiện tới các đối tượng chịu giám sát, người quản trị sử dụng tiện ích ausearch. Với luật giám sát lên file passwd, người quản trị xem các truy nhập qua câu lệnh sudo ausearch –f /etc/passwd. Kết quả như trong hình dưới đây. Hình 8-10. Thông tin truy nhập vào file chịu giám sát Các thông tin cơ bản về truy nhập bao gồm: ▪ time: thời điểm ghi nhận ▪ name: tên đối tượng theo dõi ▪ cwd: thư mục hiện thời ▪ syscall: lời gọi hệ thống ▪ auid: định danh người dùng ▪ comm: câu lệnh Giám sát các tiến trình. Người quản trị thực hiện giám sát các chương trình (lệnh) của Linux qua câu lệnh sudo autrace –r /bin/ls. Câu lệnh này theo dõi việc thực hiện câu lệnh ls. Tùy theo nhu cầu quản trị, người quản trị có thể đặt các giám sát với các chương trình và lệnh khác nhau của hệ thống. Cũng giống như giám sát các file, người quản trị dùng ausearch để xem các thông tin cụ thể về việc sử dụng các chương trình này. Báo cáo giám sát. Tiện ích aureport thực hiện việc sinh ra các báo cáo từ các file nhật ký của dịch vụ giám sát auditd thông qua việc sử dụng các câu lệnh như sau: ▪ sudo aureport: báo cáo tóm tắt ▪ sudo aureport –au: báo cáo về việc xác thực ▪ sudo aureport –m: báo cáo về các thay đổi tài khoản ▪ sudo aureport –u: báo cáo về người dùng ▪ sudo aureport –n: báo cáo về các bất thường Hình dưới đây thể hiện báo cáo về việc kiểm tra xác thực với người dùng. Trong một số tình huống, người dùng đã xác thực không thành công. Hình 8-11. Thông tin về việc xác thực người dùng Bên cạnh auditd, NAGIOS là bộ phần mềm mã nguồn mở, được thiết kế để chạy trên nền Linux, cho phép giám sát hạ tầng hệ thống và mạng. Quan trọng hơn, NAGIOS cung cấp dịch vụ giám sát và cảnh báo tình trạng hoạt động của các máy chủ, bộ chuyển mạch, các ứng dụng và dịch vụ. Về cơ bản, NAGIOS cho phép: ▪ Giám sát các dịch vụ mạng SMTP, POP3, SSH, HTTP, SNMP ▪ Giám sát các tài nguyên trên máy trạm (CPU, ổ cứng) ▪ Giám sát bằng cách chạy các đoạn mã từ xa thông qua bộ thực thi từ xa Nagios Remote Plugin Executor ▪ Hỗ trợ người dùng lập trình các dịch vụ kiểm tra theo yêu cầu riêng bằng C++, PHP, Perl,.. Hình 8-12. Các bộ phận NAGIOS Các bộ phận cấu thành NAGIOS gồm có: ▪ NRPE (Nagios Remote Plugin Executor): cho phép giám sát các hệ thống ở xa bằng các đoạn mã cài trên hệ thống ở xa. NRPE cho phép chạy các đoạn mã thêm vào của Nagios trên hệ thống ở xa để giám sát các tài nguyên của hệ thống như CPU, ổ đĩa, người dùng. ▪ NRDP (Nagios Remote Data Processor): cung cấp cách thức xử lý và truyền dữ liệu mềm dẻo. NRDP sử dụng giao thức tiêu chuẩn http và xml để truyền và đóng gói dữ liệu. ▪ NSClient+++: chủ yếu dùng giám sát các máy chạy Windows ▪ N2RRD (Nagios to Round Robin Database): lưu dữ liệu từ các phần mềm theo dõi Nagios vào cơ sở dữ liệu. Cài đặt NAGIOS gồm các gói dịch vụ nagios, nagios-nrpe-plugin và nagios-nrpe- server. Trên máy chủ dùng để giám sát toàn bộ hệ thống cần ngaios và nagios-nrpe- plugin. Trên máy chủ dịch vụ cần giám sát cần nagios-nrpe-server. Việc sử dụng NAGIOS giúp cho việc giám sát và kiểm toán được thuận tiện hơn nhờ có giao diện qua Web và người dùng quản trị có thể lựa chọn các cách thức biểu diễn dữ liệu giám sát mềm dẻo. 8.5 Giới thiệu các công cụ quản trị từ xa Trong nhiều trường hợp người quản trị cần thực hiện các công việc quản trị với các máy trạm hay các máy chủ dịch vụ từ xa do sự cách biệt vật lý với vị trí của người quản trị. Các công cụ quản trị từ xa phổ biến trong môi trường Linux có thể kể đến: OpenSSH, Puppet và Zentyal. OpenSSH là gói phần mềm được cung cấp miễn phí dựa trên bộ giao thức Secure Shell (SSH) cho phép điều khiển và truyền file một cách an toàn giữa các máy tính. OpenSSH giúp làm thuận tiện việc điều khiển máy tính từ xa được an toàn và bảo mật nhờ sử dụng cơ chế mã hóa công khai và giữ bí mật khóa phiên làm việc. Puppet là bộ phần mềm hoạt động trên nhiều hệ thống (Windows và Linux) hỗ trợ việc quản trị cấu hình hệ thống do Puppet Labs cung cấp. Puppet sử dụng ngôn ngữ mô tả riêng để quản lý cấu hình hệ thống. Các thông tin về cấu hình của các thiết bị được lưu trữ kiểm tra trong quá trình hoạt động giúp thuận tiện cho việc triển khai và quản trị. Để triển khai việc quản trị, người quản trị cần thực hiện 4 bước căn bản như trong hình dưới đây. Hình 8-13. Các bước thực hiện quản trị Pupet Sử dụng Puppet cho phép người quản trị xác định trạng thái mong muốn của hệ thống, mô phỏng việc thay đổi trạng thái (cấu hình) trước khi thực sự triển khai các thay đổi này, thực hiện việc thay đổi một cách tự động và sau đó báo cáo sự khác biệt giữa hai trạng thái (cấu hình). Trạng thái mong muốn được xác định trên máy chủ Puppet và các tác tử phần mềm Puppet được cài đặt trên các máy trạm hay máy chủ được giám sát sẽ tải về và thực hiện việc thay đổi trạng thái. Để cài đặt máy chủ Puppet cần cài qua câu lệnh sudo apt-get install puppetmaster còn phần mềm tác tử chạy trên máy được giám sát được cài đặt qua câu lệnh sudo apt-get install puppet. Zentyal là bộ phần mềm máy chủ cung cấp nhiều chức năng như quản trị hạ tầng, máy chủ văn phòng, máy chủ thông tin v.v. Bộ phần mềm này cung cấp giao diện đồ họa qua web giúp việc quản trị được dễ dàng và thuận tiện. Zentyal cung cấp các mô-đun chức năng như sau: ▪ zentyal-core & zentyal-common: cung cấp các chức năng giao tiếp thiết yếu và thư viện dùng chung cho bộ phần mềm bao gồm mô-đun lưu trữ log và sự kiện. ▪ zentyal-network: quản lý cấu hình mạng từ các giao tiếp mạng đến các máy chủ cổng (gateway). ▪ zentyal-objects & zentyal-services: cung cấp lớp trừu tượng hóa địa chỉ mạng và tên cổng. Nói cách khác, mô-đun này cho phép diễn giải các tài nguyên mạng thân thiện với người dùng: cổng 80 -> dịch vụ web. ▪ zentyal-dns & zentyal-dhcp: cấu hình DNS và DHCP. ▪ zentyal-users: cho phép quản lý người dùng và nhóm. ▪ zentyal-printers: cho phép quản lý máy in và người dùng máy in. ▪ zentyal-antivirus: tích hợp phần mềm chống mã độc. Để cài đặt người quản trị sử dụng câu lệnh sudo apt-get install. 8.6 Tăng cường bảo mật trên Linux/Unix Hiện nay, các cuộc tấn công hoặc phát hiện các lỗ hổng bảo mật mới trên các hệ điều hành xuất hiện ngày càng nhiều. Những cuộc tấn công mới này thường có hai loại đó là khai thác lỗ hổng thông qua mạng hoặc khai thác lỗ hổng cục bộ. Trong phần này chúng ta sẽ xem xét hai phương pháp bảo mật trên Linux để có thể chống lại những cuộc tấn công đó: bảo mật cục bộ (local security) và bảo mật mạng (network security). 8.6.1 Bảo mật cục bộ Bảo mật cục bộ hướng đến vấn đề của các cuộc tấn công đòi hỏi kẻ tấn công có khả năng làm được gì đó trên hệ thống với mục đích leo thang đặc quyền. Bảo mật là giảm thiểu rủi ro Bảo mật là giảm thiểu rủi ro tuy nhiên việc giảm thiểu rủi ro thì tỉ lệ thuận với chi phí bỏ ra. Người quản trị sẽ cần làm hài hòa giữa chi phí làm giảm thiểu rủi ro và những hậu quả khi bị tấn công. Trong phần này, ta xem xét các nguồn rủi ro phổ biến và có thể làm gì để giảm thiểu những rủi ro đó. SetUID Programs: là các chương trình thực thi mà trong quyền của chúng có thuộc tính đặc biệt (nằm trong bit cờ - flag) cho phép người dùng chạy với quyền cao hơn trong khi không cần sự cho phép của người quản trị. Ví dụ chương trình “ping” là chương trình kiểm tra kết nối mạng giữa hai máy do đó nó cần tạo gói tin ICMP để gửi. Tuy nhiên việc tạo gói tin này cần có sự cho phép của người quản trị do việc tạo gói tin này có thể cho phép đưa vào ứng dụng các nội dung gây hại. Mặc dù vậy, người dùng bình thường vẫn có thể sử dụng chương trình “ping” và nó được gọi là “SetUID root”. Do đó, quản trị viên cần phải hạn chế tối đa các chương trình SetUID root trên hệ thống. Nếu buộc phải chạy ứng dụng SetUID root thì có thể xem xét giải phải thay thế là chạy ứng dụng trong môi trường chroot. Tìm kiếm và tạo các chương trình SetUID: Một chương trình SetUID có một thuộc tính chương trình đặc biệt mà kernel sử dụng để xác định xem nó có ghi đè các quyền mặc định được cấp cho một ứng dụng hay không. Sử dụng câu lệnh liệt kê danh sách đơn giản ls –l ta có thể thấy quyền này (hình 8-14): Hình 8-14. Các quyền của một chương trình Nếu ký tự thứ tư trong trường quyền là s, thì ứng dụng là SetUID. Nếu chủ sở hữu là root, thì ứng dụng là SetUID root. Để xác định xem một quy trình (process) đang chạy có phải là SetUID hay không, có thể sử dụng lệnh ps để xem cả người dùng thực (actual user – người dùng đã tạo ra quy trình) của quy trình và người dùng hiệu quả (effective user – người dùng được xác định bởi bit SetUID) của quy trình đó, như hình 8-15. Hình 8-15. Sử dụng câu lệnh “ps” liệt kê thông tin Kết quả câu lệnh sẽ cho ra tất cả các chương trình đang chạy với ID quy trình (pID), effective user (euser), real user (ruser) và command name (comm). Nếu “euser” khác “ruser” thì nó là một chương trình SetUID. Để đặt một chương trình trở thành SetUID ta sử dụng câu lệnh chmod. Ví dụ câu lệnh sau sẽ đặt chương trình tên là “myprogram” trở thành SetUID root: Hình 8-16. Đặt tên và đặt SetUID root cho thư mục mới mở - Các tiến trình không cần thiết: Khi chạy hệ thống máy chủ cần phải giảm số lượng các tiến trình đang chạy nhằm tăng cường sự ổn định hệ thống, giảm mức tiêu thụ tài nguyên, hạn chế số lượng lỗ hổng có thể có trên các chương trình không cần thiết nhưng vẫn được khởi chạy. Ví du: tắt dịch vụ in nếu không có lý do gì để máy chủ kết nối với máy in; tắt thành phần máy chủ thư nếu không có lý do gì để máy chủ nhận hoặc gửi e- mail; tắt xinetd nếu không có dịch vụ nào được chạy từ xinetd; nếu người dùng không có máy in, cần tắt dịch vụ Common UNIX Printing System (CUPS); nếu máy chủ không phải là một máy chủ tập tin, cần phải tắt Hệ thống tệp mạng (NFS) và Samba. Tóm lại, để đảm bảo an toàn, máy chủ phải chạy ở mức tối thiểu cần thiết để cung cấp các dịch vụ của nó. a. Tài khoản người dùng cho các thiết bị khác (Nonhuman User Accounts) Tài khoản người dùng trên máy chủ không phải lúc nào cũng tương ứng với người dùng thực tế. Mọi tiến trình chạy trên hệ thống Linux đều phải có chủ sở hữu. Để một ứng dụng bỏ quyền root, nó phải có khả năng chạy với tư cách người dùng khác. Đây là lúc những người dùng bổ sung khác phát huy tác dụng: Mỗi ứng dụng từ bỏ quyền root của nó có thể được chỉ định một hồ sơ người dùng chuyên dụng (và ít đặc quyền hơn) khác trên hệ thống. Người dùng khác này thường sở hữu tất cả các tệp của ứng dụng (bao gồm tệp thực thi, thư viện, cấu hình và dữ liệu) và các quy trình của ứng dụng. Nếu thiết lập cho các ứng dụng không có đặc quyền sử dụng người dùng của riêng mình, thì nguy cơ ứng dụng bị tấn công có quyền truy cập vào các tệp cấu hình ứng dụng khác sẽ được giảm đi. Về bản chất, kẻ tấn công bị giới hạn bởi những tệp mà ứng dụng bị tấn công có thể truy cập. b. Giới hạn tài nguyên Trong Lunix, tiện ích ulimit có thể sử dụng để kiểm soát tốt hơn các tài nguyên có sẵn cho các quy trình được khởi động bởi vỏ (shell). Tệp cấu hình của tiện ích này nằm ở /etc/security/limits.conf. Các tùy chọn ulimit có thể được sử dụng để kiểm soát những thứ như số lượng tệp có thể được mở, chúng có thể sử dụng bao nhiêu bộ nhớ, chúng có thể sử dụng bao nhiêu thời gian CPU, chúng có thể mở bao nhiêu quy trình,… Khi khởi động các cài đặt được đọc bởi PAM (Pluggable Authentication Module). Một ví dụ việc phải hạn chế sử dụng tài nguyên là một chương trình mang tên “The Fork Bomb”. Đây là một chương trình chỉ đơn giản là tạo ra quá nhiều quy trình đến mức và khiến hệ thống ngừng hoạt động. Đối với máy người dùng điều này chỉ gây phiền nhiễu. nhưng đối với một máy chủ sản xuất, nó có thể thiệt hại lớn. The Fork Bomb dựa trên shell đơn giản sử dụng Bourne Again Shell (Bash): [yyang@server ~]$ while true; do sh -c sh & done Nếu máy chủ không có các biện pháp bảo vệ, đoạn mã này sẽ làm sập máy chủ. Format của mỗi dòng trong /ect/security/limets.conf là: Những dòng bắt đầu bằng “#” là dòng comment. Giá trị “domain” chứa tên đăng nhập của một người dùng hoặc một nhóm người dùng, hoặc sử dụng ký tự đại diện “*”. Giá trị “type” là loại giới hạn: “soft” hay “hard”. Trong trường “item” sẽ là cái gì sẽ bị giới hạn. Bảng sau mô tả mẫu cho vài item: Bảng 8-1. Mô tả các giá trị tại trường “item” Item Mô tả Giá trị chung mặc định fsize Kích thước lớn nhất của Không giới hạn tệp nofile Số lượng lớn nhất tệp được Không giới hạn mở cpu Suố lượng lớn nhất về thời Không giới hạn ginan mà CPU được sử dụng nproc Số lượng lớn nhất tiến trình Không giới hạn mà một người dùng có thể sử dụng maxlogins Số lần đăng nhập lớn nhất Không giới hạn của một người dùng. c. Giảm thiểu rủi ro chroot Lệnh gọi hệ thống chroot() (phát âm là “cha-root”) cho phép một tiến trình và tất cả các tiến trình con của nó thay đổi thư mục gốc đang hoạt động. Các chương trình (gói phần mềm) trên hệ thống Unix/Linux muốn chạy được cần phải gọi đến các chương trình khác đã được cài đặt trên hệ thống gọi là các gói phụ thuộc và các thư viện cần thiết phục vụ cho việc chạy chương trình đó. Như vậy khi thay đổi môi trường làm việc cho một chương trình (thay đổi đường dẫn đến một chương trình) thì chương trình đó chỉ chạy được trong môi trường đã được thay đổi và không thể gọi đến các chương trình khác hoặc các thư viện khác ở ngoài thư mục đang chứa chương trình đó. Môi trường đã được thay đổi cho một chương trình được gọi là một nhà tù chroot. Ý nghĩa của việc sử dụng chroot có thể coi là “nhà tù hóa” các dịch vụ có tính bảo mật kém trên hệ thống, tương tự như khái niệm “sandbox” trong đó 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. Nếu kẻ tấn công vào một chương trình đã được “giam” (chroot) trên hệ thống (/chroot/), kẻ tấn công chỉ có quyền hạn làm bất kỳ việc gì trong thư mục đã được chroot và không thể vượt ra ngoài thư mục chroot. Như vậy chương trình có thể bị tấn công nhưng hệ thống của chúng ta không bị ảnh hưởng và vẫn hoạt động bình thường. Tuy nhiên, môi trường chroot chỉ chống lại việc truy cập các tệp bên ngoài thư mục, nhưng nó không chống lại được việc sử dụng hệ thống, truy cập bộ nhớ, truy cập kernel và giao tiếp giữa các quá trình. Có nghĩa là nếu có lỗ hổng bảo mật mà kẻ tấn công có thể lợi dụng bằng cách gửi tín hiệu đến một quy trình khác, thì họ có thể khai thác lỗ hổng đó từ bên trong môi trường chroot. SELinux Bảo mật Linux truyền thống dựa trên mô hình Kiểm soát truy cập tùy quyền (Discretionary Access Control - DAC). Mô hình DAC cho phép chủ sở hữu tài nguyên (đối tượng) quyết định người dùng hoặc nhóm (đối tượng) nào có thể truy cập tài nguyên. Mô hình này được gọi là "tùy quyền" vì quyền kiểm soát truy cập dựa trên quyết định của chủ sở hữu. Một loại mô hình bảo mật khác là mô hình Kiểm soát truy cập bắt buộc (Mandatory Access Controls - MAC). Không giống như mô hình DAC, mô hình MAC sử dụng các chính sách được xác định trước để kiểm soát các tương tác của người dùng và quá trình. Mô hình MAC hạn chế mức độ kiểm soát mà người dùng có đối với các đối tượng mà họ tạo ra. SELinux (Security-Enhanced Linux) là một triển khai của mô hình MAC, được xây dựng trong Linux kernel và được kích hoạt mặc định trên Fedora, CentOS, RHEL và một vài bản phân phối Linux khác. Đây là cơ chế bảo mật nhiều mức (multiple level). Được dùng để bảo vệ một khối lượng dữ liệu lớn cần được bảo mật cao trong một môi trường mà các dữ liệu và người dùng đều có thể được phân loại rõ ràng. SElinux được phát triển bởi Cơ quan An ninh Quốc gia (NSA) của chính phủ Hoa Kỳ nhằm chống lại các mối lo ngại ngày càng tăng về các cuộc tấn công an toàn thông tin. Ngày nay, Linux trở thành hệ điều hành phổ biến tại các doanh nghiệp, do đó NSA bắt đầu tạo ra một tập hợp các bản vá để tăng tính bảo mật của Linux. Tất cả các bản vá đã được phát hành theo Giấy phép Công cộng GNU (GPL) với mã nguồn đầy đủ và do đó chịu sự giám sát kỹ lưỡng. Các bản vá được gọi chung là “SELinux”. Các bản vá đã được tích hợp vào nhân Linux bằng cách sử dụng khung Mô-đun bảo mật Linux (LSM- Linux Security Modules). Sự tích hợp này đã làm cho các bản vá lỗi và cải tiến trở nên sâu rộng và mang lại lợi ích tổng thể cho cộng đồng Linux. SELinux sử dụng các khái niệm về chủ thể (subjects): người dùng (users), ứng dụng (applications), quy trình (processes)…, đối tượng (objects): tệp (files) và sockets, nhãn (labels): siêu dữ liệu được áp dụng cho đối tượng, and chính sách (policies): mô tả ma trận quyền truy cập cho chủ thể và đối tượng. Với mức độ chi tiết cực cao của các đối tượng, có thể thể hiện các quy tắc phong phú và phức tạp, điều khiển mô hình bảo mật và hành vi của hệ thống Linux. Vì SELinux sử dụng nhãn nên nó yêu cầu một hệ thống tệp hỗ trợ các thuộc tính mở rộng. SELinux chạy ở 3 chế độ khác nhau bao gồm: Enforcing (thi hành), Permissive (cho phép) và Disabled (vô hiệu hóa). - Enforcing: Đây là chế độ mặc định sẽ cho phép và thực thi các chính sách bảo mật của SELinux trên hệ thống, từ chối các hành động truy cập và ghi nhật ký. Trong chế độ Enforcing này, hệ thống sẽ thi hành các chính sách bảo mật một cách khắc khe, bắt buộc các ứng dụng và người dùng phải tuân thủ theo chính sách đó. - Permissive: Ở chế độ này SELinux được kích hoạt nhưng sẽ không thực thi chính sách bảo mật, chỉ gửi các cảnh báo đến người dùng - Disabled: SELinux sẽ bị vô hiệu hóa các chính sách bảo mật, đây là chế độ không được khuyến khích nếu bạn không biết cách bảo mật hệ thống Linux của mình. AppArmor AppArmor là một triển khai khác của mô hình bảo mật MAC trên các hệ thống dựa trên Linux. Nó là giải pháp thay thế của SUSE cho SELinux (được sử dụng chủ yếu trong các bản phân phối có nguồn gốc từ Red Hat, chẳng hạn như Fedora, CentOS và RHEL). Việc triển khai mô hình MAC của AppArmor tập trung nhiều hơn vào việc bảo vệ các ứng dụng riêng lẻ — do đó có tên là Application Armor — thay vì thử một mô hình bảo mật bao trùm áp dụng cho toàn bộ hệ thống, như trong SELinux. Mục tiêu bảo mật của AppArmor là bảo vệ hệ thống khỏi những kẻ tấn công khai thác lỗ hổng trong các ứng dụng cụ thể đang chạy trên hệ thống. AppArmor độc lập với hệ thống tệp. Nó được tích hợp và sử dụng chủ yếu trong openSUSE, SUSE Linux Enterprise (SLE), cũng như một số bản phân phối dựa trên Debian. Ngoài ra, nó cũng có thể được cài đặt và sử dụng trong các bản phân phối Linux khác. d. Giám sát hệ thống Khi người quản trị giám sát hệ thống hàng ngày sẽ cảm nhận được những thay đổi đang diễn ra. Đối với việc giám sát hệ thống cục bộ, cần tin tưởng hệ thống của mình khó bị xâm phạm theo bất kỳ cách nào. Nếu máy chủ bị xâm phạm và cài đặt “bộ công cụ gốc” bỏ qua hệ thống giám sát, thì có thể khó biết điều gì đang xảy ra. Vì vậy, cần kết hợp giữa giám sát trên máy chủ và giám sát dựa trên máy chủ từ xa. Logging Theo mặc định, hầu hết các tệp nhật ký (log) của hệ điều hành Linux sẽ được lưu trữ trong thư mục /var/log, chương trình logrotate sẽ tự động luân phiên (lưu trữ) các nhật ký một cách thường xuyên. Mặc dù có thể đăng nhập vào đĩa cục bộ để xem nhật ký rất tiện lợi, nhưng tốt hơn hết là cần phải sao lưu nhật ký đến một máy chủ nhật ký chuyên dụng. Khi dịch vụ ghi nhật ký từ xa được sử dụng, ta có thể chắc chắn rằng bất kỳ nhật ký nào được gửi đến máy chủ nhật ký trước một cuộc tấn công đều được đảm bảo không bị giả mạo. Do khối lượng dữ liệu nhật ký tạo ra là rất lớn nên quản trị viên cần có kỹ năng viết kịch bản cơ bản để có thể dễ dàng phân tích cú pháp thông qua dữ liệu nhật ký và tự động đánh dấu cũng như gửi e-mail hoặc thông báo cho quản trị viên về bất kỳ sự kiện đặc biệt hoặc nghi ngờ nào. Sử dụng ps và netstat Người quản trị nên theo định kỳ giám sát hệ thống bằng câu lệnh “ps auxww”. Những thay đổi trong kết quả truy vấn khác với những thiết lập ban đầu sẽ cần phải được quan tâm. VD: nhất là các chương trình chụp hình hệ thống như tcpdump. Ngoài ra giám sát hệ thống mạng bằng câu lệnh “netstat –au” cũng rất quan trọng. Ở đây các vấn đề phải quan tâm là lưu lượng mạng, các cổng được mở bất thường. Sử dụng df Lệnh “df” hiển thị dung lượng trống trên mỗi phân vùng đĩa được gắn vào cây hệ thống. Người quản trị cần thực hiện lệnh “df” thường xuyên để xem việc sử dụng dung lượng ổ đĩa có thay đổi đột ngột nào không. Ví dụ: sự gia tăng đột ngột có thể là do người dùng đang sử dụng thư mục chính của họ để lưu trữ số lượng lớn tệp MP3, phim,… thay vì các tệp chứa dữ liệu cần thiết từ đây có thể xảy ra thêm các vấn đề về sao lưu và tấn công DoS. Ngoài ra, nếu kích thước của các thư mục web hoặc FTP tăng lên đáng kể mà không có lý do, thì điều đó có thể báo hiệu sự cố sắp xảy ra do máy chủ bị sử dụng trái phép. Một máy chủ có ổ đĩa đầy bất thường cũng là một nguồn tiềm ẩn của một cuộc tấn công DoS cục bộ (và/hoặc từ xa). Ổ đĩa đầy có thể ngăn người dùng hợp pháp lưu trữ dữ liệu mới hoặc thao tác với dữ liệu hiện có trên máy chủ. Máy chủ cũng có thể phải tạm thời ngoại tuyến để khắc phục tình trạng này, do đó từ chối quyền truy cập vào các dịch vụ khác mà máy chủ sẽ cung cấp. Giám sát tự động Hầu hết các giải pháp giám sát hệ thống tự động phổ biến đều chuyên giám sát các dịch vụ và daemon dựa trên mạng. Tuy nhiên, chúng cũng có khả năng giám sát tài nguyên cục bộ như mức sử dụng đĩa, mức sử dụng CPU, số lượng tiến trình, thay đổi trong các đối tượng hệ thống tệp, … Một số giải pháp có thể kể đến như sysinfo, Nagios, Tripwire, Munin, các tiện ích sysstat (sar, iostat và sadf), Beats (thông qua Elaticsearch, Logstash và Kibana hay còn gọi là ELK), Icinga, v.v. 8.6.2 Bảo mật mạng Bảo mật mạng giải quyết vấn đề kẻ tấn công gửi lưu lượng truy cập mạng độc hại đến hệ thống với mục đích làm cho hệ thống không khả dụng (tấn công từ chối dịch vụ hoặc DoS) hoặc khai thác điểm yếu trong hệ thống để giành quyền truy cập hoặc kiểm soát hệ thống. Bảo mật mạng cần kết hợp bảo mật cục bộ để đạt được hiệu quả tốt nhất. Bảo mật mạng trong hệ điều hành Linux/Unix cần quan tâm đến các vấn đề chính sau: a. TCP/IP và bảo mật mạng Sự quan trọng của số các cổng dịch vụ (port numbers) Mỗi máy chủ trên mạng dựa trên IP có ít nhất một địa chỉ IP. Ngoài ra, mọi máy chủ dựa trên Linux đều có nhiều quy trình riêng lẻ đang chạy. Mỗi quy trình có khả năng trở thành máy khách mạng, máy chủ mạng hoặc cả hai. Với khả năng có nhiều hơn một quy trình có thể hoạt động như một máy chủ trên một hệ thống, việc chỉ sử dụng một địa chỉ IP để xác định duy nhất một kết nối mạng là không đủ. Để giải quyết vấn đề này, TCP/IP thêm một thành phần để xác định duy nhất kết nối TCP hoặc UDP, được gọi là cổng. Mọi kết nối từ máy chủ này sang máy chủ khác đều có cổng nguồn và cổng đích. Mỗi cổng được gắn nhãn bằng một số nguyên từ 0 đến 65535. Để xác định mọi kết nối duy nhất có thể có giữa hai máy chủ, hệ điều hành theo dõi bốn trường thông tin trong gói tin sau: địa chỉ IP nguồn, địa chỉ IP đích, số cổng nguồn và số cổng đích. Sự kết hợp của bốn giá trị này được đảm bảo là duy nhất cho tất cả các kết nối giữa các máy chủ. Máy chủ bắt đầu kết nối bằng địa chỉ IP đích và số cổng, trong đó địa chỉ IP nguồn đã được biết. Sau đó hệ điều hành sẽ chọn cổng kết nối đang khả dụng thông qua các cổng kết nối đã mở. Theo quy ước, con số này luôn lớn hơn 1024 (số cổng từ 0 đến 1023 được dành riêng cho việc sử dụng hệ thống và các dịch vụ nổi tiếng – đã được tiêu chuẩn hóa). Về mặt kỹ thuật, máy chủ nguồn cũng có thể chọn số cổng nguồn của nó. Tuy nhiên, hầu hết các ứng dụng đều để hệ điều hành chọn số cổng nguồn cho chúng. Với sự sắp xếp này, chúng ta có thể thấy cách máy chủ nguồn A có thể mở nhiều kết nối tới một dịch vụ trên máy chủ đích B. Địa chỉ IP và số cổng của Máy chủ B sẽ luôn cố định, nhưng số cổng của Máy chủ A sẽ khác nhau đối với mỗi kết nối. Do đó, sự kết hợp của IP nguồn và đích cũng như số cổng là duy nhất và cả hai hệ thống có thể có nhiều luồng dữ liệu (kết nối) độc lập với nhau. Theo dõi các dịch vụ Máy chủ dịch vụ cung cấp các dịch vụ theo đúng chức năng của nó. Khả năng cung cấp dịch vụ được thực hiện theo các tiến trình liên kết với các cổng mạng và lắng nghe các yêu cầu đến. Ví dụ: một máy chủ web có thể bắt đầu một tiến trình liên kết với cổng 80 và lắng nghe các yêu cầu tải xuống các trang của một trang web mà máy chủ lưu trữ. Khi có một tiến trình lắng nghe trên một cổng cụ thể, Linux sẽ bỏ qua các gói được gửi đến cổng đó. Sử dụng netstat Để theo dõi những cổng nào đang mở và những cổng nào có quá trình lắng nghe, ta sử dụng lệnh “netstat” như hình. Hình 8-17. Sử dụng câu lệnh netstat theo dõi mạng Netstat sẽ cung cấp tất cả các kết nối đã thiết lập cho cả socket mạng và miền. Tức là người dùng sẽ thấy không chỉ các kết nối đang thực sự hoạt động trên mạng mà còn cả các giao tiếp giữa các tiến trình. Vì vậy, lệnh “netstat –natu” yêu cầu netstat hiển thị cho tất cả các cổng (-a), bất kể chúng đang nghe hay thực sự được kết nối, cho TCP (-t) và UDP (-u) và yêu cầu netstat không phân giải địa chỉ IP thành tên máy chủ (-n). Trong kết quả của netstat, mỗi dòng đại diện cho một cổng mạng TCP hoặc UDP (cột đầu tiên của kết quả). Cột Recv-Q (hàng đợi nhận) liệt kê số lượng byte được nhận bởi kernel nhưng chưa được đọc bởi tiến trình. Tiếp theo, cột Send-Q (hàng đợi gửi) cho chúng ta biết số byte được gửi đến nhận nhưng chưa nhận được xác nhận. Cột địa chỉ cục bộ (local address) cho biết địa chỉ IP và số cổng của máy chủ. Trong trường hợp này máy chủ đang nhận IP là 127.0.0.1 và 0.0.0.0, cũng như địa chỉ IP thông thường của nó. Trong trường hợp có nhiều giao diện, mỗi cổng được lắng nghe thường sẽ hiển thị trên tất cả các giao diện và dưới dạng các địa chỉ IP riêng biệt. Số cổng được phân tách khỏi địa chỉ IP bằng dấu hai chấm “:”. Ở đầu ra, thiết bị Ethernet có địa chỉ IP 192.168.1.4. Cột thứ năm, Địa chỉ ngoài (foreign address), xác định phía còn lại của kết nối. Trong trường hợp một cổng đang được lắng nghe cho các kết nối mới, giá trị mặc định sẽ là 0.0.0.0:*. Cột thứ sáu cho chúng ta biết trạng thái của kết nối. Có nhiều trạng thái của netstat, nhưng hai trạng thái thường xuyên xuất hiện nhất là lắng nghe - LISTEN và thiết lập - ESTABLISHED. Trạng thái LISTEN có nghĩa là một tiến trình trên máy chủ đang lắng nghe trên cổng và sẵn sàng chấp nhận các kết nối mới. Trạng thái ESTABLISHED có nghĩa là một kết nối đã được thiết lập giữa máy khách và máy chủ. Như vậy có thể thấy rằng, nếu ta liệt kê tất cả các cổng đang hoạt động thì ta có thể theo dõi hệ thống đang thực hiện những gì. Nếu hệ thống đang lắng nghe một cổng mà ta không thể giải thích được nó làm gì thì đang có thể là mối đe dọa của hệ thống. Liên kết với một giao diện mạng Một cách tiếp cận phổ biến để cải thiện tính bảo mật của một dịch vụ đang chạy trên máy chủ là làm cho nó sao cho nó chỉ liên kết với một giao diện mạng cụ thể. Theo mặc định, các ứng dụng sẽ liên kết với tất cả các giao diện (được xem là 0.0.0.0 trong đầu ra netstat). Điều này sẽ cho phép kết nối với dịch vụ đó từ bất kỳ giao diện nào—miễn là kết nối vượt qua mọi quy tắc Netfilter (ngăn xếp tường lửa Linux Kernel tích hợp) đã được cấu hình. Tuy nhiên, ta có thể cấu hình cho một dịch vụ chỉ khả dụng trên một giao diện cụ thể. Ví dụ: giả sử rằng có ba giao diện mạng trên máy chủ: eno1, với địa chỉ IP 192.168.1.4 eno2, với địa chỉ IP 172.16.1.1 lo, với địa chỉ IP 127.0.0.1 Nếu như máy chủ không mở chế độ chuyển tiếp IP (IP forwarding) thì các máy nằm trên mạng 192.168.1.0/24 (eno1) sẽ không thể kết nối với máy nằm trên 172.16/16 (eno2). Như vậy coi như là mạng 172.16/16 (eno2) là an toàn và 127.0.0.1 (lo hoặc loopback) đại diện cho chính máy chủ lưu trữ. Tắt các dịch vụ không cần thiết Để đạt được sự cân bằng hợp lý giữa tính dễ cài đặt/khả năng quản lý của máy chủ Linux và việc cung cấp trải nghiệm an toàn trong các bản phân phối Linux là một quá trình phức tạp, khó khăn. Một ví dụ dễ thấy là ở một số bản phân phối nhằm mục đích đơn giản hóa mọi thứ để mang lại sự thuận tiện cho người dùng do đó đã áp dụng các cài đặt mặc định không an toàn. Như vậy nhiệm vụ của quản trị viên cần phải tìm kiếm các cài đặt không an toàn này và đánh giá xem dịch vụ nào cần cài đặt, dịch vụ nào không. Để làm được việc này cần trả lời các câu hỏi như: Có cần dịch vụ này không? Nếu cần thì cài đặt mặc định có đủ an toàn chưa? Dịch vụ này còn được các nhà phát triển tích cực bảo trì và cập nhật bản vá hay không? Theo dõi hệ thống Sử dụng nhật ký hệ thống: dịch vụ rsyslogd (bộ ghi nhật ký hệ thống) và dịch vụ systemd-journald đều giúp quản lý và thu thập các thông tin nhật ký từ các chương trình khác nhau. Chúng bao gồm các thông báo liên quan đến bảo mật, chẳng hạn như ai đã đăng nhập vào hệ thống, khi nào họ đăng nhập, … Phân tích nhật ký: Thực hiện kiểm tra định kỳ các tệp nhật ký của hệ thống là một phần quan trọng trong việc duy trì trạng thái bảo mật tốt. Tuy nhiên do khối lượng của các tệp này thường rất lớn nên ta cần các công cụ để có thể phân tích được nhật ký và tự động lấy ra thông tin cần thiết. Ngoài việc tự viết các kịch bản phân tích sử dụng ngôn ngữ lập trình như python, có một số công cụ có sẵn giúp ta thực hiện phân tích nhật ký như journalctl, logwatch, gnome-system-log, ksystemlog, ELK (www.elastic.co) và Splunk. Lưu trữ các mục nhật ký: Việc lưu trữ các mục nhật ký tại một máy chủ lưu trữ riêng biệt là điều rất cần thiết tránh việc máy tính bị tấn công làm mất mát các tệp nhật ký. Giám sát băng thông mạng sử dụng MRTG: Việc theo dõi lượng băng thông đang được sử dụng trên máy chủ sẽ giúp người quản trị nhận được nhiều thông tin hữu ích rất trực quan thông qua các biểu đồ từ đó có thể đưa ra đánh giá phân tích. Đồng thời một lợi ích hữu ích khác của việc giám sát băng thông là xác định các nút cổ chai trong hệ thống và đưa ra giải pháp cân bằng tải cho hệ thống. Sử dụng công cụ như MRTG (Multi- Router Traffic Grapher) để theo dõi băng thông, quản trị viên dễ dàng thiết lập tiêu chí cho mức bình thường của hệ thống và từ đó so sánh phát hiện ra sự tăng hoặc giảm đáng kể khi hệ thống hoạt động, nguyên nhân chỉ ó thể do lỗi hoặc bị tấn công. Xử lý các cuộc tấn công Sau khi máy chủ đã bị tấn công thì các thông tin trong máy chủ không cho ta biết điều gì thực sự đã xảy ra. Kẻ tấn công có thể sử dụng bộ công cụ “root kit” để làm cho việc phát hiện dấu vết của cuộc tấn công khó khăn hơn. Tóm lại mọi máy chủ đã bị tấn công cần xây dựng lại hòan toàn bằng một bản cài đặt mới. Trước khi cài đặt lại cần cố gắng kiểm tra xem mức độ thiệt hại để xác định được thời điểm trong chu kỳ sao lưu khi dữ liệu đã sao lưu chắc chắn còn tin cậy. Cần phải thay đổi tất cả các mật khẩu để đảm bảo an toàn, tránh trường hợp toàn bộ mật khẩu cũ đã bị lộ. Khi bắt đầu xây dựng lại máy chủ, cần dừng mọi truy cập từ xa vào hệ thống, đồng thời dừng tất cả lưu lượng mạng đến máy chủ cho đến khi nó được xây dựng lại hoàn toàn với các bản vá lỗi mới nhất trước khi kết nối lại với mạng. Các công cụ bảo mật mạng Có rất nhiều công cụ giúp người quản trị quản lý hệ thống, bao gồm Nagios, Icinga… Tuy nhiên có một số công cụ ban đầu được tạo ra để hỗ trợ phân tích cơ bản và quản lý hệ thống, sau đó được phát triển để trở thành công cụ bảo mật hữu ích. Điều làm cho các công cụ này hoạt động tốt trên Linux từ góc độ bảo mật là chúng cung cấp thông tin chi tiết sâu hơn về những gì hệ thống đang thực hiện. - Nmap: có thể được sử dụng để quét một máy chủ hoặc một nhóm máy chủ để tìm kiếm các cổng TCP và UDP đang mở. Nmap không chỉ có chức năng quét mà thực sự có thể cố gắng kết nối với các cổng hoặc ứng dụng nghe từ xa để nó có thể xác định ứng dụng từ xa tốt hơn. Đây là công cụ mạnh và đơn giản để quản trị viên xem xét những gì hệ thống tiếp xúc với mạng và thường được cả kẻ tấn công và quản trị viên sử dụng để hiểu được điều gì có thể xảy ra đối với máy chủ. - Snort: Hệ thống phát hiện xâm nhập (IDS - intrusion detection system) cung cấp cách giám sát bí mật một điểm trong mạng và báo cáo về hoạt động đáng ngờ dựa trên chữ ký. Snort cung cấp các bộ luật mở rộng được cập nhật thường xuyên với các vectơ tấn công mới. Bất kỳ hoạt động đáng ngờ nào cũng có thể được gửi đến máy chủ ghi nhật ký và một số công cụ xử lý nhật ký mã nguồn mở có sẵn có thể giúp phân tích thông tin được thu thập. - Nessus and Open VAS: mở rộng chức năng của Nmap, phân tích sâu hơn vào các ứng dụng và cơ sở hạ tầng. Nessus là một sản phẩm thương mại, còn OpenVAS là một giải pháp thay thế mã nguồn mở và miễn phí cho Nessus. Sử dụng Nessus hoặc OpenVAS trên máy chủ là một cách nhanh chóng để thực hiện kiểm tra mức độ hiển thị của máy chủ. Báo cáo sẽ ghi lại nhiều nhận xét, từ cấp độ thông tin cho đến cấp độ cao. - Wireshark/tcpdump: các chương trình cho phép người dùng bắt các gói tin truyền trên mạng để quan sát và phân tích. Do đó ta có thể tự mình theo dõi lưu lượng mạng, phân tích chúng để tìm kiếm bất kỳ hoạt động đáng ngờ nào. 8.7 Lập trình Shell Các đoạn mã Shell cho phép nhanh chóng triển khai hay thử nghiệm một ứng dụng trong môi trường dòng lệnh của Linux/Unix sử dụng số lượng hạn chế các cấu trúc và câu lệnh của hệ thống. Mặt khác, chương trình shell cho phép tự động hóa nhiều nhiệm vụ trong việc quản trị hệ thống. Phần dưới đây giới thiệu các khái niệm cơ bản đê viết các chương trình Shell. Để viết đoạn mã Shell, người dùng có thể sử dụng bất cứ trình soạn thảo nào như vi, nano, gedit... Để chạy người dùng cần chú ý thay đổi thuộc tính của file chứa đoạn mã sang dạng thực thi được qua câu lệnh chmod. Sau đó, đoạn mã có thể chạy qua câu lệnh sh tên_file. Shell cho phép chạy nhiều câu lệnh một cách tuần tự. Thay vì nhập lệnh vào từng dòng, các câu lệnh có thể được ghi vào trong một dòng và phân cách bằng dấu chấm phẩy như dưới sau: ~$ mkdir Documents; cd Documents. 8.7.1 Thực hiện có điều kiện. Các câu lệnh chạy trong Linux/Unix thường có giá trị trả về cho biết kết quả thực hiện câu lệnh. Khi câu lệnh thực hiện thành công mã trả về là 0 và được lưu trong một biến đặc biệt là $. Đoạn mã sau biểu diễn cách dùng của biến này. ~$ ls Documents tasks.txt bookmarks.html ~$ echo $? 0 ~$ ls -z ls: invalid option -- 'z' Try 'ls --help' for more information Using A Shell 197 ~$ echo $? 2 Giá trị trả về của câu lệnh có thể dùng làm điều kiện để thực thi câu lệnh kế tiếp thông qua ký hiệu &&. Ví dụ mkdir Documents && cd Documents. Ngoài ra, có thể sử dụng ký hiệu ||, trong trường hợp nếu câu lệnh trước lỗi thì sẽ thực hiện câu lệnh sau như trong ví dụ: mount /media/USB || sudo mount /media/USB. Nếu như lệnh mount không thành công thì sẽ thử lại với câu lệnh sudo. 8.7.2 Các thao tác vào ra. Trong quá trình thực hiện câu lệnh hệ thống, kết quả thực hiện của câu lệnh có thể dùng làm dữ liệu đầu vào cho câu lệnh khác nhờ ký tự |. Đoạn mã sau tìm kiếm từ khóa “complete emerge” từ file nhật ký emerge.log và chọn lấy 5 dòng cuối cùng. ~$ grep 'completed emerge' /var/log/emerge.log | tail -5 1283033552: ::: completed emerge (1 of 1) app-admin/cvechecker-0.5 to / 1283033552: ::: completed emerge (1 of 3) dev-perl/HTML-Tagset-3.20 to / 1283033552: ::: completed emerge (2 of 3) dev-perl/MP3-Info-1.23 to / 1283033552: ::: completed emerge (3 of 3) app-pda/gnupod-0.99.8 to/ 1283033552: ::: completed emerge (1 of 1) app-admin/cvechecker-0.5 to / Ký hiệu | cho phép tạo thành các ống kết nối dữ liệu giữa các câu lệnh và có thể xâu chuỗi nhiều hơn 2 ứng dụng. Mặt khác ký hiệu > cho phép thay đổi luồng dữ liệu. Ví dụ như muốn lưu toàn bộ tên file và thư mục hiện thời vào file content.txt, có thể sử dụng câu lệnh ls > content.txt. Trong trường hợp muốn ghi tiếp vào file đã có, sử dụng ký hiệu >> như trong câu lệnh ls >> content.txt. 8.7.3 Câu lệnh điều kiện If...then...if. Cấu trúc điều kiện này cho phép thực thi các câu lệnh tùy thuộc vào điều kiện đặt ra có được thỏa mãn hay không. Đoạn mã dưới đây minh họa cách thức sử dụng #Ví dụ chon=1 if [ "$chon" = "1" ] then echo "Chọn 1" elif [ "$chon" = "2" ] then echo "Chọn 2" elif [ "$chon" = "3" ] then echo "Chọn 3" else echo "Chọn tất cả còn lại?" echo "Chọn lại" fi Ký hiệu # báo hiệu phần ghi chú của đoạn mã, $chon mô tả đoạn mã sử dụng biến chon, ký hiệu “[...]” mô tả điều kiện kiểm tra. Các phép toán kiểm tra điều kiện bao gồm: bằng “=”, lớn hơn “-gt”, nhỏ hơn “-lt”, không bằng “-ne”, thuộc “-in”... Khi cần kết hợp nhiều điều kiện có thể sử dụng ký hiệu lô-gíc và “&&” hay hoặc “||”. For... do... done. Cấu trúc lặp cho phép thực hiện các câu lệnh chừng nào biểu thức điều kiện sau từ khóa for còn hiệu lực. Dưới đây là ví dụ về việc sử dụng cấu trúc này. fruitlist="Apple Pear Tomato Peach Grape" for fruit in $fruitlist do if [ "$fruit" = "Tomato" ] || [ "$fruit" = "Peach" ] then echo "I like ${fruit}es" else echo "I like ${fruit}s" fi done while...do...done. Cấu trúc lặp này sẽ thực hiện các câu lệnh trong phần do...done chừng nào mà điều kiện sau từ khóa while còn có hiệu lực. Sau đây là một ví dụ. count=$3 while [ $count -gt 0 ] do echo $count giay! count=$(expr $count -1) sleep 1 done echo “Het gio” 8.7.4 Ví dụ Dưới đây là ví dụ về đoạn mã shell sử dụng cho việc sao lưu hệ thống #!/bin/sh # Nội dung sao lưu backup_files="/home /var/spool/mail /etc /root /boot /opt" # Vị trí sao lưu dest="/mnt/backup" # Tên file lưu trữ day=$(date +%A) hostname=$(hostname -s) archive_file="$hostname-$day.tgz" # Hiển thị thông báo echo "Backing up $backup_files to $dest/$archive_file" date echo # sử dụng chương trình tar để sao lưu tar czf $dest/$archive_file $backup_files # Thông báo kết thúc echo echo "Backup finished" date # Kiểm tra các file tại vị trí $dest. ls -lh $dest Trong đoạn mã trên, ý nghĩa của các biến như sau: ▪ $backup_file: liệt kê các thư mục muốn sao lưu. Chi tiết có thể thay đổi phù hợp với yêu cầu sao lưu. ▪ $day: cho biết ngay trong tuần và dùng để sinh các file lưu trữ theo ngày trong tuần. ▪ $hostname: tên của máy tính trong mạng, giúp phân biệt bản sao lưu của các máy khác nhau. ▪ $archive_file: tên file lưu trữ dạng đầy đủ. ▪ $dest: vị trí của file lưu trữ. Trong trường hợp này, thư mục này cần được tạo trước và gắn với một thư mục cục bộ. 8.8 Câu hỏi ôn tập cuối chương 1. Trình bày các cách thức cập nhật trong Linux/Unix? 2. Khi tiến hành sao lưu người quản trị cần quan tâm tới vấn đề nào? 3. Trình bày các cách thức sao lưu và khôi phục trên Linux/Unix? 4. Trình bày cách thức khắc phục các sự cố? 5. Trình bày cách thức giám sát hoạt động trên Linux/Unix? 6. Trình bày các công cụ kiểm toán trên Linux/Unix? 7. Trình bày các công cụ quản trị từ xa trên Linux/Unix? 8. Lập trình Shell là gì? Trình bày các thao tác, câu lệnh cơ bản? 9. Trình bày bảo mật cục bộ để tăng cường bảo mật trên Linux/Unix? 10. Trình bày bảo mật mạng để tăng cường bảo mật trên Linux/Unix?

Use Quizgecko on...
Browser
Browser