Giả sử bạn là quản trị viên hệ thống trong một công ty mà các nhóm chủ yếu làm việc trên Linux với các đặc quyền hạn chế. Bây giờ hãy tưởng tượng một tình huống mà các thành viên của một trong các nhóm - như một phần của một số công việc mới - cần thường xuyên chỉnh sửa một tệp yêu cầu đặc quyền siêu người dùng. Bạn sẽ làm gì?
Một lựa chọn là cấp cho họ quyền truy cập 'sudo', nhưng điều đó giống như cấp cho một người lạ quyền truy cập vào toàn bộ ngôi nhà của bạn khi tất cả những gì họ cần là chỉ ở trong một trong những căn phòng của bạn - ý tôi là, quyền truy cập 'sudo' mặc định sẽ cho phép họ làm bất cứ điều gì yêu cầu quyền root, trong khi tất cả những gì cần thiết là khả năng chỉnh sửa một tệp hệ thống nhất định.
Với tính linh hoạt mà 'sudo' cung cấp, lựa chọn khác mà bạn có là điều chỉnh chính sách 'sudo' theo cách chỉ cấp quyền chỉnh sửa tệp đang đề cập. Ví dụ, một cái gì đó như thế này:
Mặc dù điều đó chắc chắn là một giải pháp tốt hơn nhiều so với việc cung cấp quyền truy cập sudo hoàn chỉnh, nhưng vẫn có một lỗ hổng mà ai đó có thể khai thác.
Để hiểu những gì tôi đang nói đến, hãy xem xét một kịch bản trong đó quyền truy cập hạn chế đã đề cập ở trên được cung cấp cho nhóm và ai đó mở tệp đang đề cập để chỉnh sửa bằng lệnh 'sudo'.
Bây giờ, một bộ óc thông minh có kiến thức tốt về vim sẽ biết rằng họ có thể khởi chạy một shell mới từ bên trong trình soạn thảo - tất cả những gì họ phải làm là chạy lệnh vim sau:
Điều này sẽ ngay lập tức đưa bạn vào một shell tương tác. Nếu bạn đang thử các bước này trên máy của mình, chỉ cần thực hiện lệnh 'whoami' và bạn sẽ hiểu lỗ hổng mà tôi đang nói đến -Đúng vậy, bạn đang ở trong shell với tư cách là root.
Đây là một ảnh chụp màn hình ví dụ:
Không cần phải nói, mục đích cung cấp quyền chỉnh sửa chỉ cho một tệp duy nhất đã bị đánh bại và người dùng có thể LÀM BẤT CỨ ĐIỀU GÌ bây giờ.
Hãy xem liệu chúng ta có tùy chọn nào khác không. Có một thẻ NOEXEC mà bạn có thể sử dụng trong mục nhập sudoers của mình:
Về cơ bản, NOEXEC cho phép bạn ngăn một chương trình do sudo chạy thực thi bất kỳ chương trình nào khác. Vậy, đây có phải là giải pháp cuối cùng không? Thật đáng buồn là không. Về lý do, đây là cách sudoers manualgiải thích thẻ này:
Nếu bạn đọc kỹ văn bản được tô đậm, bạn sẽ biết rằng NOEXEC có một số hạn chế riêng.
Vậy thì giải pháp đáng tin cậy nhất là gì? Vâng, đó là sudoedit. Ngay cả hướng dẫn sử dụng sudoers cũng đề xuất công cụ này:
Sudoedit là lệnh tích hợp cho phépngười dùng chỉnh sửa tệp một cách an toàn. Theo trang hướng dẫn sudo, 'sudoedit' tương đương với việc thực thi 'sudo' với tùy chọn dòng lệnh '-e'.
Và những người dùng thuộc nhóm 'newsudo' sẽ có thể chỉnh sửa tệp bằng cách chạy lệnh sau:
Vì vậy, lệnh này sẽ thực hiện là trước tiêntạo một bản sao tạm thời của tệp bạn muốn chỉnh sửa. Sau đó, lệnh sẽtìm kiếm các biến môi trường SUDO_EDITOR, VISUAL và EDITOR (theo thứ tự đó) để xác định trình soạn thảo nào sẽ được gọi để mở bản sao tạm thời vừa được tạo. Sau khi người dùng hoàn tất công việc sửa đổi, các thay đổi sẽ được sao chép trở lại tệp gốc.
Sau đây là giải thích chi tiết từ trang hướng dẫn lệnh 'sudo':
Bây giờ, bạn hẳn đã có ý tưởng cơ bản về 'sudoedit', bao gồm thời điểm sử dụng và lý do tại sao nó tốt hơn 'sudo' khi bạn chỉ muốn chỉnh sửa một tệp hoặc một vài tệp. Tất nhiên, giống như bất kỳ công cụ bảo mật nào khác, 'sudoedit' cũng có một số lỗ hổng, nhưng nó vẫn là giải pháp được khuyến nghị trong nhiều trường hợp sử dụng.
Một lựa chọn là cấp cho họ quyền truy cập 'sudo', nhưng điều đó giống như cấp cho một người lạ quyền truy cập vào toàn bộ ngôi nhà của bạn khi tất cả những gì họ cần là chỉ ở trong một trong những căn phòng của bạn - ý tôi là, quyền truy cập 'sudo' mặc định sẽ cho phép họ làm bất cứ điều gì yêu cầu quyền root, trong khi tất cả những gì cần thiết là khả năng chỉnh sửa một tệp hệ thống nhất định.
Với tính linh hoạt mà 'sudo' cung cấp, lựa chọn khác mà bạn có là điều chỉnh chính sách 'sudo' theo cách chỉ cấp quyền chỉnh sửa tệp đang đề cập. Ví dụ, một cái gì đó như thế này:
Mã:
%newsudo ALL = vim /path/to/file
Để hiểu những gì tôi đang nói đến, hãy xem xét một kịch bản trong đó quyền truy cập hạn chế đã đề cập ở trên được cung cấp cho nhóm và ai đó mở tệp đang đề cập để chỉnh sửa bằng lệnh 'sudo'.
Bây giờ, một bộ óc thông minh có kiến thức tốt về vim sẽ biết rằng họ có thể khởi chạy một shell mới từ bên trong trình soạn thảo - tất cả những gì họ phải làm là chạy lệnh vim sau:
Mã:
:shell
Đây là một ảnh chụp màn hình ví dụ:
Không cần phải nói, mục đích cung cấp quyền chỉnh sửa chỉ cho một tệp duy nhất đã bị đánh bại và người dùng có thể LÀM BẤT CỨ ĐIỀU GÌ bây giờ.
Hãy xem liệu chúng ta có tùy chọn nào khác không. Có một thẻ NOEXEC mà bạn có thể sử dụng trong mục nhập sudoers của mình:
Mã:
%newsudo ALL = [B]NOEXEC[/b]: vim /path/to/file
Mã:
[B]noexec[/b][B]
Nhiều hệ thống hỗ trợ thư viện chia sẻ có khả năng ghi đè các hàm thư viện mặc định bằng cách trỏ một biến môi trường (thường là LD_PRELOAD) đến một thư viện chia sẻ thay thế. Trên các hệ thống như vậy, chức năng noexec của sudo có thể được sử dụng để ngăn một chương trình do sudo chạy khỏi thực thi bất kỳ chương trình nào khác. [B]Tuy nhiên, lưu ý rằng điều này chỉ áp dụng cho các tệp thực thi được liên kết động gốc. Các tệp thực thi được liên kết tĩnh và các tệp thực thi bên ngoài chạy dưới mô phỏng nhị phân không bị ảnh hưởng.[/b]
Tính năng noexec được biết là hoạt động trên SunOS, Solaris, *BSD, Linux, IRIX, Tru64 UNIX, MacOS X, HP-UX 11.x và AIX 5.3 trở lên.
...
...
...
Để bật noexec cho một lệnh, hãy sử dụng thẻ NOEXEC như được ghi lại trong phần Đặc tả người dùng ở trên. Sau đây là ví dụ đó một lần nữa:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
Điều này cho phép người dùng aaron chạy /usr/bin/more và /usr/bin/vi với noexec được bật. Điều này sẽ ngăn hai lệnh đó thực thi các lệnh khác (chẳng hạn như shell). Nếu bạn không chắc hệ thống của mình có hỗ trợ noexec hay không, bạn luôn có thể dùng thử và kiểm tra xem lệnh thoát shell có hoạt động khi noexec được bật không.
[B]Lưu ý rằng việc hạn chế lệnh thoát shell không phải là giải pháp tối ưu. Các chương trình chạy dưới dạng root vẫn có khả năng thực hiện nhiều thao tác nguy hiểm (như thay đổi hoặc ghi đè lên tệp) có thể dẫn đến leo thang đặc quyền ngoài ý muốn.
...
...
...[/b]
Vậy thì giải pháp đáng tin cậy nhất là gì? Vâng, đó là sudoedit. Ngay cả hướng dẫn sử dụng sudoers cũng đề xuất công cụ này:
Mã:
Trong trường hợp cụ thể của trình soạn thảo, cách tiếp cận an toàn hơn là cấp cho người dùng quyền chạy sudoedit.[/b]
Tại sao nó tốt hơn
Với 'sudoedit', người dùng có thể lựa chọn sử dụng trình soạn thảo ưa thích của họ - không giống như giải pháp mà chúng ta đã thảo luận ở phần đầu của hướng dẫn này, trong đó người dùng buộc phải sử dụng trình soạn thảo Vim - cho phép họ tận hưởng các tùy chỉnh của riêng mình.Và lý do lớn nhất trong tất cả, với 'sudoedit', người dùng sẽ chỉnh sửa tệp dưới dạng chính họ, chứ không phải 'root'.Sudoedit hoạt động như thế nào
Để sử dụng sudoedit, mục nhập trong sudoer phải giống như sau:
Mã:
%newsudo ALL = sudoedit /path/to/file
Mã:
sudoedit /path/to/file
Sau đây là giải thích chi tiết từ trang hướng dẫn lệnh 'sudo':
Mã:
[B]-e, --edit[/b]
Chỉnh sửa một hoặc nhiều tệp thay vì chạy lệnh. Thay vì tên đường dẫn, chuỗi "sudoedit" được sử dụng khi tham khảo chính sách bảo mật. Nếu người dùng được chính sách ủy quyền, các bước sau sẽ được thực hiện:
1. Các bản sao tạm thời được tạo của các tệp sẽ được chỉnh sửa với
chủ sở hữu được đặt thành người dùng đang gọi.
2. Trình soạn thảo do chính sách chỉ định sẽ được chạy để chỉnh sửa
các tệp tạm thời. Chính sách sudoers sử dụng các biến môi trường
SUDO_EDITOR, VISUAL và EDITOR (theo
thứ tự đó). Nếu không có biến SUDO_EDITOR, VISUAL hoặc EDITOR
nào được đặt, chương trình đầu tiên được liệt kê trong tùy chọn trình soạn thảo
sudoers(5) sẽ được sử dụng.
3. Nếu chúng đã được sửa đổi, các tệp tạm thời
sẽ được sao chép trở lại vị trí ban đầu của chúng và các phiên bản
tạm thời sẽ bị xóa.
Nếu tệp được chỉ định không tồn tại, tệp đó sẽ được tạo. [B]Lưu ý rằng không giống như hầu hết các lệnh do sudo chạy, trình soạn thảo được chạy với môi trường của người dùng đang gọi không được sửa đổi[/b]. Nếu vì lý do nào đó, sudo không thể cập nhật tệp bằng phiên bản đã chỉnh sửa, người dùng sẽ nhận được cảnh báo và bản sao đã chỉnh sửa sẽ vẫn nằm trong tệp tạm thời.