0%

建立 vps 后的第一步

建立 vps 后(主要用于科学上网)首先要保证后续的使用安全。否则再多的功能都是空中楼阁。

SSH 登录

非对称密钥算法的作用分为两种场景:

  • 加密数据:公钥加密,私钥解密。数据由前者发往后者,数据是安全的。
  • 认证:私钥加密,公钥解密。后者验证前者的身份,传输数据的安全性是没有保证的。

那么远程登录呢?

SSH 本身提供两种级别的验证方法:基于口令的安全验证;基于密钥的安全验证。引用来源

口令登录,属于加密数据的场景。

首次登录时客户端获取服务端的公钥,询问其公钥指纹是否可信(客户需要通过其他方式验证真伪)。

然后客户端以服务端公钥加密口令后传输,服务端使用自身的密钥解密后验证。参考

服务端 /etc/ssh/ 中的证书可以认为是用于标识主机的,和用户无关。

密钥登录,属于认证的场景,比如签名。

需要将客户端的公钥上传给服务端(服务端通过其他方式验证是否可信)。

客户端打个招呼要登录,服务端将一个随机字符串发给客户端。

客户端使用自身的私钥加密后,服务端解密验证是否一致。

上传后的客户端公钥放置于服务端用户的主目录下 ~/.ssh/,所以服务端新增用户后,要做进一步配置才能使用秘钥登录。

查看 SSH 主机密钥的指纹 的命令: ssh-keygen -l

验证远程主机 SSH 指纹,通过 可信渠道 获得服务器的公钥指纹,与客户端首次登录服务器时的指纹对比。

先试密钥,后用口令

将登录整个过程中使用到的 ssh 证书全部讲清楚, ssh -vvv

用户使用 ssh [user@]hostname 访问服务器时:
0. 连接建立后,先尝试密钥登录(此过程稍后讲,先跳过)

  1. 客户端验证目标主机真伪:核验服务器上 /etc/ssh/ssh_host_ecdsa_key.pub 公钥的指纹
    查看公钥的指纹:ssh-keygen -lf input_keyfile
    用户对比 ssh [user@]hostname 首次登录时输出的指纹,是否与上述结果一致
  2. 用户确认通过后,上述公钥会被存储到 $HOME/.ssh/known_hosts 文件中
    a)避免再次登录时需要再次确认; b)在口令登录方式下,用于加密客户端输入的口令(甚至后续的通信数据?)
  3. 口令登录时,客户端使用上述公钥加密口令后传输,服务端使用自身的私钥解密后验证

小结:口令登录时只用到了服务端 /etc/ssh/ 目录下的一对密钥,并在客户端 $HOME/ 下存放了 known_hosts
特别说明一下,口令登录时没用到客户端的密钥,也没用到服务端 $HOME/ 下的密钥。

ed25519

ed25519 是目前最安全、加解密速度最快的 ssh key 类型,由于其数学特性,它的 key 的长度比 rsa 小很多,优先推荐使用。

RSA,DSA,ECDSA,EdDSA 和 Ed25519 的区别

centos 的基础操作

为了某人能够业余时间练习、熟悉操作,方便工作。所以使用了与其公司服务器相同的操作系统。限于其公司版本过低, vultr 不提供一键安装服务(需要自行配置),所以采用了目前的

1
2
3
4
5
# 查看 centos 版本
$ cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
# 查看用户列表
$ cat /etc/passwd

linux 下查看进程占用的端口分为两步:

1
2
3
4
#查看nginx进程pid:
ps -ef | grep nginx
#通过nginx进程pid查看占用端口(进程pid为9836)
netstat -nap | grep 9836

操作用户

1
2
3
4
# 新增用户
$ adduser v2ray
#为这个用户初始化密码
$ passwd v2ray

CentOS 系统 SSH 免密后依然需要输入密码

确认 .ssh 目录权限是 700,authorized_keys 文件权限是 600

防火墙

服务端配置完毕,通信失败时首先要确认的就是端口是否打开。

Centos 升级到 7 之后,内置的防火墙已经从 iptables 变成了 firewalld

所以这里只记录 firewall 的操作备忘。

1
2
3
4
5
6
# 查看已经开放的端口:
firewall-cmd --list-ports
# 开启端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 批量开发端口
firewall-cmd --zone=public --add-port=30000-40000/tcp --permanent

命令含义:

  • –zone #作用域
  • –add-port=80/tcp #添加端口,格式为:端口/通讯协议
  • –permanent #永久生效,没有此参数重启后失效

调整防火墙(比如删减端口)之后,重启生效。

1
2
3
4
#重启防火墙
firewall-cmd --reload
#查看默认防火墙状态
firewall-cmd --state

启停服务

1
2
3
4
5
6
7
8
9
10
# 启动服务
systemctl start firewalld
#停止firewall
systemctl stop firewalld.service
# 开机启动
systemctl enable firewalld
#禁止firewall开机启动
systemctl disable firewalld.service
# 查看状态
systemctl status firewalld

登录

2020年6月2日,今天发现在公司的联通网络下无法登录 vps 了,连接总是失败,提示超时。

通过其他主机访问 vps 能够成功,但进入之后看到警告信息:

1
There were 2897 failed login attempts since the last successful login.

提示主机被尝试暴力破解。通过 systemctl status sshd 或者查看 ll /var/log/secure -h 等方式都能够看到异常。

修改端口

尝试修改 vim /etc/ssh/sshd_config 默认的 22 端口,重启服务器失败。查询发现报错信息

1
SELinux is preventing /usr/sbin/sshd from name_bind access on the tcp_socket port 88888.

解决方式其实在配置文件的注释中也说明了:

1
2
3
4
5
6
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
Port 88888

改完端口之后,公司的主机还是无法登录,依然是超时报错。

2020年6月24日13:21:37 修改端口并不能一劳永逸,今天发现 /var/log/secure 文件已经 12M 了,从上次成功登陆到刚刚,有 4500+ 次的错误尝试。

禁用 root 远程登陆

先创建普通用户。

修改 /etc/ssh/sshd_config 文件,将

1
2
3
#PermitRootLogin yes
# 修改为 ->
PermitRootLogin no

重启 sshd 服务生效。禁止以后,可以使用普通用户 ssh 登录,登录后可以切换到 root 权限。

更安全了,但登录失败的暴力破解日志还是会一直生成,不开心。

2020年6月30日13:30:50 普通用户登录,切换 root 登录时提示

1
2
3
Last login: Wed Jun 24 05:51:51 UTC 2020 on pts/0
Last failed login: Tue Jun 30 05:28:48 UTC 2020 from 106.13.69.8 on ssh:notty
There were 14744 failed login attempts since the last successful login.

添加禁止 ip

参考 防止服务器SSH暴力破解,拷贝其脚本,在服务器定时执行 /root/a.txt 脚本。

秘钥登录

为了保证使用的便捷性,更改秘钥登录

CentOS 系统 SSH 免密后依然需要输入密码

确认 .ssh 目录权限是 700,authorized_keys 文件权限是 600