Cấp quyền thực thi với SUDO trên Ubuntu

15:28, 28/03/2008

XHTTOnline: Lần đầu tiếp xúc với Ubuntu Linux, người sử dụng gặp không ít ngỡ ngàng với một cách bảo mật mới, đó là khi thực hiện những lệnh can thiệp đến hệ thống thì phải gõ thêm “sudo”. Đây chính là cơ chế bảo mật bằng SUDO. Cơ chế này được kích hoạt mặc định trong Ubuntu và mang lại nhiều ưu điểm hơn cơ chế chuyển sang người dùng khác bằng su truyền thống. Trong đó ưu điểm lớn nhất là cho phép nhà quản trị kiểm soát được các thao tác của người dùng có can thiệp đến hệ thống, giao quyền thực thi “đúng người đúng việc”. Ngoài ra khi thực thi lệnh từ xa thông qua telnet/SSH thì sudo thực sự thể hiện ưu thế. Nắm vững cơ chế sudo sẽ giúp ích rất nhiều cho những ai đang sử dụng Ubuntu, cả người sử dụng desktop và nhà quản trị hệ thống. SUDO là gì Sudo được dùng khi ta muốn thực thi lệnh trên Linux với quyền của một user khác. Nếu được cho phép, ta sẽ thực thi lệnh đó như là người quản trị hay một user xác định. Các khai báo “ai được làm gì” đặc tả trong file “/etc/sudoers”. SUDO còn có ưu điểm là ghi nhận lại những khi sudo được sử dụng nhằm theo dõi, phát hiện những hành vi trái phép trong hệ thống. Mặc định các ghi nhận (log) nằm trong file /var/log/secure (các bản Red Hat/Fedora / CentOS Linux) hoặc /var/log/auth.log (các bản Ubuntu / Debian Linux). Nếu người triệu gọi sudo là root hoặc khi người triệu gọi và người được “mượn” quyền là một thì sẽ không có xác nhận mật khẩu. Còn ngoài ra, sudo yêu cầu người dùng phải tự xác nhận bằng mật khẩu. Lưu ý ở đây là trong cấu hình mặc định thì mật khẩu để xác nhận này là mật khẩu của người triệu gọi, chứ không phải mật khẩu của root. Khi người dùng đã được xác nhận xong, hệ thống sẽ thiết lập một khoảng thời gian (timestamp) cho phép người triệu gọi tiếp tục dùng sudo mà không cần phải xác nhận mật khẩu lại (mặc định là 15 phút). Cách sử dụng thông dụng nhất của sudo là cú pháp sudo Ví dụ: Mở Terminal bằng cách truy cập vào menu Application > Accessories > Terminal:
 
Trong cừa sổ Terminal, gõ dòng lệnh “apt-get update”, kết quả như sau:
 
Dòng lệnh ta vừa gõ yêu cầu hệ thống cập nhật danh mục phần mềm của Ubuntu trên hệ thống. Lệnh này đòi hỏi phải có quyền root mới được thực thi do đó ta bị báo là “Permission denied”. Bây giờ bạn gõ lại với chữ sudo ở đầu “sudo apt-get update”. Hệ thống hiện ra dòng yêu cầu nhập mật khẩu. Hãy gõ mật khẩu của bạn lúc đăng nhập và nhấn Enter, lệnh sẽ được thực thi ngay lập tức. Lưu ý là Linux không hiển thị bất cứ ký tự nào khi bạn gõ mật khẩu.
 
Cũng giống như su, nếu không có khai báo định danh của user đích rõ ràng, mặc định sudo sẽ xem như ta đang mượn quyền root để thực thi. Nếu ta muốn “mượn” một người dùng nào khác thì khai báo định danh rõ ràng của người đó, chẳng hạn sudo -u training rm -rf /home/training/.recently-used Bây giờ ta sẽ xem làm cách nào để thiết lập cho sudo biết “ai được làm gì”. Cú pháp của file /etc/sudoers Như đã nói ở trên, đây là file chứa tất cả những thiết lập cho sudo. Nội dung trong file này thường được đặc tả bằng cú pháp sau: USER HOSTNAME=(TARGET-USERS) COMMAND Trong đó: - USER: Tên của người sử dụng được áp dụng luật. - HOSTNAME: Tên máy mà luật được áp dụng lên. Tham số này cần thiết vì sudo được thiết kế để bạn có thể dùng một file sudoers cho các máy khác. Lúc này sudo sẽ xem máy đang chạy được dùng các luật nào. Nói cách khác, bạn có thể thiết kế các luật cho từng máy trong hệ thống. - TARGET-USERS: Tên người dùng đích cho “mượn” quyền thực thi. - COMMAND: Tên “lệnh” (thực ra là các chương trình thực thi) mà người dùng được quyền thực thi với bất kỳ tham số nào mà họ muốn. Tuy nhiên bạn cũng có thể đặc tả các tham số của lệnh (bao gồm các dấu thay thế wildcards). Ngược lại, có thể dùng kí hiệu “” để ám chỉ là lệnh chỉ được thực thi mà không có tham số nào cả. - Nếu là cấp quyền cho group, ta thay tham số USER bằng %GROUP. Để biết thêm về cú pháp của file này, hãy gõ “man sudoers” vào cừa sổ Terminal và đọc hướng dẫn được trình bày trên màn hình. Thiết lập cho sudo Sau khi biết cú pháp của file sudoers, ta sẽ tiến hành thiết lập cho sudo bằng cách soạn thảo file này. Để mở file sudoer lên và soạn thảo, dùng lệnh sau: sudo visudo Người thiết lập cho sudo bắt buộc phải có quyền root nên ta thêm “sudo” đằng trước lệnh “visudo”. Lúc này nội dung của file sudoers sẽ được trình bày trên cừa sổ Terminal. Trong Ubuntu, các giá trị mặc định trong file sudoers như trong hình minh hoạ:
 
Bỏ qua các dòng chú thích bắt đầu bằng ký hiệu #, ta chú ý các dòng sau: Defaults !lecture,!tty_tickets,!fqdn root ALL=(ALL) ALL %admin ALL=(ALL) ALL Những khai báo trên có ý nghĩa: - Chỉ thị Default cho biết những tham số được khai báo mặc định cho hoạt động của sudo (sudo hoạt động với rất nhiều tham số, xem man sudoers để biết ý nghĩa của chúng), trong đó: - lecture là cờ điều khiển chế độ xuất một đoạn văn bản giống như “welcome” khi sudo được sử dụng. Với khai báo !lecture nghĩa là cờ này bị off, không được sử dụng. Khi sử dụng, cờ này có ba giá trị: “never” (chẳng bao giờ xuất văn bản), “once” (xuất văn bản ở lần sử dụng sudo đầu tiên), “always” (xuất văn bản bất cứ khi nào dùng sudo) trong đó “once” là giá trị mặc định. Chẳng hạn khi bật lên ở chế độ thường trực (always) thì khai báo: lecture=”always”, và mỗi lần bạn dùng sudo sẽ thấy thông báo như sau trước khi nhập mật khẩu:
 
- tty_tickets là cờ cho biết sudo sẽ xác thực user theo từng “tty”. Điều này có nghĩa là nếu bật cờ này lên, mỗi khi bạn mở một console hay terminal khác và sử dụng sudo thì phải gõ mật khẩu lại, cho dù bạn có nằm trong timestamp 15 phút hay không. Nếu tắt cờ này đi, trong thời gian 15 phút bạn có thể dùng sudo mà không phải gõ mật khẩu, cho dù ở tty nào. Cờ này có giá trị boolean, “true” hoặc “false”. - fqdn là cờ báo hiệu có cần phải khai báo tên máy đầy đủ trong file sudoers hay không. Nghĩa là nếu bật cờ này lên thì trong phần hostname, thay vì ghi một tên máy “kythuatmaytinh”, bạn phải ghi đầy đủ “kythuatmaytinh.wordpress.com” với wordpress.com là domain mà máy đó thuộc vào. Cờ này cũng có giá trị boolean. Như vậy ta có thể thấy Ubuntu thiết lập mặc định cho cơ chế sudo của mình là: không xuất văn bản khi dùng sudo, không xác nhận theo tty và không cần phải khai báo tên domain đầy đủ trong file sudoers. - Chỉ thị ” root ALL=(ALL) ALL” tuân theo đúng cú pháp thường gặp, có nghĩa là người dùng root, trên tất cả các máy, có thể mượn quyền tất cả các người dùng, để thực thi tất cả các lệnh. - Chỉ thị “%admin ALL=(ALL) ALL” cũng tuân theo cú pháp đó, có nghĩa là nhóm người dùng admin, trên tất cả các máy, có thể mượn quyền tất cả các người dùng, để thực thi tất cả các lệnh. Giả sử tôi muốn cho người dùng abel được phép tắt máy của anh ta, tôi sẽ thêm vào dòng: abel localhost=/sbin/shutdown Nếu không khai báo rõ target-users, sudo sẽ tự gán cho người triệu gọi sudo quyền owner của lệnh đó. Tiếp theo, tôi cho phép người dùng dongthao được phép khởi động lại apache server trên máy linux01 như sau: dongthao linux01= /etc/init.d/apache2 restart Bây giờ nếu muốn tôi có thể copy file sudoer này lên máy linux01 để áp dụng luật cho user monitor. Lưu lại những gì đã thiết lập bằng tổ hợp phím Ctrl-O và thoát ra chương trình thiết lập sudo bằng tổ hợp phím Ctrl-X, lúc này các rule đã bắt đầu có tác dụng. Một số ví dụ thực tế khác a) Cho phép user abel được thực thi nhiều lệnh với quyền root, các lệnh cách nhau bằng dấu phẩy abel ALL=(root) /sbin/shutdown, /bin/kill, /etc/init.d/httpd b) Cho phép user subadmin được tắt máy mà không cần phải xác nhận bằng mật khẩu abel localhost= NOPASSWD: /sbin/shutdown c) Cho phép user subadmin được thực hiện bất kỳ lệnh nào trong /usr/bin ở máy linux01 abel linux01 = /usr/bin/* Kết luận Sudo là một công cụ mạnh để thi hành chính sách bảo mật trên trạm làm việc (host-based) cho các hệ thống Ubuntu nói riêng và Linux nói chung. Với sudo, nhà quản trị có thể dễ dàng thực hiện việc giao quyền “đúng người đúng việc” và theo dõi các hành vi của người sử dụng trong hệ thống để kịp thời phát hiện các dấu hiệu xấu. Đây là nguyên tắc cơ bản cần được triển khai đầu tiên cho các hệ thống an toàn thông tin. Bài viết cung cấp những kiến thức cơ bản nhất giúp người đọc có thể áp dụng ngay cho hệ thống Linux của mình. Sudo là công cụ rất mạnh và nhiều tùy biến nên bạn đọc nên dùng lệnh “man” với các tham số “sudo”, “visudo”, “sudoers” để tìm hiểu và sử dụng thành thạo hơn. Lê Đình Đông Thao