【持续更新...】阿里云ECS服务器使用日志

写在前面

前段时间,在某云上买了一台云服务器。这是第一台自己的服务器,所以有些不知所措吧,一下子不知道该干什么了。本来我的初衷是在服务器上结合docker部署一些项目,以及为了给我的域名备案使用。买了以后,发现各种问题接踵而至。如何使用?如何选择远程连接的方式?如何确保服务器的安全?

刚买第二天就给我报各种风险漏洞,虽然目前没有什么东西放在上面,但是也不能一直这样下去。因此,我就到处去学如何使用这台服务器(当然包括官方文档),来解决上面的问题。现在真心觉得维护工作好麻烦,我在想部署项目的时候不知道会有什么更大的问题在等着我……

我会在这里记录使用服务器过程中遇到的问题与解决方案,算是服务器使用日志吧。

服务器操作系统:Debian 11

2023

12-30

远程连接

远程连接的方式有很多,提供远程连接的软件也有很多,根据实际需求选择合适的软件即可。下面介绍几种常见的远程连接方式或软件吧

网页端远程连接

这应该是最最最简单,或者说用户最容易发现的方法了吧,简单讲下:

  1. 进入云服务商官网控制台,左上角扩展中找到“云服务器ECS”进入实例管理
  2. 点击远程连接,选择连接方式,输入密码即可连接

如果忘记密码可以离线重置密码,重置以后不要忘了重启实例

这种连接方式就是浏览器通过云服务商连接到远端的服务器,浏览器与服务商之间使用HTTPS协议,服务商与服务器之间使用的是SSH协议,这两种协议的安全性都有保证,所以可以放心使用。

VNC

VNC是基于RFB协议的有界面的连接方式,但是RFB协议不够安全,不建议经常使用VNC连接。可是,一般排查一些异常会用到VNC,所以VNC是需要学会的。

第一次使用服务器需要设置VNC远程连接密码,实例操作中的“更多”,找到密码/密钥,里面就能修改VNC远程密码。

RDP

VNC和RDP都是有界面的连接模式,但是RDP更安全,所以一般选择RDP来连接的比较多。RDP是微软的专有协议,在Windows下使用非常方便,而且更安全,另外RDP需要在安全组中开启3389端口。

SSH

还有一种更安全的连接方式,那当然是SSH连接,毕竟密钥对肯定比密码更安全啦。

在控制台左边有一栏是“网络与安全”,里面有一个密钥对,去创建一个密钥对。其实就是在本地生成一个私钥,需要保存好,不要泄露了。之后远程连接时使用证书连接即可。

生成的私钥文件一定要保存好,这个文件只能下载一次

Websockets+SSL免密登录

简单来讲就是要在服务器端安装一个阿里云的客户端来支持免密登录。

客户端连接(我采用的方式)

一般大厂提供的云服务都会有自己的客户端连接软件,比如阿里云、腾讯云等。使用他们开发提供的客户端也会比较放心,直接下载安装即可。

具体的操作方式可以参考下面的视频:

2024

01-12

处理服务器报警的漏洞

使用服务器的第二天,就给我报了两个中小漏洞出来,短短几天又爆出来十几个,我的天。作为网安人肯定不能忍,于是就去网上寻找解决方案,下面我来讲讲我是如何解决漏洞的。

这里出现的漏洞主要是系统漏洞、Web漏洞以及应用漏洞。基本平时碰到的漏洞一般都是系统漏洞,这是因为Linux内核或者应用程序中必然会存在一些缺陷或者错误。

手动修复漏洞(免费)

具体请看下文如何做好安全防护?

自动修复漏洞(付费)

最简单粗暴的方法,掏钱使用服务商的按量修复,推荐富哥使用。

如何做好安全防护?

我只能尽我所能去做好服务器的安全防护,保护好我的小鸡🐥。Linux 服务器的安全防护一直是一个复杂的巨大课题。现在,我有了一台服务器,这与自己的电脑不同,它 24 小时开机,而且具有一个公网 IP,意味着人人都可能可以访问到这台服务器,就相当于已经置身于安全攻防战场的第一线,需要直面所有风险。

任何人只需要知道【IP 地址】+【端口】+【用户名】+【密码】这四个要素,就能登录你的 VPS 服务器。那很显然,这四要素的安全就是我们要防护的底线。

更新安装包索引

1
2
apt update
apt upgrade

保持即可,直接回车。

01-15

SSH 防护

更改 SSH 端口

一般 SSH 端口默认为22,但是也有服务器提供商已经为我们修改了SSH的端口,那么你可以选择不修改,直接跳过此步。

  1. 对于Linux来说,用 nano 打开 SSH 远程登录程序设置:
1
nano /etc/ssh/sshd_config

如果服务器操作系统是Windows,自行检索吧,因为很少有人用Windows去操作服务器。

  1. 文件打开后,进入了 nano 的界面,重要的快捷键都显示在屏幕下方了,不用死记硬背,是不是很贴心呢?
  1. 在打开的文件中一找到 Port 这项,并修改它的端口。Port 后面的数字就是 SSH 的端口,建议把它改成一个大于 1024 小于 65535 的整数。具体操作如下:
  • 使用 ctrl+w 进入搜索模式,然后输入 Port 22 并回车
  • 删除 22 并改成你自定义的端口号
  • 注意:如果这一行开头有个#,说明这一行【不生效】(被注释掉了),可以在文件最后写一个不带#的,或者把#删掉就好。

强烈建议用一个自己想到的其他端口,毕竟有 6 万多个端口可以自由选择。

  1. 保存并退出配置文件

保存是 ctrl+o + 回车,退出是 ctrl+x

注意:是保存后退出,不是退出后保存

  1. 重启 ssh 服务,使变更生效
1
sudo service sshd restart

注意:为了保证你不会失联,请不要关闭当前的 ssh 登录窗口!而是另外开一个窗口来测试!
注意:为了保证你不会失联,请不要关闭当前的 ssh 登录窗口!而是另外开一个窗口来测试!
注意:为了保证你不会失联,请不要关闭当前的 ssh 登录窗口!而是另外开一个窗口来测试!

  1. 一般来说,现在就能使用自定义端口使用SSH服务了。但是也不绝对,就拿我使用的ECS来说。因为阿里云为了保护服务器,在默认的安全组里面,只添加了一些常用的端口号,比如22端口。所以,我还需要进入服务器的控制台,在安全组里添加自定义的端口,然后重启实例,注意必须重启实例,然后才能够使用自定义端口进行SSH连接。这种端口变换不会影响公私钥对的校验。

所以说,大家需要查看自己的服务器是否开启了我们自定义的端口号,如果默认关闭,那就需要手动开启,才能使用SSH连接。

使用复杂的密码

如果你想给当前的用户设置重新设置一个密码,那么可以到这个网站,生成一个复杂的密码,当作你服务器的密码。

然后使用下面的命令修改密码:

1
passwd

出现提示让你修改密码。然后粘贴进去就行了。(注意为了安全的考量,Linux 下输入密码是没有显示的)

新建普通用户

为什么要普通用户?Linux 系统中的 root,不仅仅是一个管理员账号那么简单。它是整个系统的根基、是系统的主宰、至高无上的神。一旦 root 账号出现安全问题,整个系统就只能任人鱼肉、无处可逃。

  1. 新增一个用户并设定登录密码

名字可以随便起,这里以 ecsadmin 为例:

1
adduser ecsadmin

执行命令后,根据提示操作即可。务必设置一个用户密码(设置密码时是看不到的)。之后系统会询问一些用户的附加信息,可以无视,一路回车即可。

  1. 安装 sudo 功能
1
apt update && apt install sudo  #Debain默认没有,Ubuntu自身应该是已经有安装的
  1. 把 ecsadmin 用户加入 sudo 名单里
1
visudo

User Privilege Specification 下加入一行 ecsadmin ALL=(ALL) NOPASSWD: ALL 即可。

