Điểm:2

Có điều gì như sự kiện trong Ubuntu không?

lá cờ in

Tôi muốn biết liệu Ubuntu có thứ gì đó giống như sự kiện hay không. Tôi cần điều hành một công việc của Jenkins nhưng Jenkins không có đặc quyền sudo và tôi không muốn giao nó cho anh ấy. Nhưng công việc cần chạy một số hành động yêu cầu đặc quyền sudo. Giải pháp có thể là kích hoạt một sự kiện sẽ lắng nghe với tư cách là người dùng root và sự kiện này sẽ chạy mã với đặc quyền sudo. Có thể tôi vẫn còn bối rối bởi các đặc quyền nhưng tôi nghĩ điều này có thể rất hữu ích. Hoặc một cái gì đó như giao diện người dùng root công khai sẽ có sẵn cho những người dùng khác nhưng sẽ chạy với tư cách là người dùng root. Thích

root->doS SomethingAsRoot()

Hy vọng bạn hiểu những gì tôi muốn đạt được. Cảm ơn vì sự giúp đỡ.

PS Câu hỏi này có liên quan đến vấn đề này

muru avatar
lá cờ us
Chắc chắn, rất nhiều thứ sử dụng D-Bus cho việc này, ví dụ: GUI của trình quản lý mạng và các công cụ dòng lệnh giao tiếp qua D-Bus với trình nền của trình quản lý mạng, trình nền này chạy với quyền root.
lá cờ in
Cảm ơn tôi sẽ xem xét nó.
lá cờ in
Hmm, tôi đang tìm kiếm thông tin về D-bus nhưng tôi không chắc liệu nó có thể chạy tập lệnh dưới người dùng gốc sẽ được kích hoạt với người dùng khác hay không.
raj avatar
lá cờ cn
raj
Bạn không thể cấp đặc quyền sudo cho Jenkins ** đối với tập lệnh cụ thể mà bạn muốn chạy ** sao? Sudo không phải là giải pháp "tất cả hoặc không có gì" - hoàn toàn ngược lại, bạn có thể chỉ định rất chi tiết người dùng nào có thể chạy cái gì.
lá cờ in
Luồng trông giống như Jenkins chạy git clone. Git repo chứa tập lệnh bash mà Jenkins chạy. Và tập lệnh chạy `rm -rf` ở cuối. Và đó là vấn đề khiến tôi cần xóa các tệp có 644 quyền của người dùng khác (dữ liệu www). Giải pháp có thể là nếu tôi có thể buộc dữ liệu www (Laravel) tạo tệp có đặc quyền 664.
lá cờ in
Làm cách nào tôi có thể thêm đặc quyền sudo vào tập lệnh cho Jenkins? Jenkins có thể viết lại kịch bản và sau đó làm bất cứ điều gì. Tôi biết sudo có thể được ủy quyền để ra lệnh không viết kịch bản. Nhưng trong trường hợp này, lệnh rm hơi nguy hiểm.
raj avatar
lá cờ cn
raj
@Äamo Bạn cũng có thể hạn chế quyền sudo đối với một lệnh **với các tham số cụ thể**. Vì vậy, nếu tập lệnh chạy `sudo rm -rf /some/path` chẳng hạn, thì bạn chỉ có thể cấp quyền cho Jenkins để chạy `rm -rf /some/path`. Tất nhiên, điều này không hoàn toàn có xu hướng cố gắng khắc phục nó và xóa một thư mục khác, nhưng điều này không đơn giản. Tuy nhiên, trong trường hợp đó, tôi nghĩ cách tiếp cận an toàn nhất là chạy tệp nhị phân setuid chạy lệnh được mã hóa cứng `rm -rf /some/path`.
lá cờ in
Tập lệnh python hoặc php có thể được sử dụng làm "nhị phân setuid" không? (tất nhiên là không) Nó khiến tôi phát điên lên...
lá cờ in
Tôi có nó. Tôi đã tạo tập lệnh bash vô tận chạy với quyền root trên nền để xóa các thư mục cứ sau 10 giây. https://stackoverflow.com/questions/68003861/how-to-set-laravel-to-generate-files-with-required-permissions
raj avatar
lá cờ cn
raj
Bạn đã giải quyết vấn đề của mình theo cách khác (và có lẽ là cách tốt hơn, nếu chỉ cần thay đổi quyền), nhưng tôi vẫn không hiểu vấn đề của bạn với trình bao bọc nhị phân xung quanh tập lệnh để chạy nó với quyền root là gì. Bạn chỉ cần chạy trình bao bọc thay vì tập lệnh. Bạn vẫn có thể sửa đổi tập lệnh theo ý muốn và làm bất cứ điều gì bạn muốn với nó. Và nếu bạn chỉ muốn chạy một lệnh duy nhất (`rm`) với quyền root, bạn chỉ tạo trình bao bọc xung quanh lệnh đó và chạy trình bao bọc đó thay vì `rm` trực tiếp. Nó rất đơn giản. vấn đề của bạn với nó là gì?
Điểm:1
lá cờ cn
raj

Nếu các hành động cần được chạy với quyền root có thể được tách thành các quy trình/tập lệnh riêng biệt, thì bạn có thể chạy các quy trình này với quyền root setuid. Nó là một công cụ rất tiện dụng mà theo ý kiến ​​cá nhân của tôi thì nó rất hiếm khi được sử dụng.

quy trình setuid là gì? Hãy tìm ví dụ tại mật khẩu chỉ huy. Nó có thể được chạy bởi bất kỳ người dùng nào, nhưng nó cần được chạy với quyền root, vì nó cần sửa đổi mật khẩu được lưu trữ trong một tệp mà chỉ root mới có thể truy cập (/etc/shadow).

Nó được thực hiện như thế nào? Nhìn vào các quyền của /usr/bin/passwd nhị phân:

-rwsr-xr-x 1 root root 68208 maj 28 2020 /usr/bin/passwd

Chữ "s" thay vì "x" trong trường chủ sở hữu cho biết rằng tệp nhị phân này sẽ được chạy với quyền của chủ sở hữu - đó là quyền root.

Bằng cách này mỗi nhị phân có thể được tạo để chạy với quyền root (hoặc bất kỳ người dùng nào khác), không phụ thuộc vào người gọi nó.

Tuy nhiên, trên kịch bản bit setuid bị bỏ qua vì lý do bảo mật. Vì vậy, để chạy một kịch bản với quyền root, bạn cần sử dụng một trình bao bọc nhị phân điều đó sẽ gọi tập lệnh từ bên trong. Bạn có thể sử dụng chương trình C đơn giản sau để tạo một trình bao bọc như vậy:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int chính ()
{
   intrc;
   thiết lập( 0 );
   rc=WEXITSTATUS(system( "/path/to/your/script" ));
   thoát (rc);
}

Biên dịch chương trình và tạo gốc setuid có thể thực thi được (giả sử tệp thực thi được gọi là vỏ bánh, làm sudo chown root: trình bao bọc gốc theo dõi bởi Trình bao bọc Sudo chmod o+s).

BTW. Tập lệnh được chạy từ bên trong trình bao bọc không cần phải thiết lập; chỉ trình bao bọc cần.

Chỉnh sửa: từ lời giải thích của bạn trong các nhận xét, có vẻ như bạn muốn chạy một ứng dụng cụ thể rm -rf/một số/đường dẫn lệnh với quyền root và quan tâm đến việc không vô tình xóa bất kỳ thứ gì khác. Trong trường hợp đó, tôi đề nghị chỉ cần thay thế /đường dẫn/đến/của bạn/tập lệnh tham gia vào chương trình bao bọc ở trên bằng chính lệnh này rm -rf/một số/đường dẫn, và chỉ cần chạy vỏ bánh nhị phân từ tập lệnh của bạn ở nơi bạn sẽ chạy rm -rf/một số/đường dẫn chỉ huy. Đây dường như là cách tiếp cận an toàn nhất.

