SSH简介

SSH(Secure Shell)是一种网络协议,用于计算机之间的加密登录。SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是 OpenSSH,它是自由软件,应用非常广泛。

口令登录

输入命令:

ssh user@host -p port

如果你是第一次登录对方主机,系统会出现下面的提示:

The authenticity of host 'host (xx.xxx.xx.xx)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?

输入yes后会出现如下提示:

Warning: Permanently added 'host,xx.xx.xxx.xx' (RSA) to the list of known hosts.

然后,会要求输入密码。

Password: (enter password)

如果密码正确,就可以登录了。

当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

公钥登录

使用密码登录,每次都必须输入密码,非常不方便。SSH还提供了公钥登录,可以省去输入密码的步骤。原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

口令与公钥登录原理

  • 密码口令登录

通过密码进行登录,主要流程为:

  1. 客户端连接上服务器之后,服务器把自己的公钥传给客户端
  2. 客户端输入服务器密码通过公钥加密之后传给服务器
  3. 服务器根据自己的私钥解密登录密码,如果正确那么就让客户端登录
  • 公钥登录

公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含:

  1. 客户端生成RSA公钥和私钥
  2. 客户端将自己的公钥存放到服务器
  3. 客户端请求连接服务器,服务器将一个随机字符串发送给客户端
  4. 客户端根据自己的私钥加密这个随机字符串之后再发送给服务器
  5. 服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了。

免密登录配置

使用ssh-keygen生成秘钥:

ssh-keygen -t rsa -C "注释"
# -t 指定秘钥类型
# -C 注释
# -f 指定秘钥文件和存储文件名

运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pubid_rsa。前者是你的公钥,后者是你的私钥。
输入下面的命令,将公钥传送到远程主机host上面:

ssh-copy-id user@host -p port

然后,编辑/etc/ssh/sshd_config这个文件,检查下面几行前面"#"注释是否取掉。

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

重启SSH服务:

service sshd restart

ssh-copy-id命令

ssh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限。

  • 语法

ssh-copy-id [-i [identity_file]] [user@]machine
  • 选项

-i:指定公钥文件
实例:
1、把本地的ssh公钥文件安装到远程主机对应的账户下:

ssh-copy-id user@server
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server

authorized_keys文件

authorized_keys的权限要是600!!!如果不是,可能会无法免密登录,可以使用下面的命令进行设置:

chmod 600 /root/.ssh/authorized_keys

除了使用ssh-copy-id命令,还可以使用下面命令来把本地的公钥写入远程主机的authorized_keys:

ssh user@host -p port 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

参考资料