Linux服务器入侵预防与问题排查
-
弱口令入侵检查
有时候由于服务器系统账户存在弱口令的原因很容易被黑客破解或是一些入侵工具入侵,用
last命令用来列出目前与过去登录系统的用户相关信息,以下用查看恶意的入侵记录,
其中第一列:用户名
第二列:终端位置。(pts/0通过ssh或者telnet远程连接的用户,tty:直接连接到计算机或者本地用户)
第三列:登陆IP或者内核(看到0.0或者什么都没有,意味着用户通过本地终端连接,除了重启,内核版本会显示在状态中)
第四列:开始时间(如:sun apr 3 :四月三号星期天)
第五列:结束时间(still login in 还未退出,down:直到正常关机,crash:直到强制关机)
第六列:持续时间
root@VM-0-7-ubuntu:/# last
ubuntu pts/0 211.159.185.38 Fri Mar 23 20:12 still logged in
reboot system boot 4.4.0-91-generic Fri Mar 23 20:11 still running
ubuntu pts/1 119.28.7.195 Fri Mar 23 20:11 - 20:11 (00:00)
ubuntu pts/0 211.159.185.38 Fri Mar 23 20:06 - 20:11 (00:04)
reboot system boot 4.4.0-91-generic Fri Mar 23 20:05 - 20:11 (00:05)
ubuntu tty1 Fri Mar 23 20:00 - down (00:04)
reboot system boot 4.4.0-91-generic Fri Mar 23 19:58 - 20:05 (00:07)
ubuntu pts/0 211.159.185.38 Fri Mar 23 16:20 - 17:04 (00:44)
ubuntu pts/0 119.29.96.147 Fri Mar 23 16:18 - 16:19 (00:00)
ubuntu pts/0 119.28.22.215 Fri Mar 23 15:43 - 16:18 (00:35)
ubuntu pts/0 119.28.7.195 Fri Mar 23 15:20 - 15:35 (00:14)
ubuntu pts/0 211.159.185.38 Fri Mar 23 14:56 - 15:12 (00:15)
ubuntu pts/0 119.28.7.195 Fri Mar 23 14:02 - 14:12 (00:10)
ubuntu pts/0 119.28.7.195 Fri Mar 23 13:49 - 13:59 (00:10)
ubuntu tty1 Fri Mar 23 12:43 - 12:49 (00:06)
ubuntu pts/0 119.28.22.215 Fri Mar 23 12:30 - 12:41 (00:11)
ubuntu pts/0 119.28.7.195 Fri Mar 23 11:54 - 12:09 (00:14)
reboot system boot 4.4.0-91-generic Fri Mar 23 11:54 - 20:05 (08:10)
root pts/6 118.25.16.215 Thu Mar 22 15:20 - 15:20 (00:00)
root pts/6 :1.0 Thu Mar 22 01:07 - 08:52 (07:45)
root pts/5 :1.0 Thu Mar 22 01:07 - 20:58 (19:51)
root pts/5 118.25.16.215 Wed Mar 21 17:39 - 17:54 (00:15)
执行last指令时,它会读取位于/var/log目录下名称为wtmp的文件并把该给文件的内容记录的登录系统的用户名单全部显示出来,默认是显示wtmp的记录,
1)utmp文件中保存的是当前正在本系统中的用户的信息
2)wtmp文件中保存的是登录过本系统的用户的信息
btmp可以显示的信息更详细,可以显示远程登录,例如ssh登录等,下面命令显示最近100条记录:
last -n 100 -f /var/log/btmp
czhou ssh:notty 218.38.136.53 Thu Mar 22 20:34 - 20:44 (00:09)
czhou ssh:notty 218.38.136.53 Thu Mar 22 20:34 - 20:34 (00:00)
czhou ssh:notty 218.38.136.53 Thu Mar 22 20:20 - 20:34 (00:13)
czhou ssh:notty 218.38.136.53 Thu Mar 22 20:20 - 20:20 (00:00)
czhou ssh:notty 218.38.136.53 Thu Mar 22 20:07 - 20:20 (00:13)
czhou ssh:notty 218.38.136.53 Thu Mar 22 20:07 - 20:07 (00:00)
yliang ssh:notty 218.38.136.53 Thu Mar 22 19:53 - 20:07 (00:13)
yliang ssh:notty 218.38.136.53 Thu Mar 22 19:53 - 19:53 (00:00)
yliang ssh:notty 218.38.136.53 Thu Mar 22 19:39 - 19:53 (00:13)
yliang ssh:notty 218.38.136.53 Thu Mar 22 19:39 - 19:39 (00:00)
yliang ssh:notty 218.38.136.53 Thu Mar 22 19:25 - 19:39 (00:13)
yliang ssh:notty 218.38.136.53 Thu Mar 22 19:25 - 19:25 (00:00)
yliang ssh:notty 218.38.136.53 Thu Mar 22 19:11 - 19:25 (00:13)
yliang ssh:notty 218.38.136.53 Thu Mar 22 19:11 - 19:11 (00:00)
yliang ssh:notty 218.38.136.53 Thu Mar 22 18:58 - 19:11 (00:13)
yliang ssh:notty 218.38.136.53 Thu Mar 22 18:58 - 18:58 (00:00)
liuym ssh:notty 218.38.136.53 Thu Mar 22 18:44 - 18:58 (00:13)
liuym ssh:notty 218.38.136.53 Thu Mar 22 18:44 - 18:44 (00:00)
liuym ssh:notty 218.38.136.53 Thu Mar 22 18:30 - 18:44 (00:13)
liuym ssh:notty 218.38.136.53 Thu Mar 22 18:30 - 18:30 (00:00)
root ssh:notty 112.112.102.38 Thu Mar 22 18:22 - 18:30 (00:07)
root ssh:notty 112.112.102.38 Thu Mar 22 18:22 - 18:22 (00:00)
我们可以看到上面记录来自不同主机的登录信息,这些信息中隐藏着非法的登录者,这些非法的登录可能会窃取你的主机数据,甚至恶意破坏系统删除数据等,通过下列命令可以禁用用户和删除指定用户名,保障主机安全。
另外通过less /var/log/secure|grep 'Accepted'命令,查看是否有可疑 IP 登录机器成功:
检查说明:攻击者或者恶意软件往往会往系统中注入隐藏的系统账户实施提权或其他破坏性的攻击。
usermod -L 用户名
userdel -r 用户名
-
默认端口检查
系统的管理端口是重灾区,这些端口包括(SSH、FTP、MySQL、Reids 等),有时候要将这些端口改成其它端口以防止一些自动化工具爆破入侵,例如SSH的默认端口22就是最常被入侵的端口,如上面的日志所示:
yliang ssh:notty 218.38.136.53 Thu Mar 22 19:25 - 19:39 (00:13)
yliang ssh:notty 218.38.136.53 Thu Mar 22 19:25 - 19:25 (00:00)
yliang ssh:notty 218.38.136.53 Thu Mar 22 19:11 - 19:25 (00:13)
yliang ssh:notty 218.38.136.53 Thu Mar 22 19:11 - 19:11 (00:00)
yliang ssh:notty 218.38.136.53 Thu Mar 22 18:58 - 19:11 (00:13)
yliang ssh:notty 218.38.136.53 Thu Mar 22 18:58 - 18:58 (00:00)
liuym ssh:notty 218.38.136.53 Thu Mar 22 18:44 - 18:58 (00:13)
liuym ssh:notty 218.38.136.53 Thu Mar 22 18:44 - 18:44 (00:00)
这些莫名其妙的主机就是一些非法的入侵者,它们持续不断的攻击你的服务器,如果你没有更改掉这些默认的端口就有可能遭到入侵,通常这些入侵的主机都是一些自动化的入侵工具所为,所以投入使用的服务器首先改掉默认的SSH口.通过命令/etc/ssh/sshd_config可以将Linux SSH的默认端口改掉,唯一需要注意的是不能和现有的已用端口相同。
修改完之后记得运行/etc/init.d/sshd restart命令重启是配置生效;
另外其他需要注意的端口例如FTP、MySQL、Reids 等的程序配置文件的默认监听端口 21、3306、6379 ,也需要修改掉,因为这些也通常是被经常入侵的对象。
如果想要限制远程登录的 IP,可以通过编辑/etc/hosts.deny 、/etc/hosts.allow两个文件来限制 IP。
首先:修改:/etc/hosts.deny, 在其中加入sshd: ALL
然后:修改:/etc/hosts.allow,在其中进行如下设置:sshd: 192.168.0.241这样就可以限制只有192.168.0.241的IP通过SSH登陆上Linux机器了。
-
非授权账户登录检查
通常攻击者或者恶意软件往往会往系统中注入隐藏的系统账户实施提权或其他破坏性的攻击。有一些方法可以拦截用户通过提权实施的攻击,具体的方法可以参考论文,<一种拦截Linux内核恶意进程提权的方法及系统技术方案> http://www.jigao616.com/zhuanlijieshao_15159844.aspx, 方案思路主要是通过跟踪内核进程并分析其数据信息,然后判断是否包含敏感信息来决定是否放行进程来实现对恶意进程实施拦截。通过查看/etc/passwd文件可以找出隐藏系统账户中的非法账户。
root@VM-0-7-ubuntu:/# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
lxd:x:106:65534::/var/lib/lxd/:/bin/false
messagebus:x:107:111::/var/run/dbus:/bin/false
uuidd:x:108:112::/run/uuidd:/bin/false
dnsmasq:x:109:65534:dnsmasq,,,:/var/lib/misc:/bin/false
sshd:x:110:65534::/var/run/sshd:/usr/sbin/nologin
ubuntu:x:500:500:ubuntu,,,:/home/ubuntu:/bin/bash
ntp:x:111:117::/home/ntp:/bin/false
ftp:x:112:119:ftp daemon,,,:/srv/ftp:/bin/false
ftpuser:x:1000:1000::/var/myftp:
mongodb:x:113:65534::/var/lib/mongodb:/bin/false
colord:x:114:122:colord colour management daemon,,,:/var/lib/colord:/bin/false
pulse:x:115:123:PulseAudio daemon,,,:/var/run/pulse:/bin/false
rtkit:x:116:125:RealtimeKit,,,:/proc:/bin/false
usbmux:x:117:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false
xrdp:x:118:126::/var/run/xrdp:/bin/false
要知道什么账户是非法的入侵账户首先需要独栋passwd文件:
(1)用户名:用于区分不同的用户。在同一系统中注册名是惟一的。在字段被限制在8个字符Linux系统中对字母大小写是敏感的。
(2)密码(已经加密):系统用口令来验证用户的合法性。passwd文件中的口令字段使用一个"x"来代替,将/etc /shadow作为真正的口令文件,用于保存包括个人口令在内的数据。当然shadow文件是不能被普通用户读取的,只有超级用户才有权读取。
此外,需要注意的是,如果passwd字段中的第一个字符是"*"的话,那么,就表示该账号被查封了,系统不允许持有该账号的用户登录。
(3)UID(用户标识):UID是一个数值,是Linux系统中惟一的用户标识,用于区别不同的用户。UID相同的用户,不同注册名的用户是同一个用户。
(4)GID组标识:这是当前用户的缺省工作组标识。具有相似属性的多个用户可以被分配到同一个组内,每个组都有自己的组名,且以自己的组标 识号相区分。像UID一样,用户的组标识号也存放在passwd文件中。在现代的Unix/Linux中,每个用户可以同时属于多个组。除了在 passwd文件中指定其归属的基本组之外,还在/etc/group文件中指明一个组所包含用户。
(5)用户全名或本地帐号:包含有关用户的一些信息,如用户的真实姓名、办公室地址、联系电话等。在Linux系统中,mail和finger等程序利用这些信息来标识系统的用户。
(6)用户主目录(home_directory):该字段定义了个人用户的主目录,当用户登录后,他的Shell将把该目录作为用户的工作目录。 在Unix/Linux系统中,超级用户root的工作目录为/root;而其它个人用户在/home目录下均有自己独立的工作环境,系统在该目录下为每 个用户配置了自己的主目录。个人用户的文件都放置在各自的主目录下。
(7)登录使用的Shell:就是对登录命令进行解析的工具,Shell是当用户登录系统时运行的程序名称,通常是一个Shell程序的全路径名, 如/bin/bash(若为空格则缺省为/bin/sh)。
检查恶意进程及非法端口
运行netstat –antlp查看下服务器是否有未被授权的端口被监听,查看下对应的 pid。
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 172.21.0.7:ssh 119.28.22.215:54105 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 32235 /run/user/500/systemd/notify
unix 3 [ ] DGRAM 9687 /run/systemd/notify
unix 12 [ ] DGRAM 9693 /run/systemd/journal/dev-log
unix 2 [ ] DGRAM 9695 /run/systemd/journal/syslog
unix 6 [ ] DGRAM 9700 /run/systemd/journal/socket
unix 2 [ ] DGRAM 16558 /tmp/.xrdp/xrdp-sesman-VnxLcq/xrdp_sesman_000004da_main_term_cf009900
unix 2 [ ] DGRAM 16559 /tmp/.xrdp/xrdp-sesman-VnxLcq/xrdp_sesman_000004da_main_sync_bd4cc1a4
unix 2 [ ] DGRAM 16686 /tmp/.xrdp/xrdp-bvU4Jq/xrdp_000004d6_listen_pro_done_event_e729bb4e
unix 2 [ ] DGRAM 16687 /tmp/.xrdp/xrdp-bvU4Jq/xrdp_000004d6_main_term_a10ed07e
unix 2 [ ] DGRAM 16688 /tmp/.xrdp/xrdp-bvU4Jq/xrdp_000004d6_main_sync_04545a34
unix 3 [ ] STREAM CONNECTED 14084 /var/run/dbus/system_bus_socket
unix 3 [ ] STREAM CONNECTED 32262
unix 2 [ ] DGRAM 13113
unix 2 [ ] DGRAM 10372
unix 3 [ ] STREAM CONNECTED 13998 /run/systemd/journal/stdout
unix 3 [ ] STREAM CONNECTED 13456 /run/systemd/journal/stdout
unix 3 [ ] STREAM CONNECTED 32263
unix 3 [ ] STREAM CONNECTED 13455
unix 2 [ ] DGRAM 14069
unix 3 [ ] STREAM CONNECTED 13790
unix 3 [ ] STREAM CONNECTED 14040
unix 3 [ ] STREAM CONNECTED 13791 /run/systemd/journal/stdout
unix 3 [ ] STREAM CONNECTED 14082
unix 3 [ ] STREAM CONNECTED 14081
unix 2 [ ] DGRAM 22488
unix 3 [ ] STREAM CONNECTED 13863 /run/systemd/journal/stdout
unix 3 [ ] STREAM CONNECTED 13997
unix 3 [ ] STREAM CONNECTED 14142
unix 3 [ ] STREAM CONNECTED 10427
unix 3 [ ] STREAM CONNECTED 14146 /run/systemd/journal/stdout
检查服务器是否存在恶意进程,恶意进程往往会开启监听端口,与外部控制机器进行连接。若发现有非授权进程,运行ls -l /proc/$PID/exe或file /proc/$PID/exe($PID 为对应的pid 号),查看下 pid 所对应的进程文件路径。如果为恶意进程,删除下对应的文件即可。
使用ps -ef和top命令查看是否有异常进程
root 991 1 0 11:54 ? 00:00:00 /usr/sbin/sshd -D
root 992 1 0 11:54 ? 00:00:00 /usr/lib/accountsservice/accounts-daemon
daemon 1005 1 0 11:54 ? 00:00:00 /usr/sbin/atd -f
root 1008 1 0 11:54 ? 00:00:00 /usr/bin/lxcfs /var/lib/lxcfs/
mongodb 1014 1 0 11:54 ? 00:00:50 /usr/bin/mongod --config /etc/mongodb.conf
message+ 1020 1 0 11:54 ? 00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root 1038 1 0 11:54 ? 00:00:00 /usr/lib/snapd/snapd
syslog 1040 1 0 11:54 ? 00:00:00 /usr/sbin/rsyslogd -n
root 1046 1 0 11:54 ? 00:00:00 /lib/systemd/systemd-logind
root 1057 1 0 11:54 ? 00:00:00 /usr/sbin/cron -f
root 1060 1 0 11:54 ? 00:00:00 /usr/sbin/acpid
root 1075 1 0 11:54 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd.conf
root 1183 1 0 11:54 ? 00:00:00 /usr/lib/policykit-1/polkitd --no-debug
root 1184 1 0 11:54 ? 00:00:00 /sbin/mdadm --monitor --pid-file /run/mdadm/monitor.pid --daemonise --scan --syslog
root 1228 1 0 11:54 ttyS0 00:00:00 /sbin/agetty --keep-baud 115200 38400 9600 ttyS0 vt220
ntp 1229 1 0 11:54 ? 00:00:00 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 111:117
xrdp 1238 1 0 11:54 ? 00:00:00 /usr/sbin/xrdp
root 1242 1 0 11:54 ? 00:00:00 /usr/sbin/xrdp-sesman
root 1953 1 0 12:49 tty1 00:00:00 /sbin/agetty --noclear tty1 linux
root 2339 2 0 14:12 ? 00:00:00 [kworker/0:4]
root 2340 2 0 14:12 ? 00:00:00 [kworker/0:5]
root 2774 991 0 15:43 ? 00:00:00 sshd: ubuntu [priv]
ubuntu 2776 1 0 15:43 ? 00:00:00 /lib/systemd/systemd --user
ubuntu 2777 2776 0 15:43 ? 00:00:00 (sd-pam)
ubuntu 2809 2774 0 15:43 ? 00:00:00 sshd: ubuntu@pts/0
ubuntu 2810 2809 0 15:43 pts/0 00:00:00 -bash
ubuntu 2877 2810 0 16:16 pts/0 00:00:00 ps –ef
运行以上命令,当发现有名称不断变化的非授权进程占用大量系统 CPU 或内存资源时,则可能为恶意程序。确认该进程为恶意进程后,可以使用kill -9 进程名命令结束进程,或使用防火墙限制进程外联。
-
检查恶意程序和可疑启动项
使用chkconfig --list和cat /etc/rc.local命令查看下开机启动项中是否有异常的启动服务
root@VM-0-7-ubuntu:/# cat /etc/rc.local
#!/bin/sh
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/usr/local/qcloud/rps/set_rps.sh >/tmp/setRps.log 2>&1
/usr/local/qcloud/irq/net_smp_affinity.sh >/tmp/net_affinity.log 2>&1
恶意程序往往会添加在系统的启动项,在用户关机重启后再次运行,如发现有恶意进程,可使用chkconfig 服务名 off命令关闭,同时检查/etc/rc.local中是否有异常项目,如有请注释掉。
进入 cron 文件目录,查看是否存在非法定时任务脚本
另外通过查看/etc/crontab,/etc/cron.d,/etc/cron.daily,cron.hourly/,cron.monthly,cron.weekly/是否存在可以脚本或程序。如发现有不认识的计划任务,可定位脚本确认是否正常业务脚本,如果非正常业务脚本,可直接注释掉任务内容或删除脚本。
root@VM-0-7-ubuntu:/# cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
注:
cron是用来控制循环执行的例行性工作的,可循环的时间为分钟、小时、每周、每月或每年等。比如我要设定机器每天早上8点进行备份,就可以用到这个服务。
除非我们的机器保持每天都24小时开始,否则就会有些系统例行工作都没有人做了,这个时候就可以用到anacron了。
anacron并不是用来取代cron的,anacron 存在的目的就在于我们上面提到的,在处理非 24 小时一直启动的 Linux 系统的 cron 服务的执行!所以 anacron 并不能指定何时执行某项任务, 而是以天为单位或者是在开机后立刻进行 anacron 的动作,他会去侦测停机期间应该进行但是并没有进行的 cron服务,如果有就将该任务执行一遍,然后就自动停止。