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.
- Trƣờng max là số ngày lớn nhất mà mật khẩu đƣợc chấp nhận.
- Trƣờng warn chứa số ngày thông báo trƣớc khi mật khẩu bị quá hạn.
- Trƣờng inactive chứa số ngày mà username vẫn còn tác dụng trƣớc khi không đƣợc phép đăng nhập.
- Trƣờng expire chỉ số ngày xác định mà ngƣời sử dụng đƣợc quyền đăng nhập vào hệ thống.
- Trƣờng flag hiện không sử dụng.
Việc sử dụng Shadow password góp phần đáng kể trong việc đảm bảo tính bí mật của mật khẩu ngƣời dùng. Tuy nhiên, để đảm bảo an toàn mật khẩu ngay trên hệ thống cần kết hợp nhiều biện pháp khác nhau nhƣ các tài khoản phải có mật khẩu đủ “mạnh” (độ dài mật khẩu lớn hơn 8 ký tự, bao gồm cả chữ thƣờng, chữ hoa, số và các ký tự đặc biệt...), thay đổi mật khẩu đều đặn...
2.4.3 OpenSSH
Nhƣ đã trình bày ở trên, chúng ta có thể sử dụng nhiều biện pháp khác nhau để các mật khẩu tại hệ thống có thể đƣợc bảo mật tốt hơn, tuy nhiên các mối đe dọa vẫn tồn tại. Điều này đặc biệt đúng trong các môi trƣờng hệ thống Unix\Linux, 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ã hóa hay cơ chế bảo vệ khác. Ví dụ: telnet, rsh, rlogin... các kết nối này sẽ gửi các mật khẩu dƣới dạng text trên đƣờng truyền. Việc bảo vệ các mật khẩu đƣợc mã hóa lƣu trên hệ thống sẽ không còn nhiều ý nghĩa khi lại truyền các mật khẩu này dƣới dạng text qua mạng. Chính vì vậy, cần phải sử dụng các giao thức bảo mật để thay thế các giao thức không bảo mật này, đảm bảo an toàn, bí mật, toàn vẹn ... cho thông tin khi truyền qua mạng.
Một trong những lựa chọn để giải quyết vấn đề trên đó là sử dụng giao thức SSH (Secure Shell). SSH là một giao thức mạng dùng để thiết lập kết nối mạng một cách bảo mật. Với SSH mỗi khi dữ liệu đƣợc gửi bởi một máy tính vào mạng, SSH tự động mã hóa nó. Khi dữ liệu đƣợc nhận vào, SSH sẽ tự động giải mã ngƣợc lại. Kết quả là việc mã hóa đƣợc thực hiện trong suốt, ngƣời dùng có thể làm việc bình thƣờng mà không biết rằng việc truyền thông của họ đã đƣợc mã hóa an toàn trên mạng.[8]
Công cụ SSH điển hình, hiện đang đƣợc sử dụng rộng rãi đó là OpenSSH. OpenSSH là một chƣơng trình nguồn mở đƣợc sử dụng để mã hóa các giao dịch giữa các máy với nhau bằng cách sử dụng giao thức SSH. Đây là một sự thay thế an toàn cho những chƣơng trình đƣợc sử dụng để kết nối thƣờng thấy nhƣ: Telnet, rsh, rlogin..Bởi nó luôn mã hóa tất cả các giao dịch, ẩn đi, che dấu tên đăng nhập và mật khẩu đƣợc sử dụng cho những phiên đăng nhập từ xa. Sau khi phiên đăng nhập đƣợc thực hiện sẽ tiếp tục mã hóa tất cả những dữ liệu giao dịch giữa hai máy. OpenSSH cung cấp khá nhiều tính năng để giúp cho việc truyền thông giữa hai host trở nên an toàn. Một số tính năng nổi bật của OpenSSH có thể chỉ ra đó là: Khả năng mã hóa và xác thực mạnh, hỗ trợ Sftp client và server trong cả hai giao thức SSH1 và SSH2, mã hóa giao thứ X11 cho việc sử dụng X Window và quá trình chuyển đổi cổng (Port Forwarding)….
Chi tiết về giao thức SSH và công cụ OpenSSH sẽ đƣợc trình bày cụ thể trong chƣơng sau.
2.4.4 Các biện pháp giám sát người dùng
- Phát hiện những ai trên hệ thống: Chúng ta có thể sử dụng các tiện ích mà hệ thống