昨天重新整理了一遍家里的群晖系统的硬件,除了数据备份之外,从日志回收到通知告警再到上面跑的服务的更新,有机会可以详细写一遍。
折腾过程中,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
来登录硬件设备,可以这么写:
# 新群晖
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
达成免密登录的主要原因有两个:
home
目录以及home/$USER
目录、authorized_keys
文件缺失或者相应权限设置不正确。- 因为
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
这个时候你可能出现两个状况:
- 直接登录进了设备。
- 需要你输入配置密码。
如果是第一种情况,恭喜你,你基本已经操作完毕,可以跳到下一节内容了。
如果是第二种情况,输入密码登录到设备后,我们需要手动重启 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
这个时候你还是可能出现两个状况:
- 直接登录进了设备。
- 需要你输入配置密码,或者提示无法进行登录。
如果是第一种,那么我们已经正式配置完毕,接下来可以进行简单的系统安全加固。 如果是第二种,请查看下一节内容。
我们先默认你已经完全配置成功,需要一些额外的系统加固。
虽然在内网,但是一样需要提防一些恶意软件进行密码穷举式的内网渗透,既然已经可以使用证书登录设备,那么我们要关闭 允许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
服务不能正确启动,解决方案有两个:
- 在群晖中开启
telnet
服务,使用telnet orange.lab.com
命令登录你的设备,然后修正你的配置,让 sshd 服务能够重启启动(如果免密登录 RSA 证书丢失,也可以用这个方法重置 sshd 配置,或者更新免密证书内容)。 - 在群晖中先关闭
ssh
登录选项,然后重新开启允许ssh
登录选项,让系统能够正确的启动起来sshd
服务(使用 synoservicectl 重启服务,概率遇到服务不能启动的问题)。
如果你确定你的 sshd_config
配置有问题,可以尝试使用 sudo /bin/sshd -d
命令以调试模式启动 sshd
命令,查看启动过程存在的问题。
如果你的用户始终不能登录,还可以查看 /etc/passwd
文件中的配置,确定你的用户后面跟随的 shell
的内容为 /bin/sh
或者 /bin/ash
之一。
最后
免密登录本来是很简单的事情,但是因为群晖本身的黑盒环境(恢复部分用户修改的文件内容),以及不确定的增量升级补丁(不确定补丁了哪些文件),导致了本篇洋洋洒洒写了这么多。
许多地方我提供了两个方案,除了能应用在群晖外,也能在老版本的客户端和老版本的 Linux 服务器的配置中使用。
希望这些能够帮助到有同样问题的你。
–EOF