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:

  •  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/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.

2- Tài khoản root và những vấn đề liên quan đến an toàn hệ thống

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

id user_name

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

rm -rf /

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:

Ở 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!

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.

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:

su

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:

sudo command

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ư:

  •  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.

Tất cả các lệnh sử dụng sudo đều được ghi lại vào file log /var/log/secure

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.

Ví dụ, nếu cho phép normal user manthang được phép sudo lệnh su thì user manthang chỉ cần gõ:

sudo su –

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.

–manthang

3 comments

  1. Vài hệ điều hành khi cài xong tài khoản root bị khóa mất tiêu, làm sao mà mở lại đây ta, trong khi mình chỉ có quyền admin, thì không sửa file shadow được!

  2. Hi, dctuit!
    Với trường hợp bạn nêu ra thì bạn có thể khởi động vào runlevel 1 (single mode). Trong single mode, bạn không cần đăng nhập vẫn có được quyền hạn cao nhất để làm việc với Linux. Sau đó, bạn có thể sử dụng các lệnh sau:

    – Đổi mật khẩu cho root
    # passwd root

    Nếu cần:
    – Re-enable mật khẩu của root
    # passwd -u root

    —- Riêng trường hợp của Ubuntu thì trong các phiên bản gần đây, mặc định, mật khẩu của tài khoản root được hệ thống tự động khởi tạo ngẫu nhiên trong quá trình cài đặt Ubuntu. Do đó, mật khẩu của root hoàn toàn là bí mật nhưng bạn vẫn có thể sử dụng sudo với tài khoản người dùng thông thường để chạy các lệnh quản trị.

    Thân!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s