前言

作为敲代码的,对于服务器关注点主要在于如何安装、部署软件,如何设置配置文件,软件的开启和关闭等等,对于服务器网络安全所知甚少。服务器安全的重要性只有在被黑,被破坏之后才能体会。

为此,服务器的数据库日常备份和代码的阶段性备份都不可少。然后这并不是全部,作为程序员还需要懂一些必要的常识知识。

都知道,服务器会对外开放一些端口,这些端口就像我们人体的耳鼻喉一样重要,如 22 远程 shell 登录,80 web 访问,3306 服务器端口等等。对于服务器的日常运行,这些端口功不可没,但也因为这些端口的开放,给服务器带来了隐患。

一些黑客或者不法分子通过端口扫码工具,找到开放的端口,然后通过这些端口,尝试一些对服务器有害的行为。每个端口都对应着服务器上的一项服务,如果黑客能够通过端口找到服务软件的一些漏洞,利用这些漏洞直接攻击服务器,或者进一步直接获取到服务器 root 权限,那这台服务器就易主了。服务器当然不会丢,但就像一个随时能被小偷进入的房间一样,你不知道什么时候东西就被偷了。

以 sshd 远程登录服务为例,新购的服务器远程登录默认用户名为 root,默认端口为 22。黑客会使用这些默认参数,对你服务器进行密码暴力破解。如果不巧你的服务器密码强度很弱,那么你的服务器就直接被黑了。

那么作为一个服务器运维小白,怎么简单判断服务器是否被黑或者被当肉鸡挖矿了呢?

排查、判断是否被黑

1. 服务器访问速度

在服务器被黑,尤其是被当肉鸡挖矿的时候,你的服务器硬件配置会被极限使用,这时候,最简单的办法就是打开服务器上一个网页,测试访问速度。一般的简单页面会在 400ms 内相应,超过 1s 甚至好几秒,就要警醒,你可能被黑了。如果你的网站直接访问不了 404 或者怎么样的(在你安装部署成功后,某天突然变成这样),大概率被黑。

2. 服务器内存、CPU 使用状况

普通的 web 服务器,CPU 经常会 100% 空闲,内存也不会长期占用很多。可以使用 free -m 查看内存使用情况

Linux 查看内存使用
Linux 查看内存使用

free -m 表示单位为 M,如果想要更宽泛、更明确的展示,可以使用 free -h,表示用便于人类理解的方式展示。

带单位的内存展示方式
带单位的内存展示方式

如果 cached 过大接近 total 数就需要清除缓存了

缓存清除命令:

echo 1 > /proc/sys/vm/drop_caches --释放网页缓存
echo 2 > /proc/sys/vm/drop_caches --释放目录项和索引
echo 3 > /proc/sys/vm/drop_caches --释放网页缓存,目录项和索引

暂时不知道单独查看 cpu 使用情况的指令,使用 top 可以查看到 cpu、内存和 top 15 内存使用的指令列表。

top 指令查看 cpu、内存使用情况
top 指令查看 cpu、内存使用情况

登录用户列表

ps aux | grep sshd 查看正在通过 sshd 远程登录到服务器的用户,正常应该只有3、4条纪录,如果超出这个范围,并且记录末尾多为 sshd: root [prev] 或者 sshd: root [net] 之类的,大概率被黑。如果执行者都是 root,先修改 root 密码 passwd root xxxxxxxx,再删除这些不规则进程。

cat /etc/passwd 查看服务器上所有的用户,新增加的用户在最下面,看是否有自己不知道、但却存在用户,确认不是本人添加之后,删除它们(userdel [-f] xxxxx)。

last | more 查看服务器登录记录。自上而下查看(日期倒序),除了自己的 root pts/x 处于 still logged in 状态以外,存在其他任何处于这个状态下的记录都大概率属于被黑。查看登录状态的其他记录,用户是否为 root ,如果不是 root ,判断是否需要删除这个用户;如果是 root,考虑先修改 root 密码,再把进程删掉。

users:users 用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名把显示相同的次数。例如:users(回车)显示:chyang lewis lewis ylou ynguo ynguo

