Mặc dù bạn hạn chế các đối số dòng lệnh, không có gì ngăn người dùng sử dụng vim để mở, chỉnh sửa và ghi đè bất kỳ tệp ngẫu nhiên nào khi nó đang chạy dưới quyền root.
Người dùng có thể chạy sudo vim /etc/httpd/conf/httpd.conf
và sau đó
- xóa tất cả văn bản đó khỏi bộ đệm chỉnh sửa
- sau đó để thuận tiện cho nguồn một tệp hiện có (mặc dù điều đó thậm chí không bắt buộc): ví dụ: cấu hình sudo
:r /etc/sudoers
LƯU Ý: Trừ khi bị giới hạn bởi SELinux, người dùng có thể đọc bất kỳ tệp nào theo cách này!
- cấp cho mình nhiều đặc quyền sudo
user ALL=(ALL) NOPASSWD: ALL
- ghi đè lên cấu hình cũ
:w /etc/sudoers
Tôi có thể tưởng tượng hàng tá cách tương tự mà người dùng của bạn bây giờ có thể truy cập, sửa đổi hoặc phá hủy hệ thống của bạn.
Bạn thậm chí sẽ không có một dấu vết kiểm toán mà các tệp đã được thay đổi theo kiểu này vì bạn sẽ chỉ thấy anh ta chỉnh sửa cấu hình Apache của bạn trong các thông điệp nhật ký sudo. Đây là một rủi ro bảo mật trong việc cấp sudo
đặc quyền cho bất kỳ biên tập viên.
Đây ít nhiều là cùng một lý do tại sao việc cấp quyền sudo gốc cho các lệnh như tar
và unzip
thường không an toàn, không có gì ngăn cản bạn bao gồm các thay thế cho tệp nhị phân hệ thống hoặc tệp cấu hình hệ thống trong kho lưu trữ.
Một rủi ro thứ hai, như nhiều nhà bình luận khác đã chỉ ra, đó là vim
cho phép thoát khỏi shell , nơi bạn có thể bắt đầu một shell con từ bên trong vim cho phép bạn thực hiện bất kỳ lệnh tùy ý nào . Từ trong phiên sudo vim của bạn, những cái đó sẽ chạy như root, ví dụ như thoát shell:
:!/bin/bash
sẽ cung cấp cho bạn một vỏ gốc tương tác
:!/bin/rm -rf /
sẽ làm cho những câu chuyện hay trong quán rượu.
Thay vào đó, phải làm gì?
Bạn vẫn có thể sử dụng sudo
để cho phép người dùng chỉnh sửa các tệp mà họ không sở hữu một cách an toàn.
Trong cấu hình sudoers của bạn, bạn có thể đặt một lệnh dành riêng đặc biệt sudoedit
theo sau là tên đường dẫn đầy đủ (ký tự đại diện) cho (các) tệp mà người dùng có thể chỉnh sửa:
user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
Sau đó, người dùng có thể sử dụng công -e
tắc trong dòng lệnh sudo của họ hoặc sử dụng sudoedit
lệnh:
sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf
Như đã giải thích trong trang man :
Các -e (edit)
tùy chọn chỉ ra rằng, thay vì chạy một lệnh, người dùng muốn chỉnh sửa một hoặc nhiều tệp hơn. Thay cho lệnh, 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 ủy quyền bởi chính sách, các bước sau sẽ được thực hiện:
- Các bản sao tạm thời được tạo từ các tệp sẽ được chỉnh sửa với chủ sở hữu được đặt thành người dùng gọi.
- Trình chỉnh sửa được chỉ định bởi chính sách đượ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ó SUDO_EDITOR, VISUAL hoặc EDITOR nào được đặt, chương trình đầu tiên được liệt kê trong
sudoers
tùy chọn trình chỉnh sửa (5) sẽ được sử dụng.
- Nếu chúng đã được sửa đổi, các tệp tạm thời đượ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, nó sẽ được tạo.
Lưu ý rằng không giống như hầu hết các lệnh được chạy bởi sudo, trình soạn thảo được chạy với môi trường người dùng đang gọi không được sửa đổi. Nếu vì lý do nào đó, sudo không thể cập nhật tệp với 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 ở trong tệp tạm thời.
Các sudoers
nhãn hiệu cũng có một phần toàn bộ như thế nào nó có thể cung cấp hạn chế bảo vệ chống lại thoát vỏ với RESRICT
và NOEXEC
tùy chọn.
restrict
Tránh cho người dùng quyền truy cập vào các lệnh cho phép người dùng chạy các lệnh tùy ý. Nhiều trình soạn thảo có chế độ hạn chế trong đó thoát vỏ bị vô hiệu hóa, mặc dù sudoedit là một giải pháp tốt hơn để chạy các trình soạn thảo thông qua sudo. Do số lượng lớn các chương trình cung cấp thoát vỏ, việc giới hạn người dùng đối với tập hợp các chương trình thường không khả thi.
và
noexec
Nhiều hệ thống hỗ trợ thư viện dùng chung có khả năng ghi đè các chức năng thư viện mặc định bằng cách trỏ biến môi trường (thường là LD_PRELOAD) vào thư viện dùng chung 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 chương trình chạy bởi sudo thực thi bất kỳ chương trình nào khác. Lưu ý, ... ...
Để bật noexec cho một lệnh, hãy sử dụng NOEXEC
thẻ như được ghi lại trong phần Đặc tả người dùng ở trên. Đâ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
bật noexec. Đ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).
vim
, người dùng có thể tự do mở và ghi vào bất kỳ tập tin nào anh ta muốn.