Secure Shell
SSH是一种用于计算机加密登录的网络协议,为Linux系统的一项标准配置。SSH仅仅是一种协议,存在多种实现。在Linux系统上应用比较广泛的是开源实现OpenSSH。
SSH采用了公钥加密的机制来保证会话的安全:
1、当远程主机接受到用户的登录请求时,则把自己的公钥(有主机自己签发)发送给用户;
2、用户使用公钥对登录密码进行加密;
3、远程主机使用私钥对用户发送的登录密码进行解密比对,验证登录请求的合法性。
远程登录
SSH的基本功能是进行加密的远程登录。命令如下:
$ ssh user@host
还可以省略用户名,用本地用户名进行登录:
$ ssh host
SSH的默认端口是22,当不指定端口时,将会默认采用这个端口。使用-p参数可以对端口进行指定。
$ ssh -p 2017 user@host
信任主机
与ssh有关的文件通常保存在Linux用户的家目录下的.ssh目录中($HOME/.ssh/),除了每个用户保有的ssh相关文件外,系统保有的ssh文件通常存放再/etc/ssh/目录下。
通常在进行第一次登录时,ssh会出现下面的提示:
$ ssh root@192.168.1.128
The authenticity of host '192.168.1.128' can't be established.
RSA key fingerprint is 97:2e:e7:e0:de:9f:af:67:28:c2:42:2e:34:56:58:4f.
Are you sure you want to continue connecting (yes/no)?
这是因为ssh自身无法确认host主机的真实性,于是它告知用户该主机的公钥指纹,由用户自己决定是否信任主机。
为什么时公钥指纹而不是完整的公钥呢?因为通常公钥长度都比较长,例如RSA算法的公钥则由1024位,不利于人工比对。所以一般采用hash算法(如MD5)对其进行消息摘要生成较短的公钥指纹以便进行比对。
当主机被信任之后,其公钥就会被存入该用户.ssh目录下的known_hosts文件中,下次再登录该主机时系统就会识别出这是已经信任的主机了。
公钥登录(免密登录)
通常,直接登录主机每次都必须输入密码。有些情况下,我们需要实现免密登录来方便我们的操作。SSH提供了公钥登录的方式,用户将自己的公钥存储再远程主机上,当用户登录时,远程主机向用户发送随机字符串,用户用自己的私钥加密后再发回给远程主机,远程主机用事先存储的公钥加密后比对一致即可认定用户可信。
生成公钥
我们可以用ssh-keygen生成自己的公钥:
$ ssh-keygen
使用-t参数可以指定使用的公钥算法。还可以设置口令对私钥进行保护。
该命令默认会在.ssh目录下生成id_rsa.pub和id_rsa两个文件,前者为公钥,后者为私钥。
传输公钥
将公钥传送到远程主机:
$ ssh-copy-id user@host
然后就可以使用公钥登录了。
有些情况下,远程主机并没有开启公钥登录的功能。这时需要打开远程主机的/etc/ssh/sshd_config,查看下面几行是否被注释掉了,若是,取消注释然后重启ssh服务即可(debian系推荐使用systemctl工具)
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
存储公钥
远程主机通常将用户的公钥存储在.ssh目录下的authorized_keys文件中。可以使用一下命令进行公钥存储:
$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub