adamdj
VIP Members
-
24/08/2016
-
91
-
130 bài viết
Quyền lực root và vấn đề an toàn hệ thống
Trong Unix/Linux, tài khoản root là người dùng có quyền lực cao nhất, root có thể làm rất nhiều điều mà ngay cả tài khoản Administrator trên Windows cũng không thể có được. Nhưng quyền lợi luôn đi kèm trách nhiệm: bạn có được sức mạnh của root nhưng cũng cần có ý thức bảo mật tài khoản này tránh khỏi sự lạm dụng của kẻ xấu.
Bài viết hôm nay sẽ làm rõ vấn đề lợi – hại khi sử dụng tài khoản root.
1- Những ý nghĩa khác nhau của thuật ngữ root
Khi đặt vào 3 ngữ cảnh sau, từ root sẽ mang 3 ý nghĩa khác nhau:
a) User ID (UID) của root
Mỗi một user được tạo ra trên hệ thống đều phải có một số nhận dạng gọi là UID. Linux sẽ quản lý các tài khoản người dùng thông qua UID, còn Username chỉ là tên gọi thân thiện, giúp con người dễ dàng phân biệt các user.
Tài khoản root được Linux tự động tạo ra và mặc định, root luôn có UID=0. Bạn có thể thay đổi UID của root nhưng điều này không hề được khuyến khích vì nó ảnh hưởng tới an ninh, ổn định của hệ thống. Để xem UID của một user, bạn gõ lệnh sau trong giao diện dòng lệnh
Một điều thú vị là bạn hoàn toàn có thể cho phép nhiều user có cùng UID và các user này sẽ có quyền hạn ngang nhau. Như vậy, để tạo thêm các user có quyền hạn ngang bằng root, bạn gán cho user đó có UID=o.
Và để leo thang đặc quyền cho một user thông thường, hacker sẽ tìm cách để thay đổi UID của user trở thành o.
b) Root privilege
Root có quyền lực lớn nhất và tuyệt đối, nó có quyền truy cập tới bất kỳ file nào và thực thi được mọi câu lệnh. Ngoài ra, root trao cho người đang sử dụng nó khả năng chỉnh sửa hệ thống rất sâu theo bất kỳ cách nào, ngay cả việc chỉnh sửa các module của hệ điều hành và biên dịch lại Linux kernel – một điều không thể trên hệ thống Windows…
root cũng có quyền cấp phát và thu hồi các quyền hạn truy cập file cho các user khác, bao gồm các file mặc định chỉ dành riêng cho root.
Thưở ban đầu thì các hệ điều hành *nix được thiết kế để chạy trên các mainframe (siêu máy tính), dành cho các hệ thống đa người dùng bởi vì lúc đó các dòng máy tính cá nhân (PC) chưa phổ biến như bây giờ và mỗi người dùng sẽ sử dụng các thiết bị đầu cuối đơn giản để kết nối vào các siêu máy tính và thực hiện công việc cần làm.
Vì vậy mà cần có 1 cơ chế để ngăn chia và bảo vệ các file của từng user trong khi vẫn cho phép các user sử dụng hệ thống đồng thời, và ý niệm về home directory ra đời từ đây. Bên cạnh đó, cũng cần có giải pháp giúp cho người quản trị hệ thống thực thi các tác vụ như là: truy cập vào file, thư mục các user khác để sửa lỗi; cấp và thu quyền hạn cho các user; truy cập các file quan trọng để sửa chữa, khôi phục và cập nhật hệ thống… những yêu cầu này dẫn tới việc hình thành tài khoản root.
c) Permission System
Hệ thống phân quyền trong *nix mặc định cấm các normal user truy cập, thay đổi cấu hình các khu vực trọng yếu trên hệ thống và dữ liệu cá nhân thuộc về các user khác. Thường thì user chỉ có thể đọc file mà không có quyền ghi bất cứ gì vào root directory (/), ngoài ra user có tự do quyền hạn với home direcroty của mình.
Chính vì sự ngăn cấm này đã gây ra sự tò mò, khó chịu cho những người dùng mới làm quen với các hệ thống như *nix, đặc biệt là những người đã quen với các hệ thống có cơ chế phân quyền yếu hoặc bỏ ngỏ quyền hạn Admin như Windows, một số phiên bản Macintosh cũ… Bắt đầu từ Windows Vista thì Microsoft đã cải tiến toàn diện vấn đề bảo mật với hy vọng lấy lại niềm tin từ các nhà quản trị hệ thống luôn phàn nàn rằng: Windows chưa lúc nào thật sự an toàn!
Những tay “vọc sĩ” sẽ cố gắng vượt qua hệ thống phân quyền này trên các máy tính cá nhân bằng cách đang nhập trực tiếp bằng tài khoản root và… ngồi lì ở đó! Mặc dù điều này mang lại sự thoải mái và thuận tiện trong xử lý công việc, nhưng giải pháp an toàn hơn là bạn nên có một normal user để làm các việc bình thường như: chat, duyệt web, sử dụng mail, các nhu cầu văn phòng, giải trí… Tất cả đều hoạt động trơn tru trong môi trường của normal user.
Nếu bạn là người dùng mới làm quen với *nix, một lời khuyên luôn được nhắc tới là tránh lạm dụng đặc quyền root bởi thật dễ dàng để phá hủy hệ thống *nix hơn là phá hủy các hệ thống khác với quyền hạn root. Để bù đắp phần nào những sơ hở trong cơ chế phân quyền thiếu chặt chẽ, các kỹ sư thiết kế Windows đã xây dựng các tính năng và đặt ra các phương thức nhằm bảo vệ dữ liệu và hệ điều hành như: Data Execution Protection (DEP), Kernel Patch Protection (KPP), Encrypting File System (EFS),…
Tuy nhiên, 1 nguyên tắc quan trọng của hệ điều hành *nix là cung cấp tối đa độ linh động trong cho việc cấu hình hệ thống, vì vậy mà tài khoản root được có được quyền hạn vô đối. Hệ thống *nix giả định rằng người quản trị biết chính xác điều anh (cô) ấy đang làm vì 1 sơ sót nhỏ cũng có thể dẫn đến toàn bộ hệ thống ngừng hoạt động.
Đặt trường hợp, nếu đã làm quen với dòng lệnh Linux hẳn bạn đã biết câu lệnh này
Ngay khi thực thi lệnh trên với quyền root và khởi động lại máy, toàn bộ dữ liệu trong phân vùng dành cho thư mục gốc (/) bị xóa bỏ… Bạn đã tự sát chính mình!
Thêm 1 nguy cơ nữa khi sử dụng hệ thống với quyền root là tất cả các tiến trình (process) do root khởi động sẽ được cấp quyền hạn root. Vì thậm chí các chương trình ứng dụng có sự kiểm duyệt tốt và được sử dụng rộng rãi cũng ẩn chứa nhiều lỗi nên 1 attacker thực thụ có thể dò tìm và khai thác vài trong các lỗi đó và chiếm quyền điều khiển hệ thống khi ứng dụng đó được chạy với quyền root.
Dưới đây là 1 ví dụ với ứng dụng Web Server Apache để minh họa cho mối nguy trên:
d) Delegate Authority
Nếu bạn đang ở normal user mà vẫn muốn chạy các lệnh cần tới quyền root thì 1 số công cụ như gksu (ứng dụng GNOME), kdesu (ứng dụng KDE), su, sudo (trong console/terminal) tạm thời trao cho bạn quyền root mà không cần mất công đăng xuất (log out) khỏi normal user rồi đăng nhập (log in) lại bằng root.
Ví dụ, bạn đang ở normal user và muốn trở thành root mà không cần logout khỏi normal user, trong môi trường dòng lệnh (console) bạn gõ lệnh sau:
sau đó nhấn Enter và gõ vào mật khẩu của root.
Với su, bạn sẽ luôn “ngồi trên ghế” của root cho tới khi bạn nhấn Ctrl+D hoặc gõ exit để nhảy khỏi “chiếc ghế quyền uy” này và trở lại là “công dân nghèo” trước đó
.
Nếu sử dụng sudo thì bạn cần cung cấp mật khẩu của user chạy lệnh sudo, không phải mật khẩu của root như là với lệnh su. Cú pháp cơ bản của sudo:
Bằng cách chỉnh sửa file cấu hình của sudo là /etc/sudoers bạn có thể làm rất nhiều thứ như:
Xem xét kỹ thì sudo là con dao 2 lưỡi:
rồi cung cấp mật khẩu của mình là có ngay quyền root mà không cần biết mật khẩu để đăng nhập vào root.
Để hiểu rõ hơn về bạn gõ man sudo để xem tài liệu hướng dẫn về nó.
Đối với gksu, kdesu thì thường được dùng khi chạy các chương trình có giao diện đồ họa mà yêu cầu quyền root. Ví dụ, khi bạn chạy công cụ Synaptics – trình quản lý gói .DEB thì sẽ hiện ra 1 của sổ yêu cầu nhập mật khẩu của bạn, đây chính là gksu.
3. Kết Luận
Nhìn chung trong môi trường tổ chức và doanh nghiệp, mỗi quản trị viên nên tạo riêng 1 normal user để làm các công việc thông thường. Mọi hoạt động này đều được hệ thống ghi nhận và lưu thành các file log dành cho mục đích giám sát hoạt động và khắc phục sự cố trên hệ thống. Ngoài ra, để giảm tải công việc, người quản trị hệ thống cấp cao cũng cần có cơ chế ủy quyền thích hợp cho các nhân viên phía dưới.
Nguồn: manthang wordpress
Bài viết hôm nay sẽ làm rõ vấn đề lợi – hại khi sử dụng tài khoản root.
1- Những ý nghĩa khác nhau của thuật ngữ root
Khi đặt vào 3 ngữ cảnh sau, từ root sẽ mang 3 ý nghĩa khác nhau:
- File system: Trong cấu trúc cây thư mục của Linux, thì root directory có ký hiệu là dấu / , là thư mục cấp cao nhất – nó không có thư mục cha.
- Home directory: Mỗi người dùng đều có thư mục chủ (home) để lưu trữ những dữ liệu, thiết lập cá nhân của họ. Thư mục home của người dùng root là /root , còn những người dùng bình thường (normal user) khác có thư mục home nằm tại /home/user_name
- User account: root là tên tài khoản có đặc quyền cao nhất trong các hệ thống *nix (tên gọi chung của các HĐH Linux và các HĐH khác tựa Unix). Và đây cũng là ngữ cảnh sẽ được sử dụng trong bài viết này.
a) User ID (UID) của root
Mỗi một user được tạo ra trên hệ thống đều phải có một số nhận dạng gọi là UID. Linux sẽ quản lý các tài khoản người dùng thông qua UID, còn Username chỉ là tên gọi thân thiện, giúp con người dễ dàng phân biệt các user.
Tài khoản root được Linux tự động tạo ra và mặc định, root luôn có UID=0. Bạn có thể thay đổi UID của root nhưng điều này không hề được khuyến khích vì nó ảnh hưởng tới an ninh, ổn định của hệ thống. Để xem UID của một user, bạn gõ lệnh sau trong giao diện dòng lệnh
Mã:
id user_name
Và để leo thang đặc quyền cho một user thông thường, hacker sẽ tìm cách để thay đổi UID của user trở thành o.
b) Root privilege
Root có quyền lực lớn nhất và tuyệt đối, nó có quyền truy cập tới bất kỳ file nào và thực thi được mọi câu lệnh. Ngoài ra, root trao cho người đang sử dụng nó khả năng chỉnh sửa hệ thống rất sâu theo bất kỳ cách nào, ngay cả việc chỉnh sửa các module của hệ điều hành và biên dịch lại Linux kernel – một điều không thể trên hệ thống Windows…
root cũng có quyền cấp phát và thu hồi các quyền hạn truy cập file cho các user khác, bao gồm các file mặc định chỉ dành riêng cho root.
Thưở ban đầu thì các hệ điều hành *nix được thiết kế để chạy trên các mainframe (siêu máy tính), dành cho các hệ thống đa người dùng bởi vì lúc đó các dòng máy tính cá nhân (PC) chưa phổ biến như bây giờ và mỗi người dùng sẽ sử dụng các thiết bị đầu cuối đơn giản để kết nối vào các siêu máy tính và thực hiện công việc cần làm.
Vì vậy mà cần có 1 cơ chế để ngăn chia và bảo vệ các file của từng user trong khi vẫn cho phép các user sử dụng hệ thống đồng thời, và ý niệm về home directory ra đời từ đây. Bên cạnh đó, cũng cần có giải pháp giúp cho người quản trị hệ thống thực thi các tác vụ như là: truy cập vào file, thư mục các user khác để sửa lỗi; cấp và thu quyền hạn cho các user; truy cập các file quan trọng để sửa chữa, khôi phục và cập nhật hệ thống… những yêu cầu này dẫn tới việc hình thành tài khoản root.
c) Permission System
Hệ thống phân quyền trong *nix mặc định cấm các normal user truy cập, thay đổi cấu hình các khu vực trọng yếu trên hệ thống và dữ liệu cá nhân thuộc về các user khác. Thường thì user chỉ có thể đọc file mà không có quyền ghi bất cứ gì vào root directory (/), ngoài ra user có tự do quyền hạn với home direcroty của mình.
Chính vì sự ngăn cấm này đã gây ra sự tò mò, khó chịu cho những người dùng mới làm quen với các hệ thống như *nix, đặc biệt là những người đã quen với các hệ thống có cơ chế phân quyền yếu hoặc bỏ ngỏ quyền hạn Admin như Windows, một số phiên bản Macintosh cũ… Bắt đầu từ Windows Vista thì Microsoft đã cải tiến toàn diện vấn đề bảo mật với hy vọng lấy lại niềm tin từ các nhà quản trị hệ thống luôn phàn nàn rằng: Windows chưa lúc nào thật sự an toàn!
Những tay “vọc sĩ” sẽ cố gắng vượt qua hệ thống phân quyền này trên các máy tính cá nhân bằng cách đang nhập trực tiếp bằng tài khoản root và… ngồi lì ở đó! Mặc dù điều này mang lại sự thoải mái và thuận tiện trong xử lý công việc, nhưng giải pháp an toàn hơn là bạn nên có một normal user để làm các việc bình thường như: chat, duyệt web, sử dụng mail, các nhu cầu văn phòng, giải trí… Tất cả đều hoạt động trơn tru trong môi trường của normal user.
Nếu bạn là người dùng mới làm quen với *nix, một lời khuyên luôn được nhắc tới là tránh lạm dụng đặc quyền root bởi thật dễ dàng để phá hủy hệ thống *nix hơn là phá hủy các hệ thống khác với quyền hạn root. Để bù đắp phần nào những sơ hở trong cơ chế phân quyền thiếu chặt chẽ, các kỹ sư thiết kế Windows đã xây dựng các tính năng và đặt ra các phương thức nhằm bảo vệ dữ liệu và hệ điều hành như: Data Execution Protection (DEP), Kernel Patch Protection (KPP), Encrypting File System (EFS),…
Tuy nhiên, 1 nguyên tắc quan trọng của hệ điều hành *nix là cung cấp tối đa độ linh động trong cho việc cấu hình hệ thống, vì vậy mà tài khoản root được có được quyền hạn vô đối. Hệ thống *nix giả định rằng người quản trị biết chính xác điều anh (cô) ấy đang làm vì 1 sơ sót nhỏ cũng có thể dẫn đến toàn bộ hệ thống ngừng hoạt động.
Đặt trường hợp, nếu đã làm quen với dòng lệnh Linux hẳn bạn đã biết câu lệnh này
Mã:
rm -rf /
Thêm 1 nguy cơ nữa khi sử dụng hệ thống với quyền root là tất cả các tiến trình (process) do root khởi động sẽ được cấp quyền hạn root. Vì thậm chí các chương trình ứng dụng có sự kiểm duyệt tốt và được sử dụng rộng rãi cũng ẩn chứa nhiều lỗi nên 1 attacker thực thụ có thể dò tìm và khai thác vài trong các lỗi đó và chiếm quyền điều khiển hệ thống khi ứng dụng đó được chạy với quyền root.
Dưới đây là 1 ví dụ với ứng dụng Web Server Apache để minh họa cho mối nguy trên:
Trích “Những cuộc đối thoại với Rookie – Phần 14” của tác giả Hoàng Ngọc Diêu.Ở những phiên bản sơ khai của Apache, khi bạn khởi động Apache, nó tạo ra một process do root làm chủ. Sở dĩ bạn phải khởi động Apache ở chế độ là root là vì Apache sẽ tạo một listening port 80 (để chờ đợi các kết nối đến từ các Web Client).
Port 80 là port nằm trong chuỗi “low ports” (dưới 1024) và để tạo một port trong chuỗi này bạn phải là root thì mới tạo được. Sau này Apache hình thành cơ chế ‘chuyển quyền’ sau khi khởi động.
Nói một cách nôm na là sau khi khởi động và tạo xong port 80 ở tình trạng listening, nó hạ quyền hạn từ root xuống thành quyền hạn của một account nào đó bạn gán trong cấu hình của Apache. Bạn biết lý do tại sao không?”
Đó là nếu Apache chạy ở chủ quyền root và ai đó load một con ‘shell’ (upload shell) nào đó lên thì con shell này cũng sẽ chạy với chủ quyền root!
d) Delegate Authority
Nếu bạn đang ở normal user mà vẫn muốn chạy các lệnh cần tới quyền root thì 1 số công cụ như gksu (ứng dụng GNOME), kdesu (ứng dụng KDE), su, sudo (trong console/terminal) tạm thời trao cho bạn quyền root mà không cần mất công đăng xuất (log out) khỏi normal user rồi đăng nhập (log in) lại bằng root.
Ví dụ, bạn đang ở normal user và muốn trở thành root mà không cần logout khỏi normal user, trong môi trường dòng lệnh (console) bạn gõ lệnh sau:
Mã:
su –
Với su, bạn sẽ luôn “ngồi trên ghế” của root cho tới khi bạn nhấn Ctrl+D hoặc gõ exit để nhảy khỏi “chiếc ghế quyền uy” này và trở lại là “công dân nghèo” trước đó
.
Nếu sử dụng sudo thì bạn cần cung cấp mật khẩu của user chạy lệnh sudo, không phải mật khẩu của root như là với lệnh su. Cú pháp cơ bản của sudo:
Mã:
sudo command
Tất cả các lệnh sử dụng sudo đều được ghi lại vào file log /var/log/secure
- Cho phép user nào được quyền sudo.
- Quy định các lệnh sudo nào mà user có thể chạy.
- Ấn định lượng thời gian mà lệnh sudo còn hiệu lực. Điều này giúp bạn chạy sudo nhiều lần mà không cần nhập lại mật khẩu cho mỗi lần sudo.
Xem xét kỹ thì sudo là con dao 2 lưỡi:
- “Lưỡi cùn” (vô hại): normal user sẽ chỉ được quyền chạy 1 số lệnh quản trị do bạn ấn định trước trong file /etc/sudoers. Đồng thời, mật khẩu của root được giữ bí mật.
- “Lưỡi sắc” (nguy cơ): nếu bạn kiểm soát vấn đề ủy quyền thông qua sudo không chặt chẽ thì normal user dễ dàng chiếm quyền điều khiển hệ thống với đặc quyền root.
Mã:
sudo su –
Để hiểu rõ hơn về bạn gõ man sudo để xem tài liệu hướng dẫn về nó.
Đối với gksu, kdesu thì thường được dùng khi chạy các chương trình có giao diện đồ họa mà yêu cầu quyền root. Ví dụ, khi bạn chạy công cụ Synaptics – trình quản lý gói .DEB thì sẽ hiện ra 1 của sổ yêu cầu nhập mật khẩu của bạn, đây chính là gksu.
3. Kết Luận
Nhìn chung trong môi trường tổ chức và doanh nghiệp, mỗi quản trị viên nên tạo riêng 1 normal user để làm các công việc thông thường. Mọi hoạt động này đều được hệ thống ghi nhận và lưu thành các file log dành cho mục đích giám sát hoạt động và khắc phục sự cố trên hệ thống. Ngoài ra, để giảm tải công việc, người quản trị hệ thống cấp cao cũng cần có cơ chế ủy quyền thích hợp cho các nhân viên phía dưới.
Nguồn: manthang wordpress