avatar

目录
Centos6.10服务器入侵->重装->恢复记录

Centos6.10 服务器入侵->重装->恢复记录

  • 头些天在 centos6.10 服务器创建了一个 git 账户用来搭建私有 Git 仓库,账户和密码均为 git,并且支持 ssh 密码远程连接,很快被黑客扫描到,通过 ssh 弱口令进到我的 git 账户,并操纵我的服务器扫描其他持续扫描其他服务器,被购买服务器的主机商的防火墙发现,锁定了我的服务器。也是在与客服的沟通中,他问我的服务器 ssh 密码是否过于简单,正是弱口令使我的服务器沦陷。病毒已经植入到我的系统中,为了彻底解决,客服建议我重装系统,尽管服务器上面的数据比较多,我还是硬着头皮备份、重装了一次系统,搞了整整一天,服务器上的功能基本恢复。

  • 上一次配置服务器还是在 2 年前,当时安全意识较差,认为防火墙是多余的,把防火墙直接关闭,使得服务器上可以任意向外发送数据、服务器上的任何端口都向外开放;很多程序都放到 root 账户下运行;为了省事,设置及其简单的密码,每当看到网络安全相关资料讲解“弱口令”时,感觉弱口令离我非常遥远,不以为然。这些做法都是极其危险的,也是一步一步使我服务器沦陷的最终原因。

一、备份 WEB 站点(root 账户)

  • 我安装的 WEB 服务软件为国产的 Kangle 服务器,应该很少有人听说,Kangle 就相当于平时我们所常见的 Apache、Nginx,也是一款能够提供 WEB 访问控制服务的软件。

  • Kangle 站点文件存放在/home/ftp下,Kangle 一些相关的账户配置信息存储在/vhs/kangle/etc,首先备份这两个文件夹,然后下载压缩包到本地:

bash
1
2
3
4
cd /home/ftp
zip -r ftp.zip ftp
cd /vhs/kangle/etc/
zip -r etc.zip etc

二、备份 MySQL 数据库(root 账户)

  • 备份 MySQL 可以使用 Navicat 以 root 账户的身份登陆,导出所有数据库即可(安全起见,MySQL 在默认状态是不允许从外网以 root 账户远程连接,在备份的时候需要手动设置将 localhst 改成%)。

  • MySQL 配置允许远程连接

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 进入MySQL
mysql -uroot -p

# 切换到mysql库
use mysql;

# 查看用户表
SELECT `Host`,`User` FROM user;

# 更新用户表
UPDATE user SET `Host` = '%' WHERE `User` = '用户名' LIMIT 1;

# 强制刷新权限
flush privileges;

# 关闭mysql
exit;
  • 如果你安装了 phpmyadmin 也可以以 root 身份登陆管理页面,导出数据库。

  • 我在服务器上设置了定时任务,即每天 01:00 将整个数据库备份一次,永久保存在服务器上,恰好今天在重装系统前没有对数据库再进行修改,于是我直接使用了今天凌晨 1 点的全备份来恢复系统。尽管安装系统时仅格式化系统盘,但是为了安全起见,我把 sql 备份文件下载到了本地。

三、备份 tomcat9、gitea(git 账户)

  • git 账户下运行着 tomcat 和 gitea(开源 git 仓库面板,轻量级),将这两个相关的文件全部压缩,下载。

四、备份 root 账户下的 frp 内网穿透软件(root)

  • 第三步忘记了备份内网穿透,再次切换到 root 用户,找到 frp 的安装位置,压缩,下载:
bash
1
2
cd /usr/local
zip -r frp.zip frp

五、重装系统

  • 仍然选择 centos6.10,并仅格式化系统盘,手机验证码确认,重装。大概 5 分钟,系统重装完成.(实际这里第一次重装系统时我选的 centos7,但是装完之后发现 centos7 与 centos6 之间的操作还是存在一定差异的,用着不顺手,就又重装了一次,装回了 centos6)

