ssh 免登录配置

引子

近日海淘了一个 mini-PC:Gigabyte GB-BSRE-1605,此设备虽采用 amd 嵌入式低功耗处理器,性能相比现在自己所用的设备却有不小提升,加上先前升级电脑多余一些 ssd 和 ram,于是组了一个个人服务器,装上最新的 ubuntu 20.04 server 后,打算以后作为远程开发的基础主机。现记录一些开发环境配置过程,供参考。

设备无需连接显示器及键盘鼠标等输入设备,第一步,开启远程 ssh 登录。

原理

从客户端来看,ssh 提供两种级别的安全验证:

  1. 基于口令的验证:只要知道帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但缺点是:不能保证你正在连接的服务器就是你想连接的服务器。以下是登录验证流程:

    当第一次链接远程主机时,会提示你当前主机的”公钥指纹”,询问你是否继续,如果选择继续后就可以输入密码进行登录了,当远程的主机接受以后,该台服务器的公钥就会保存到~/.ssh/known_hosts文件中。

  2. 基于密钥的验证:这种验证的前提是客户端需要生成一对密钥,将公钥放到需访问的远程服务器。这种验证比上一种的好处是,不能仿冒真正的服务器,因为要仿冒必须拿到客户端生成的公钥。缺点就是验证等待过程稍长些。

条件

ssh 免登录实现的原理为 ssh 的公钥与私钥配对,此时无需输入登录密码进行认证。假设要从电脑 a 通过 ssh 免密码登录服务器 b,前提条件为:

  1. 服务器 b 需要运行 ssh 服务端程序,并且最好是作为开机自启动服务
  2. 电脑 a 可以运行 ssh 客户端程序,电脑 a 生成了 ssh 的公钥和私钥
  3. 服务器 b 欲登录用户存储了电脑 a 的公钥

步骤

下面分别说明如何实现上面的条件,以及一些注意事项。

  1. 如果服务器为 linux 或者 mac,一般都会自带 ssh 服务端,以 ubuntu 20.04 server 系统为例:


    并且默认开机启动

    如果电脑没有安装 ssh 服务端程序,则需要自行手动安装,以 ubuntu 系统为例,通过命令 sudo apt install ssh 即可安装 ssh 服务端,客户端及相关工具。

  2. 电脑如果为 linux 或者 Mac,一般也会自带 ssh 客户端,如果是 windows,可能要单独安装。ssh 公钥和私钥需要通过 ssh-keygen 工具生成,生成 ssh 公私钥的命令一般为 ssh-keygen -t rsa,也可以从其他地方拷贝后放到对应的目录,一般为 ~/.ssh 目录下。

  3. 通过 ssh-copy-id 工具将电脑 a 生成的 ssh 公钥传输到服务器 b,命令格式一般为 ssh-copy-id -i ~/.ssh/id_rsa.pub UserName@RemoteServer,其中 UserName 为服务器 b 的用户名,RemoteServer 为服务器 b 的 ip 或者域名。操作成功后,会将电脑 a 的 ssh 公钥追加到服务器 b 的用户 UserName 用户目录的 .ssh/authorized_keys 文件中

  4. 完成以上操作后,就可以在电脑 a 上通过 ssh 命令免密码登录服务器 b 了,命令格式一般为 ssh UserName@RemoteServer,也可以直接简写为 ssh RemoteServer

其他说明

ssh 免密登陆除了极少数情况下需要自己安装 sshd 服务端程序并配置 ssh_config 以外,经常遇到的问题其实是权限问题。

权限问题:

  1. 传输 ssh 公钥如果遇到一些权限报错,需要将个人主目录下 .ssh 目录及其目录下的文件设置为相应的权限:远程机器的 .ssh 目录需要 700 权限,authorized_keys 文件需要 600 权限
  2. 要正常进行 ssh 免密码登录,客户端机器下 .ssh 目录及其目录下的文件权限为:.ssh 目录需要 700 权限,id_rsa 文件需要 600 权限,其他文件为 644 权限

最后,ssh 免密登录如果需要管理的 ssh 目标主机太多,并且 ip 不是很好记忆,或者有多套 ssh 公私钥,可以通过 ssh config 实现通过别名快速登陆,通过 config 还可以实现流量转发等高级功能,实现远程服务本地调用,后面再详述。

参考资料:

  1. //superuser.com/questions/215504/permissions-on-private-key-in-ssh-folder
  2. //gist.github.com/grenade/6318301
  3. //www.shellhacks.com/ssh-login-without-password/
  4. //www.linux.com/training-tutorials/ssh-scp-without-password-remote-host-look-ma-no-password/
  5. //www.jianshu.com/p/0f9b72d691c2
  6. //deepzz.com/post/how-to-setup-ssh-config.html
Tags: