本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 2018年07月20日 统计字数: 4083字 阅读时间: 9分钟阅读 本文链接: https://soulteary.com/2018/07/20/synology-passwordless-ssh.html ----- # 设置群晖 6.1 以及 6.2 使用证书免密登录 昨天重新整理了一遍家里的群晖系统的硬件,除了数据备份之外,从日志回收到通知告警再到上面跑的服务的更新,有机会可以详细写一遍。 折腾过程中,`ssh` 连接操作必不可少,但是群晖系统却没有设置 `RSA KEY` 免密码认证的地方,导致每次连接都要输入服务器密码,很是讨厌,而简单创建 `authorized_keys` 对于群晖不生效也很有意思(先按下不表)。 然后在网上进行了一顿搜索,不论是国外用户的博客还是官方论坛上的帖子,感觉都写的很繁琐,以及大量复制粘贴,甚至包含错误根本解决不了问题,故有了这篇文字。 ## 目标硬件 本文旨在解决多数 `DSM 6.1.7-15284 Update 2` 和 `DSM 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` 来登录硬件设备,可以这么写: ```bash # 新群晖 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` 服务重载配置失败。 为此我们要先登录设备,修正问题目录环境。 ```bash ssh orange.home.com ``` 执行登录设备命令,会根据你之前是否信任设备提示下面的信息,如果你已经成功登录过设备,或者没有进行一些特殊的配置,下面的信息将不会再次出现。 ```bash 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` 回车之后,则会看到下面的警告信息。 ```bash 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` 目录)。 ```bash 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` 文件中追加内容。 ```bash ssh orange.home.com "cat >> ~/.ssh/authorized_keys" < ~/.ssh/keys/litchi/litchi-2018.pub ``` 是不是比 `ssh-copy-id soulteary@orange.home.com` 更加直观了呢。 ## 验证配置完成 再次执行登录操作。 ```bash 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。 执行完毕,你会收到下面的提示信息,并被踢出设备登录。 ```bash soulteary@Orange:/$ Connection to 10.11.12.81 closed by remote host. Connection to 10.11.12.81 closed. ``` 好了,接下来就是第二次验证了。 ## 再次验证设备 再次执行登录操作。 ```bash ssh orange.home.com ``` 这个时候你还是可能出现两个状况: 1. 直接登录进了设备。 2. 需要你输入配置密码,或者提示无法进行登录。 如果是第一种,那么我们已经正式配置完毕,接下来可以进行简单的系统安全加固。 如果是第二种,请查看下一节内容。 我们先默认你已经完全配置成功,需要一些额外的系统加固。 虽然在内网,但是一样需要提防一些恶意软件进行密码穷举式的内网渗透,既然已经可以使用证书登录设备,那么我们要关闭 `允许root用户使用ssh登录设备` 和 `允许使用账号密码进行设备登录` 两个配置。 登录设备,执行下面两句命令即可。 ```bash 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