Có cách nào điển hình để truyền mật khẩu vào tệp Systemd Unit không?


10

Tôi muốn bắt đầu một dịch vụ bằng cách sử dụng tệp đơn vị systemd. Dịch vụ này yêu cầu mật khẩu để bắt đầu. Tôi không muốn lưu trữ mật khẩu trong văn bản gốc trong tệp đơn vị systemd, vì nó có thể đọc được trên thế giới. Tôi cũng không muốn cung cấp mật khẩu này một cách tương tác.

Nếu tôi đang viết một tập lệnh bình thường cho điều này, tôi sẽ lưu trữ thông tin đăng nhập trong một tệp thuộc sở hữu gốc với quyền hạn chế (400 hoặc 600), sau đó đọc tệp như một phần của tập lệnh. Có cách nào theo kiểu systemd cụ thể để làm điều này không, hay tôi chỉ nên làm theo quy trình tương tự như trong kịch bản shell thông thường?


Câu trả lời:


11

Có hai cách tiếp cận có thể ở đây, tùy thuộc vào yêu cầu của bạn. Nếu bạn không muốn được nhắc nhập mật khẩu khi dịch vụ được kích hoạt, hãy sử dụng lệnh EnvironmentFile. Từ man systemd.exec:

Tương tự như Môi trường = nhưng đọc các biến môi trường từ tệp văn bản. Tệp văn bản phải chứa các bài tập biến được phân tách bằng dòng mới.

Nếu bạn làm muốn được nhắc nhở, bạn sẽ sử dụng một trong những systemd-ask-passwordchỉ thị. Từ man systemd-ask-password:

systemd-ask-password có thể được sử dụng để truy vấn mật khẩu hệ thống hoặc cụm mật khẩu từ người dùng, sử dụng thông báo câu hỏi được chỉ định trên dòng lệnh. Khi chạy từ TTY, nó sẽ truy vấn mật khẩu trên TTY và in nó ra đầu ra tiêu chuẩn. Khi chạy không có TTY hoặc với --no-tty, nó sẽ sử dụng cơ chế truy vấn trên toàn hệ thống, cho phép người dùng hoạt động phản hồi thông qua một số tác nhân


2
Lưu ý rằng có những thiếu sót khi truyền mật khẩu trong các biến môi trường (ngay cả khi tệp được đặt biến được bảo vệ), vì thông thường có thể rình mò vào các biến môi trường của các quy trình thuộc về người dùng khác (ví dụ như sử dụng ps ajxewww) để ai đó có thể nhặt nó từ đó
filbranden

Cảm ơn! EnvironmentFilemục nhập với đường dẫn tuyệt đối đến một tệp có 400 quyền hoạt động tốt.
levibostian

@filbranden Bạn không thể đọc các biến môi trường của các quá trình thuộc về người dùng khác.
woky

1

Tôi có thể cung cấp một giải pháp thay thế bổ sung phù hợp với nhu cầu của bạn nhưng nó đòi hỏi một số điều kiện tiên quyết phải được đáp ứng:

Các bước tiếp theo như sau:

Sử dụng secret-tooltừ libsecretđể lưu trữ mật khẩu của bạn. Ví dụ:

$ secret-tool store --label=myProgram myService password
Password: <type it here>

Nếu tệp thực thi của bạn hỗ trợ đọc mật khẩu từ một biến môi trường, tốt hơn là:

[Service]
ExecStart=/usr/bin/sh -c 'env SECRET=$(secret-tool lookup myService password) /usr/bin/script'

Nếu tệp thực thi của bạn chấp nhận mật khẩu làm đối số, bạn vẫn có thể sử dụng secret-toolnhư vậy:

[Service]
ExecStart=/usr/bin/sh -c '/usr/bin/script --secret=$(secret-tool lookup myService password)'

Thận trọng : mật khẩu sẽ hiển thị rõ ràng khi bạn chạy systemctl --user status myUnit.servicevì nó hiển thị đối số là đang chạy trên dòng lệnh. Điều này có nghĩa là điều này cũng sẽ hiển thị cho người dùng đang chạy tophoặc ps -aux.


1

Có một sự thay thế thứ ba cho điều này cũng như gợi ý 2 của @jasonwryan.

trích từ câu trả lời của Michael Hampton tại ServerFault - Làm cách nào để đặt biến môi trường trong dịch vụ systemd?

Cách tốt nhất hiện tại để làm điều này là chạy systemctl edit myservice, nó sẽ tạo một tệp ghi đè cho bạn hoặc cho phép bạn chỉnh sửa một tệp hiện có.

Trong các cài đặt thông thường, điều này sẽ tạo một thư mục /etc/systemd/system/myservice.service.dvà bên trong thư mục đó tạo một tệp có tên kết thúc bằng .conf(thông thường, override.conf) và trong tệp này, bạn có thể thêm hoặc ghi đè bất kỳ phần nào của đơn vị được phân phối.

Chẳng hạn, trong một tệp /etc/systemd/system/myservice.service.d/myenv.conf:

[Service]
Environment="SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN"
Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd"

Cũng lưu ý rằng nếu thư mục tồn tại và trống, dịch vụ của bạn sẽ bị vô hiệu hóa! Nếu bạn không có ý định đặt một cái gì đó vào thư mục, hãy đảm bảo rằng nó không tồn tại.

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.