.ssh/id_dsa パスワードが必要な systemd サービス

.ssh/id_dsa パスワードが必要な systemd サービス

smd-loopセッションでプロセスを開始するsystemctlサービスがありますscreen。このプロセスにはリモートSSHソース(同期化目的)へのアクセスが必要なので、私の秘密鍵へid_dsaのアクセスが必要です。

正しく動作するようにシステムサービスを設定するには?次のサービスはプロセスを正しく開始しますが、screenセッションに接続してパスワードを手動で入力する必要がありますid_dsa

[Unit]
Description=smd loop
After=local-fs.target network.target

[Service]
User=%i
Group=users
Type=Forking
ExecStart=/usr/bin/screen -S smd-loop-win -md "smd-loop"
RemainAfterExit=yes

手動で起動すると、smd-loopログイン時にパスワードの保存を開始するモジュールをインストールしたため、パスワードは不要です。id_dsapam_sshssh-agent

答え1

ログイン時にのみサービスを実行する必要がある場合は、ssh-agentセッションで開始したサービスに接続するようにしてください。最も簡単な方法は、プロキシソケットに固定パスを使用することです。システム操作SSH_AUTH_SOCKと.変数が環境に存在する場合、その変数に含まれるソケットパスが使用されます。その後、ログイン時に秘密鍵を実行すると、ジョブはそれを使用できます。/home/romeovs/.ssh/darkstar.agent.socket.profilessh-agentSSH_AUTH_SOCKssh-agentssh-add

このタスクを常に実行する必要がある場合は、この目的のために特定のパスワードのないキー()を生成し、制限を使用してssh-keygen -t rsa -f ~/.ssh/smd.id_rsa -N ''サーバーで特定のコマンドのみを実行することを承認することをお勧めします。command=from=~/.ssh/authorized_keysサーバー上のファイル。このfrom=オプションは、キーが特定のホストのログイン試行にのみ有効であることを示し、クライアントが指定したコマンドではなくcommand=実行するコマンドを指定します。

ssh-rsa AAAA…== romeovs@darkstar no-agent-forwarding no-port-forwarding no-x11-forwarding from="[email protected]" command="somecommand --foo"

このコマンドはログインシェルによって実行されます。コマンドに引数を渡す必要がある場合は、2つのオプションがあります。

  • クライアントが試みた元のコマンドはSSH_ORIGINAL_COMMAND環境変数にあります。解析を試している場合は、引用の問題に注意してください。
  • 一部の環境変数はクライアントによって渡されます。正確な設定は、サーバー構成(ファイルAcceptEnvのディレクティブsshd_config)によって異なります。

答え2

~/.ssh暗号化されていない秘密鍵を含むIDファイルを、サービスが実行されているユーザーのディレクトリに配置する必要があります。また、たとえば、rootとして実行している場合は、HOME環境変数を設定する必要があります。

ExecStart=/usr/bin/env HOME=/root /usr/bin/screen -S smd-loop-win -md "smd-loop"

または、smd-loop呼び出し方法を制御できる場合は、使用するIDファイルを知らせるオプションを追加sshできます。-Issh

いずれにせよ、IDファイルはそのユーザーが所有する必要があり、そのユーザー(chmod 0400 ~/.ssh/id*)のみにアクセスできます。

答え3

パスワードを要求せずにサービスの独自のSSHキーを生成します。

次に、ターゲットシステムでauthenticate_keysに "command ="を使用して、そのキーの使用を単一のコマンドに制限します。

その後、ターゲットコマンドを実行するにはサーバーに接続するだけです。他のものを指定する必要はありません(コマンドイベントは実行されません)。

関連情報