23. tháng 2 2025
Trong quá trình làm việc, tôi thường xuyên triển khai các chương trình viết bằng ngôn ngữ Go lên máy chủ sản xuất. Tôi sử dụng Makefile để tự động hóa quy trình biên dịch vàscp tệp thực thi lên máy chủ. Tuy nhiên, tôi không thể tự động khởi động lại dịch đại lý cá độ vụ qua mạng vì các lệnh liên quan đến systemd yêu cầu quyền sudo.
Do đó, mỗi lần triển khai xong, tôi đều phải đăng nhập trực tiếp vào máy chủ, sau đó chạy lệnh sudo systemctl restart xxx.service
và nhập mật khẩu thủ công. Điều này gây mất thời gian đáng kể. Tôi muốn tìm một giải pháp để cấp quyền sudo cho người dùng hiện tại nhưng vẫn đảm bảo an toàn bằng cách giới hạn phạm vi chỉ cho phép thực thi một số lệnh cụ thể.
Tôi đã tìm hiểu và phát hiện rằng tập tin sudoers có thể đáp ứng hoàn hảo nhu cầu của mình. Khi kiểm tra thông tin về sudoers:
man sudoers
Tôi đọc được rằng:
sudoers — đây là plugin chính sách bảo mật mặc định của sudo. Plugin này xác định quyền sudo của người dùng dựa trên nội dung của tập tin /etc/sudoers hoặc tùy chọn qua LDAP. Điều thú vị là nó còn hỗ trợ quản lý thông qua hệ thống LDAP, rất chuyên nghiệp và linh hoạt.
Để chỉnh sửa tập tin cấu hình sudoers, chúng ta phải sử dụng lệnh visudo
. Lưu ý quan trọng: Không bao giờ chỉnh sửa trực tiếp tập tin /etc/sudoers
bằng các trình soạn thảo khác như vim vì bất kỳ lỗi nào trong cú pháp cũng có thể khiến hệ thống bị hỏng.
Chúng ta cũng có thể tạo thêm các tệp cấu hình riêng lẻ trong thư mục /etc/sudoers.d/
bằng cách sử dụng lệnh:
sudo visudo -f /etc/sudoers.d/tên_tập_tin_muốn_chỉnh_sửa
/etc/sudoers.d/
:sudo visudo -f /etc/sudoers.d/cấu_hình_mới
người_dùng ALL=(root) NOPASSWD: /usr/bin/systemctl
Trong đó, bạn thay thế người_dùng
bằng tên tài khoản mà bạn đang sử dụng để đăng nhập vào máy chủ.
Sau khi cấu hình xong, tôi thử nghiệm bằng cách thực thi lệnh sudo systemctl stop/start
từ xa qua ssh. Kết quả là lệnh được thực thi thành công mà không cần nhập mật khẩu. Ngược lại, các lệnh khác như apt install
vẫn yêu cầu nhập mật khẩu như bình thường, đúng với mong đợi.
Cấu trúc chung của một dòng cấu hình trong sudoers là:
Người_dùng Máy_chủ = (Chạy_lài) Lệnh
Nghĩa là:
"Người_dùng có thể chạy Lệnh dưới danh nghĩa của người dùng Chạy_lài trên Máy_chủ".
Ví dụ trên có nghĩa là người dùng myuser
có thể thực thi lệnh /usr/bin/systemctl
mà không cần nhập mật khẩu trên mọi máy chủ.