Server搭建过程-2.SSH终端配置

购买云服务器之后,默认的SSH登录方式可能比较简单。输入IP地址 、用户名和密码,就能在任意地方使用SSH工具登录。
有些SSH设置到手因个人习惯,需要修改。同时为了加强服务器的安全性,推荐使用密钥认证。
密钥认证安全性提高很多,且可以实现免密登录。

下面就是个人的SSH终端配置过程。
个人平时默认使用Windows自带的终端来进行SSH链接(自带的终端已默认内置OpenSSH


将为SSH登录配置密钥认证方式,即生成密钥对,并将公钥部署到服务器,替代传统密码登录。

进入云服务器的设置页面(我的是阿里云),创建密钥对。
密钥对的名字任意,只是起到一个提醒和标记的作用,起一个你自己记得住有印象的名字。

创建好后,浏览器会自动下载一个文件。文件名是密钥对的名字+pem后缀。
这份文件只能下载一次,后续无法在云服务器设置页面再次下载到。这其实就是我们的密钥对中的私钥,妥善保存。

页面上提示我们是否要将密钥绑定到实例,点击绑定。这样公钥就保存在了服务器上。

现在来解析一下这个过程。
实际上密钥认证使用的密钥对和https加密的原理相似。
生成的密钥对中由两部分组成,分为公钥和私钥。使用的加密方法其实是非对称加密。

公钥文件放在服务器上,而私钥文件放在客户端上。
公钥加密的数据,只能使用私钥来解密,而私钥加密的数据,也只能用公钥来解密。
公钥可以公开分发,用于加密数据或验证身份;私钥必须严格保密,用于解密数据或进行身份认证,一旦泄露将导致安全风险。

这也就是上文为什么说私钥必须自己妥善保存,不单指只能下载一次的原因,如果私钥有泄露的情况,那么知道私钥的人都能使用SSH控制你的服务器,这安全性就完全没有了。

我们平时通过SSH连接到云服务器,又或者是生成密钥对,都通常使用OpenSSH工具。

云服务器的密钥对创建功能实质上是对 SSH 密钥生成的简化操作,我们也可以通过 OpenSSH 工具手动生成同样的密钥对。

1
ssh-keygen -f afile

生成一个叫afile的密钥对。也可以增添-t参数,来指定加密算法,比如:

1
ssh-keygen -t rsa -f afile

执行命令后,提示Enter file in which to save the key,即需要输入密钥的存放位置。
可以直接回车,直接回车的话,密钥对会保存在这个目录下:

1
当前用户目录/.ssh/

接着提示Enter passphraseEnter passphrase again,这是提示输入保护私钥的密码,以及二次确认。
一般不需要密码,直接两次回车即可。

接着我们在保存的目录下可以看到,带pub字样的文件是公钥,反之是私钥。接着我们需要把公钥上传到服务器上。

打开服务器上/etc/ssh/sshd_config文件,可以看到一条信息

1
AuthorizedKeysFile      .ssh/authorized_keys

举个例子,比如我使用SSH,以Alex这个Linux账户的身份试图登录到云服务器。

那么就会去/home/Alex/.ssh/authorized_keys这个路径下,打开authorized_keys,寻找内部是否有对应的公钥
如果使用root账户试图登录,就会去/root/.ssh/authorized_keys下寻找。

这并不是一个绝对路径,而是根据你试图登录的账户,不同的相对路径。
如果你想要方便多账户和多客户端的登录,可以把这里改成绝对路径,内使用每一条公钥一行的形式。

那么我需要登录的是root账户,于是我找到/root/.ssh/authorized_keys,在内添加公钥。
这里填入的格式是一行一条公钥。于是如果原有的公钥有换行,需要删除换行,整理成一行的形式。

需要注意的是,~/.ssh文件夹和authorized_keys文件的权限应该分别为700600,否则SSH可能因为权限问题无法登录。

保存文件后,公钥也就上传到了服务器,现在还需要进行最后一步的设置,也就是设置客户端SSH登录的配置信息。
这里以windows的默认终端作为例子,其他ssh工具也差不多。

C:\Users\用户名\.ssh下创建一个名叫config的文件,纯文本,无后缀名。
写入以下内容:

1
2
3
4
Host server
HostName 8.8.8.8
User root
IdentityFile C:\Users\admin\.ssh\admin.pem

serverSSH登陆时使用的别称,简便操作。后面就可以直接输入命令ssh server一键登录了
8.8.8.8是服务器的IP地址。
root是登录时使用的账户。
C:\Users\admin\.ssh\admin.pem是指定私钥的路径。

至此,密钥认证设置完毕。不过ssh登录的相关配置还有很多选项可以调整,内容都在服务器/etc/ssh/sshd_config
不过/etc/ssh/ssh_config这个文件,是你使用这台服务器上ssh连接别人时候使用的配置文件。故不在本篇文章介绍范围内。
SSHSSHD的区别就在于前者为客户端,后者为服务端。Ddeamon的缩写。

sshd_config中有些地方值得注意

1
#PermitRootLogin yes

取消这行的注释的话,将允许在SSH登陆时使用root账户登录。

如果已经能够使用密钥认证形式登录,建议添加一行

1
PasswordAuthentication no

以禁用密码登录,提高安全性。

需要注意的是,sshd_config中的几行HostKey 是 SSH 服务端用于标识和证明自身身份的私钥文件,客户端通过对应的公钥验证服务端的可信性;它们与用户登录无关,仅用于建立安全连接的第一步握手过程。
这几个Hostkey是在ssh服务安装的时候就已产生。


PS:修改了文件的话,让配置生效需要重启SSH服务。

1
sudo systemctl restart sshd

说到SSH服务,可以顺带提一下SCP命令,基于SSH协议加密传输文件。

1
scp [选项] 源路径 目标路径

其中选项为可选参数。

-r递归复制整个目录(复制文件夹时使用)
-P指定传输时使用的端口(在SSH端口为非默认端口时使用)(注意是大写 P
-C启用压缩,提高传输效率(注意是大写 C
-p保留原文件的修改时间、访问时间和权限
-q静默模式,不显示进度条

典型格式有:

1
2
3
4
5
6
7
8
# 1.从本地复制到远程
scp 本地文件 用户名@远程地址:目标路径

# 2.从远程复制到本地
scp 用户名@远程地址:远程文件路径 本地路径

# 3.两台远程之间复制(通过本地主机发起)
scp 用户A@主机A:路径 用户B@主机B:路径

示例:

1
2
3
4
5
6
7
8
# 1.将本地文件上传到远程主机:
scp myfile.txt user@192.168.1.100:/home/user/

# 2.将远程文件下载到本地:
scp user@192.168.1.100:/home/user/myfile.txt ./

# 3.复制整个目录:
scp -r myfolder user@192.168.1.100:/home/user/

在设置了密钥的情况下,如果有按照上面所说的在config文件里填写了服务器的配置信息,则

1
scp myfile.txt user@server:/home/user

没填写配置信息或者想手动指定密钥文件的路径的话,加-i参数:

1
scp -i key.pem myfile.txt user@server:/home/user

SCP类似的有SFTPRSYNC