昨天重新整理了一遍家里的群晖系统的硬件,除了数据备份之外,从日志回收到通知告警再到上面跑的服务的更新,有机会可以详细写一遍。

折腾过程中,ssh 连接操作必不可少,但是群晖系统却没有设置 RSA KEY 免密码认证的地方,导致每次连接都要输入服务器密码,很是讨厌,而简单创建 authorized_keys 对于群晖不生效也很有意思(先按下不表)。

然后在网上进行了一顿搜索,不论是国外用户的博客还是官方论坛上的帖子,感觉都写的很繁琐,以及大量复制粘贴,甚至包含错误根本解决不了问题,故有了这篇文字。

目标硬件

本文旨在解决多数 DSM 6.1.7-15284 Update 2DSM 6.2-23739 Update 2 的硬件不能免密登录的问题。

少部分硬件由于一直跟随系统增量升级,所以可能存在一定的问题,为此我对于以上版本的系统各进行了两次完整的配置测试,除了一台一直跟随增量升级到6.2的设备配置失败,其余设备都顺利解决问题。

完整结果:

  • [成功] 从 6.1 一路升级到 6.1.7 的设备,开启“家目录”功能。
  • [成功] 直接安装 6.1.7 的设备,未开启“家目录”功能。
  • [成功] 直接安装 6.2 的设备,,未开启“家目录”功能。
  • [失败] 从 6.0 一路升级到 6.2 的设备,开启“家目录”功能。

前置准备

和常规设置服务器 免密码登录 一样,我们要先生成 RSA KEY 秘钥一对,rsa-keygen -t rsa 命令应该可以帮助到你,如果还不会,可以自行搜索相关资料,这里建议对于不同的设备生产不同的秘钥并妥善保存。

然后建议在你的 ~/.ssh/config 配置文件中对要进行登录的设备进行单独的显式声明,避免因为 DNS 或者 hosts 记录而干扰到 ssh 登录操作。

如果你想始终使用 ssh orange.home.com 来登录硬件设备,可以这么写:

# 新群晖
Host orange.home.com
  User            soulteary
  Hostname        10.11.12.81
  Port            55555
  IdentityFile    ~/.ssh/keys/litchi/litchi-2018
  ControlPath     ~/.ssh/home-orange-%r@%h:%p
  ControlPersist  yes
  TCPKeepAlive    yes
  Compression     yes
  ForwardAgent    yes

当然,如果你的配置特别多,还可以使用 Include 指令进行配置拆分,这个不在本篇内容话题之中,有兴趣可以自行查阅。

修正问题环境

群晖默认不能够简单配置 authorized_keys 达成免密登录的主要原因有两个:

  1. home 目录以及 home/$USER 目录、authorized_keys 文件缺失或者相应权限设置不正确。
  2. 因为sshd_config配置错误,导致sshd 服务重载配置失败。

为此我们要先登录设备,修正问题目录环境。

ssh orange.home.com

执行登录设备命令,会根据你之前是否信任设备提示下面的信息,如果你已经成功登录过设备,或者没有进行一些特殊的配置,下面的信息将不会再次出现。

The authenticity of host '[10.11.12.81]:55555 ([10.11.12.81]:55555)' can't be established.
ECDSA key fingerprint is SHA256:SKMgwJJSfwcEOY8Z8yXD889ru9lPLbQ1km1Xs65sH1Y.
Are you sure you want to continue connecting (yes/no)? 

如果你没有开启了群晖的“家目录”功能(如非必要也不必开启,当然开启也无所谓)。 当你输入 yes 回车之后,则会看到下面的警告信息。

Warning: Permanently added '[10.11.12.81]:55555' (ECDSA) to the list of known hosts.
soulteary@10.11.12.81's password: 
Could not chdir to home directory /var/services/homes/soulteary: No such file or directory

既然如此,我们就手工创建出来这个目录(也可以修改 /etc/passwd 中的 $home 目录)。

sudo mkdir -p /var/services/homes/$USER/.ssh
sudo chown -R $USER:users /var/services/homes/$USER/
sudo chmod 755 /var/services/homes/
chmod 700 /var/services/homes/$USER/.ssh
touch /var/services/homes/$USER/.ssh/authorized_keys
chmod 644 /var/services/homes/$USER/.ssh/authorized_keys

当你执行完毕上述命令,CTRL+D 登出设备,来将之前准备好的 RSA KEY 注入设备。

同步登陆证书

同步证书一般有两个方案,一个是使用 ssh-copy-id 命令,简单快捷,不过这里我选择的是另外一个方案,通过 ssh 执行远程设备上的 cat 命令配合管道符向设备中我们刚刚创建好的 authorized_keys 文件中追加内容。

ssh orange.home.com "cat >> ~/.ssh/authorized_keys" < ~/.ssh/keys/litchi/litchi-2018.pub

是不是比 ssh-copy-id soulteary@orange.home.com 更加直观了呢。

验证配置完成

再次执行登录操作。

ssh orange.home.com

这个时候你可能出现两个状况:

  1. 直接登录进了设备。
  2. 需要你输入配置密码。

如果是第一种情况,恭喜你,你基本已经操作完毕,可以跳到下一节内容了。

如果是第二种情况,输入密码登录到设备后,我们需要手动重启 sshd 服务,尝试让它重载默认配置,以及读取我们的免密登录的配置文件内容。

这里同样有两个方案:

群晖系统提供的 sudo synoservicectl --restart sshd ,或者手动进行进程的灭杀,因为系统配置了进程守护,所以依赖进程重新自启动来完成配置重载。

ps -ef | grep /usr/bin/sshd | awk {'print$2'} | xargs -I {} sudo kill -9 {}

这里我选择了第二种,因为第一种在使用的过程中,概率性失灵,ORZ。

执行完毕,你会收到下面的提示信息,并被踢出设备登录。

soulteary@Orange:/$ Connection to 10.11.12.81 closed by remote host.
Connection to 10.11.12.81 closed.

好了,接下来就是第二次验证了。

再次验证设备

再次执行登录操作。

ssh orange.home.com

这个时候你还是可能出现两个状况:

  1. 直接登录进了设备。
  2. 需要你输入配置密码,或者提示无法进行登录。

如果是第一种,那么我们已经正式配置完毕,接下来可以进行简单的系统安全加固。 如果是第二种,请查看下一节内容。

我们先默认你已经完全配置成功,需要一些额外的系统加固。

虽然在内网,但是一样需要提防一些恶意软件进行密码穷举式的内网渗透,既然已经可以使用证书登录设备,那么我们要关闭 允许root用户使用ssh登录设备允许使用账号密码进行设备登录 两个配置。

登录设备,执行下面两句命令即可。

sudo sed -ie 's/#\?PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -ie 's/#\?PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config

至此,如果你一切顺利的话,免密登录的操作就大功告成了。

调试配置中的错误

如果上一步操作中,你的设备禁止你使用 ssh 进行设备登录,那么很大的概率是你的 sshd_config 配置文件有错误,导致你的 sshd 服务不能正确启动,解决方案有两个:

  1. 在群晖中开启 telnet 服务,使用 telnet orange.lab.com 命令登录你的设备,然后修正你的配置,让 sshd 服务能够重启启动(如果免密登录 RSA 证书丢失,也可以用这个方法重置 sshd 配置,或者更新免密证书内容)。
  2. 在群晖中先关闭 ssh 登录选项,然后重新开启允许 ssh 登录选项,让系统能够正确的启动起来 sshd 服务(使用 synoservicectl 重启服务,概率遇到服务不能启动的问题)。

如果你确定你的 sshd_config 配置有问题,可以尝试使用 sudo /bin/sshd -d 命令以调试模式启动 sshd 命令,查看启动过程存在的问题。

如果你的用户始终不能登录,还可以查看 /etc/passwd 文件中的配置,确定你的用户后面跟随的 shell 的内容为 /bin/sh 或者 /bin/ash 之一。

最后

免密登录本来是很简单的事情,但是因为群晖本身的黑盒环境(恢复部分用户修改的文件内容),以及不确定的增量升级补丁(不确定补丁了哪些文件),导致了本篇洋洋洒洒写了这么多。

许多地方我提供了两个方案,除了能应用在群晖外,也能在老版本的客户端和老版本的 Linux 服务器的配置中使用。

希望这些能够帮助到有同样问题的你。

–EOF