[TOC]
# 安全事件
互联网时代最重要的是数据,数据备份的同时还要加固系统防止泄露和涂改等。 最近笔者接到一个网友的询问,它的服务器数据库留下了这样一段话( To recover your lost Database and avoid leaking it: Send us 0.05 Bitcoin (BTC) to our Bitcoin address 14yVUjTFesHAusWZ8qytA9faYmKfqEFpYv and contact us by Email with your Server IP or Domain name and a Proof of Payment. Your Database is downloaded and backed up on our servers. If we dont receive your payment in the next 10 Days, we will make your database public or use them otherwise. )其实这是用户的服务器中了勒索病毒,中病毒的原因有可能很多种,软件的漏洞、服务器密码的泄露、服务器中了木马或病毒等,通常中此病毒后用户可以通过以下两个网站寻求解决方案:
* https://id-ransomware.malwarehunterteam.com/
* https://www.nomoreransom.org/
但是通常是没有太好的解决方案,除非按照黑客的要求提供0.05比特币。但是作为系统管理员的您可以防范于未然,提前加固我们的服务器安全。如何加固,我们分为系统加固、网络加固、安全测试和入侵排查几个方面来介绍。
# 系统加固
关于加固服务器可以按照以下步骤来执行:
服务器安全不只是数据库方面,您可参考以下内容,加固服务器的安全性:
* 服务器设置大写、小写、特殊字符、数字组成的12-16位的复杂密码 ,也可使用密码生成器自动生成复杂密码,我们可以通过这个在线地址自动生成复杂密码 https://suijimimashengcheng.51240.com/
* 删除服务器上设置的不需要的用户
* 对于不需要登录的用户,请将用户的权限设置为禁止登录
* 修改远程登录服务的默认端口号以及禁止超级管理员用户登陆
* 较为安全的方法:只使用密钥登录禁止密码登陆 (针对Linux系统)
* 防火墙限定指定的端口访问
* 不建议向公网开放核心应用服务端口访问,例如MySQL、Redis等
*注:做好云服务器系统的安全防护可以有效加强云服务器系统安全, 但也无法保证绝对安全, 建议定期做好云服务器系统的安全巡检及数据备份,以防突发情况导致数据丢失、或业务不可用。
## 设置密码策略
修改文件/etc/login.defs 。
```
PASS_MAX_DAYS 90 密码最长有效期
PASS_MIN_DAYS 10 密码修改之间最小的天数
PASS_MIN_LEN 8 密码长度
PASS_WARN_AGE 7 口令失效前多少天开始通知用户修改密码
```
## 设置密码强度
编辑文件/etc/pam.d/password-auth。
```
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= difok=1 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1
```
* difok= 定义新密码中必须要有几个字符和旧密码不同
* minlen=新密码的最小长度
* ucredit= 新密码中可以包含的大写字母的最大数目。-1 至少一个
* lcredit=新密码中可以包含的小写字母的最大数
* dcredit=定新密码中可以包含的数字的最大数目
*注:这个密码强度的设定只对"普通用户"有限制作用,root用户无论修改自己的密码还是修改普通用户的时候,不符合强度设置依然可以设置成功*
## 设置登录次数
编辑文件 /etc/pam.d/sshd。
```
auth required pam_tally2.so deny=3 unlock_time=150 even_deny_root root_unlock_time300
```
* pam_tally2 查看被锁定的用户
* pam_tally2 --reset -u username 将被锁定的用户解锁
## 禁止root用户远程登录
禁止ROOT用户远程登录 。打开 /etc/ssh/sshd_config
```
#PermitRootLogin no
```
*注:生效需要重启sshd守护进程*
## 设置账户保存历史命令条数 & 超时时间
打开 /etc/profile ,修改如下。
```
HISTSIZE=1000
TMOUT=600
```
# 网络加固
网络是入侵主要的途径,有效控制的网络出入可以降低被入侵的风险,这里我们就需要使用到Linux自带的防火墙(iptables)。以下是服务器的案例
# 目录规划与备份
## 目录规划
我们在做业务时最重要的就是合理规划目录,以腾讯云的计算产品为例,我们可以看到它分为:
* 系统盘,系统盘通常存放操作系统的内容,此盘不建议我们存放数据
* 数据盘(云盘),数据盘主要用来存放数据
在系统盘中,建议可以/var/log下的日志,进行日志的切割,同时定期删除这些日志文件。数据盘最好有合理的规划,来看以下目录的规划案例。
```
[djangowang@localhost ~]# cd /data1/
[djangowang@localhost ~]# tree -d -L 2
.
|-- backup # 数据备份目录
| |-- database
| |-- file_history
| |-- panel
| `-- site
|-- php_session # 扩展目录
|-- Recycle_bin # 回收站
| |-- _bt_www_bt_wwwroot_bt_fastadmin.puppeter.com_t_1606275469.6741953
| |-- _bt_www_bt_wwwroot_bt_fastadmin.puppeter.com_t_1606487788.4557512
| `-- _bt_www_bt_wwwroot_bt_fastadmin.puppeter.com_t_1606488343.4240072
|-- server # 程序目录
| |-- cron
| |-- data
| |-- mysql
| |-- nginx
| |-- panel
| |-- php
| |-- phpmyadmin
| |-- pure-ftpd
| `-- stop
|-- wwwlogs
| `-- waf
`-- wwwroot # 个人网站发布目录
|-- book.puppeter.com
|-- discuz
|-- fastadmin.puppeter.com
`-- test.puppeter.com
```
## 数据备份
有合理的目录规划后,我们就可以很方便的来备份这些重要的数据。备份的方式有多重具体可以参考(高级系统管理-> 系统备份),如果数据比较大建议直接打包指定目录的数据,如果不打或者比较多的文本文件建议打包压缩这些文件,以(目录规划)为例,最重要的文件应该是 /data1/wwwroot/ 下的文件,所以我们可以直接tar命令打包备份它们。
```
[djangowang@localhost ~]# tar -czvf backup.tar.gz /data1/wwwroot/*
```
*注: tar的-z参数是压缩,会涉及大量的cpu计算,这种备份建议放在凌晨服务器不繁忙的情况下进行自动备份*
# 安全测试
安全测试就是从一个黑客的角度通过工具以黑盒的方式来检测网站是否安全,这里推荐Hydra工具。Hydra(“九头蛇”)黑客工具(官网:https://www.mh-sec.de/ ),可以暴力破解各种服务的密码,包括不限于如下:
* 破解ssh
* 破解ftp
* get方式提交,破解web登录
* post方式提交,破解web登录
* 破解https
* 破解teamspeak
* 破解cisco
* 破解smb
* 破解pop3
* 破解MySQL
## Hydra安装
```
[djangowang@localhost ~]# yum install hydra
```
## Hydra参数
* \-R 继续从上一次进度接着破解。
* \-S 采用SSL链接。
* \-s PORT 可通过这个参数指定非默认端口。
* \-l LOGIN 指定破解的用户,对特定用户破解。
* \-L FILE 指定用户名字典。
* \-p PASS 小写,指定密码破解,少用,一般是采用密码字典。
* \-P FILE 大写,指定密码字典。
* \-e ns 可选选项,n:空密码试探,s:使用指定用户和密码试探。
* \-C FILE 使用冒号分割格式,例如“登录名:密码”来代替-L/-P参数。
* \-M FILE 指定目标列表文件一行一条。
* \-o FILE 指定结果输出文件。
* \-f 在使用-M参数以后,找到第一对登录名或者密码的时候中止破解。
* \-t TASKS 同时运行的线程数,默认为16。
* \-w TIME 设置最大超时的时间,单位秒,默认是30s。
* \-v / -V 显示详细过程。
## Hydra使用案例
1. 如何检测Linux服务器的登录密码。hydra -l 用户名 -P 密码字典 -t 线程数 -vV(显示详细过程) -e ns IP ssh
```
[djangowang@localhost ~]# hydra -l root -P ruopass.txt -t 10 -vV -e ns 122.51.60.210 ssh
```
2.如何破解MySQL。
```
[djangowang@localhost ~]# hydra -l root -P ruopass.txt -t 5 -Vv localhost mysql
```
3. 如何破解Windows服务器登录密码。hydra -l 用户名 -P 密码字典 -t 线程数 -vV(显示详细过程) -e ns rdp。
```
[djangowang@localhost ~]# hydra -l administrator -P ruopass.txt -t 5 -Vv 129.211.103.202 rdp -s 3389
```
# 入侵排查
以下我们来介绍一下入侵排查的思路。
## 查看当前登录用户状态
通过(w ) 命令确认当前用户登录状态。
```
[[djangowang@localhost ~]# w
09:18:10 up 254 days, 18:58, 2 users, load average: 0.29, 0.11, 0.08
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 19May20 48days 1.05s 1.05s -bash
root pts/0 116.77.73.251 09:17 2.00s 0.02s 0.00s w
```
如果有异常用户在线,可以先修改密码后再将异常用户踢出,踢出方法如下:
```
[djangowang@localhost ~]# ps -ef | grep tty1
root 4203 4189 0 2020 tty1 00:00:01 -bash
root 23703 23463 0 09:19 pts/0 00:00:00 grep --color=auto tty1
[djangowang@localhost ~]# kill -9 4203
[djangowang@localhost ~]# w
09:19:16 up 254 days, 18:59, 1 user, load average: 0.10, 0.09, 0.07
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 116.77.73.251 09:17 4.00s 0.02s 0.00s w
```
## 排查登录信息
在Linux系统中,我们通过last命令来查看用户登录信息,他包含登录用户名、TTY、IP、登录时间等信息。
```
[djangowang@localhost ~]# last
root pts/0 116.77.73.251 Sat Jan 16 09:17 still logged in
root pts/0 116.77.73.251 Fri Jan 15 21:20 - 21:41 (00:20)
root pts/0 14.17.22.36 Fri Jan 15 16:02 - 16:15 (00:13)
...
```
我们可以通过此信息排查过去一段时间内是否有用户登录过,通过哪个用户登录并做了什么。( last ) 命令会读取/var/log/wtmp文件,此文件记录了这些登录信息,如果黑客清理了此文件我们就会查不到登录信息。 这里可以加一个特殊的权限位,让用户变为只能追加且不能删除,执行命令如下。
```
[djangowang@localhost ~]# chattr +a /var/log/wtmp
```
## 排查历史命令
在Linux系统中,我们通过 history 命令,排查用户执行的命令或修改的文件,但不包含文件内容。history命令的用法如下。
```
[djangowang@localhost ~]# history | more
1 2021-01-16 09:17:38 dig cdntest.site
2 2020-09-08 10:46:47 dig cdntest.site
3 2020-09-08 10:46:47 dig cdntest.site
4 2020-09-08 10:46:47 dig cdntest.site
5 2020-09-08 10:46:48 dig cdntest.site
6 2020-09-08 10:46:48 dig cdntest.site
7 2020-09-08 10:46:48 dig cdntest.site
8 2020-09-08 10:46:48 dig cdntest.site
```
history命令读取了宿主目录中的.bash_history 文件,为了防止黑客清理此文件,建议增加特殊标志位。
```
[djangowang@localhost ~]# chattr +a ~/.bash_history
```
## 排查开放的端口和连接状态
我们可以通过( netnstat ) 命令来查看与本机建立连接的IP和端口。
```
[djangowang@localhost ~]# netstat -antlp | more
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 172.16.16.2:22 116.77.73.251:54092 ESTABLISHED 28352/sshd: root@pt
tcp 0 0 172.16.16.2:40688 169.254.0.55:5574 ESTABLISHED 8034/YDService
...
```
通过lsof命令查看端口,就能查看到他的进程ID和一些相关信息。
```
[djangowang@localhost ~]# lsof -i 40688
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
YDService 8034 root 37u IPv4 375815846 0t0 TCP VM_16_2_centos:40688->169.254.0.55:lsi-bobcat (ESTABLISHED)
```
通过查看/proc文件中的fd,就能查看到程序的位置。
```
[djangowang@localhost ~]# ls -al /proc/8034/fd/*
lrwx------ 1 root root 64 Jan 14 23:14 /proc/8034/fd/0 -> /dev/null
lrwx------ 1 root root 64 Jan 14 23:14 /proc/8034/fd/1 -> /dev/null
l-wx------ 1 root root 64 Jan 14 23:14 /proc/8034/fd/15 -> /usr/local/qcloud/YunJing/ydsvc.err
lrwx------ 1 root root 64 Jan 14 23:14 /proc/8034/fd/16 -> /usr/local/qcloud/YunJing/log/hids.log
l-wx------ 1 root root 64 Jan 14 23:14 /proc/8034/fd/17 -> /usr/local/qcloud/YunJing/ydsvc.err
...
```
[djangowang@localhost ~]# 通过查看进行启动时间确认是否有异常。
```
[djangowang@localhost ~]# ps -p 8034 -o lstart
STARTED
Thu Jan 14 23:14:45 2021
```
最后我们通过程序目录的位置,启动的时间和其他相关的信息判断进程是否是正确的或是伪装的木马病毒,并做相关的处理。
## 排查启动项
执行系统命令 (systemctl list-unit-files)其中左边是服务名称,右边是状态,enabled是开机启动,disabled是开机不启动。
```
[djangowang@localhost ~]# systemctl list-unit-files | grep enabled
brandbot.path enabled
acpid.service enabled
atd.service enabled
...
```
## 排查定时任务
通过crontab -l 命令列出当前的定时任务,并删除不需要的定时任务。
```
[djangowang@localhost ~]# crontab -l # 列出当前用户的计时器设置
*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'
```
## 排查系统日志
以下日志位置是我们需要主要关注的日志。
| 日志位置 | 说明 |
| --- | --- |
| /var/log/messages | 系统相关日志 |
| /var/log/cron | 定时任务日志 |
| /var/log/secure | 记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |