Apakah ada cara khas untuk meneruskan kata sandi ke file Systemd Unit?

10

Saya ingin memulai layanan menggunakan file unit systemd. Layanan ini memerlukan kata sandi untuk memulai. Saya tidak ingin menyimpan kata sandi dalam plaintext di file systemd unit, karena itu dapat dibaca dunia. Saya juga tidak ingin memberikan kata sandi ini secara interaktif.

Jika saya menulis skrip normal untuk ini, saya akan menyimpan kredensial dalam file yang dimiliki oleh root dengan izin terbatas (400 atau 600), dan kemudian membaca file sebagai bagian dari skrip. Apakah ada cara gaya-sistem tertentu untuk melakukan ini, atau haruskah saya mengikuti proses yang sama seperti yang saya lakukan dalam skrip shell biasa?

Kode Saus
sumber

Jawaban:

11

Ada dua pendekatan yang mungkin di sini, tergantung pada kebutuhan Anda. Jika Anda tidak ingin dimintai kata sandi saat layanan diaktifkan, gunakan EnvironmentFilearahan. Dari man systemd.exec:

Mirip dengan Environment = tetapi membaca variabel lingkungan dari file teks. File teks harus berisi tugas variabel yang dipisahkan baris-baru.

Jika Anda tidak ingin diminta, Anda akan menggunakan salah satu systemd-ask-passwordarahan. Dari man systemd-ask-password:

systemd-ask-password dapat digunakan untuk menanyakan kata sandi sistem atau frasa sandi dari pengguna, menggunakan pesan pertanyaan yang ditentukan pada baris perintah. Ketika dijalankan dari TTY itu akan menanyakan kata sandi pada TTY dan mencetaknya ke output standar. Saat dijalankan tanpa TTY atau dengan --no-tty akan menggunakan mekanisme kueri seluruh sistem, yang memungkinkan pengguna aktif untuk merespons melalui beberapa agen

jasonwryan
sumber
2
Perhatikan bahwa ada kekurangan untuk mengirimkan kata sandi dalam variabel lingkungan (bahkan jika file tempat variabel diatur dilindungi), karena biasanya mungkin untuk menyelinap ke variabel lingkungan dari proses milik pengguna lain (misalnya menggunakan ps ajxewww) sehingga seseorang mungkin dapat ambil dari sana.
filbranden
Terima kasih! EnvironmentFileentri dengan jalur absolut ke file dengan 400 izin berfungsi dengan baik.
levibostian
@filbranden Anda tidak dapat membaca variabel lingkungan dari proses milik pengguna lain.
woky
1

Saya dapat menawarkan alternatif tambahan yang mungkin sesuai dengan kebutuhan Anda tetapi membutuhkan beberapa prasyarat yang harus dipenuhi:

Langkah selanjutnya adalah sebagai berikut:

Gunakan secret-tooldari libsecretuntuk menyimpan kata sandi Anda. Sebagai contoh:

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

Jika dukungan Anda yang dapat dieksekusi membaca kata sandi dari variabel lingkungan, lebih baik:

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

Jika executable Anda menerima kata sandi sebagai argumen, Anda masih dapat menggunakan secret-toolseperti:

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

Perhatian : kata sandi akan terlihat jelas ketika Anda akan menjalankan systemctl --user status myUnit.servicekarena itu menunjukkan argumen sedang dijalankan di baris perintah. Ini berarti ini juga akan terlihat bagi pengguna yang menjalankan topatau ps -aux.

Doron Behar
sumber
1

Ada alternatif ketiga untuk ini serta saran 2 oleh @jasonwryan.

kutipan dari jawaban Michael Hampton di ServerFault - Bagaimana cara mengatur variabel lingkungan dalam layanan systemd?

Cara terbaik saat ini untuk melakukannya adalah menjalankan systemctl edit myservice, yang akan membuat file override untuk Anda atau membiarkan Anda mengedit yang sudah ada.

Dalam instalasi normal ini akan membuat direktori /etc/systemd/system/myservice.service.d, dan di dalam direktori itu membuat file yang namanya berakhir dengan .conf(biasanya, override.conf), dan dalam file ini Anda dapat menambah atau menimpa bagian manapun dari unit yang dikirimkan oleh distribusi.

Misalnya, dalam file /etc/systemd/system/myservice.service.d/myenv.conf:

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

Perhatikan juga bahwa jika direktori ada dan kosong, layanan Anda akan dinonaktifkan! Jika Anda tidak bermaksud memasukkan sesuatu ke direktori, pastikan itu tidak ada.

slm
sumber