Tại sao việc cấp quyền truy cập sudo vim cho người dùng thông thường lại có rủi ro?


30

Tôi muốn tạo một người dùng mới và cấp cho anh ta quyền truy cập sudo. Để cụ thể, tôi muốn anh ta sử dụng sudo vimvà chỉnh sửa httpd.conf. Tôi đã viết điều này trong sudoers:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

Tôi, tuy nhiên, nghe nói rằng điều này có thể có rủi ro. Tại sao điều này có vấn đề? Vấn đề nghiêm trọng đến mức nào?


16
Đối với một, lệnh của bạn sẽ cung cấp cho người dùng quyền truy cập đọc và ghi vào tất cả các tệp trên máy tính. Sau khi vào 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.
John1024

4
Bên cạnh đó, bạn có thể tạo một nhóm mới để thêm bất kỳ người dùng nào cần truy cập /etc/httpd/confs/httpd.conf. Sau đó sử dụng chgrp [OPTION] GROUPNAME FILEđể thay đổi quyền sở hữu nhóm của /etc/httpd/confs/httpd.conf. Một cái gì đó muốn groupadd vimportanttạo nhóm mới và chgrp -v vimportant /etc/httpd/confs/httpd.confthay đổi quyền sở hữu nhóm. yolinux.com/TUTORIALS/LinuxTutorialQuản lý nhóm.html
iyrin

4
Lưu ý rằng, vì tất cả các vấn đề được đề cập trong câu trả lời, sudo bao gồm một cách để cho phép người dùng chỉnh sửa các tệp với trình chỉnh sửa chạy với các đặc quyền riêng của họ. Tìm "Chỉnh sửa an toàn" trong sudoerstrang man.
Michał Politowski

2
(Không chắc chắn những gì tôi nói là đúng) Vì bạn đang cấp sudoquyền truy cập vào vim, người dùng sẽ có thể sử dụng vim làm root. Trong vim, bạn có thể chạy các lệnh UNIX ( Cách chạy các lệnh Unix từ bên trong Vim? ) Để người dùng có thể thực hiện những việc như useradd <myuser>, rm -rf /hoặc nhiều thứ khác.
fedorqui

6
Đây là loại câu hỏi sai. Khi xem xét cấp các đặc quyền nâng cao dưới bất kỳ hình thức nào, bạn không muốn nghĩ rằng "Tôi sẽ làm điều này, trừ khi tôi nghĩ về một số lý do tại sao nó nguy hiểm." Bạn muốn nghĩ rằng "Tôi sẽ không làm điều này, trừ khi tôi có thể tự chứng minh rằng nó an toàn."
Nate Eldredge

Câu trả lời:


60

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ư tarunzipthườ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à vimcho 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 sudoedittheo 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 -etắc trong dòng lệnh sudo của họ hoặc sử dụng sudoeditlệ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 sudoerstù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 sudoersnhã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 RESRICTNOEXECtù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.

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 NOEXECthẻ 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/usr/bin/vibậ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).


Tôi không biết điều đó sudo tarsudo unzipcũng gây ra vấn đề. Cảm ơn bạn.
mi0pu

5
Câu trả lời tốt đẹp. Sẽ tốt hơn nữa nếu nó cũng đề cập đến việc trốn thoát từ bên trong vim vào một cái vỏ. Khi bạn ở trong vỏ, nó hoàn toàn miễn phí và tất cả những gì sẽ hiển thị trong nhật ký là người dùng đang chỉnh sửa tệp cấu hình Apache của bạn.
một CVn

2
Ngoài ra? Nếu bạn đang sử dụng vim, bạn có thể làm điều gì đó thật kinh khủng, như :!rm -rf /, rất tiếc!
Wayne Werner

1
echo "user ALL=(ALL) NOPASSWD: ALL" > ~/sudoers; tar cv ~/sudoers | sudo tar xv -C /etcVà bùm. Root truy cập vào tar là một lỗ hổng.
Qix

1
@ MichaelKjorling đó là câu trả lời mà tôi đang mong đợi :sh, sau đó bùng nổ, root root
Lạch

5

Cấu hình này cho phép người dùng chỉnh sửa tập tin đó. Để làm như vậy, ông bắt đầu một vimtrình soạn thảo với quyền root.

Khi vimlệnh được bắt đầu, người dùng có thể làm bất cứ điều gì mình thích với trình soạn thảo đó. - Anh ta có thể mở một tập tin khác hoặc thậm chí bắt đầu một shell từ vim.

Do đó, người dùng hiện có thể xem và chỉnh sửa các tệp tùy ý và chạy các lệnh tùy ý trên hệ thống của bạn.


Bạn có ý nghĩa gì bởi "Cấu hình này cho phép tất cả người dùng chỉnh sửa tệp đó"? "Người dùng" có một ý nghĩa đặc biệt?
mi0pu

Rất tiếc, đã không chú ý. đã sửa câu trả lời.
michas

5

Khóa bảo mật

Một số chương trình, ví dụ như less, vi, vimmore, cho phép các chương trình khác để chạy từ một lệnh gì vỏ được gọi là Shell thoát hoặc thoát để thông dịch lệnh. Trong những trường hợp này, bạn có thể sử dụng NOEXECđể ngăn chặn một số chương trình cho phép thực thi các đặc quyền chương trình khác. Thí dụ:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

Điều này sẽ cho phép người dùng chỉnh sửa hoặc xem và đặc quyền xem bất kỳ tệp nào trên hệ thống đang chạy vim và hơn thế nữa, nhưng vô hiệu hóa khả năng chạy các chương trình khác với các đặc quyền từ trình thông dịch lệnh thoát vim.

