记一次处理挖矿程序引发的postgres 连接超时

近一段时间内发现自己的服务器总是警告被挖矿,然处理挖矿程序中也引发了许多其他的问题,也从中学到了其他的知识,趁今天未加班梳理一下便于巩固,记录日常

一、查找进程

进入服务使用top 查看cpu 使用情况

在这里插入图片描述

1、使用 ll /proc/pid号 查找进程

在这里插入图片描述

2、使用 lsof 查找进程打开的文件

也可以使用 lsof -p pid(有的linux 需要先安装yam install lsof)


lsof -p /proc/24143 
// 或者
lsof|grep 进程名称

然后就能根据显示的文件路径找到对应的程序位置

根据如下的提示初步判断是postgresql这个所引起的,因为服务器宿主机并未安装相关的postgres,所以第一反应就是docker容器中的postgres在作怪
在这里插入图片描述

还有其他相关命令

   #lsof -p pid                         #查看该进程打开的文件
    #cat /proc/pid/maps                      #查看pid线程内存分配 
    #ls -l /proc/$PID/exe                     #查看PID启动文件的路径
    #ls -l /proc/$PID/cwd                     #查看PID执行目录的路径
    #cat /proc/$PID/status                  #查看PID详细的内存占比

3、处理挖矿程序

首先进入到容器使用top发现该进程疯狂占用cpu
在这里插入图片描述

干掉进程

kill -9 18552

随后登录到postgres修改用户密码

root@f82e7d3a9755:/# su postgres
postgres@f82e7d3a9755:/$ passwd
Changing password for postgres.
(current) UNIX password: 
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
postgres@f82e7d3a9755:/$ exit
exit

也可以不登录postgres, 直接进入容器就修改,如

root@f82e7d3a9755:/# passwd root
Enter new UNIX password: 
Retype new UNIX password: 
Sorry, passwords do not match
passwd: Authentication token manipulation error
passwd: password unchanged

现在再看
在这里插入图片描述

一切正常了

4、重启docker

这个修改后重启一下docker

  systemctl restart  docker

然后把需要的容器再启动起来 docker start containerId

二、postgres 连接超时

在这里插入图片描述
在这里插入图片描述

接上处理挖矿程序后,运行自己的项目,发现pg 数据库无法连接了,尝试使用navicat进行连接也不行,于是又开始了解决postgres 无法被连接的问题

1. 容器操作

首先我的postgres是使用docker 制作的一个容器,所以先要进入这个容器

docker exec -it 容器id /bin/bash
在这里插入图片描述
进入容器后再登录postgres

root@f82e7d3a9755:/# su postgres
postgres@f82e7d3a9755:/$ psql

在这里插入图片描述

然后使用了如下命令查看postpres 的配置文件位置

postgres=# select name, setting from pg_settings where category='File Locations' ;

在这里插入图片描述
找到后,再使用 \q 退出postpres 数据库

2. vim 安装

这里我们需要在容器里安装vim 命令来进行文件编辑

先执行

mv /etc/apt/sources.list /etc/apt/sources.list.bak && \
echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >/etc/apt/sources.list && \
echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list && \
echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list && \
echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources

开始安装

apt-get update && apt-get install vim -y

最后安装还是失败了,这个种柑橘你懂的
后来选择了使用echo 来修改配置,而这个可想而知,没vi 好用了

3. 使用echo修改配置

这里需要去看看看echo相关配置echo linux 官网详解

  • 语法

