dịch vụ systemd cần mật khẩu .ssh / id_dsa


8

Tôi có một dịch vụ systemctl bắt đầu một tiến trình smd-looptrong một screenphiên. Quá trình này yêu cầu truy cập vào các nguồn SSH từ xa (cho mục đích đồng bộ hóa) và do đó cần có thể truy cập id_dsakhóa riêng của tôi .

Làm cách nào tôi có thể thiết lập dịch vụ systemd để nó hoạt động? Dịch vụ sau đây bắt đầu quá trình một cách chính xác nhưng yêu cầu tôi đính kèm vào phiên màn hình và nhập id_dsamật khẩu theo cách thủ công .

[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

Khi tôi bắt đầu bằng tay smd-loopcác id_dsamật khẩu không cần thiết kể từ khi tôi đã insalled các pam_sshmô-đun mà bắt đầu một ssh-agentchứa mật khẩu lúc đăng nhập.


Tôi cho rằng bạn có nghĩa là nó cần truy cập không phải khóa công khai của bạn, mà là khóa riêng. Tôi có đúng không?
Serge

ah vâng, nó cần khóa riêng. hãy để tôi khắc phục điều đó
romeovs

Câu trả lời:


3

Bạn cần đặt các tệp nhận dạng chứa khóa riêng không được mã hóa vào ~/.sshthư mục của người dùng mà dịch vụ đang chạy. Ngoài ra, bạn cần đặt biến môi trường HOME cho nó, ví dụ nếu nó được chạy dưới dạng root:

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

Ngoài ra, nếu bạn có quyền kiểm soát cách smd-loopgọi, sshbạn có thể thêm -Itùy chọn để cho biết sshtệp nhận dạng sẽ sử dụng.

Trong mọi trường hợp, tệp nhận dạng phải thuộc sở hữu của người dùng này và chỉ có thể truy cập được bởi người dùng này ( chmod 0400 ~/.ssh/id*).


cảm ơn! là đúng envnên /usr/bin/envvì systemd không biết nơi envlà. Ngoài ra, lệnh thực sự là smd-loop, smd-loop-winlà tên của thể hiện màn hình đã tạo.
romeovs

6

Nếu bạn chỉ cần để dịch vụ hoạt động trong khi bạn đăng nhập, hãy kết nối với dịch vụ ssh-agentmà bạn bắt đầu với phiên của mình. Cách dễ nhất để làm điều này là sử dụng một đường dẫn cố định cho ổ cắm tác nhân. Đặt SSH_AUTH_SOCKbiến môi trường thành một cái gì đó giống như /home/romeovs/.ssh/darkstar.agent.socketcả trong công việc systemd và trong của bạn .profile. Lưu ý rằng nếu bản phân phối của bạn bắt đầu một ssh-agentquy trình cho bạn, bạn có thể cần phải giết nó hoặc để nó không được sử dụng và thay thế nó bằng chính bản phân phối của bạn. Nếu SSH_AUTH_SOCKbiến có trong môi trường, ssh-agentsử dụng đường dẫn chứa trong ổ cắm của nó. Sau đó, khi bạn đăng nhập, hãy chạy ssh-addtrên khóa riêng của bạn và công việc sẽ có thể sử dụng nó.

Nếu bạn cần phải hoàn thành công việc mọi lúc, tôi khuyên bạn nên tạo một khóa mật khẩu cụ thể cho mục đích đó ( ssh-keygen -t rsa -f ~/.ssh/smd.id_rsa -N '') và chỉ cho phép nó chạy một lệnh cụ thể trên máy chủ bằng cách sử dụng một command=và các from=hạn chế trong ~/.ssh/authorized_keystệp trên máy chủ. Các from=tùy chọn phương tiện rằng chìa khóa chỉ có giá trị cho những nỗ lực đăng nhập từ một host cụ thể và command=xác định một lệnh sẽ được thực thi thay vì lệnh theo quy định của khách hàng.

ssh-rsa AAAA…== romeovs@darkstar no-agent-forwarding no-port-forwarding no-x11-forwarding from="romeovs@darkstar.example.com" command="somecommand --foo"

Lệnh được thực thi bởi shell đăng nhập của bạn. Nếu bạn cần truyền tham số cho lệnh đó, bạn có hai lựa chọn:

  • Lệnh ban đầu được cố gắng bởi máy khách nằm trong SSH_ORIGINAL_COMMANDbiến môi trường. Coi chừng trích dẫn các vấn đề nếu bạn cố gắng phân tích nó.
  • Một vài biến môi trường được thông qua bởi khách hàng. Bộ chính xác phụ thuộc vào cấu hình máy chủ ( AcceptEnvchỉ thị trong sshd_configtệp).

2

Tôi sẽ tạo một khóa ssh riêng mà không có cụm mật khẩu cho dịch vụ đó.

Trên (các) hệ thống đích, sau đó tôi sẽ sử dụng "lệnh =" trong ủy quyền để hạn chế sử dụng khóa đó cho một lệnh duy nhất.

Sau đó, để kích hoạt lệnh đích, bạn chỉ cần kết nối với máy chủ - bạn phải chỉ định không có gì khác (không phải là sự kiện lệnh) nữa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.