Quan trọng sudobao gồm một số khóa bảo mật (mặc định) có thể ngăn chặn các tác vụ nguy hiểm, chẳng hạn như chuyển hướng đầu ra tiêu chuẩn của việc thực hiện chương trình ( STDOUT) sang các tệp bên ngoài thư mục chính của người dùng.

Nếu được xác định trong tệp /etc/sudoersmà người dùng có thể chạy với các đặc quyền /usr/bin/vim, nghĩa là như sau:

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less

sudocho phép người dùng thông thường được xác định có thể chạy /usr/bin/vimtheo các cách sau:

sudo /usr/bin/vim
sudo vim

Nhưng được ngăn không cho chạy vim như sau:

cd /usr/bin
sudo ./vim

2
Đây có phải là một câu trả lời hoặc một lỗi cắt và dán?
jasonwryan

1
Hầu hết điều đó không liên quan đến câu hỏi.
Hauke ​​Laging


1

Một cải tiến bảo mật gia tăng có thể sẽ là thay thế:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

với

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

và sau đó có người dùng chạy sudo rvim /etc/httpd/confs/httpd.confthay thế.

Vim hỗ trợ chế độ hạn chế được kích hoạt với tùy chọn dòng lệnh -Z hoặc bằng cách khởi động chương trình dưới dạng rvim. Khi chế độ hạn chế được bật "tất cả các lệnh sử dụng lớp vỏ bên ngoài đều bị tắt". Cách tiếp cận này sẽ không ngăn người dùng sử dụng :split filelệnh ex để mở các tệp khác, nhưng ít nhất nên ngăn chặn các lệnh shell độc hại có chủ ý như :!rm -rf /.


1
Thật không may, điều này cũng không an toàn 100%. Nếu người dùng quản lý để chỉnh sửa / etc / sudoers để biến mình thành toàn năng trên hệ thống, thì anh ta có thể chạy bất kỳ lệnh nào dưới dạng root.
vurp0

0

Tôi đồng ý với câu trả lời của HBruijn rằng chạy vim với quyền root thực sự mở hệ thống rất rộng và sudoedit sẽ là một giải pháp an toàn hơn.

Nhưng ngay cả khi đó, hệ thống của bạn có thể vẫn sẽ khá mở. Ít nhất giả định rằng một số quy trình apache với quyền root sẽ được khởi chạy dựa trên cấu hình đó. Có một triệu cách để cấu hình apache theo cách nó sẽ thực thi các chương trình bên ngoài. Như một ví dụ, hãy xem xét đối số ống dẫn đến lệnh CustomLog . Hướng dẫn sử dụng nêu rõ:

Bảo vệ:

Nếu một chương trình được sử dụng, thì nó sẽ được chạy như người dùng đã bắt đầu httpd. Đây sẽ là root nếu máy chủ được khởi động bằng root; hãy chắc chắn rằng chương trình này an toàn.

Rõ ràng, nếu người dùng của bạn có thể viết cấu hình, họ có thể thay đổi chương trình đó thành bất cứ điều gì họ thích, ví dụ: thứ gì đó chạy tập lệnh shell để cấp cho họ quyền thêm.

Vì lý do này, gần đây tôi đã hack một cách để sử dụng các khả năng theo cách mà apache có thể có được khả năng đặc biệt để liên kết với một cổng đặc quyền mặc dù nó thực thi như một người dùng bình thường. Bằng cách đó, người dùng có thể chỉnh sửa cấu hình và thậm chí khởi chạy máy chủ, và vẫn chủ yếu là an toàn. Vấn đề duy nhất là họ có thể liên kết bất kỳ quy trình nào trên bất kỳ IP nào. Một mức độ tin cậy nhất định vẫn còn, vì họ có thể hình dung ra một cách để đánh sập hệ thống sshd, và sau đó khởi chạy phiên bản của chính họ trong nỗ lực lấy mật khẩu gốc.


0

Cần lưu ý rằng thậm chí sudoedit {.../whatever.conf}có thể là một rủi ro bảo mật.

Tạo một kịch bản shell /tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

và gọi tập lệnh này trong tập tin cấu hình của bạn. Tôi biết một số ví dụ về cách tiếp cận này đang hoạt động:

samba -> đăng nhập lệnh mã thông báo nt

log nt token command = /tmp/make_me_root.sh

syslog-ng -> chương trình: Gửi tin nhắn đến các ứng dụng bên ngoài

log { 
    source{ system() } ; 
    destination { program("/tmp/make_me_root.sh") };
}; 

Apache -> CustomLog

CustomLog "|/tmp/make_me_root.sh"

Tôi cho rằng một người có thể mở rộng danh sách này vô tận.

Tất cả bạn phải làm là để khởi động lại dịch vụ. Tất nhiên, một khi bạn đã root, bạn sẽ hoàn nguyên các dòng cấu hình như vậy để làm mờ dấu vết của bạn.


0

Tất nhiên, nó không an toàn hơn chút nào. Như đã nói trước khi sudoedit, đó là cách dễ dàng và phù hợp nhất để làm điều đó.

Điều tôi muốn thêm là vim cho phép khởi chạy shell, vì vậy, không chỉ có thể chỉnh sửa bất kỳ tệp hệ thống nào, nó còn cho phép khởi chạy shell và làm bất cứ nơi nào anh ta muốn.

Chỉ cần thử khởi chạy một vim và gõ: sh

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.