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 passphrase
和Enter 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
文件的权限应该分别为700
和600
,否则SSH可能因为权限问题无法登录。
保存文件后,公钥也就上传到了服务器,现在还需要进行最后一步的设置,也就是设置客户端SSH登录的配置信息。
这里以windows的默认终端作为例子,其他ssh工具也差不多。
在C:\Users\用户名\.ssh
下创建一个名叫config
的文件,纯文本,无后缀名。
写入以下内容:
1 | Host server |
server
是SSH
登陆时使用的别称,简便操作。后面就可以直接输入命令ssh server
一键登录了8.8.8.8
是服务器的IP
地址。root
是登录时使用的账户。C:\Users\admin\.ssh\admin.pem
是指定私钥的路径。
至此,密钥认证设置完毕。不过ssh登录的相关配置还有很多选项可以调整,内容都在服务器/etc/ssh/sshd_config
里
不过/etc/ssh/ssh_config
这个文件,是你使用这台服务器上ssh连接别人时候使用的配置文件。故不在本篇文章介绍范围内。SSH
和SSHD
的区别就在于前者为客户端,后者为服务端。D
是deamon
的缩写。
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 | # 1.从本地复制到远程 |
示例:
1 | # 1.将本地文件上传到远程主机: |
在设置了密钥的情况下,如果有按照上面所说的在config文件里填写了服务器的配置信息,则
1 | scp myfile.txt user@server:/home/user |
没填写配置信息或者想手动指定密钥文件的路径的话,加-i
参数:
1 | scp -i key.pem myfile.txt user@server:/home/user |
和SCP
类似的有SFTP
和RSYNC
。