shell script: sử dụng sudo bên trong nó vs chạy nó với sudo?


13

Khi viết một kịch bản shell, trong đó một số nhưng không phải tất cả các lệnh trong nó đều cần các đặc quyền siêu người dùng, tôi sẽ

  • thêm sudo vào các lệnh cần đặc quyền siêu người dùng và chạy tập lệnh shell mà không cần sudo hoặc

  • không thêm sudo vào các lệnh cần đặc quyền siêu người dùng, nhưng chạy tập lệnh shell với sudo?

Theo cách thứ hai, tôi sẽ chỉ cần cung cấp mật khẩu của mình một lần, nhưng tất cả các lệnh trong tập lệnh sẽ được chạy với các đặc quyền siêu người dùng, bao gồm cả các lệnh không cần.

Theo cách đầu tiên, tôi có thể cần cung cấp mật khẩu của mình nhiều lần cho các lệnh sudo khác nhau, trong khi các đặc quyền siêu người dùng chỉ được cấp cho những lệnh cần chúng.

Từ mối quan tâm an ninh, cách đầu tiên là tốt hơn. Để thuận tiện, cách thứ hai là tốt hơn.

  1. Tôi đã nghĩ đến việc áp dụng cách đầu tiên. Vì vậy, tôi phải đối phó với sự bất tiện khi cung cấp mật khẩu của mình cho nhiều lệnh sudo trong tập lệnh shell.

  2. Stephen Harris đã viết :

    Một tập lệnh được viết tốt sẽ phát hiện nếu nó đang chạy với quyền phù hợp và hoàn toàn không gọi sudo, nhưng có rất nhiều tập lệnh xấu

    Vậy tôi có nên sử dụng cách thứ hai? Nếu vậy,

    • Làm thế nào tôi có thể viết "tập lệnh sẽ phát hiện nếu nó đang chạy với quyền phù hợp và không gọi sudo chút nào"?

    • Làm cách nào tôi có thể cải thiện bảo mật của nó để tránh sự cố cung cấp đặc quyền siêu người dùng cho các lệnh không cần đến chúng khi chạy tập lệnh với sudo?

  3. Cách tiếp cận đơn giản này có cách tốt nhất trong cả hai cách tiếp cận: thêm sudo vào các lệnh chỉ cần nó và chạy tập lệnh có hoặc không có sudo tùy thuộc vào việc tôi muốn thuận tiện hay bảo mật? Liệu phương pháp này có một số vấn đề?

Cảm ơn.


Tôi nghĩ rằng sudocó một bộ đệm thông tin đăng nhập mặc định. Đây có phải là vô hiệu hóa trên nền tảng của bạn?
đường ống

@pipe Kịch bản của anh ấy có thể ngủ trong một số lần nhất định, và theo cách đó, bộ đệm có thể không hoạt động.
LinuxSecurityFreak

Câu trả lời:


15

Để giải quyết vấn đề đầu tiên của bạn:

Làm thế nào tôi có thể viết "tập lệnh sẽ phát hiện nếu nó đang chạy với quyền phù hợp và không gọi sudo chút nào"?

Có một kiểm tra đơn giản và POSIX cho root:

#!/bin/sh
is_user_root ()
{
    [ "$(id -u)" -eq 0 ]
}

Ngoài ra, trong Bash, các lập trình viên hướng đến hiệu suất nhiều hơn có thể muốn sử dụng:

#!/bin/bash
is_user_root ()
{
    [ ${EUID:-$(id -u)} -eq 0 ]
}

Lưu ý rằng tôi cố tình bọc mã trong các chức năng để sử dụng lại.

Để giải quyết vấn đề thứ hai của bạn:

Làm cách nào tôi có thể cải thiện bảo mật của nó để tránh sự cố cung cấp đặc quyền siêu người dùng cho các lệnh không cần đến chúng khi chạy tập lệnh với sudo?

Bạn không thể làm gì nhiều về điều này. Ít nhất không có gì đến với tâm trí của tôi. Nếu tôi thấy kịch bản, tôi có thể có đề xuất. Nhưng vì bạn không bao gồm nó trong câu hỏi của mình ... Nếu bạn chạy toàn bộ tập lệnh bằng sudohoặc như root, tôi thấy không có cách nào để kiểm soát điều này.

Để giải quyết các bình luận:

Bạn nghĩ gì về "sử dụng sudo bên trong nó và chạy nó với sudo"

Trong các kịch bản của tôi, tôi thường tiến hành theo cách tiếp cận sau, nhưng điều đó không nhất thiết có nghĩa là tôi giới thiệu nó cho bạn. Bởi vì nó phụ thuộc vào kịch bản dành cho ai - rootchỉ dành cho ; đối với người dùng chủ yếu ngoại trừ việc có một số người dùng có sudoquyền; bạn sẽ phải bao gồm cả kịch bản của bạn vào câu hỏi để tôi có thể trả lời với bất kỳ giá trị nào.


sudo -u "$SUDO_USER" command...?
Michael Homer

Cảm ơn. Bạn nghĩ gì về "sử dụng sudo bên trong nó và chạy nó với sudo"?
Tim

Cảm ơn. Cách tiếp cận đơn giản này có cách tốt nhất trong cả hai cách tiếp cận: thêm sudo vào các lệnh chỉ cần nó và chạy tập lệnh có hoặc không có sudo tùy thuộc vào việc tôi muốn thuận tiện hay bảo mật? Liệu phương pháp này có một số vấn đề?
Tim

