初识 VPS:SSH 的配置与访问

PuTTY

最近用GitHub的学生开发包兑换了 DigitalOcean 的 50 刀 credit,于是购买了人生中的第一个VPS,踏上不归路漫漫征途……

由于是初次搭建,所以不得不参考网上大量参差不齐的教程,有时一开就是十几个网页……在这里,我会尽可能完整地记录下自己折腾 VPS 的过程,计划将写成一个系列。其中将会涉及少量的技术细节,但大部分都是专注于应用层面的操作流程,对新手(我自己)可以说是相当友好。


服务器初始配置

首先,当然是购买一台服务器。DigitalOcean 是按使用时间计费的,因此只需要新建一个 Droplet 并完成相应的初始设定即可。安装过程中选择需要的配置,这里我自己部署的镜像是 Ubuntu 16.04.5 LTS。新建过程中有添加 SSH 密钥的选项。

右侧的 Windows 是我已经添加过的公钥的名字,可以直接选择

在Windows 中创建 SSH 密钥可以使用 PuTTY 自带的生成器。关于此操作网上教程太多,在此不再赘述。生成好后需要将公钥部署在服务器端。 如果在上图中的界面直接选择添加的话,系统会在部署时自动配置好服务器上的公钥,免去之后手动上传公钥的麻烦;同时会自动修改登录配置,禁止使用密码直接登录(事实上如果这样操作的话 DO 就不会再给你的邮箱里发初始密码了)。

配置好后点击 Create,一台服务器就创建完毕了。此时按理应当可以通过 SSH 客户端,或者在终端使用 ssh root@you_ip 命令登录服务器了。

如果使用的是 Amazon Lightsail 等 VPS,可能默认登录的账户是 bitnami 或 ubuntu。要切换成 root,可以先使用 sudo passwd 设置 root 用户的密码,然后使用su root 切换到 root 用户登录。

SSH 公钥上传错了怎么办?

然而这里不知是我复制公钥时没拷贝完整,还是 DO 出了 bug,反正是死活登录不上。这就尴尬了,密码登录被禁止,SSH 密钥对不上,登录不上服务器又不能修改这俩配置……

*更新于 2018-08-21

其实并没有原来想的这么麻烦,ssh 自带的一个命令就可以解决这个问题。

1
ssh-copy-id user@server

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

也可以指定公钥文件:

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

不用复制粘贴,不用手动上传,一句命令解决。看来,还是要多看看命令文档……


原文如下,仅供参考。

重置密码

好在 DO 提供了 Console 功能,可以无视禁止密码登录的配置。不过上文有提到,预配置 SSH 的服务器是不会发送初始密码邮件的,因此首先要做的是重置服务器的密码。

选择 Droplets–Access–Reset root password,随后 DO 会发一封包含新密码的电子邮件。使用这个密码就可以在 Console 中登录服务器了。不过,这个在浏览器里用的终端是没法复制粘贴的……也就意味着需要手动输入二十几位的随机密码……然后设定新密码时,又要重新输入一遍刚才的旧密码……体验极差……

登录上服务器后就好办了,可以修改位于 “~/.ssh/authorized_keys” 的公钥。不过,想要手动输一遍公钥需要极强的耐心和忍耐力……所以还是先把密码登录开起来,然后在 SSH 客户端中粘贴密钥吧。

允许密码登录

使用 vim /etc/ssh/sshd_config 修改 SSH 配置,找到 PasswordAuthentication no 所在的一行,在前面加 # 将其注释掉。这里需要用到终端下 vim 编辑器的一些基本操作。具体来说,进入 vim 界面后按 i 打开 insert 模式,即可修改文本,然后按 esc 退出 insert ,再依次输入 :wq! 回车即可保存并退出。 接着,使用 sudo systemctl reload sshd 重启 SSH 服务。现在,可以在 PuTTY 或者其他终端中使用 ssh root@you_ip ,输入密码登录了。

修改公钥

下一步需要做的就是修改服务器端错误的公钥。使用 vim ~/.ssh/authorized_keys 打开公钥文件,粘贴正确的公钥即可。随后再次使用 sudo systemctl reload sshd 重启 SSH 服务,即可通过密钥配对免密码登录服务器。出于安全考虑,可以再次修改 SSH 配置,重新禁止密码登录。

附注

值得注意的是,如果像我一样,之前重装过服务器的系统,那么再次使用 SSH 登录时会失败并提示

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

这是因为服务器的 fingerprint 变了,被识别为可能是伪造的服务器的中间人攻击。需要手动清除之前旧的服务器指纹。该文件在 Windows 中存储路径为 “%USERPROFILE%\.ssh\known_hosts”;Linux 中则位于 “~/.ssh/known_hosts”。可以直接进入上述的文件删除对应的指纹,在 Linux 中也可以使用ssh-keygen -R your_ip 命令更新指纹(经测试,Windows 内置的 Linux 子系统暂不支持此命令)。


*更新于 2019-02-19

换了 Amazon Lightsail 的机子(Ubuntu),安全机制略有不同,这里记录一下初次登录的注意事项。

  1. 默认用户名为 bitnami,初次登录请使用 SSH 或 SHell(Web Console)。
  2. Ubuntu 刚安装后, root 没有默认密码,需要手动创建。用 bitnami 登录之后(该用户在 admin 组中,有权限给 root 设定密码),使用 sudo passwd root 修改 root 密码,然后可以使用 sudo susu root 切换当前用户为 root。
  3. 新装完 Ubuntu 系统时,内部会缺少比较多的软件源,这时候系统会自动启动更新进程 apt-get。因此如果在创建实例后短时间内运行 apt 命令的话,可能会报错:Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?,此时不要使用网上的教程去强行停止 apt.systemd.dai 进程(实测这样做重启后会导致 SSH 无法连接,只能重装系统),而应该耐心等待至执行 ps -A | grep apt 命令后无进程为止。
  4. 默认用户 bitnami 的初始密码存放于 /home/bitnami/bitnami_application_password 中。需要注意的是,Bitnami 的 LEMP 套件中 MySQL 默认的管理员用户是 root,但其密码并不是刚才创建的那个 Linux 系统的 root 密码,而是这个 bitnami 的初始密码。修改 MySQL 密码参考这里
  5. Bitnami 的 Nginx 配置默认不允许密码登录和 root 直接登录。前者在前文中有解决方案;后者同样编辑 /etc/ssh/sshd_config,将 PermitRootLoginprohibit-password 改为 yes 即可。注意之后同样需要重启 SSH 服务(service sshd restart)。
  6. 上一步操作仅允许了 root 使用密码登录,如果试图用 SSH 直接登录 root,会提示

    WARNING! The remote SSH server rejected X11 forwarding request. Please login as the user “ubuntu” rather than the user “root”.

    要解除此限制,可以参考如何启用 root 用户通过 SSH 登录 AWS Ubuntu 实例一文,编辑 /root/.ssh/authorized_keys,删除 ssh-rsa 之前的文本即可。注意,这样做会显著降低安全性。

注:su (switch user) 和 sudo 的区别是:

  1. su 的密码是 root 的密码,而 sudo 的密码是用户的密码;
  2. su 直接将身份变成 root,而 sudo 是以用户登录后以 root 的身份运行命令,不需要知道 root 密码。

参考链接

-------------本文结束    感谢您的阅读-------------
0%