web-dev-qa-db-ja.com

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

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

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

10
SauceCode

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

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

doを要求する場合は、systemd-ask-passwordディレクティブの1つを使用します。 man systemd-ask-passwordから:

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

11
jasonwryan

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

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

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

$ 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
Doron Behar