环境配置

虚拟机

  • Debian x64
  • Host-Only 网络
  • Linux-Apache-MySQL-PHP (LAMP)

实验目的是检查 Linux 服务器配置,确保安全配置并进行加固。

本实验基于 Debian 6 ,已经停止了常规安全更新支持(目前都 Debian 9 了…也说明这实验已经很久了23333),不过对主机进行审查的思路大致上是不变的,只是在新版本系统中的一些操作或内容可能会有所改动。

主机审查

系统角色

系统的用途不同将使用不同的安全模型,比如 Web 服务器系统和内网文件系统就具有完全不同的安全需求。

实验系统是一个 Web 服务器,用于提供基于 PHP 的 Web 应用程序(WordPress)。

访问权限

主机审查需要有 root 权限或相同权限的账户,使用 sudo -s 获得 root 访问权限。

自动部署

目前已有许多 Web 应用程序使用自动部署,本博客也使用了 Travis-CI 进行自动部署。

日志

首先确保使用 SSH 连接到虚拟机,然后使用 screen 生成操作日志记录,完成后使用 scp 导出记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 切换目录
cd tmp

# 开始记录
screen
# CTRL+a
# H

# 结束记录
# CTRL+a
# H
exit

# 重命名
mv screenlog.0 Audit-`hostname`-`date +"%d-%b-%Y_%H:%M"`.txt

# 复制到本地
scp -r user@192.168.56.106:/tmp/ ~/Desktop

系统审查

内核

根据内核版本检查安全漏洞,可以在 Debian 官网上查阅安全信息,也可以参阅 CVE-Linux-Kernel-Security Vulnerabilities 列表。

1
2
# 查看内核版本
uname -a

参阅

时间

时间同步的重要性可想而知,基于时间的操作包括日志记录,身份认证等等。本人自建自用的 VPN 服务也必须确保时间同步,更别说搭载应用服务的服务器了。

实验指导建议不要使用夏令时时区,以避免时间跳跃(顺便了解了一下夏时制,貌似全球使用的地区也不多)。

1
2
3
4
5
6
7
8
# 查看时区设置
cat /etc/timezone

# 查看 NTP 服务器,用于和其他服务器同步
ps -edf | grep ntp

# 查看尝试同步的服务器
ntpq -p -n

参阅

安装的软件包

系统上应该保证不安装不必要的包,避免增加产生漏洞的可能性。对于自用的电脑也是同样的道理,(虽然可能是个人的强迫症)定期清理掉不使用的软件、文件,同时定期检查和更新软件。

Web 应用程序通常会使用许多第三方组件,而有的时候 Web 应用程序的漏洞就来自组件,因此非常有必要定期进行检查和更新。

1
2
# 查看安装的软件包
dpkg -l | less

参阅

日志

日志的内容就比较多,系统、网络、服务等理应都有日志记录,Linux 中的系统日志为 syslog,可以使用 rsyslog 进行查看和处理(这里暂时不作展开)。

1
2
# 查看系统进程
ps -edf | grep syslog

参阅

网络审查

首先可以查看基本的网络信息,包括网卡、路由、DNS 配置等。

1
2
3
4
5
6
7
8
9
# 查看所有网卡
ifconfig -a

# 查看路由信息
netstat -rn

# 查看 DNS 配置
cat /etc/resolv.conf
cat /etc/hosts

防火墙规则

最基本可以的使用 iptables 进行查看和配置,需要使用 root 权限。顺便推一个本人《网络安全》课程中做过的 实验

1
2
# 查看防火墙规则
iptables -L -v

参阅

IPv6

虽然知道 IPv6 但基本没有使用过(或者其实自己不知道在使用)。

1
2
# 查看 IPv6 防火墙规则
ip6tables -L -v

参阅

文件系统审查

挂载

/etc/fstab 配置文件定义了文件系统的挂载规则,印象中曾尝试用来挂载 CD 文件。

1
2
# 查看挂载信息
cat /etc/fstab

参阅

敏感文件

文件系统中的权限非常重要,包括读写执行,诸如包含敏感信息或配置信息的敏感文件必须限制权限。

提到敏感文件就想到 /etc/shadow ,保存了系统的用户名和密码(散列值);对于 Web 应用程序,配置和密钥也都是敏感文件。

参阅

文件权限

ls -l 就可以查看当前目录文件的权限,用字母表示包括 r(read),w(write),x(execute),特殊的标志位有 s(setuid),t(sticky)。

1
2
# 显示当前目录的文件列表
ls -l

使用 chmod 修改权限,使用字母或数字都可以

  • 字母
    • u:文件所有者
    • g:文件所有者的用户组
    • o:其他用户
    • a:所有,即 ugo
  • 数字
    • r = 4
    • w = 2
    • x = 1
1
2
3
4
5
# 设置文件所有者的用户组的权限为读写,+增加权限,-减少权限,=设置权限
chmod g=rw filename

# 设置所有者读写执行,用户组读执行,其他用户读执行
chmod 755 filename

参阅

普通权限文件

使用 find 检索所有用户可读可写的文件

1
2
3
4
5
# 路径 /
# 类型 文件
# 权限 其他用户可读可写
# 标准设备输出到空设备
find / -type f -perm -006 2>/dev/null

参阅

服务审查

运行的服务

查看系统进程,通常可以使用 lsof 命令,需要使用 root 权限。

1
2
3
4
5
6
7
8
# 查看系统进程
ps -edf

# 查看打开的文件及其进程,UDP 服务
lsof -i UDP -n -P

# 查看打开的文件及其进程,TCP 服务
lsof -i TCP -n -P

参阅

实验中需要关注的服务

实验基于 LAMP ,因此 Apache、MySQL、PHP 都需要关注,不过并没有没有深入进行分析。

OpenSSH

为了提供 SSH 连接服务,使用了 OpenSSH ,其配置文件位于 /etc/ssh 目录下。实验中主要防止 root 用户直接远程连接,即将 PermitRootLogin 配置为 no ,同时使用 SSH 版本2 protocol 2,修改配置文件 sshd_config

MySQL

MySQL 无需监听所有网卡,设置为监听本地即可,修改配置文件 /etc/mysql/my.cnf

1
2
[mysqld]
bind-address = 127.0.0.1

然后重启 MySQL 即可生效,实验中使用的是 MySQL 5.6 ,目前已经更新到 8.0 版本,部分命令和变量有所改变,不作展开,其余同理。

官方给出的安全指南(MySQL 8.0):Chapter 6 Security

Apache

Apache 配置文件为 /etc/apache2/apache2.conf,实验中检查 Web 应用程序目录及文件的权限。

1
ls -lR /var/www/wordpress

官方提供的安全建议(Apache 2.4):Security Tips

PHP

实验中的 PHP 以 Apache 模块方式安装,/etc/apache2/mods-enabled/ 目录下可以查看相关配置文件。

官方安全介绍:PHP 手册 - 安全

参阅