zoukankan      html  css  js  c++  java
  • 记一次处理挖矿程序引发的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    响铃声  
          退格  
      c    不再产生新的输出  
      e    转义符    
      f    换页  
      
        新行  
      
        回车  
      	    水平制表符  
      v    竖直制表符  
      0NNN   字节数以八进制数 NNN (13)表示  
      xHH    字节数以十六进制数 HH (12)表示  
    

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

    最后使用 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 这次经历就记录到此,没有什么技术含量只是记录日常采坑谢谢

  • 相关阅读:
    MySQL
    LeetCode
    数据结构
    我的编程幻想曲,更新中
    快速排序
    C与C++的区别
    必须要使用列表初始化的几种情况
    析构中delete this
    指向自身类型的成员指针的初始化,this不属于类对象的一部分
    构造函数
  • 原文地址:https://www.cnblogs.com/dengxiaoning/p/14460938.html
Copyright © 2011-2022 走看看