lá cờ in
Không hiểu nó. Một cái gì đó ít phức tạp hơn nên tồn tại. Tại sao các tệp S không thể thực thi trực tiếp mà từ trình bao bọc? Nó chả có nghĩa gì cả.
raj avatar
lá cờ cn
raj
@Äamo Chỉ trên **nhị phân** bit **s** mới có hiệu lực. Đối với **scripts** nó không hiệu quả vì có những tác động bảo mật nghiêm trọng đằng sau nó. Do đó, các tập lệnh cần được chạy từ bên trong setuid **nhị phân**. Tệp nhị phân đã có quyền gốc (vì nó được thiết lập sẵn), vì vậy khi nó thực thi tập lệnh, tập lệnh sẽ kế thừa các quyền này. BTW. Tập lệnh chạy từ bên trong trình bao bọc không cần phải đặt bit **s**. Chỉ có trình bao bọc cần.
lá cờ in
Đó là lý do tại sao mọi người không sử dụng nó. Có điều gì giống như các sự kiện trong Linux không? Cái gì đó sẽ lắng nghe với quyền root và thực hiện một số hành động với quyền root?
raj avatar
lá cờ cn
raj
@Äamo sử dụng ổ cắm, bạn luôn có thể viết một ứng dụng máy khách-máy chủ sẽ lắng nghe dữ liệu đến trên một ổ cắm và thực hiện bất kỳ hành động nào đối với dữ liệu đó. Cả hai mặt của ổ cắm có thể chạy dưới những người dùng khác nhau và đây là cơ chế tiêu chuẩn được nhiều ứng dụng sử dụng để phân tách đặc quyền. Ví dụ, nếu bạn đang sử dụng ứng dụng khách MySQL (không có đặc quyền) để yêu cầu máy chủ MySQL (có đặc quyền) truy cập cơ sở dữ liệu, thì bạn đang sử dụng chính xác ứng dụng này. Tuy nhiên, việc lập trình các ổ cắm chắc chắn khó hơn là gọi một nhị phân setuid :) Có lẽ bạn cũng có thể sử dụng các đường ống có tên theo cách tương tự.
lá cờ in
Đường ống được đặt tên là gì? Có vẻ như nó là không thể đối với tôi.
raj avatar
lá cờ cn
raj
@Äamo nếu bạn chạy một lệnh như `mknod /tmp/mypipe p` và cấp quyền thích hợp cho cả hai người dùng đối với `/tmp/mypipe`, thì các quy trình chạy trên những người dùng khác nhau có thể giao tiếp bằng ví dụ. một ghi vào `/tmp/mypipe`, và một đọc từ `/tmp/mypipe`. Nó giống như đường ống thông thường `|` nhưng cho phép cả hai quy trình chạy độc lập. Nhưng tôi không nghĩ rằng điều này sẽ đặc biệt hữu ích trong trường hợp của bạn.
marko avatar
lá cờ tw
Nếu bạn đang ở trong một môi trường đồ họa chẳng hạn như X11, bạn có thể gọi `pkexec` từ bên trong tập lệnh bằng cách đặt dòng sau làm dòng đầu tiên trong tập lệnh: `#!/usr/bin/pkexec /bin/bash` rồi đến phần còn lại của nó chạy với quyền root/admin.Người dùng sẽ được nhắc nhập mật khẩu gốc khi tập lệnh chạy.
lá cờ in
Tôi có nó. Tôi đã tạo tập lệnh vô tận chạy với quyền root trên nền và nó sẽ xóa thư mục sau mỗi 10 giây. Có thể không mát mẻ nhưng hoạt động như một sự quyến rũ. https://stackoverflow.com/questions/68003861/how-to-set-laravel-to-generate-files-with-required-permissions
lá cờ in
Giải pháp cuối cùng là sử dụng setfacl cho thư mục mẹ.
Điểm:0
lá cờ in

Giải pháp đơn giản của tôi là chạy tập lệnh nền vô tận với quyền root để tìm và xóa các thư mục cần thiết cứ sau 10 giây. Nó chạy dưới dạng nohup nên nó vẫn chạy mặc dù tôi đã đóng terminal.

trong khi đúng
làm
  tìm /var/www -maxdepth 1 -type d -name 'triển khai-old-*' -exec rm -rf {} \;
  ngủ 10
xong
Điểm:0
lá cờ in

Giải pháp cuối cùng cho vấn đề này khi Laravel tạo các tệp bằng chmod 644 là thiết lập các đặc quyền ACL cho thư mục mẹ thông qua setfacl.

setfacl -R -dm "g:www-data:rw" $www_new_app_dir/storage 

trong đó tất cả các tệp được tạo sẽ kế thừa cài đặt acl từ thư mục mẹ. Trong trường hợp này, rw dành cho nhóm dữ liệu www.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.