NOPASSWD 这个设置,它的意思是 ecsadmin 用户临时使用 root 权限时,不用额外输入密码。如果你希望遵守传统习惯,每次使用 sudo 时需要输入密码,那么这一行改成 vpsadmin ALL=(ALL:ALL) ALL 即可。

禁止 root 登陆

  1. 用 nano 编辑器打开 SSH远程登录程序设置
1
nano /etc/ssh/sshd_config
  1. 找到 PermitRootLogin Yes 这一项,然后把它后面的设定值改为 no 即可
  2. 保存文件并退出
  3. 重启 ssh 服务,让变更生效
1
sudo service sshd restart

01-21

全局防护

安装并配置 UFW 防火墙

  1. Ubuntu 默认自己已经是自带 ufw 防火墙了,只是没有启动而已(如果是 Debian 的话,需要安装)

安装:

1
apt install ufw
  1. 设置 ufw 使用默认值
1
2
ufw default deny incoming
ufw default allow outgoing
  1. 允许 SSH 连接

没有改SSH端口设置

1
ufw allow ssh

使用自定义SSH端口

1
ufw allow 自定义端口号/tcp comment 'SSH'
  1. 允许 http 连接
1
ufw allow http
  1. 允许 https 连接
1
ufw allow https
  1. 启动 ufw 防火墙
1
ufw enable
  1. 查看 ufw 防火墙状态
1
2
ufw status
ufw status numbered
  1. 其他
1
2
ufw delete 5 #删除一条规则
ufw reload #重载配置

禁止 Ping

  • 宝塔用户
    如果是宝塔用户,可以在这边禁止 Ping

  • 未安装宝塔的用户

    1
    sudo nano /etc/ufw/before.rules

    crl+w搜索:echo-request,把 ACCEPT 改成 DROP

禁止暴力破解

这一步如果大家使用的是SSH公私钥对连接的话就没必要配置了,因为只要保证你的私钥不泄露,就基本能够保证不被暴力破解。感兴趣的可以去了解一下RSA加密通信的相关知识。其实,使用SSH连接远程仓库的时候,有些教程会教大家生成私钥,这个生成的私钥一般就在用户文件夹下的.ssh里面,就是通过RSA加密算法得到的。

安装 Fail2ban

1
sudo apt update && sudo apt install fail2ban

进入文件夹,先做好备份

1
2
cd /etc/fail2ban # 进入fail2ban目录
sudo cp fail2ban.conf fail2ban.local # 复制一份配置文件

打开编辑fail2ban.local文件,默认的是没有配置的,我们加入一个配置:

1
2
3
4
5
6
7
[sshd]
enable = ture
port = 9753 # 注意改成自己对应的端口
filter =sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = -1
1
2
3
sudo service fail2ban restart    #重启
sudo fail2ban-client status #查看状态
sudo fail2ban-client status sshd #查看sshd的详细状态
解禁指定IP,这里的IP需要自定义
1
sudo fail2ban-client set sshd unbanip 192.0.0.1 #解禁指定IP,这里的IP需要自定义

01-27

尽量使用反向代理

使用宝塔的同学建议更改一下默认的8888端口,使用

1
bt

就能进入修改面板,大家自己修改即可。

我使用 Nginx Proxy Manager 做反向代理,具体搭建请参考Nginx Proxy Manager

02-25

SSH远程登录异常

今天使用服务器的时候,本来使用SSH连接得好好的,突然断开了连接。再次尝试连接显示超时:

最后联系了阿里云售后小哥哥解决了问题:
我遇到的大概率就是内存满了,毕竟好多容器在跑。重启实例以后,就恢复了连接,给阿里云售后点赞。

既然遇到了这个问题,我还是想要总结记录一下关于服务器SSH连接失败的原因及排查、解决方案。

一般SSH连接失败的原因会有这几个:

  • 服务器端或客户端的防火墙设置了关闭空闲连接的规则,导致长时间没有数据交互的SSH连接被断开
  • 服务器端或客户端的网络环境不稳定,导致SSH连接丢包或延迟过高,无法正常通信

我觉得上面这些应该不太会发生在大部分人身上,或者说大多数问题并不是由上面的因素造成的。还有:

  • 就是主机内存满了,需要清理。
    具体原因:
    首先,我们要知道 Linux 系统为了提高内存的利用率,会把一些不常用的内存数据交换到硬盘上,形成一个 swap 分区。这样,当内存不足时,系统可以从 swap 分区中调用一些数据回到内存中,释放一些空间给其他进程使用。
    然而,如果系统的内存和 swap 分区都被占满了,那么系统就会面临一个严重的问题,就是没有足够的内存来运行新的进程或者服务。这时,系统会启动一个叫做 OOM Killer 的机制,来杀死一些占用内存较多的进程,以便释放一些内存空间。
    但是,这个机制并不是完美的,有时候它会杀死一些重要的进程,导致系统不稳定或者崩溃。而且,这个机制也不是及时的,有时候在它启动之前,系统已经陷入了无法响应的状态。
    SSH 服务是一个基于 TCP 协议的远程登录服务,它需要在服务器端和客户端之间建立一个加密的通道,来传输数据和命令。这个通道的建立需要经过几个步骤,其中最关键的一步是服务器端和客户端之间的密钥交换,也就是所谓的 handshake 。
    如果服务器的内存和 swap 分区都满了,那么服务器可能无法为 SSH 服务分配足够的内存空间,导致 SSH 服务无法正常运行或者响应客户端的请求。这样,客户端就会一直等待服务器的回应,直到超时或者断开连接。

因此,最快的处理方式就是重启实例。重启实例时,在内存中未保存到磁盘的数据会丢失,从而释放内存空间。

下面仔细看一下上面的排查过程:

  1. 使用ping命令检查网络连通性:
    1
    ping [$ECS_IP]
  • 如上图所示,服务器运行中,并且没有丢包现象,说明网络正常。
  • 如果存在丢包现象,说明网络存在波动,尝试更换时间段或本地网络后重新进行测试。
  • 如果ping不同,那就有多种可能:ECS实例未运行、防火墙设置等,需要逐一排查。
  1. 使用telnet命令检查远程连接端口的可用性,一般就是指22端口:
    1
    telnet [$ECS_IP] [$Port]
  • 可以访问远程连接端口,说明网络和远程连接服务正常。
  • 无法访问远程连接端口,可能是由于安全组规则、RDP或SSH服务未运行、防火墙设置等,无法访问远程连接的端口。
  1. 使用ssh命令检查远程连接时的报错
    通过报错信息:Timed out while waiting for handshake可以推断有可能是内存占用满了。

一般来说,内存被占满,肯定是有一项进程负荷太大。像我就是因为部署一个容器的时候,其他还挂着好几个容器,然后就炸了。所以,大家可能需要多注意一下自己的服务器配置,一些非必要的容器也不要一直挂着。

另外,在网上查找解决方案是发现的宝藏博客,供大家学习:

02-28

AK泄露,调用异常行为

大家还是要注意,一些不明来路的脚本文件尽量不要下载。

下午收到官方的电话和短信的通知,说我的AK泄露了,并存在异常调用行为:

这是怎么回事呢?于是去咨询了售后,结果是虚惊一场,但不知道为什么系统告警了。之后,我把原先的AK删除,创建了新的,直接从根源解决问题。

03-01

阿里云服务器监控插件安装

由于之前SSH断联以后,咨询售后得知原因可能时内存占用过多,但是之后几天还是出现崩掉的情况,需要重启才能恢复正常。所以今天尝试安装阿里云自带的监控插件,可以实时监控内存使用情况。其实我觉得有些奇怪,在服务器刚到手的时候,我就设置了4GB的SWAP交换空间,就是用来预防内存不够用的情况,但是还是出现了问题。而且还频繁出现这类问题,那就不得不好好研究解决一下了。

安装了官方的监控插件以后,确实看到服务器的内存使用率很高,而且居高不下,但还没有用到交换空间,目前还没有找到问题所在。。。

等待更新......