2.3 Giải pháp đảm bảo an toàn file
2.3.2 Sử dụng các tính năng bảo mật của hệ thống tập tin ext
Hệ thống tập tin ext của Linux hỗ trợ một tập hợp các đặc tính mở rộng có thể giúp chúng ta bảo mật hệ thống một cách chặt chẽ hơn. Các thuộc tính mở rộng của tập tin ext đƣợc mô tả trong bảng 2.3 dƣới đây.
Bảng 2.3 : Các thuộc tính mở rộng của hệ thống file ext
Thuộc tính mở rộng Phần mô tả
A Khi thuộc tính A đƣợc xác lập, thời gian truy cập file không đƣợc cập nhật. Điều này hữu ích với các máy tính có vấn đề về tiêu thụ năng lƣợng bởi việc tạo ra một số đĩa I/O là không cần thiết.
S Khi thuộc tính S đƣợc xác lập, file đồng bộ hoá với bộ lƣu trữ vật lý để mang lại cấp độ cao hơn về tính toàn vẹn dữ liệu.
a File ở dạng append-only (chỉ thêm vào) - các file có thể đƣợc tạo hoặc sửa đổi bên trong thƣ mục cụ thể mà không thể nào bị loại bỏ.
i Các file không bị thay đổi. Trong một thƣ mục đặc biệt, các file có thể đƣợc sửa đổi nhƣng các file mới không thể đƣợc tạo hoặc bị xoá.
d Chƣơng trình dump sẽ bỏ qua các file.
c Khi thuộc tính này đƣợc xác lập có nghĩa một yêu cầu ghi lên file bị nén và yêu cầu đọc tự động giải nén.
s Khi một file với thuộc tính này bị xoá, dữ liệu của file ghi đè lên với các số zero.
U Khi một file không có thuộc tính này dữ liệu đƣợc di chuyển ra xa để nó không thể bị xoá.
Hệ thống tập tin ext trên Linux cung cấp một số tính năng duy nhất. Một trong số các tính năng này làm cho các tập tin không đổi qua ngƣời dùng root. Có thể sử dụng lệnh chattr để xác lập thuộc tính cho tập tin.[4]
2.3.3 Chương trình kiểm tra tính toàn vẹn của file
Kiểm tra toàn vẹn sử dụng “md5sum” và “sha1sum”. md5sum và sha1sum sẽ thực hiện việc băm một tập tin hoặc một gói để thu đƣợc một giá trị băm. Với băm Md5 sử dụng thuật toán 128 bit, sha1 sử dụng dụng thuật toán 160 bit để xác định chuỗi vân nhận dạng( Finger Print) của các tập tin trong một gói phần mềm. Với mục đích là đảm bảo sự toàn vẹn của các tập tin trong gói phần mềm từ các nhà cung cấp đến ngƣời sử dụng. Nó có thể cho biết về sự thay đổi của tập tin trong các gói phần mềm khi có ai đó thay đổi. Do vậy trƣớc khi cài đặt các gói phần mềm trên hệ thống hãy thực hiện việc kiểm tra để đảm bảo các gói phần mềm này không bị thay đổi hay chứa các mã độc hại.
Tripwire là một chƣơng trình kiểm tra tính toàn vẹn tập tin và thƣ mục, một tiện ích so sánh một tập hợp các tập tin và các thƣ mục đƣợc hoạch định, với các thông tin đƣợc lƣu trữ trong một cơ sở dữ liệu đƣợc sinh ra trƣớc đó. Bất kỳ sự khác biệt nào xuất hiện thì cờ hiệu đƣợc bật hay đƣợc ghi lại, bao gồm cả việc thêm hay xóa các dữ liệu nhập vào. Khi nó chạy dựa vào các tập tin hệ thống trên một nguyên tắc cơ bản, thì bất kỳ thay đổi nào trong các tập tin hệ thống quan trọng sẽ đƣợc đánh dấu và việc điều khiển hƣ hại cụ thể nào đó có thể đƣợc biết ngay lập tức. Tripwire có cơ sở dữ liệu chứa thông tin cũng cho phép xác minh, cho phép truy cập và cài đặt chế độ tập tin, tên ngƣời dùng chủ sở hữu tập tin, ngày tháng và thời gian tập tin đã đƣợc truy cập lần và sửa đổi cuối.
2.4 Giải pháp đảm bảo an toàn tài khoản ngƣời dùng
2.4.1 Các rủi ro và biện pháp bảo vệ tài khoản người dùng
Với các hệ điều hành đa nhiệm, đa ngƣời dùng, trong cùng một thời điểm có nhiều ngƣời cùng làm việc trên hệ thống, cùng sử dụng, chia sẻ tài nguyên nhƣ bộ nhớ, đĩa cứng, máy tin và các thiết bị khác. Do đó, Chính sách quản lý ngƣời dùng tốt sẽ là chìa khóa giúp hệ thống hoạt động hiệu quả, cũng nhƣ tăng cƣờng tính năng bảo mật cho hệ thống đối với từng tài khoản, nhóm tài khoản cụ thể.
Trong các hệ thống Unix/Linux khi cài đặt chúng ta sẽ khởi tạo ngƣời sử dụng root cho hệ thống. Đây là spuper user, tức là ngƣời sử dụng đặc biệt có quyền không giới hạn. Sử dụng quyền root có thể thao tác với hệ thống mà không phải lo lắng gì đến xét quyền thâm nhập này khác. Tài khoản này có quyền hạn rất lớn nên nó là mục tiêu mà các tin tặc muốn chiếm đoạt. Nên cần sử dụng một cách cẩn thận, không sử dụng bừa bãi tài khoản này qua telnet hay kết nối từ xa mà không có công cụ kết nối an toàn. Trong Linux, chúng ta có thể tạo các ngƣời dùng có tên khác với quyền root, bằng cách tạo các ngƣời dùng có UserID bằng 0.
Mọi ngƣời muốn đăng nhập và sử dụng hệ thống Unix\Linux đều cần có một tài khoản. Việc tạo và quản lý tài khoản ngƣời dùng là vấn đề quan trọng. Mỗi tài khoản ngƣời dùng có một tên sử dụng (username), một mật khẩu (password) riêng để cho ngƣời quản trị dễ ràng quản lý hoạt động của ngƣời dùng cũng nhƣ tăng cƣờng tính an toàn cho hệ thống. Trong hệ điều hành Linux, tập tin /etc/passwd là tập tin chứa các thông tin về tài khoản ngƣời dùng của hệ thống. Tập tin /etc/passwd đóng vai trò sống còn đối với một hệ thống Unix\Linux. Mọi ngƣời đều có thể đọc đƣợc tập tin này nhƣng chỉ có tài khoản root mới có quyền thay đổi nó. Tập tin /etc/passwd đƣợc lƣu dƣới dạng text nhƣ đại đa số các tập tin cầu hình của Unix/Linux. Hình 2.2 dƣới đây minh họa nội dung của tập tin /etc/passwd.
Mỗi một tài khoản đƣợc lƣu trong một dòng gồm 7 cột, mỗi cột cách nhau bởi dấu “:” nhƣ minh họa dƣới đây:
Username:password:uid:gid:fullname:homedir:shell
các cột có ý nghĩa nhƣ sau: - Cột 1: Tên ngƣời sử dụng.
- Cột 2: Mã liên quan đến passwd cho Unix chuẩn và :x: đối với Linux. Linux lƣu mã này trong một tập tin khác /etc/shadow mà chỉ có quyền root mới đọc đƣợc.
- Cột 3;4: UserID, GroupID.
- Cột 5: Tên đầy đủ của ngƣời sử dụng. Một số phần mềm phá password sử dụng dữ liệu của cột này để thử đoán password.
- Cột 7: Chƣơng trình sẽ chạy đầu tiên khi ngƣời dùng đăng nhập.
Tập tin đƣợc mở đầu bằng ngƣời dùng với quyền root, Chú ý là tất cả những tài khoản có UserID = 0 đều là root. Tiếp theo là các tài khoản hệ thống. Đây là các tài khoản không có thật và không thể login vào hệ thống. Cuối cùng là các tài khoản ngƣời dùng bình thƣờng.
Tên người dùng và định danh người dùng (Username và UserID): Tên ngƣời dùng là một chuỗi ký tự xác định duy nhất một ngƣời dùng. Ngƣời dùng tên này khi đăng nhập cũng nhƣ truy xuất tài nguyên. Trong hệ thống Linux tên phân biệt chữ hoa, thƣờng. Thông thƣờng tên ngƣời dùng thƣờng sử dụng chữ thƣờng. Để quản lý ngƣời dùng Linux sử dụng khái niệm định danh ngƣời dùng (UserID), mỗi ngƣời dùng mang một con số định danh riêng cho mình. Linux sử dụng số định danh để kiểm soát hoạt động của ngƣời dùng. Theo qui định chung các ngƣời dùng có định danh là 0 là ngƣời dùng với quyền root. Các số định danh từ 1-99 sử dụng cho các tài khoản hệ thống, định danh của ngƣời dùng bình thƣờng sử dụng giá trị bắt đầu từ 100.
Mật khẩu (Password): Mỗi ngƣời dùng phải có một mật khẩu riêng để sử dụng tài khoản của mình. Mọi ngƣời đề có quyền đổi mật khẩu của mình. Tài khoản với quyền root có thể đổi mật khẩu của những ngƣời khác. Trong các hệ thống Unix/Linux truyền thống lƣu các thông tin liên quan đến mật khẩu đăng nhập ở trong /etc/passwd. Tuy nhiên, do đây là tập tin phải đọc đƣợc bởi tất cả mọi ngƣời do một số yêu cầu cho hoạt động bình thƣờng của hệ thống và nhìn chung các tài khoản thƣờng đặt các mật khẩu “yếu”. Do đó, hầu hết các hệ thống Unix/Linux hiện nay đều lƣu mật khẩu trong một tập tin khác /etc/shadow và chỉ có quyền root mới có thể đọc tập tin này.
Định danh nhóm (GroupID): Định danh nhóm mà ngƣời dùng này là một thành viên của nhóm. Mỗi nhóm có tên và một định danh nhóm. Một nhóm có thể chứa nhiều ngƣời dùng và ngƣời dùng có thể thuộc nhiều nhóm. Tuy nhiên, tại một thời điểm một ngƣời chỉ thuộc một nhóm mà thôi. Thông tin của nhóm đƣợc lƣu tại tập tin /etc/group.
Chú thích (Comment): Dòng chú thích về tài khoản ngƣời dùng này.
Thư mục cá nhân (Home Directory): Khi ngƣời dùng đăng nhập vào hệ thống đƣợc đặt làm việc tại thƣ mục cá nhân của mình. Thƣờng thì mỗi ngƣời có một thƣ mục cá nhân riêng, ngƣời dùng có toàn quyền trên nó, nó dùng để chứa dữ liệu cá nhân và các thông tin hệ thống cho hoạt động của ngƣời dùng. Thƣ mục mặc nhiên sử dụng cho các thƣ mục cá nhân của ngƣời dùng bình thƣờng là /home; của tài khoản root là /root. Tuy nhiên cũng có thể đặt ở vị trí khác.
Việc tìm hiểu hệ thống ngƣời dùng và nhóm ngƣời dùng trong các hệ thống mã nguồn mở là hết sức cần thiết, chẳng hạn nhƣ trong các hệ thống Unix\Linux. Nhƣ đã
trình bày, các tài khoản root có quyền không hạn chế. Tuy nhiên, khi hệ thống bị sự cố do một lỗi lầm nào đó hoặc tài khoản root bị tin tặc chiếm quyền thì mới thấy đƣợc sự nguy hiểm khi làm việc với quyền root. Do đó, chỉ nên sử dụng sử dụng tài khoản này vào các mục đích cấu hình, bảo trì hệ thống chứ không nên sử dụng vào mục đích hằng ngày. Chính vì vậy cần tạo ra các tài khoản ngƣời dùng với các quyền khác nhau và đƣợc hạn chế để đảm bảo an toàn cho hệ thống. Với hệ thống cài đặt Linux, đặc biệt là các hệ thống quan trọng có nhiều ngƣời quản lý thì việc tạo các nhóm ngƣời dùng với những quyền nhất định sẽ góp phần đảm bảo an toàn cho hệ thống. Với các file quan trọng lƣu trữ các thông tin cấu hình của hệ thống cần phải thiết lập các chế độ bảo mật tập tin và chỉ cho phép một vài ngƣời dùng đặc biệt mới đƣợc quyền thao tác chỉnh sửa file này.
Một vài biện pháp đƣợc sử dụng để bảo vệ tài khoản ngƣời dùng trong các hệ thống mã nguồn mở Linux có thể chỉ ra:
- Quản lý tài khoản ngƣời dùng hiệu quả và đảm bảo mật khẩu ngƣời dùng đủ mạnh.
- Loại bỏ tất cả các tài khoản ngƣời dùng và các nhóm đặc biệt: Ngay sau khi cài đặt Linux, ngƣời quản trị nên xóa bỏ các tài khoản và nhóm ngƣời dùng đã đƣợc tạo sẵn nhƣng không có nhu cầu sử dụng nhƣ lp, sync, shutdown, halt, news, uucp, operator, games, gopher…
- Ngăn chặn việc sử dụng lệnh “su” chuyển từ tài khoản bình thƣờng lên tài khoản root: Trong các hệ thống Linux, ngƣời dùng có thể sử dụng lệnh “su” (Substitute User) để chuyển sang một tài khoản khác, và có thể chuyển sang tài khoản root. Chính vì vậy cần phải ngăn chặn việc này, và có thể thực hiện bằng cách thêm vào nội dung file /etc/pam.d/su hai dòng lệnh sau:
Auth sufficient/lib/security/pam_rootok.so debug Auth required/lib/security/pam_wheel.so group=wheel
- Xóa bỏ những chƣơng trình SUID/SGID không sử dụng: Thông thƣờng, những ứng dụng đƣợc thực hiện dƣới quyền của tài khoản ngƣời dùng gọi thực hiện ứng dụng. Tuy nhiên, hệ thống Unix\Linux sử dụng một kỹ thuật đặc biệt cho phép một số chƣơng trình thực hiện dƣới quyền của ngƣời quản lý chƣơng trình (chứ không phải ngƣời thực hiện). Đấy chính là lý do tại sao tất cả mọi ngƣời dùng trong hệ thống đều có thể đổi mật khẩu của mình trong khi không hề có quyền truy xuất lên file /etc/shadow: nguyên nhân vì lệnh passwd có gán thuộc tính SUID và đƣợc quản lý bởi root, mà chỉ có root mới có quyền truy xuất /etc/shadow. Tuy nhiên, khả năng này có thể gây nên những nguy cơ tiềm tàng: Nếu một chƣơng trình có tính năng thực thi đƣợc quản lý bởi root, do thiết kế không tốt hoặc do đƣợc cài đặt cố tình bởi những kẻ phá hoại mà lại có thuộc tính SUID thì mọi điều đều có thể xảy ra. Thực tế cho thấy, khá nhiều kỹ thuật xâm nhập hệ thống mà không có quyền root đƣợc thực hiện nhờ kỹ
thuật này. Tin tặc bằng cách nào đó tạo đƣợc một shell đƣợc quản lý bởi root, có thuộc tính SUID. Sau đó mọi truy xuất phá hoại sẽ đƣợc thực hiện qua shell này vì mọi lệnh thực hiện trong shell sẽ đƣợc thực hiện dƣới quyền root. Thuộc tính SGID cũng tƣơng tự nhƣ thuộc tính SUID, các chƣơng trình đƣợc thực hiện với quyền nhóm là nhóm quản lý chƣơng trình chứ không phải nhóm của ngƣời chạy chƣơng trình. Nhƣ vậy ngƣời quản trị sẽ phải thƣờng xuyên kiểm tra xem trong hệ thống có những ứng dụng nào có thuộc tính SUID hoặc SGID mà không đƣợc phép không?
- Tự động thoát khỏi shell: Ngƣời quản trị hệ thống rất hay quên thoát ra khỏi dấu nhắc shell khi kết thúc công việc. Thật nguy hiểm nếu lúc đó có một kẻ phá hoại, kẻ này có thể dễ dàng có quyền truy xuất hệ thống ở mức cao nhất. Để giảm nguy cơ này, ngƣời quản trị nên cài đặt tính năng tự thoát khỏi shell khi không có sự truy xuất nào trong một khoảng thời gian định trƣớc bằng cách đặt một tham số quy định khoảng thời gian hệ thống vẫn duy trì dấu nhắc shell.
2.4.2 Shadow Password
Trong hệ thống Unix\Linux, thông tin tài khoản ngƣời dùng đƣợc lƣu trữ trong file /etc/passwd. Nó là một file text cung cấp các thông tin hữu ích về mỗi tài khoản ngƣời dùng nhƣ: User ID, Group ID, Home Directory, Shell… Cấu trúc của tập tin /etc/passwd đã đƣợc trình bày ở phần trên. Trƣớc đây file này cũng chứa các mật khẩu dạng mã hóa (encoded password) của mỗi tài khoản. Mặc định, mọi tài khoản đều có quyền đọc đối với file này, nhƣng chỉ có tài khoản root với có quyền chỉnh sửa. Thời gian đầu không có vấn đề gì khi mật khẩu ở dạng mã hóa đƣợc lƣu trữ trong file /etc/passwd, bởi vì khi đó tốc độ xử lý của phần cứng còn chậm, nên dù cho tin tặc biết đƣợc mật khẩu đã mã hóa thì việc giải mã để tìm lại mật khẩu nguyên gốc là “rất khó” và mất nhiều thời gian, nhất là với những mật khẩu có độ phức tạp cao và đƣợc mã hóa sử dụng các giải thuật băm một chiều nhƣ MD5, SHA-1…
Tuy nhiên, với sức mạnh tính toán hiện nay thì việc giải mã các mật khẩu này đã không còn là việc khó nữa và vì thế để khắc phục nguy cơ này các hệ thống Unix\Linux ngày nay đều ứng dụng cơ chế shadow password. Khi hệ thống sử dụng shadow password, trƣờng password trong file /etc/passwd sẽ đƣợc thay bằng ký tự x, mật khẩu dƣới dạng mã hóa của tài khoản ngƣời dùng đƣợc lƣu trong file /etc/shadow và chỉ có tài khoản root mới có quyền đọc file này.
Tài khoản ngƣời dùng đƣợc lƣu trữ trong file /etc/passwd khi sử dụng shadow password:
dangnam:x:1000:1000:DangNam,,,:/home/dangnam:/bin/bash Tài khoản tƣơng ứng lƣu trong file /etc/shadow:
Mỗi một tài khoản lƣu trong file /etc/shadow bao gồm 9 trƣờng, phân cách bởi dấu hai chấm “:” bao gồm các thông tin sau:
username:pswd:lastchg:min:max:warn:inactive:exprire: flag - Trƣờng username là tên tài khoản ngƣời dùng lấy từ file /etc/passwd.
- Trƣờng pswd chứa các kỹ tự mật khẩu đã mã hóa của tài khoản tƣơng ứng.
- Trƣờng lastchg là ngày mà mật khẩu thay đổi cuối.
- Trƣờng min là ngày nhỏ nhất giữa ngày thay đổi mật khẩu.