systemdユニットファイルを使用してサービスを開始したいと思います。サービスを開始するにはパスワードが必要です。誰でも読むことができるので、システムデバイスファイルにパスワードをプレーンテキストで保存したくありません。また、このパスワードをインタラクティブに提供したくありません。
これに対して一般的なスクリプトを作成する場合は、制限付き権限(400または600)を持つルート所有のファイルに資格情報を保存し、そのファイルをスクリプトの一部として読みます。これを行うための特定のシステムスタイルの方法はありますか?それとも、通常のシェルスクリプトと同じプロセスに従う必要がありますか?
答え1
要件に応じて、2つの可能なアプローチがあります。もしあなたなら欲しくないサービスを有効にしたときにパスワードを求めるメッセージを表示するには、このEnvironmentFile
コマンドを使用します。からman systemd.exec
:
Environment=に似ていますが、テキストファイルから環境変数を読み込みます。テキストファイルには、改行区切りの変数割り当てを含める必要があります。
もしあなたならするメッセージを表示するには、systemd-ask-password
次のいずれかのコマンドを使用できます。からman systemd-ask-password
:
systemd-ask-passwordは、コマンドラインで指定された質問メッセージを使用して、ユーザーのシステムパスワードまたはパスワードを照会するために使用できます。 TTYで実行すると、TTYにパスワードを照会し、それを標準出力として印刷します。 TTYなしまたは--no-ttyを使用して実行すると、アクティブユーザーが複数のプロキシを介して応答できるようにするシステム全体のクエリメカニズムが使用されます。
答え2
systemdマニュアル(systemd.execなど)によると、資格情報を管理するために一般的な環境変数を使用しないでください。 Systemd には、LoadCredential、LoadCredentialEncrypted、SetCredential、SetCredentialEncrypted などのオプションを説明する完全なマニュアルページがあります。バラよりhttps://systemd.io/CREDENTIALS/systemdでこれを行う正しい方法の完全な説明については、systemd.execのマニュアルページを参照してください。
環境変数を使用することは、資格情報を必要としないプロセスが依然としてこれらの変数を継承またはアクセスできることを意味し、潜在的に秘密が誤って公開される可能性があります。 Bitwarden CLIとsystemdサービスを統合し、次の説明に従ってSetCredentialEncryptedを使用したいと思います。https://systemd.io/CREDENTIALS/。いくつかの調整後(bw
HOME環境変数の設定が予想されます)、My Bitwardenマスターパスワードはディスクに保存され暗号化され、My Service部門のみにアクセスしてMy Bitwardenアカウントのロックを解除できます。
それは私がやっていることです。まず、通常のファイルにBitwardenマスターパスワードを書き留めました。/tmp/bwmaster.pass。振り返ってみると、BtrfsではなくRAMディスクに書き込む方が良いでしょう。おそらくオプションです。/走る/(これらすべてのコマンドにはrootアクセスが必要です)。次に、マスターパスワードの暗号化されたコピーを作成しました。
# systemd-creds encrypt --pretty --name=bwmp /tmp/bwmaster.pass -
これにより、システムサービスユニットファイルの[サービス]セクションに直接または上書きとして追加できるSetCredentialEncrypted = bwmpの概要が印刷されます。これは私の結果です。
SetCredentialEncrypted=bwmp: \
k6iUCUh0RJCQyvL8k8q1UyAAAAABAAAADAAAABAAAADCNQBSGbmpFUpRgngAAAAAgAAAA \
AAAAAALACMA0AAAACAAAAAAfgAgCE+qUDoEpxT3155oWkncltAG6Wv+IQAEm7EwIhahpw \
gAEB8dLosK741kyXWOWXQwLRfvhx6vDf7Na6JNGNW3PQkF6TZmJsUNYsWGXLgyIbgtjkd \
0TkS0LfVOo/e6PQ32p/xfEj0b+ZGCXgtjC0Tx6sDedhU0fIfT2b+IlwBOAAgACwAAABIA \
ID8H3RbsT7rIBH02CIgm/Gv1ukSXO3DMHmVQkDG0wEciABAAINgs66YvSM+PW+qPTnGE/ \
8Yq67HHaX5XMmymUojmugUkPwfdFuxPusgEfTYIiCb8a/W6RJc7cMweZVCQMbTARyIAAA \
AAWUZXjxS/vfx0BJq8RQAAyeXdSsf7ccsz+yEcMvoUm4WYZupWzt1FW93FDsUpdyi+QID \
pqczUQ24ODMC+HP9vP7nvLHPF4uNk+iPkR5fF7Ypl5rHdcFyfm1Bqp70g
サービスユニットファイルに保存した後、一時プレーンテキストファイルを安全に削除しました。
# shred -uz /tmp/bwmaster.pass
man shred
これについて詳しくはこちらをご覧ください。これを行うときは、Bitwardenを使用してBorg暗号化されたバックアップ資格情報を保存します。次のサービスファイルを作成しました。
[Unit]
Wants=network.target
After=network-online.target
[Service]
Type=oneshot
SetCredentialEncrypted=bwmp: \
k6iUCUh0RJCQyvL8k8q1UyAAAAABAAAADAAAABAAAADCNQBSGbmpFUpRgngAAAAAgAAAA \
AAAAAALACMA0AAAACAAAAAAfgAgCE+qUDoEpxT3155oWkncltAG6Wv+IQAEm7EwIhahpw \
gAEB8dLosK741kyXWOWXQwLRfvhx6vDf7Na6JNGNW3PQkF6TZmJsUNYsWGXLgyIbgtjkd \
0TkS0LfVOo/e6PQ32p/xfEj0b+ZGCXgtjC0Tx6sDedhU0fIfT2b+IlwBOAAgACwAAABIA \
ID8H3RbsT7rIBH02CIgm/Gv1ukSXO3DMHmVQkDG0wEciABAAINgs66YvSM+PW+qPTnGE/ \
8Yq67HHaX5XMmymUojmugUkPwfdFuxPusgEfTYIiCb8a/W6RJc7cMweZVCQMbTARyIAAA \
AAWUZXjxS/vfx0BJq8RQAAyeXdSsf7ccsz+yEcMvoUm4WYZupWzt1FW93FDsUpdyi+QID \
pqczUQ24ODMC+HP9vP7nvLHPF4uNk+iPkR5fF7Ypl5rHdcFyfm1Bqp70g
Environment=BWMPATH=%d/bwmp
ExecStart=/usr/local/sbin/borg.sh
もう少しあります。ボーグサービスファイルにはありますが、このトピックの重要な部分のみが含まれていました。マニュアルによると、スクリプトで参照できる$CREDENTIAL_PATH/bwmpファイルが必要ですが、上記のようにBWMPATH環境変数を定義するまでは機能しませんでした。これは、おそらくbw
コマンド(Bitwarden CLI)ツールでHOME変数を設定する必要があるため、スクリプトで設定したからです(ルートのみが実行されますborg.sh
)。
systemd.execとhttps://systemd.io/CREDENTIALSどのように機能するかについての詳細な情報を含むマニュアル。このsystemd-creds
コマンドはTPMv2チップ(システムで利用可能な場合)とキーファイルを自動的に使用します。私のシステムにTPMv2チップがあるかどうかはわかりません。これについては後で見てみましょう。
これはArch Linux、systemd 251.3-1で動作します(1週間ほど更新なし)。別のバージョンを使用している場合は、このバージョンが存在しない可能性があります。
答え3
@jasonwryanの2番目の提案に加えて、3番目の選択肢があります。
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"
また、このディレクトリが存在し、空の場合、サービスが無効になることに注意してください。そのディレクトリに何かを入れる予定がない場合は、そのディレクトリが存在しないことを確認してください。
答え4
あなたのニーズに合った追加の選択肢を提供できますが、いくつかの前提条件が必要です。
- systemd単位をユーザー単位に設定する必要があります。
- Gnomeキーリングを設定する必要があります。次の方法をお勧めします。https://wiki.archlinux.org/index.php/GNOME/Keyring#PAM_method
次のステップは次のとおりです。
パスワードを保存するにはsecret-tool
fromを使用してください。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
。