服务器遭遇攻击处理
系统被植入rootkit之类的程序后,最安全有效的方法是直接重新安装系统。绝大多数攻击程序会依附在系统文件或者内核中,只有重装系统才能确保彻底清除攻击源。
一、服务允许马上切断网络处理基本流程:
1、切断网络:切断感染源,防止二次感染
2、查找攻击源:分析系统日志、登录日志、命令历史等,查看系统开启的端口、端口运行的进程,是否存在可疑进程等
3、分析入侵可能原因和途径:系统漏洞、程序漏洞、密码泄露等;
4、备份并彻查用户数据(关键部分):分两部分备份,一部份是全部的系统数据,包括二进制文件和日志文件等(用于后期检查),另一部份备份重要的数据文件。备份完成后进行整体的检查,察看是否有异常数据存在,是否隐藏着攻击源;
5、重装系统:先在服务器上安装需要的套件,接着进行简单的防火墙设定后再进行联机,以APT/YUM 之类的工具进行在线更新,完成后使用第三方工具chkrootkit/rkhunter(官网下载),检验系统安全状态
6、修复程序或系统漏洞:系统漏洞或程序漏洞引起的,应先修复漏洞和程序bug,再重新上线服务
7、恢复数据并连接网络:将备份的数据重新复制到新装服务器上,启动原本服务器上面的各项服务;使用第三方工具chkrootkit/rkhunter再次检验系统安全状态,开启服务器网络,重新对外提供服务。
8、检查分析完整备份的数据:分析日志文件,尽最大可能找出入侵者是经过哪个服务,在哪个时间点,以哪个IP联机进入本机的,根据入侵信息制定预防方法,并应用在新服务器上。
二、无法马上切断网络连接时处理流程:
1、登录系统查看可疑用户:w:显示目前登入系统的用户信息
[root@node1 ~]# w
04:54:13 up 9:51, 3 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 19:04 9:49m 0.02s 0.02s -bash
root pts/0 192.168.88.1 19:04 5.00s 0.26s 0.00s w
field pts/2 192.168.88.1 20:49 1:43m 0.79s 0.04s sshd: field [priv]
2、锁定可疑用户:“passwd -l username”
[root@node1 ~]# passwd -l field
锁定用户 field 的密码 。
passwd: 操作成功
[root@node1 ~]# ps -ef |grep @pts/2
field 6443 6441 0 8月07 ? 00:00:04 sshd: field@pts/2
root 30104 1119 0 05:00 pts/0 00:00:00 grep --color=auto @pts/2
[root@node1 ~]# kill -9 6443
此时已锁住用户,并强制用户下线,用户下线后无法再次登录。如需解锁密码,使用“passwd -u username”命令
[root@node1 ~]# passwd -u field
解锁用户 field 的密码。
passwd: 操作成功
3、使用last命令查看用户登录事件:last命令输出来源为/var/log/wtmp
[root@node1 ~]# last
field pts/1 192.168.88.1 Wed Aug 8 05:01 still logged in
field pts/2 192.168.88.1 Tue Aug 7 20:49 - 05:00 (08:11)
...
4、查看系统日志:/var/log目录下的message、secure文件,用户目录下的.bash_history文件等
/var/log/messages:整体系统信息,其中包含系统启动期间的日志。此外,mail、cron、daemon、kern和auth等内容也记录在var/log/messages日志中。
[root@node1 ~]# tail /var/log/messages
Aug 8 05:00:28 node1 systemd-logind: Removed session 5.
Aug 8 05:00:28 node1 systemd: Removed slice User Slice of field.
Aug 8 05:00:28 node1 systemd: Stopping User Slice of field.
Aug 8 05:01:01 node1 systemd: Started Session 16 of user root.
Aug 8 05:01:01 node1 systemd: Starting Session 16 of user root.
Aug 8 05:01:13 node1 systemd: Created slice User Slice of field.
Aug 8 05:01:13 node1 systemd: Starting User Slice of field.
Aug 8 05:01:13 node1 systemd: Started Session 17 of user field.
Aug 8 05:01:13 node1 systemd-logind: New session 17 of user field.
Aug 8 05:01:13 node1 systemd: Starting Session 17 of user field.
/var/log/secure:验证和授权方面信息。例如,sshd会记录所有信息(包括失败登录)。
[root@node1 ~]# tail /var/log/secure
Aug 8 03:03:15 node1 polkitd[530]: Unregistered Authentication Agent for unix-process:1887:2884608 (system bus name :1.52, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale zh_CN.UTF-8) (disconnected from bus)
Aug 8 05:00:25 node1 sshd[6441]: pam_unix(sshd:session): session closed for user field
Aug 8 05:00:27 node1 su: pam_unix(su-l:session): session closed for user root
Aug 8 05:00:39 node1 sshd[30126]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.88.1 user=field
Aug 8 05:00:39 node1 sshd[30126]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "field"
Aug 8 05:00:41 node1 sshd[30126]: Failed password for field from 192.168.88.1 port 51373 ssh2
Aug 8 05:00:47 node1 sshd[30126]: error: Received disconnect from 192.168.88.1 port 51373:0: [preauth]
Aug 8 05:00:47 node1 sshd[30126]: Disconnected from 192.168.88.1 port 51373 [preauth]
Aug 8 05:01:13 node1 sshd[30187]: Accepted password for field from 192.168.88.1 port 51378 ssh2
Aug 8 05:01:13 node1 sshd[30187]: pam_unix(sshd:session): session opened for user field by (uid=0)
/var/log/wtmp或/var/log/utmp:登录信息。使用wtmp可以正在登陆进入系统的用户,哪个用户使用命令显示这个文件或信息等。
[root@node1 ~]# tail /var/log/wtmp
/var/log/dmesg:包含内核缓冲信息(kernel ring buffer)。在系统启动时,会在屏幕上显示许多与硬件有关的信息。
[root@node1 log]# tail /var/log/dmesg
[ 20.646133] ppdev: user-space parallel port driver
[ 20.983754] cryptd: max_cpu_qlen set to 100
[ 21.459365] AVX version of gcm_enc/dec engaged.
[ 21.459369] AES CTR mode by8 optimization enabled
[ 21.469693] alg: No test for __gcm-aes-aesni (__driver-gcm-aes-aesni)
[ 21.470434] alg: No test for __generic-gcm-aes-aesni (__driver-generic-gcm-aes-aesni)
[ 21.587206] XFS (sda1): Mounting V5 Filesystem
[ 21.638688] Adding 1049596k swap on /dev/sda2. Priority:-1 extents:1 across:1049596k FS
[ 22.417299] XFS (sda1): Ending clean mount
[ 23.720713] type=1305 audit(1533639771.745:3): audit_pid=504 old=0 auid=4294967295 ses=4294967295 res=1
/var/log/boot.log:系统启动时的日志。
[root@node1 log]# tail /var/log/boot.log
查看每个账户目录下的“.bash_history”文件,记录用户执行的历史命令
[root@node1 ~]# tail .bash_history
who -u am i |awk '{print $NF}'|sed -e 's/[()]//g'
who -u am i |awk '{print NF}'
hostname
${LOGNAME}
echo ${LOGNAME}
exit
vim /etc/bashrc
history
./etc/bashrc
. /etc/bashrc
5、检测和关闭可疑进程:
1)、根据服务名查找进程完整信息:pidof命令确定进程pid,再查看内存目录/proc/[pid]/*相关文件
/proc/[pid]/*部分文件说明:
/proc/[pid]/exe为实际运行程序的符号链接
/proc/[pid]/fd是一个目录,包含进程打开文件的情况
/proc/[pid]/limits显示当前进程的资源限制。
/proc/[pid]/cmdline是一个只读文件,包含进程的完整命令行信息。如果这个进程是zombie进程,则这个文件没有任何内容。
/proc/[pid]/environ显示进程的环境变量
/proc/[pid]/limits显示当前进程的资源限制。
/proc/[pid]/maps显示进程的内存区域映射信息。
/proc/[pid]/syscall显示当前进程正在执行的系统调用。
示例:查看sshd、crond进程完整信息
[root@node1 log]# pidof sshd
30189 30187 1117 763
[root@node1 log]# ls -al /proc/30189/exe
lrwxrwxrwx 1 root root 0 8月 8 05:17 /proc/30189/exe -> /usr/sbin/sshd
[root@node1 log]# pidof crond
559
[root@node1 log]# ls -al /proc/559/exe
lrwxrwxrwx 1 root root 0 8月 8 02:59 /proc/559/exe -> /usr/sbin/crond
[root@node1 log]# ls -al /proc/559/fd
总用量 0
dr-x------ 2 root root 0 8月 8 05:31 .
dr-xr-xr-x 9 root root 0 8月 8 01:20 ..
lr-x------ 1 root root 64 8月 8 05:31 0 -> /dev/null
lrwx------ 1 root root 64 8月 8 05:31 1 -> socket:[16851]
lrwx------ 1 root root 64 8月 8 05:31 2 -> socket:[16851]
lrwx------ 1 root root 64 8月 8 05:31 3 -> /run/crond.pid
lrwx------ 1 root root 64 8月 8 05:31 4 -> socket:[16922]
lr-x------ 1 root root 64 8月 8 05:31 5 -> anon_inode:inotify
2)、根据端口查找进程
[root@node1 log]# fuser -n tcp 80
80/tcp: 765 885 886 887 888 889
[root@node1 log]# fuser -n tcp 25
25/tcp: 646
[root@node1 log]# ps -ef | grep 765
root 765 1 0 8月07 ? 00:00:03 /usr/sbin/httpd -DFOREGROUND
apache 885 765 0 8月07 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 886 765 0 8月07 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 887 765 0 8月07 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 888 765 0 8月07 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 889 765 0 8月07 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 32468 1119 0 05:34 pts/0 00:00:00 grep --color=auto 765
[root@node1 log]# ps -ef | grep 646
root 646 1 0 02:46 ? 00:00:00 sendmail: accepting connections
root 32478 1119 0 05:34 pts/0 00:00:00 grep --color=auto 646
3)、系统命令(ps,top,netstat等)可能被修改时借助第三方工具:chkrootkit、rkhunter等
6、检测文件系统完整性
1)、rpm验证:rpm -Va 列出目前系统上所有可能被改动的文件
参数说明:
S:文件容量大小发生改变
M:文件的类型或文件的属性发生改变(rwx) -->重点关注项-->不利改变时重装rpm包
5:MD5校验和发生改变
D:设备节点属性发生改变
L:文件符号链接发生改变
U:文件/子目录/设备节点的所有者发生改变
G:文件/子目录/设备节点的所属组发生改变
T:文件最后一次修改时间发生改变
[root@node1 log]# rpm -Va
.M....... c /etc/audit/rules.d/audit.rules
S.5....T. c /etc/nginx/nginx.conf
S.5....T. c /etc/crontab
S.5....T. c /etc/sysconfig/authconfig
2)、借助第三方工具:chkrootkit、rkhunter等
7、确认受到攻击时只能切断网络,备份数据,重装系统
1)、切断网络;
2)、安装稳定版本系统、删除默认且不需要的用户,禁止非必需直接登录用户系统登录功能;
[root@node1 ~]# awk -F : '{print $1}' /etc/passwd
[root@node1 ~]# userdel games
[root@node1 ~]# groupdel games
[root@node1 ~]# usermod -s /sbin/nologin hacluster
3)、采用公钥认证方式登录,规避密码认证风险;
4)、根据官网(如apache/nginx)同步更新服务程序为最新稳定版,避免旧版本漏洞;
5)、开启tcp_wrappers防火墙,限制sshd等服务登录的源地址;
6)、安装官网下载的第三方工具chkrootkit、rkhunter等检查服务器安全状态;
7)、彻查备份的数据,无误后恢复数据,再次使用第三方工具检查服务器安全状态;
8)、开启网络、服务,重新对外开放;