echo [短选项]... [字符串]...  

  • echo 主要有
  1. 命令操作符 >(输出重定向)
    echo -n Hello,Binn > tmp.txt
    这句话的意思即是:输出Hello,Binn字符串到一个位置,如果tmp.txt存在,我们即【清空其内容,更新为Hello,Binn】,不存在,创建它
  2. 命令操作符 >>(输出追加重定向
    echo Hello,C >> tmp.txt
    查看tmp.txt的内容(此时可以看到,原来的字符串B并没有被替换,而是在B的下一行新增字符串C,即追加操作)
  -n 不尾随换行符  
  -e 启用解释反斜杠的转义功能  
  -E 禁用解释反斜杠的转义功能(默认)  
      --help 显示此帮助信息并退出  
      --version 显示版本信息并退出  
若-e 可用,则以下序列即可识别:  
  \\    反斜杠  
  \a    响铃声  
  \b    退格  
  \c    不再产生新的输出  
  \e    转义符    
  \f    换页  
  \n    新行  
  \r    回车  
  \t    水平制表符  
  \v    竖直制表符  
  \0NNN   字节数以八进制数 NNN (13)表示  
  \xHH    字节数以十六进制数 HH (12)表示  

这里使用用 >> 进行追加不行,我们是需要修改配置,那
这里比较实用的就是 -e 了,因为那个pg_hba.conf里面类容很多而且有换行
拷贝原来的配置内容,再每一个结尾使用 \r 进行换行,和 \n 增加新行来格式配置

最后使用 echo -e " 修改的内容" > /etc/postgresql/9.6/main/pg_hba.conf

如这就是修改后的片段
在这里插入图片描述
然鹅修改完配置后在重启容器,外部进行pg 连接,任然提示超时???

4. 问题初见端倪

如上方法试了一大堆还是不行,只好试试重新创建一个容器来用
在这里插入图片描述
这一运行 屏幕出现了一行醒目的 IPv4被禁用的提示 WARNING: IPv4 forwarding is disabled. Networking will not work.
看见这句猛然如梦中惊醒(成年人的崩溃就在这一瞬间),这才知道了为啥一直无法链接(网络都没了)

找到了原因接下来就好处理了,直接找到对应的网络处理方案

解决方法
第一步:在宿主机上执行echo “net.ipv4.ip_forward=1” >>/usr/lib/sysctl.d/00-system.conf
第二步:重启network和docker服务

[root@localhost /]# systemctl restart network && systemctl restart docker
第三步:验证是否成功
[root@localhost /]# docker start f82e7d3a9755
f82e7d3a9755
成功了

然后让配置生效

pg_ctl reload

在这里插入图片描述

创建用户

postgres@f82e7d3a9755:/$ psql
psql (9.6.11)
Type "help" for help.

postgres=# create role dbasuper superuser password '访问密码' login;
CREATE ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 dbasuper  | Superuser                                                  | {}
 dex       |                                                            | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# 

创建好用户再一次测试连接
在这里插入图片描述

三、从容器中备份数据库

有了这些经历,我决定把postgres中的数据备份起来,免得下次在出现这种情况,我可以直接删库跑路,哈哈哈,扯远了,可以删掉容器,重建,导入数据,不需要那么麻烦去容器中追查木马,搞出来一堆问题。

docker ps

进入目标容器:

docker exec -u root -it 容器名 /bin/bash

docker 中,以root用户,创建备份目录,直接执行如下命令,


pg_dump -h localhost -p 5432 -U odoo xxx(数据库名) > /数据库dump备份文件目录/export_XXX(数据库名)_bak_2018xxx.dmp

看实际操作如下:

root@f82e7d3a9755:/# pg_dump -h localhost -p 5432 -U dbasuper lszz > /usr/export_lszz_backups.dmp
Password: 
root@f82e7d3a9755:/# ls /usr
bin  export_lszz_backups.dmp  games  include  lib  local  sbin	share  src
root@f82e7d3a9755:/# 

现在备份了但是在容器里需要将其拷贝到宿主机来
拷贝文件从容器里

1、从容器里面拷文件到宿主机?

     答:在宿主机里面执行以下命令

             docker cp 容器名:要拷贝的文件在容器里面的路径       要拷贝到宿主机的相应路径 

     示例: 假设容器名为testtomcat,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js,  现在要将test.js从容器里面拷到宿主机的/opt路径下面,那么命令应该怎么写呢?

     答案:在宿主机上面执行命令

1
docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js /opt
  

2、从宿主机拷文件到容器里面

      答:在宿主机里面执行如下命令

              docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径

       示例:假设容器名为testtomcat,现在要将宿主机/opt/test.js文件拷贝到容器里面的/usr/local/tomcat/webapps/test/js路径下面,那么命令该怎么写呢?

       答案:在宿主机上面执行如下命令     

1
docker cp /opt/test.js testtomcat:/usr/local/tomcat/webapps/test/js

实际操作

[root@dex leshan]# docker cp postgresql:/usr/export_lszz_backups.dmp /opt

在这里插入图片描述


【最终】为了安全我在阿里云安全组把对应的数据库端口改成了只允许本机ip访问,这个每次解决被攻击太麻烦了,不再这里浪费时间了。

在这里插入图片描述


OK 这次经历就记录到此,没有什么技术含量只是记录日常采坑谢谢

posted @ 2020-12-26 15:30  奔跑的痕迹  阅读(596)  评论(0编辑  收藏  举报