六、恢复服务器环境及功能

  • 由于重装系统时保留了数据盘,因此重装完毕之后。/home 目录下的文件夹并没有清空。众所周知,Linux 一般是一个账户对应一个/home 目录下的文件夹,我们应先把这些目录清理干净,防止造成冲突。
bash
1
2
# 删除git用户
userdel git
  • 设置 ssh,允许远程连接。我的服务器重装完毕后已经配置好 ssh,直接连接即可。

  • 重装 Kangle 服务器,恢复站点数据(FTP 站点及服务器参数配置文件)。

  • 重装 MySQL,恢复 MySQL 数据:

bash
1
mysqldump -u root -p mysql > /backup/20200222.sql

  • 安装 git(version >= 2.16)

卸载旧版本 git

bash
1
yum remove git

安装依赖库

bash
1
2
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install gcc perl-ExtUtils-MakeMaker

下载安装 libiconv

bash
1
2
3
4
5
cd /usr/local
wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
tar -zxvf libiconv-1.15.tar.gz
cd libiconv-1.15
./configure --prefix=/usr/local/libiconv && make && make install

下载安装 Git

bash
1
2
3
4
5
6
cd /usr/local
wget https://www.kernel.org/pub/software/scm/git/git-2.11.0.tar.gz
tar -zxvf git-2.11.0.tar.gz
cd git-2.11.0
./configure --prefix=/usr/local/git-2.11.0 --with-iconv=/usr/local/libiconv
make && make install

检查版本号

bash
1
git --version


  • 安装 jdk1.8。我安装的系统位 centos6.10 x64,安装 jdk1.8。具体版本号为:jdk-8u201-linux-x64.tar.gz。由于已经在本地存过 jdk,直接通过 SSH 上传到/usr/local 中:
bash
1
2
tar -zxvf jdk-8u201-linux-x64.tar.gz
vi /etc/profile
  • 在 profile 文件中追加如下文本:
bash
1
2
3
4
5
# jdk8 env
JAVA_HOME=/usr/local/dev/jdk1.8.0_201
CLASSPATH=.:$JAVA_HOME/lib
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
  • 保存退出,使环境变量生效:
bash
1
source /etc/profile

  • 升级内核。centos6.10 的默认内核版本是 2.x,但是 gitea 内核版本要求在 3.x,所以需要升级内核。

  • 查看当前内核版本

bash
1
uname -r
  • 查看当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)
bash
1
uname -a
  • 导入 public key
bash
1
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
bash
1
rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
  • 安装 kernel-lt(lt=long-term)
bash
1
yum --enablerepo=elrepo-kernel install kernel-lt -y
  • 编辑 grub.conf 文件,修改 Grub 引导顺序
bash
1
vi /etc/grub.conf

  • 因为一般新安装的内核在第一个位置,所以设置 default=0,表示启动新内核

  • 重启系统

bash
1
shutdown -r now
  • 再次查看内核版本,已经升级成4.4.214-1.el6.elrepo.x86_64

  • 创建 git 账户,在 git 账户中恢复 tomcat、frp、gitea 服务。为了增强密码安全性,我使用 KeePass 软件生成了一个 128 位的密码。在 git 账户中上传备份过的 tomcat9、frp、gitea,解压并配置相关文件,启动 tomcat、frp、gitea 并保持在后台运行。

  • 添加 MySQL 自动完整备份

  • 在/home/backup/创建 autobackupmysql.sh,编辑:

bash
1
2
filename=`date +%Y%m%d`
mysqldump -uroot -p密码 --all-databases >/home/backup/$filename.sql
  • 添加 cron
bash
1
2
crontab -e
0 1 * * * /home/backup/autobackupmysql.sh

