16 điểm bởi GN⁺ 2024-05-01 | 1 bình luận | Chia sẻ qua WhatsApp

run0: công cụ thay thế sudo của systemd

  • Công cụ mới được đưa vào v256 (thực chất là một symlink tới systemd-run vốn đã có sẵn)
  • Hoạt động tương tự sudo, nhưng không phải SUID
  • Yêu cầu service manager gọi lệnh hoặc shell bằng UID của người dùng đích
    • Gọi lệnh đích trong một ngữ cảnh thực thi cô lập được fork mới từ PID 1, thay vì kế thừa ngữ cảnh từ phía client
  • run0 không triển khai ngôn ngữ cấu hình riêng mà sử dụng polkit để phân quyền.
  • Trong quá trình nâng quyền, nền terminal sẽ chuyển sang tông đỏ để báo rằng đang chạy với đặc quyền. Tiêu đề cửa sổ cũng hiển thị một chấm đỏ cho biết trạng thái nâng quyền.
  • Hỗ trợ tùy chọn --property= của systemd-run, nên có thể chỉ định các thiết lập service mong muốn cho lệnh/phiên đặc quyền được gọi.

Vấn đề của sudo

  • sudo là một binary SUID tương đối lớn, tức là mã đặc quyền có thể được người dùng không đặc quyền gọi trong ngữ cảnh của chính họ.
  • Bề mặt tấn công lớn do có ngôn ngữ cấu hình phức tạp, plugin có thể nạp (LDAP, v.v.), đối sánh hostname, v.v.
  • Việc là binary SUID mới là vấn đề lớn nhất. Nó được gọi bởi mã không đặc quyền và kế thừa ngữ cảnh thực thi do mã không đặc quyền kiểm soát (biến môi trường, thuộc tính lập lịch tiến trình, phân bổ cgroup, ngữ cảnh bảo mật, file descriptor được truyền vào, v.v.). Binary SUID phải dọn dẹp các yếu tố này cực kỳ cẩn thận, nhưng trong nhiều trường hợp lại làm không tốt.

Khác

  • Với run0, không chỉ shell mà cả các lệnh khác cũng có thể chạy bằng quyền root. Khi chương trình kết thúc, màu terminal sẽ trở lại như cũ.
  • Việc tự động đổi màu nền có thể gây bất tiện, nhưng có thể thay đổi hoặc vô hiệu hóa bằng tùy chọn --background=.
  • Có vẻ cũng có thể thay thế hoàn toàn sudo bằng run0, nhưng mỗi bản phân phối có thể có sở thích khác nhau.
  • Cách mở rộng bằng plugin của sudo như hỗ trợ LDAP có nhiều vấn đề. polkit có thể được mở rộng theo cách được quản lý an toàn trong systemd.
  • Việc thực thi script bash bằng run0 có thể được kiểm tra thông qua các biến môi trường SUDO_xxx tương thích với sudo.

Ý kiến của GN⁺

  • Việc đưa ra run0 như một phương án thay thế cho sudo vốn được dùng rất thường xuyên là khá ấn tượng. Có vẻ nó kế thừa được ưu điểm của sudo đồng thời tránh được rủi ro của SUID.
  • Việc thông báo trực quan rõ ràng về trạng thái nâng quyền có thể giúp giảm thiệt hại do thao tác nhầm. Đổi màu nền terminal có thể gây khó chịu, nhưng vì có thể điều chỉnh bằng tùy chọn nên có lẽ không phải vấn đề lớn.
  • Thiết lập phân quyền qua polkit có thể kém linh hoạt hơn sudo, nhưng ngược lại sẽ đơn giản hơn và giảm bề mặt tấn công. Có vẻ việc tài liệu hóa tốt các ví dụ cấu hình polkit sẽ rất quan trọng.
  • Để phục vụ việc di chuyển các script hiện có đang phụ thuộc vào sudo, có lẽ trong một thời gian sudo vẫn cần được cung cấp song song. Tuy vậy, với môi trường mới thì nên dùng run0 ngay từ đầu.
  • Về lâu dài, có thể kỳ vọng việc đưa vào run0 sẽ trở thành dịp để mạnh dạn loại bỏ SUID và chuyển sang kiến trúc quản lý tập trung quyền hệ thống từ các dịch vụ hệ thống. Đây có vẻ là hướng đi đáng mong muốn về mặt bảo mật và độ vững chắc của hệ thống.

1 bình luận

 
GN⁺ 2024-05-01
Ý kiến Hacker News
  • Không giống sudo, run0 không kế thừa bất kỳ ngữ cảnh nào từ client mà gọi lệnh đích trong một ngữ cảnh exec cô lập được fork mới từ PID 1. Điều này không phù hợp với các trường hợp sử dụng thông thường của lệnh shell, nên trên thực tế sẽ gây ra vấn đề và khó được chấp nhận rộng rãi.
  • Nếu run0 được sử dụng rộng rãi, sẽ có thêm một cờ để nó hoạt động giống sudo, và mọi người rồi sẽ luôn dùng cờ đó. Khi điều này gây ra vấn đề, dự án systemd có thể sẽ cố loại bỏ sudo.
  • run0 áp dụng cách tiếp cận khác với sudo bằng cách có ranh giới IPC nghiêm ngặt giữa các mức đặc quyền. Đây có thể là một hướng tốt cho những người muốn dùng systemd.
  • sudo phần lớn được duy trì bởi một người.
  • Xét trên nhiều khía cạnh, cách hoạt động của run0 gần với ssh hơn là sudo. Có thể triển khai một công cụ tương tự bằng cách kết nối SSH tới localhost.
  • Một ý tưởng tương tự từng được thử nghiệm ở một bản sao BSD thử nghiệm của Berkeley vào giữa thập niên 1980, nhưng đã bị bác bỏ do độ phức tạp của việc truyền mọi thứ qua pipe. Thay vào đó, việc kiểm tra môi trường được kế thừa đã được tăng cường.
  • Có các câu hỏi xoay quanh run0 về logging, các biến môi trường được truyền đi, xử lý signal, và phương án thay thế cho sudoedit.
  • Ngoài run0, cũng có một bản triển khai sudo viết bằng Rust, an toàn bộ nhớ hơn và ít lỗi hơn.
  • Gần đây, thường chỉ có một người dùng trên một máy vật lý, nên cần đơn giản hóa hệ thống quyền của Unix.
  • Việc đổi màu nền terminal sang đỏ khi nâng quyền không phải là phần quan trọng.