Systemd Unitファイルにパスワードを渡す一般的な方法はありますか?


10

systemdユニットファイルを使用してサービスを開始したいと思います。このサービスを開始するにはパスワードが必要です。パスワードは平文でsystemdユニットファイルに保存したくないのです。また、このパスワードをインタラクティブに提供したくありません。

このための通常のスクリプトを作成している場合は、制限付きのアクセス許可(400または600)でrootが所有するファイルに資格情報を保存し、スクリプトの一部としてファイルを読み取ります。これを行う特定のsystemdスタイルの方法はありますか、それとも通常のシェルスクリプトと同じプロセスに従うだけですか?


回答:


11

ここには、要件に応じて2つの可能なアプローチがあります。あなたがいる場合していないサービスが起動されたとき、パスワードの入力を求めるプロンプトを表示する、使用EnvironmentFileディレクティブを。からman systemd.exec

Environment =に似ていますが、テキストファイルから環境変数を読み取ります。テキストファイルには、改行で区切られた変数の割り当てが含まれている必要があります。

プロンプトを表示たい場合は、いずれかのsystemd-ask-passwordディレクティブを使用します。からman systemd-ask-password

systemd-ask-passwordは、コマンドラインで指定された質問メッセージを使用して、ユーザーからシステムパスワードまたはパスフレーズをクエリするために使用できます。TTYから実行すると、TTYのパスワードを照会し、標準出力に出力します。TTYなしまたは--no-tty付きで実行すると、システム全体のクエリメカニズムが使用され、アクティブユーザーが複数のエージェントを介して応答できるようになります。


2
環境変数にパスワードを渡すことに欠点があります。なお(たとえ変数が設定が保護されているファイル)、それは(例えば、使用して他のユーザーに属するプロセスの環境変数に詮索するのは可能ですので、ps ajxewww誰かがすることができるかもしれないので)そこから受け取ります。
filbranden

ありがとう!EnvironmentFile400のアクセス許可を持つファイルへの絶対パスを含むエントリは、適切に機能します。
レビボスチアン

@filbranden他のユーザーに属するプロセスの環境変数を読み取ることはできません。
woky

1

私はあなたのニーズに合うかもしれない追加の代替案を提供できますが、それは満たされるためにいくつかの前提条件を必要とします:

次の手順は次のとおりです。

secret-toolfrom libsecretを使用してパスワードを保存します。例えば:

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

実行可能ファイルが環境変数からのパスワードの読み取りをサポートしている場合、それはより良い方法です。

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

実行可能ファイルがパスワードを引数として受け入れる場合でも、次のsecret-toolように使用できます。

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

注意:パスワードはsystemctl --user status myUnit.serviceコマンドラインで実行されているものとして引数を表示するので、実行するとパスワードは明白に表示されます。つまり、これはtopまたはを実行しているユーザーにも表示されますps -aux


1

これに対する3番目の代替案と、@ jasonwryanによる2つの提案があります。

ServerFaultでのMichael Hamptonの回答からの抜粋-systemdサービスで環境変数を設定する方法

これを行う現在の最良の方法は、を実行することです。これsystemctl edit myserviceにより、オーバーライドファイルが作成されるか、既存のファイルを編集できます。

通常のインストールでは、これ/etc/systemd/system/myservice.service.dによりディレクトリが作成され、そのディレクトリ内で名前が.conf(通常はoverride.conf)で終わるファイルが作成されます。このファイルで、配布によって出荷されるユニットの任意の部分に追加または上書きできます。

たとえば、ファイルでは/etc/systemd/system/myservice.service.d/myenv.conf

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

また、ディレクトリが存在し、空の場合、サービスは無効になります。ディレクトリに何かを置くつもりがない場合は、それが存在しないことを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.