近一段时间内发现自己的服务器总是警告被挖矿,然处理挖矿程序中也引发了许多其他的问题,也从中学到了其他的知识,趁今天未加班梳理一下便于巩固,记录日常
文章目录
一、查找进程
进入服务使用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 主要有
- 命令操作符 >(输出重定向)
如 echo -n Hello,Binn > tmp.txt
这句话的意思即是:输出Hello,Binn字符串到一个位置,如果tmp.txt存在,我们即【清空其内容,更新为Hello,Binn】,不存在,创建它 - 命令操作符 >>(输出追加重定向
如echo Hello,C >> tmp.txt
查看tmp.txt的内容(此时可以看到,原来的字符串B并没有被替换,而是在B的下一行新增字符串C,即追加操作)
-n 不尾随换行符
-e 启用解释反斜杠的转义功能
-E 禁用解释反斜杠的转义功能(默认)
--help 显示此帮助信息并退出
--version 显示版本信息并退出
若-e 可用,则以下序列即可识别:
\ 反斜杠
a 响铃声
退格
c 不再产生新的输出
e 转义符
f 换页
新行
回车
水平制表符
v 竖直制表符
0NNN 字节数以八进制数 NNN (1至3位)表示
xHH 字节数以十六进制数 HH (1至2位)表示
这里使用用 >> 进行追加不行,我们是需要修改配置,那
这里比较实用的就是 -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 这次经历就记录到此,没有什么技术含量只是记录日常采坑谢谢