建立 vps 后(主要用于科学上网)首先要保证后续的使用安全。否则再多的功能都是空中楼阁。
SSH 登录
非对称密钥算法的作用分为两种场景:
- 加密数据:公钥加密,私钥解密。数据由前者发往后者,数据是安全的。
- 认证:私钥加密,公钥解密。后者验证前者的身份,传输数据的安全性是没有保证的。
那么远程登录呢?
SSH 本身提供两种级别的验证方法:基于口令的安全验证;基于密钥的安全验证。引用来源
口令登录,属于加密数据的场景。
首次登录时客户端获取服务端的公钥,询问其公钥指纹是否可信(客户需要通过其他方式验证真伪)。
然后客户端以服务端公钥加密口令后传输,服务端使用自身的密钥解密后验证。参考
服务端 /etc/ssh/
中的证书可以认为是用于标识主机的,和用户无关。
密钥登录,属于认证的场景,比如签名。
需要将客户端的公钥上传给服务端(服务端通过其他方式验证是否可信)。
客户端打个招呼要登录,服务端将一个随机字符串发给客户端。
客户端使用自身的私钥加密后,服务端解密验证是否一致。
上传后的客户端公钥放置于服务端用户的主目录下 ~/.ssh/
,所以服务端新增用户后,要做进一步配置才能使用秘钥登录。
查看 SSH 主机密钥的指纹 的命令: ssh-keygen -l
验证远程主机 SSH 指纹,通过 可信渠道 获得服务器的公钥指纹,与客户端首次登录服务器时的指纹对比。
先试密钥,后用口令
将登录整个过程中使用到的 ssh 证书全部讲清楚, ssh -vvv
用户使用 ssh [user@]hostname
访问服务器时:
0. 连接建立后,先尝试密钥登录(此过程稍后讲,先跳过)
- 客户端验证目标主机真伪:核验服务器上
/etc/ssh/ssh_host_ecdsa_key.pub
公钥的指纹
查看公钥的指纹:ssh-keygen -lf input_keyfile
用户对比ssh [user@]hostname
首次登录时输出的指纹,是否与上述结果一致 - 用户确认通过后,上述公钥会被存储到
$HOME/.ssh/known_hosts
文件中
a)避免再次登录时需要再次确认; b)在口令登录方式下,用于加密客户端输入的口令(甚至后续的通信数据?) - 口令登录时,客户端使用上述公钥加密口令后传输,服务端使用自身的私钥解密后验证
小结:口令登录时只用到了服务端 /etc/ssh/
目录下的一对密钥,并在客户端 $HOME/
下存放了 known_hosts
。
特别说明一下,口令登录时没用到客户端的密钥,也没用到服务端 $HOME/
下的密钥。
ed25519
ed25519 是目前最安全、加解密速度最快的 ssh key 类型,由于其数学特性,它的 key 的长度比 rsa 小很多,优先推荐使用。
RSA,DSA,ECDSA,EdDSA 和 Ed25519 的区别
centos 的基础操作
为了某人能够业余时间练习、熟悉操作,方便工作。所以使用了与其公司服务器相同的操作系统。限于其公司版本过低, vultr 不提供一键安装服务(需要自行配置),所以采用了目前的
1 | 查看 centos 版本 |
linux 下查看进程占用的端口分为两步:
1 | 查看nginx进程pid: |
操作用户
1 | 新增用户 |
确认 .ssh 目录权限是 700,authorized_keys 文件权限是 600
防火墙
服务端配置完毕,通信失败时首先要确认的就是端口是否打开。
Centos 升级到 7 之后,内置的防火墙已经从 iptables 变成了 firewalld
所以这里只记录 firewall 的操作备忘。
1 | 查看已经开放的端口: |
命令含义:
–zone
#作用域–add-port=80/tcp
#添加端口,格式为:端口/通讯协议–permanent
#永久生效,没有此参数重启后失效
调整防火墙(比如删减端口)之后,重启生效。
1 | 重启防火墙 |
启停服务
1 | 启动服务 |
登录
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 | If you want to change the port on a SELinux system, you have to tell |
改完端口之后,公司的主机还是无法登录,依然是超时报错。
2020年6月24日13:21:37 修改端口并不能一劳永逸,今天发现 /var/log/secure 文件已经 12M 了,从上次成功登陆到刚刚,有 4500+ 次的错误尝试。
禁用 root 远程登陆
先创建普通用户。
修改 /etc/ssh/sshd_config
文件,将
1 | #PermitRootLogin yes |
重启 sshd 服务生效。禁止以后,可以使用普通用户 ssh 登录,登录后可以切换到 root 权限。
更安全了,但登录失败的暴力破解日志还是会一直生成,不开心。
2020年6月30日13:30:50 普通用户登录,切换 root 登录时提示
1 | Last login: Wed Jun 24 05:51:51 UTC 2020 on pts/0 |
添加禁止 ip
参考 防止服务器SSH暴力破解,拷贝其脚本,在服务器定时执行 /root/a.txt 脚本。
秘钥登录
为了保证使用的便捷性,更改秘钥登录
确认 .ssh 目录权限是 700,authorized_keys 文件权限是 600