@MichaelHomer Tôi đã tự hỏi những gì sudo -u "$SUDO_USER" commandcó nghĩa là ở đây?
Tim

@Tim Mặc dù tôi không tìm thấy bất kỳ vấn đề nào với cách tiếp cận đó, nhưng ai đó có thể phản đối với các lập luận hợp lý. Điều này thực sự nằm ngoài phạm vi câu hỏi ban đầu của bạn. Tôi cần thực hiện sao lưu M-Disc hàng tháng của mình ngay bây giờ, vì vậy tôi không nghĩ sẽ có sẵn ngày hôm nay, xin lỗi vì điều đó. Tôi hy vọng tôi đã trả lời chính ít nhất. Hẹn gặp bạn vào ngày mai.
LinuxSecurityFreak

-4

Tôi nghĩ rằng tôi có thể trả lời điều này.

Vậy tôi có nên sử dụng cách thứ hai?

Không có lý do tại sao bạn nên có một vấn đề ở đây, đây là lý do:

Nếu chỉ có một lệnh cần được chạy dưới quyền root, thì runchương trình của bạn là roothoặc sudobởi vì sudobên trong tập lệnh của bạn là con đường dài hơn. Bạn đã quên rằng lập trình viên lười biếng?

Nếu bạn cần nhiều lệnh runnhư rootsau đó chạy nó như là roothay sudo.

Làm cách nào tôi có thể cải thiện bảo mật của nó để tránh sự cố cung cấp đặc quyền siêu người dùng cho các lệnh không cần đến chúng khi chạy tập lệnh với sudo?

Nếu người dùng khác cần runchương trình của bạn thì hãy thiết lập sudocho những người đó vì sudocó thể tùy chỉnh rất nhiều và sẽ đáp ứng nhu cầu của bạn.

Đây là một ví dụ với sudo:

Luôn sử dụng visudokhi chỉnh sửa tệp sudoers .....

kate ALL=(ALL) NOPASSWD: /usr/local/bin/script ARG1 ARG2

sudo cũng rất tốt để thay đổi người dùng bên trong chương trình / tập lệnh của bạn, đây là một dòng từ một trong các tập lệnh của tôi:

sudo -i -u "$user" user="$user" CURRENTDIR="$CURRENTDIR" BASHRC="$BASHRC" bash <<'EOF'

Làm thế nào tôi có thể viết "tập lệnh sẽ phát hiện nếu nó đang chạy với quyền phù hợp và không gọi sudo chút nào"?

https://www.cyberciti.biz/tips/shell-root-user-check-script.html
how-do-i-xác định-if-a-shell-script-is-running-with-root-allow

bash/sh:

#!/bin/bash
# (Use #!/bin/sh for sh)
if [ `id -u` = 0 ] 
then
        echo "I AM ROOT, HEAR ME ROAR"
fi

csh:

#!/bin/csh
if ( `id -u` == "0" ) 
then
        echo "I AM ROOT, HEAR ME ROAR"
endif

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
  echo "You must be a root user" 2>&1
  exit 1
else
  mount /dev/sdb1 /mnt/disk2
fi

EDIT theo yêu cầu từ quý ông @terdon:

Hãy nghĩ về kịch bản của bạn theo cách này ....

Đây có phải là một kịch bản công khai (những người khác ngoài bạn sẽ sử dụng nó) Kịch bản này làm gì? Nó cho bạn biết thời gian? Hay nó cập nhật iptables trên 200 hệ thống? Nếu chỉ có bạn sử dụng nó, nó có liên quan đến công việc / chuyên nghiệp hay là để sử dụng cá nhân?

Bạn chỉ cần biết trước nhóm người dùng của bạn bao gồm những gì, đó là nó.

Nếu đó là writtenđể cho hoặc bán cho quản trị viên, thậm chí sau đó, tại sao không scriptđược phép chạy như root?? Nó có hại gì?

Các kịch bản / chương trình thực chạy thường là người dùng đặc quyền và không ai đề cập rằng đó không phải là vấn đề, nhưng khi các lập trình viên, chủ yếu là người mới như tôi nói về những điều này, thì đó là một mối đe dọa bảo mật thực sự ..... anh chàng trong bài đăng của bạn là gì Nói đến việc cố gắng nói trong khi không thanh lịch là một số người nhìn vào sự kiểm soát mà bạn có systemvà mã của bạn .... bạn có đặt các tệp thành nhiều quyền hơn bạn sẽ sử dụng không, bạn có kiểm tra tất cả không logic hay là lập trình viên tài năng sẽ thấy những nguy hiểm trong mã của bạn chỉ cần liếc nhìn nó?

Nếu bạn code needs root, hãy sử dụng sudovà nếu có nhiều người chỉ cần chạy nó như root....... câu trả lời của tôi kết thúc ở đây phew


2
@s SomethingS Something bạn có thể giải thích lý do tại sao bạn khuyên bạn luôn luôn chạy tập lệnh dưới dạng root, ngay cả khi chỉ có một lệnh duy nhất cần quyền root? Bạn đưa ra hai khả năng trong câu trả lời của mình (một lệnh yêu cầu quyền root hoặc nhiều) nhưng bạn đề xuất điều tương tự cho cả hai.
terdon

2
Tôi đã suy nghĩ về vấn đề này và đọc các cuộc thảo luận tương tự khác. Câu trả lời này chỉ làm tôi bối rối. (Nhưng, bạn đã có đủ số phiếu bầu rồi.)
Joe
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.