安全日志

日志对于安全来说,非常重要,他记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的监测系统状态,监测和追踪侵入者等等。

在 Linux 系统中,有三个主要的日志子系统:

  • 连接时间日志–由多个程序执行,把纪录写入到/var/log/wtmp和/var/run/utmp,login 等程序更新 wtmp 和 utmp 文件,使系统管理员能够跟踪谁在何时登录到系统。
  • 进程统计–由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。
  • 错误日志–由syslogd(8)执行。各种系统守护进程、用户程序和内核通过syslog(3)向文件/var/log/messages报告值得注意的事件。另外有许多UNIX程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。

tail -f /var/log/secure 查看服务器的安全日志。所用用户登录、退出或者其他涉及安全方面的操作,如创建新的用户组或者用户都会存在记录。如果日志里存在 POSSIBLE BREAK-IN ATTEMPT! 这样的说明,该记录中的 ip 地址大概率为黑客或者恶意扫描地址,可将其添加到 /etc/hosts.deny 中,禁止其再次访问。

who 查看当前的登录用户。缺省输出包括用户名、终端类型、登录日期及远程主机。who wtmp 查看所有登录记录(wtmp 为 /var/log 下二进制文件)。

last:last命令往回搜索 wtmp 来显示自从文件第一次创建以来登录过的用户。

w:w 命令查询 utmp 文件并显示当前系统中每个用户和它所运行的进程信息。

扫描端口

nmap 127.0.0.1 扫描本地端口,查看结果集列表中,是否存在不确定的已打开的端口。指令可能不存在,可使用 yum -y install nmap 安装该指令。如果确认是被打开的,lsof -i :xxx 查看该端口对应的执行脚本,确认为恶意脚本后,删除端口对应的进程,之后删除恶意脚本。

nmap 扫描本地端口
nmap 扫描本地端口

检查进程

ps aux 检查所有的进程,看是否存在异常进程。这个很难,你要对运行中的所有进程都有了解,才好排查出恶意的进程。

定时任务

ls /var/spool/cron 查看存在的定时任务。会按照系统用户展示,不同的用户,在使用 crontab -e 编辑系统定时任务时,写入的文件是不同的。如果存在未知用户的定时任务文件,可以进一步查看该用户下定时任务内容 cat /var/spool/cron/xxx,确定存在指定的任务执行脚本为恶意脚本后,删除恶意脚本,再删除该任务(或者直接删除该用户的定时任务文件,之后反向再去删除该用户)。

被修改的文件

对于已确认的恶意用户,在删除用户之后,还需要查看该用户是否修改了系统的文件。因为可能存在恶意脚本,会被定时,或者其他形式触发。find / -user xxx | xargs ls -l 查看该用户最近修改文件记录。如果是一些系统指令,少量的话,可以考虑从其他安全的服务器拷贝过来替换掉。find / -user xxx | xargs lsattr 查看该用户文件属性,如果存在串改,可以还原。比如 i 表示不可修改,find / -user 122 | xargs chattr -i 去掉该属性。

安全方面的建议

1、iptables是个好东西,提供四层的包过滤防护功能,运用得当可以防止很多安全隐患。

2、hosts.deny/allow ,存在于Iptables之下的硬性防护措施,虽然不怎么灵活但是安全性更高

3、Selinux,这个内核级的防护墙被很多人所放弃,主要是由于它很不灵活,如果运用不得当会更自己添加很多麻烦,但是它对于保护系统安全非常重要

4、sshd的策略,禁止root以及修改端口是个不错的办法

5、密码复杂性以及定期更换密码、检查系统账号是系统管理员的日常工作

6、第三方监控以及监控脚本是个不错的策略,zabbix和cacti都支持监控系统登录用户

7、系统漏洞:尽量使用较新版本的二进制包部署服务器的应用程序

8、第三方软件:fail2ban和denyhost这两款防护软件个人认为还不错

9、合理运用权限位控制系统文件被修改

本文参考:
本人网站一次被黑的经历与反思 心得与体会 - 脚本之家
linux下怎么查看ssh的用户登录日志
服务器被黑给我上了一课