七、服务器安全性增强设置

  • 主要从以下两方面入手:
  1. 禁止使用 ssh 密码方式连接,改为 ssh 证书连接。
  2. 配置安全策略较强的 iptables 策略,将 iptables 的 INPUT,FORWARD,OUTPUT 策略全部设置为 DROP,即出现在所有进出站服务都要在 iptables 的 INPUT 和 OUTPUT 上添加记录,否则无法访问服务。
  • 1.修改 ssh 连接方式,由于我有 root 和 git 两个账户,因此需要分别生成私钥。
Code
1
2
3
su root
ssh-keygen -t rsa
cd ~/.ssh
  • 将公钥设置为服务器的登录公钥
bash
1
mv id_rsa.pub authorized_keys
  • 查看私钥并保存到本地
bash
1
cat id_rsa
  • 设置 ssh,禁止密码登录,改用私钥登录
bash
1
vi /etc/ssh/sshd_config
  • 修改 PasswordAuthentication 改为 no,然后重启 sshd 服务
bash
1
service sshd restart
  • 再次连接使用 ssh 私钥即可直接登陆。其他账户的操作方法同 root 账户。

  • 2.iptable 安全策略,首先将 INPUT,FORWARD,OUTPUT 策略全部设置为 DROP(即白名单模式,不设置默认黑名单)
bash
1
2
3
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
  • 注意,上面的命令,当你执行第一条iptables -P INPUT DROP时,会发现你的 ssh 连接断开,这就说明第一条配置生效了,剩下的配置需要到主机商后台管理页面使用 VNC 进行连接操作。

  • 首先开启 22 端口,允许其出站入站

bash
1
2
3
4
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
service iptables save
service iptables status
  • 查看 iptables 状态,若 22 端口已添加,那么断开 VNC,再到我们的 ssh 连接软件去操作(ssh 终端可以复制粘贴,VNC 不能,所以尽快配置好 22 端口)

  • 首先需要开放本机回环地址(127.0.0.1),即允许本机内互相访问

bash
1
2
3
4
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
service iptables save
service iptables status
  • 添加完毕后,我的服务器还需要陆续开放 WEB 服务所需的 80、443s 端口、3306 数据库端口、允许 ICMP 包通过(ping)等等
bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -j ACCEPT

iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3306 -j ACCEPT

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

service iptables save
service iptables status
  • 配置完毕后,重启防火墙
bash
1
service iptables restart
  • 我的服务器上运行的 tomcat、gitea 等服务,使用 Kangle 服务器提供的反向代理进行使用,即代理到 127.0.0.1:port,这样更加安全,避免没必要的端口暴露。

  • 这是我的防火墙配置

到这里,服务器重装及环境的恢复总算基本完成,下一步就是进行各项功能的测试。这一次的攻击事件也使我加强了对网络安全的认识,计算机网络中无时无刻都在进行这各种扫描、嗅探、入侵,只有我们防护好自己的服务器,滴水不漏,才能保证服务器和数据服务的安全可靠。



常用路径及命令

  • redis 官方下载地址:http://download.redis.io/releases/
  • redis 安装——进入到安装目录,直接运行 make,然后启动即可
  • redis 安装目录:/usr/local/dev/redis-3.0.5
  • redis 启动 nohup /usr/local/dev/redis-3.0.5/bin/redis-server /usr/local/dev/redis-3.0.5/redis.conf &
  • redis 测试 /usr/local/dev/redis-3.0.5/bin/redis-cli
  • centos6.10 添加开机自启,vi /etc/rc.d/rc.local
  • 环境变量文件vi /etc/profile,source /etc/profile
  • 如果上面的环境变量文件配置了不生效,则配置vi /etc/bashrc,source /etc/bashrc
  • jdk 环境配置,下载压缩包,解压到某一路径,配置 profile,保存,使 profile 生效
  • springboot 部署命令:java -jar -Dspring.profiles.active=test demo-0.0.1-SNAPSHOT.jar
文章作者: Bill
文章链接: http://blog.webpro.ltd/2020/02/22/My-Server-Attacked-by-Scanner/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Bill's blog

评论