![通过 root ssh 连接自动复制文件的安全方法](https://linux22.com/image/788814/%E9%80%9A%E8%BF%87%20root%20ssh%20%E8%BF%9E%E6%8E%A5%E8%87%AA%E5%8A%A8%E5%A4%8D%E5%88%B6%E6%96%87%E4%BB%B6%E7%9A%84%E5%AE%89%E5%85%A8%E6%96%B9%E6%B3%95.png)
我的家庭服务器上目前运行着一些不同的服务,为了简单起见,我有一个 VM 通过 certbot 管理证书,并使用 SCP 通过网络复制它们。
ssh 连接是密钥保护的,但由于我是自动运行的,所以密钥本身不需要密码,这显然不是理想的。
密钥仅存储在管理 certbot 的 VM 的根帐户中,但我仍然希望有一个选项,即脚本可以复制文件,而如果有人获得其中一个系统的访问权限,我本质上不必使用不安全的方法来对我网络上的其他系统进行根访问。
有没有办法只允许通过 ssh 连接传递某些命令而不允许它打开 shell 会话,或者有人能想到另一种方法来复制我每周的 cron 作业上的文件,而不会给别人留下通过 ssh 到我的其他机器的选项?
我的路由器仅在周六晚上启用 certbot 用户,这样我的虚拟机就可以 ssh 并运行一个脚本,该脚本会禁用阻止端口 80 的防火墙规则,运行 certbot renew 命令,再次启用防火墙规则并禁用 certbot 用户。我对此很满意,因为每周启用路由器用户的时间最多只有 15 分钟。
问题在于证书的复制,因为显然它是以 root 身份执行的,因此帐户始终处于活动状态。
#!/bin/bash
ssh [email protected] "/system script run certbotenable"
#ufw allow 80
certbot renew
#ufw delete allow 80
systemctl restart apache2
ssh [email protected] "/system script run certbotdisable"
scp /etc/letsencrypt/live/sazed.mydomain.com/cert.pem root@sazed:/etc/pve/local/pveproxy-ssl.pem
scp /etc/letsencrypt/live/sazed.mydomain.com/privkey.pem root@sazed:/etc/pve/local/pveproxy-ssl.key
scp /etc/letsencrypt/live/rashek.mydomain.com/cert.pem root@rashek:/root/ssl/fullchain.pem
scp /etc/letsencrypt/live/rashek.mydomain.com/privkey.pem root@rashek:/root/ssl//privkey.key
ssh root@sazed "service pveproxy restart"
答案1
您可以生成多个 ssh 密钥对。
在远程服务器上,您可以使用authorized_keys
文件中的高级选项并为每个公钥添加限制。这允许您对使用特定密钥对登录的访问权限进行限制。
请参阅authorized_keys文件格式描述https://www.freebsd.org/cgi/man.cgi?sshd(8)了解选项及其含义。
例如,有用的选项command=
限制只能访问单个命令/可执行文件/脚本
相当典型的是强制使用 internal-sftp ;然后只允许使用 sftp 进行文件传输。
或者from=
限制接受连接的源 IP
类似地,/etc/ssh/sshd_config
您可以使用指令为 root 登录设置其他要求Match
,即当您仍然需要允许所有普通用户使用密码登录时,您可以使用该指令设置 root 仅接受基于公钥的登录
# /etc/ssh/sshd_config
#here go defaults for all connections/users
PasswordAuthentication yes
PubkeyAuthentication yes
...
# Use Match directives to override default settings and specify specific settings
# for users, groups, hosts
# https://man.openbsd.org/sshd_config#Match
Match User root
PasswordAuthentication no
当然,您可以通过配置拉取而不是推送方法来避免整个 root/特权帐户问题。