定义
本文档主要适用于对腾讯云云市场中镜像服务类产品进行安全审核。
镜像的安全审核要求主要分为两类:
必备要求项:为审核前必须满足的基本条件,如有不符将在安全审核中不予通过。
优化建议项:为在满足“必备要求”的基础上提供额外的加固指导和建议,为可选项,建议镜像服务商结合自身业务情况进行强化加固,以提升服务镜像的安全性和可用性。
适用范围
腾讯云云市场 镜像服务类商品的安全审核。
系统组件安全
系统组件加固主要针对系统基础支撑组件进行加固,这部分组件为系统的各类服务支持,可以保证系统底层的安全性,防止黑客入侵。
必备要求
禁止镜像存在公开可利用的且已公布修复方案的高危安全漏洞。
禁止使用官方已停止维护的发行版本进行镜像,例如 Debian6、CentOS4、Win2003。
镜像制作时必须安装所有官方安全更新,具体请参见下文 安装系统安全更新。
禁止镜像默认安装任何病毒、木马、后门、挖矿以及挂机等恶意程序。
禁止使用任何盗版或者破解版程序。
注意:
已上架镜像会被定期扫描,若发现服务镜像不满足上述条件存在安全漏洞或违规行为,腾讯云将有权对厂商镜像做下架处理。
优化建议
安装系统安全更新
Windows 系列镜像:建议开启 Windows Update 自动更新,保证最新更新已安装。
红帽系列镜像:包括 RHEL、CentOS、OpenSUSE 等,请使用 yum update 命令进行 重要安全组件 更新。
Debian 系:包括 Debian、Ubuntu 等 Linux 发行版,在配置好正确的 APT 镜像源地址的情况下,可使用 apt update &&apt upgrade 命令进行更新。
其他发行版包括 BSD 衍生版,请使用相应的命令进行更新。
更新常用核心组件
需确保如下组件已更新且无漏洞,更新方法可参照系统安全更新所提命令:
类型 | 组件名称 |
内核及引导 | grub、kernel、initramfs、sysvinit、systemd、efistub 等。 |
常用依赖库 | libc6、glibc、libssl(openssl)、libgnutls、OpenJDK、SunJDK、libtomcat、libxml、libgd、libpng、zlib、libpython、libnet、libkrb、libcup、libfuse、libdbus 等。 |
常见应用 | 包含但不限于 wget、rsync、curl、tar、apt、dpkg、rpm、yum 、sshfs、shell(bash、zsh、csh、dash…)、openssh、ftp、gzip、sudo、su、ppp、exim 等。 |
安装主机安全组件
Windows 安全 Agent 安装指引
1. 登录腾讯云控制台,根据镜像版本下载相应的主机安全控件:主机安全(云镜)。
2. 安装主机安全控件,如下图:
3. 检查是否安装完成。通过“任务管理器”查看是否存在 YDService 和 YDLive 两个进程,若存在,则表示已安装成功,至此,主机安全客户端组件完成安装。
Linux 安全 Agent 安装指引
1. 登录腾讯云控制台,根据镜像版本下载相应的主机安全控件:安全概览。
2. 登录主机,执行安装脚本:
3. 返回如下结果则说明安全组件安装成功:
系统配置安全
除系统自身漏洞以及引入的第三方组件漏洞外,另一方面的威胁来自于安全配置失误导致的安全问题,通过对系统及重点组件进行加固,可以大大降低人为配置失误或弱配置导致的入侵风险。
必备要求
禁止系统及应用高危端口默认对外网开放,常见高危端口列表见附表。
合理配置系统关键目录的权限,例如 /etc、/bin、~/.ssh 等。
除了 /tmp 目录,其他目录不允许出现 777 权限。
默认日志服务保证正常运行,如 dmesg、syslog、wtmp、btmp、sudo 等。
设置合理的防火墙或安全组策略,屏蔽不安全的端口(如137、139、445等,详见如下表格),仅开放需要的端口;建议使用 iptables 默认屏蔽所有端口,单独开放需要的端口,例如 HTTP80、SSH22、RDP3389、HTTPS443 等。
附表:
服务名称 | 默认服务端口 | 常见漏洞 |
Rlogin | 513 | Rlogin 空密码登录。 |
MySQL | 3306 | MySQL 弱口令及高危漏洞。 |
SQL Server | 1433、1434 | SQL Server 弱口令及高危漏洞。 |
Windows | SMB 137、139、445 | 永恒之蓝漏洞,SMB 漏洞。 |
Rsync | 873 | Rsync 未授权访问漏洞。 |
Docker | 2375 | Docker Remote API 未授权访问漏洞。 |
CouchDB | 5984 | CouchDB 未授权访问漏洞导致系统命令执行。 |
Redis | 6379 | Redis 未授权漏洞。 |
Tomcat | 8080 | Tomcat/WDCP 主机管理系统,默认弱口令。 |
Elasticsearch | 9200 | ElasticSearch 命令执行漏洞。 |
Memcached | 11211 | Memcached 未授权访问。 |
Mongodb | 27017、27018 | MongoDB 未授权访问。 |
Hadoop | 50070、50030 | Hadoop 默认端口未授权访问。 |
优化建议(Linux)
Linux 软件更新配置
腾讯云官方常见软件源供自定义的镜像使用:
CentOS 系列镜像
镜像版本 | Yum 源地址 |
CentOS | https://mirrors.cloud.tencent.com/help/centos.html https://mirrors.cloud.tencent.com/help/epel.html |
注意:
建议修改前提前做好备份,备份操作方法如下:
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
。Ubuntu 系列镜像
镜像版本 | APT 源地址 |
Ubuntu | https://mirrors.cloud.tencent.com/help/ubuntu.html |
注意:
建议修改前提前做好备份,备份操作方法如下:
cp /etc/apt/sources.list /etc/apt/sources.list.bak
。Debian 系列镜像
镜像版本 | APT 源地址 |
Debian | https://mirrors.cloud.tencent.com/help/debian.html https://mirrors.cloud.tencent.com/help/debian-security.html |
注意:
建议修改前提前做好备份,备份操作方法如下:
cp /etc/apt/sources.list /etc/apt/sources.list.bak
。Linux 口令策略加固
操作目的 | 加强口令的复杂度等,降低被猜解的可能性 |
检查方法 | 使用命令 cat /etc/login.defs/grep PASS 和cat /etc/pam.d/system-auth 查看密码策略设置。 |
加固方法 | 1. 使用命令 vi /etc/login.defs 修改配置文件。PASSMAX_DAYS 90 #新建用户的密码最长使用天数 PASS_MIN_DAYS 0 #新建用户的密码最短使用天数 PASS_WARN_AGE 7 #新建用户的密码到期提前提醒天数 使用 chage 命令修改用户设置,例如: chage -m 0 -M 30 -E 2000-01-01 -W 7 <用户名> 表示:将此用户的密码最长使用天数设为30,最短使用天数设为0,密码2000年01月01日过期,过期前 7 天里警告用户。 2. 设置连续输错 10 次密码,账号锁定 5 分钟。 使用命令 vi /etc/pam.d/system-auth 修改配置文件,添加auth required pam_tally.so onerr=fail deny=10 unlock_time=300 注:解锁用户 faillog -u <用户名> -r |
回退方法 | vi /etc/login.defs 和vi /etc/pam.d/ system-auth ,将配置改回加固前配置。 |
备注 | 锁定用户功能谨慎使用,密码策略对 root 不生效。 |
操作目的 | 应设置口令最小长度 |
检查方法 | 对于采用静态口令认证技术的设备,应配置用户口令最小长度不小于8位。 |
加固方法 | 参考配置操作 在文件 /etc/login.defs 中设置 PASS_MIN_LEN 不小于标准值8。 |
检测方法 | 1. 判定条件 密码长度小于8位修改密码不成功。 2. 检测操作 用要修改密码的用户先登录系统,然后用 passwd 命令修改密码,当长度小于8位提示错误: BAD PASSWORD: it is too short |
回退方法 | 修改 /etc/login.defs ,PASS_MIN_LEN 密码长度改回为0。 |
备注 | 无 |
操作目的 | 建议重要服务器采用密钥登录 |
检查方法 | cat /root/.ssh/authorized_keys ,检查是否有登录账户密钥。 |
加固方法 | 1. 通过 ssh-keygen 生成待登录机器的密钥; 2. 将 /root/.ssh/id_rsa.pub 内容填入待登录机器密钥文件中/root/.ssh/authorized_keys 。 |
检测方法 | 判定条件 抽取测试机, cat .ssh/authorized_keys ,检查是否存在。 |
Linux SSH 服务加固
修改默认端口和监听地址
操作方法 |
1. Vi /etc/ssh/sshd_config 2. 注释#Port 22,添加 Port XXXX,改为其他非默认端口。 3. 添加 ListenAddress <本地监听地址>,如 ListenAddress 10.104.233.1。 |
配置会话登录超时退出
操作方法 |
1. Vi /etc/ssh/sshd_config 2. 取消注释#ClientAliveInterval 0,改为 ClientAliveInterval 600 或 900,10分钟或者15分钟自动退出。 3. 添加 ListenAddress <本地监听地址>,如 ListenAddress 10.104.233.1。 |
配置防火墙限制指定源 IP 或者网段才能登录
操作方法 |
1. Iptables -A INPUT -s 192.168.0.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT 2. 这里192.168.0.0/24 可以改为自身已知网段地址。 |
禁止空密码账户登录
操作方法 |
1. Vi /etc/ssh/sshd_config 2. 找到 PermitEmptyPasswords 项,将其改为 no,即不允许空密码存在。 |
Linux 高危端口加固
相应服务开启后,查看是否还有高危端口开放
操作方法 |
1. netstat -anltp 2. 若存在非业务端口对外网开放(监听0.0.0.0:XXX),可关闭相应服务或端口所对应进程。 |
Linux 敏感文件加固
操作方法 |
1. 具有 suid 和 sgid 的文件具有相当的危险性。简单说就是普通用户使用这些命令时可以具有超级用户的权限,检查特殊权限位文件命令: find /usr/bin/chage /usr/bin/gpasswd /usr/bin/wall /usr/bin/chfn /usr/bin/chsh /usr/bin/newgrp /usr/bin/write /usr/sbin/usernetctl /usr/sbin/traceroute /bin/mount /bin/umount /bin/ping /sbin/netreport -type f -perm +6000 2>/dev/null 2. 如果存在输出结果,则使用 chmod 755 文件名命令修改文件的权限。例如: chmod a-s /usr/bin/chage 。 |
优化建议(Windows)
修改远程桌面默认端口
基线名称 | 应修改远程桌面服务( RDP )的默认端口 |
基线说明 | 不能使用默认的端口3389。 |
操作指南 | 1. 参考配置操作 打开命令提示符,运行命令 regedit 打开注册表编辑器,浏览到路径HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp ,修改名称为 “PortNumber” 的数值的数据,使其不等于默认值3389。2. 补充操作说明 需要重启系统才能生效。 |
检测方法 | 1. 判定条件 在其它的 Windows 上,不能仅使用 IP 通过远程桌面连接程序连接被检查计算机。 2. 检测操作 打开命令提示符,运行命令 regedit 打开注册表编辑器,浏览到路径HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp ,查看 “PortNumber” 的数值的数据是否等于默认值3389。 |
配置 Windows 密码策略
操作目的 | 应启用并正确配置密码策略 |
检查方法 | 在组策略中找到密码策略选项,根据自身要求进行配置 |
加固方法 | 1. 参考配置操作 打开命令提示符,运行命令 gpedit.msc 打开组策略编辑器,浏览到路径“本地计算机策略\\计算机配置\\ Windows 设置\\安全设置\\账户策略\\密码策略”,配置“密码最长存留期(使用期限)”、 “密码最短存留期(使用期限)”、“密码长度最小值”、“强制密码历史”为指定值,并启用“密码复杂性要求”。2. 推荐设置如下: 2.1 账户策略 > 密码策略 密码必须符合复杂性要求:启用 密码长度最小值:8个字符 密码最短使用期限:0天 密码最长使用期限:90天 强制密码历史:1个记住密码 用可还原的加密来存储密码:已禁用 2.2. 账户策略 > 账户锁定策略 账户锁定时间:30分钟 账户锁定阈值:10次无效登录 重置账户锁定计数器:30分钟 2.3. 本地策略 > 安全选项 交互式登录:不显示最后的用户名:启用 |
检测方法 | 判定条件 设置新密码时有以下限制: 不能设置不符合复杂性要求的密码。 不能设置太短的密码。 不可在最短留存期内修改密码。 必须在最长留存期后修改密码。 不能循环使用指定次数之内的密码。 |
删除 Windows 无关账户
操作目的 | 应删除或锁定高危、无关账户。 |
检查方法 | 在组策略中找到安全选项,禁用来宾账户或系统其他无关账户。 |
加固方法 | 参考配置操作 1. 打开命令提示符,运行命令 gpedit.msc 打开组策略编辑器,浏览到路径“本地计算机策略\\计算机配置\\ Windows 设置\\安全设置\\本地策略\\安全选项”。2. 删除或锁定无关账户,操作如下: 使用 “net user 账户名 /del” 删除无关账户。 使用 “net user 账户名 /active:no” 锁定无关账户。 |
检测方法 | 判定条件 已禁用来宾账户,或者已删除或锁定其它与实际需求无关的账户。 |
配置 Windows 事件审核
操作目的 | 记录 Windows 账户各类操作事件,方便事后追溯。 |
检查方法 | 在组策略中找到安全选项, 修改审核策略配置 |
加固方法 | 参考配置操作 1. 打开命令提示符,运行命令 gpedit.msc 打开组策略编辑器。2. 找到“本地计算机策略\\计算机配置\\ Windows 设置\\安全设置\\本地策略\\安全选项”。 3. 推荐设置如下: 审核策略更改:成功 审核登录事件:成功,失败。 审核对象访问:成功 审核进程跟踪:成功,失败。 审核目录服务访问:成功,失败。 审核系统事件:成功,失败。 审核账户登录事件:成功,失败。 审核账户管理:成功,失败。 |
检测方法 | 判定条件 已禁用来宾账户。 已删除或锁定其它与实际需求无关的账户。 |
备注 | 为避免日志空间不足,可提升日志存储空间,通过路径开始 > 运行 > eventvwr.msc > windows 日志 > 查看“应用程序”、“安全”、“系统”的属性进行配置,推荐设置为20480KB 或更高。 |
优化 Windows 启动服务
操作目的 | 应提高系统服务安全,优化系统资源,减少受攻击面。 |
检查方法 | 打开“控制面板”,打开“管理工具”中的“服务”,以不影响业务为前提,禁用以下服务: Alerter 服务 Clipbook 服务 Computer Browser Messenger Remote Registry Service Routing and Remote Access Simple Mail Trasfer Protocol(SMTP) (可选) Simple Network Management Protocol(SNMP) Service (可选) Simple Network Management Protocol(SNMP) Trap (可选) Telnet World Wide Web Publishing Service (可选) Print Spooler Terminal Service |
强化网络访问控制权限
操作目的 | 关闭高危网络端口及默认共享,启用网络访问限制。 |
检查方法 | 1. 启动网络访问控制 操作方法如下: 开始 > 运行 > secpol.msc > 安全设置 > 本地策略 > 安全选项推荐配置如下: 网络访问:不允许 SAM 账户的匿名枚举:已启用。 网络访问: 不允许 SAM 账户和共享的匿名枚举:已启用。 网络访问:将 Everyone 权限应用于匿名用户:已禁用。 账户: 使用空密码的本地账户只允许进行控制台登录:已启用。 关闭共享服务端口(135、137、139、445 等)。 若未用到 SMB、RPC 等服务,建议用户关闭相应服务端口。方法如下: 135 端口关闭方法: 1.1.1 单击开始 > 运行,输入“dcomcnfg”,单击确定,打开组件服务。 1.1.2 在弹出的“组件服务”对话框中,选择“计算机”选项。 1.1.3 在“计算机”选项右边,右键单击我的电脑,选择“属性”。 1.1.4 在出现的“我的电脑属性”对话框“默认属性”选项卡中,去掉“在此计算机上启用分布式 COM”前的勾。 1.1.5 选择“默认协议”选项卡,选中“面向连接的 TCP/IP”,单击删除按钮。 1.1.6 单击确定按钮,设置完成,重新启动后即可关闭 135 端口。 137、138、139等 Netbios 服务端口关闭方法: 通过路径“控制面板 > 网络与共享中心 > 本地连接”右键单击属性,选择“TCP/IPv4协议”属性,在“常规”选项卡下选择“高级”,选择“WINS”选项卡,选中“禁用 TCP/IP 上的 NetBIOS”,这样即关闭了 139 端口。 2. 关闭默认共享 查看共享:开始 > 运行 > cmd.exe > net share 关闭默认共享操作: 开始 > 运行 > regedit,找到 HKEYLOCALMACHINE\\SYSTEM\\CurrentControlSet\\Services\\lanmanserver\\parameters 选项,新建 AutoShareServer(REGDWORD),键值设置为0即可。 |
第三方组件安全
第三方组件为各类 Web 类应用服务提供丰富的支撑环境,如果爆发漏洞,会给操作系统本身以及用户的业务带来极大的风险和隐患,对第三方的组件进行加固,可以保服务组件整体的安全性,以及保障服务自身安全及用户信息安全。
必备要求
禁止镜像第三方组件存在公开可利用的且已公布修复方案的安全漏洞。
禁止使用已停止维护的软件版本,如 PHP 5.3. 与 5.4. 版本、PHPMyadmin 4.0.0 以下版本,MySQL 5.1. 版本等。
镜像制作中需从第三方组件官方提供的下载页面下载最新稳定版本进行安装,禁止通过非官方站点下载部署。
禁止使用任何非授权或破解版商业程序提供商业服务。
涉及到镜像内置的软件功能(包括但不限于数据库,FTP,商业软件)的密码,均不能使用“默认方式”内置到镜像文件内,而是通过“启动脚本”的方式(shell,cloud-init 等方案)在镜像创建云服务器的过程随机生成密码文件,客户在拿到云服务器的访问权限后,可通过 SSH 或者远程桌面等自行去云服务器上查找密码文件以获得密码;生成密码文件的脚本必须使用随机算法,保证每次云机创建后获得的都是唯一的密码。
优化建议
Web 服务组件
常用 Web 组件/CMS | 当前稳定版本推荐 | 官方下载链接 |
PHP | >=5.6. >=7.0. >=7.1. | |
MySQL | >=5.5. >=5.6. >=5.7. | |
Apache | >=2.2. >=2.4. | |
Nginx | >=1.10. >=1.11. >=1.12. | |
Tomcat | >=9.0. >=8.5. | |
Redis | >=4.0.* | |
memcached | >=1.5.10 | |
Squid | 3.5 系列最新版本 4.2 系列最新版本 | |
Nodejs | >=8.0 | |
Jetty | >=9.2.* | |
ProFTPD | 1.3.6* 1.3.5* | |
WordPress | >=4.9.8 |
注意:
如上推荐版本为截止2018年08月底最新稳定版,具体可参考官方链接进行下载安装。
Web 应用系统
使用的开源 CMS、BBS 等系统以及插件需为截止镜像发布前的最新版本。
Web 应用系统禁止存在高危安全漏洞,如 SQL 注入、命令注入、文件上传等漏洞。
Web 应用系统管理后台及数据库密码首次安装使用时需强制用户进行密码修改,禁止服务初始化后使用默认密码提供服务。
Web 环境安全
Web 环境安全包含常见易出现安全问题的 Web 支撑服务组件,典型的如 PHP、Apache、Tomcat、Nginx、IIS、MySQL 、Redis、JBoss、Jetty、vsFTPd。
必备要求
建议从官方下载稳定版组件进行部署安装,注意不要下载和使用 beta 版本。
Web 服务组件必须以普通账户权限运行。
禁止 HTTP 目录索引,外部用户可直接访问 Index/ 等目录。
不允许使用弱密码,需使用随机字符串作为初始默认密码。
合理配置目录访问权限,禁止未授权的目录访问行为,如 .git/.svn 等目录 。
默认关闭组件或程序调试模式,避免敏感信息泄露。
优化建议
PHP 安全优化建议
控制脚本访问权限
PHP 默认配置允许 PHP 脚本程序访问服务器上的任意文件,为避免 PHP 脚本访问不该访问的文件,从一定程度上限制了 PHP 木马的危害,需设置 PHP 只能访问网站目录或者其他必须可访问的目录。
/usr/local/apache2/web/
为网站根目录,打开php.ini
,安全加固配置方式如下:
open_basedir = /usr/local/apache2/web/
需要多个目录时,以冒号隔开如:
open_basedir = /usr/local/apache2/web/:/tmp/:/data/adc/
隐藏 PHP 版本信息
攻击者在信息收集时候无法判断程序版本,增加防御系数。打开
php.ini
安全加固配置方式如下,隐藏版本设置:
expose_php =off
开启安全模式
修改 PHP 配置文件
php.ini
,添加如下配置:
safe_mode = on
safe_mode_gid = off
关闭全局变量
关闭全局变量,配置如下:
register_globals = off
禁用 PHP 危险函数
Web 木马程序通常利用 PHP 的特殊函数执行系统命令,查询任意目录文件,增加修改删除文件等。PHP 木马程序常使用的函数为:dl, eval, assert, exec, popen, system, passthru, shell_exec 等。
修改 PHP 配置文件
php.ini
,添加如下配置:
disable_functions= dl,eval,assert,exec,passthru,popen,proc_open,shell_exec,system,phpinfo,assert
可酌情调整函数内容。开启 magic_quotes_gpc:
magicquotesgpc 会把引用的数据中包含单引号( ' )和双引号( " )以及反斜线 ( \\ )自动加上反斜线,自动转译符号,确保数据操作的正确运行,magicquotesgpc 的设定值将会影响通过 Get/Post/Cookies 获得的数据,可以有效的防止 SQL 注入漏洞。
打开
php.ini
,安全加固配置方式如下,打开 magicquotesgpc 设置:
magicquotesgpc = On
*其他参考配置
开启 magic_quotes_runtime,对文件或者数据库中取出的数据过滤,能很好地解决二次注入漏洞。
magic_quotes_runtime = On
关闭错误信息提示:
display_errors = off
display_startup_errors = off
开启错误日志记录,关闭 display_errors 后能够把错误信息记录下来,便于查找服务器运行的原因,同时也要设置错误日志存放的目录,建议跟 webserver 的日志放在一起。
log_errors = On
error_log = /usr/local/apache2/logs/php_error.log
不允许调用 dl:
enable_dl = off
关闭远程文件,允许访问 URL 远程资源使得 PHP 应用程序的漏洞变得更加容易被利用,PHP 脚本若存在远程文件包含漏洞可以让攻击者直接获取网站权限及上传 Web 木马,一般会在 PHP 配置文件中关闭该功能,若需要访问远程服务器建议采用其他方式,如 libcurl 库:
allow_url_fopen = off
allow_url_include = off
开启 http only:
session.cookie_httponly = 1
cookie domain
开启 https secure:
session.cookie_secure = 1
适当的 PHP redirects:
cgi.force_redirect = 0
SQL 的安全模式:
sql.safe_mode = on
Apache 安全优化建议
Apache 软件下载
应该从 Apache 官方提供的下载页面。
删除默认页面
Apache 安装好后,存在默认的示例页面:需要删除两个目录:
icons
、manual
,并且注释或删除 Apache 配置文件中的以下两行内容:Alias /icons/ "/usr/share/apache2/icons/"
AliasMatch ^/manual(?:/(?:de|en|es|fr|ja|ko|ru))?(/.*)?$ "/usr/share/apache2/manual$1"
目录权限配置
如果 Apache 以 daemon 普通用户启动,则黑客通过网站漏洞入侵服务器后,将获得 Apache 的 daemon 权限,因此需要确认网站 Web 目录和文件的属主与 Apache 启动用户不同,防止网站被黑客恶意篡改和删除。网站 Web 目录和文件的属主可以设置为 root 等(非 Apache 启动用户)。Web 目录权限统一设置为755,Web 文件权限统一设置为644( cgi 文件若需执行权限可设置为 755),只有上传目录等需要可读可写权限的目录可以设置为777。假设网站目录为:
/usr/local/apache2/htdocs/
,上传目录为:/usr/local/apache2/htdocs/upload/
chown -R root:root /usr/local/apache2/htdocs/
chmod 755 /usr/local/apache2/htdocs/
find /usr/local/apache2/htdocs/ -type d -exec chmod 755 {} \\;
find /usr/local/apache2/htdocs/ -type f -exec chmod 644 {} \\;
chmod –R 777 /usr/local/apache2/htdocs/upload/
为了防止黑客在777权限目录中上传或者写入 Web 木马,因此需要设置 777 权限的目录不能执行或访问脚本。禁止执行或访问脚本的安全配置如下:
<Directory "/usr/local/apache2/htdocs/yourpath">Options NoneAllowOverride NoneOrder deny,allowdeny from all<FilesMatch "\\.(jpg|jpeg|gif|png)$">Order deny,allowallow from all</FilesMatch></Directory>
消除目录浏览漏洞
Apache 默认允许目录浏览,如果目录下没有索引文件则会出现目录浏览漏洞。
需要把 Apache 配置文件中的全部 “Indexes” 删除或者改为 “-Indexes”。
开启访问日志
开启日志有助于发生安全事件后方便进行入侵回溯,分析原因及定位攻击者:
CustomLog /www/logs/access_log common
默认情况下,Apache 已开启访问日志记录,请在 Apache 配置文件中确认已开启访问日志。
其他参考配置
FollowSymLinks
此指令为默认启用,因此在创建符号链接到网页服务器的文档 root 目录时,请慎重行事。例如,请勿为“/”提供符号链接。ServerTokens ProductOnly
serversignature Off
Apache 默认输出的 banner 会泄露关键信息,如服务器 OS 类型、Apache 版本、安装的应用程序类型及版本。暴露过多的信息只会给黑客带来便利。
在 Apache 配置文件中,修改 ServerToken、ServerSignature 设置(如果没有这两行配置,请自行添加)。UserDir
此指令可确认系统中用户账户是否存在,所以要默认禁用UserDir
指令。
要在服务器上启用用户名目录浏览,则须使用以下指令:
UserDir enabled
UserDir disabled root
这些指令用于/root/
之外的所有用户目录,可激活其用户目录浏览这一功能。在禁用账户列表中添加用户,要在UserDir disabled
命令行添加以空格分隔的用户列表。Tomcat 安全优化建议
Apache 软件下载
应该从 Tomcat 官方提供的下载页面进行安装部署。
Tomcat 日志记录
编辑
server.xml
配置文件,确保在 HOST 标签中有记录日志功能,配置如下:<valve cassname=”org.apache.catalina.valves.AccessLogValve”
Directory=”logs” prefix=”localhost_access_log.”
Suffix=”.txt”
Pattern=”common” resloveHosts=”false”/>
注意
默认 Tomcat 已经开启日志记录功能。
启动安全模式
为了限制脚本的访问权限,防范 webshell 木马,建议启动时增加安全参数启动,如采用如下方式启动 Tomcat:
Tomcat/bin/startup.sh –security
删除 Tomcat 默认页面
删除
tomcat/webapps/
目录下的所有文件及目录,已知webapps
目录包含:Tomcat/webapps/docs/
Tomcat/webapps/examples/
Tomcat/webapps/host-manager/Tomcat/webapps/manager/
Tomcat/webapps/ROOT/
删除 Tomcat 的 admin 控制台软件:删除
{Tomcat安装目录}\\webapps
下admin.xml
文件。删除 Tomcat 的 Manager 控制台软件:删除
{Tomcat安装目录}\\webapps
下manager.xml
文件。 删除 jspx 文件解析
Tomcat 默认是可以解析 jspx 文件格式的后缀,解析 jspx 给服务器带来了极大的安全风险,若不需要使用 jspx 文件,建议删除对 jspx 的解析,具体操作为修改 conf/web.xml 文件,将如下代码注释掉:
<url-pattern>*.jspx</url-pattern>
禁止显示错误信息
Tomcat 在程序执行失败时会有错误信息提示,可能泄露服务器的敏感信息,需要关闭错误提示信息。可以通过指定错误页面的方式不将错误信息显示给用户,修改
tomcat/conf/web.xml
,增加如下配置项:<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
注意
可以根据需要自行增加相应的错误码,常见的如500,404等,location 选项为指定跳转的页面,该 jsp 文件需要自己生成。
Nginx 安全优化建议
Nginx 软件的下载
应该从 Nginx 官方提供的下载页面下载进行部署安装,需要下载最新稳定版本。注意不要下载 beta 版本, Nginx 官网下载地址为:
http://nginx.org/en/download.html
。消除目录浏览漏洞
cat/etc/nginx/nginx.conf
Nginx 默认不允许目录浏览,请检查目录浏览的相关配置,确保没有目录浏览漏洞。确保 autoindex 的配置为 off ,即 autoindex off 或者没有配置 autoindex。
关开启访问日志
开启日志有助于发生安全事件后回溯分析整个事件的原因及定位攻击者。
默认情况下,Nginx 已开启访问日志记录,请在 Nginx 配置文件中确认已开启访问日志
access_log /backup/nginx_logs/access.log combined;
关闭服务器标记
cat/etc/nginx/nginx.conf
添加这行配置:
server_tokens off
删除默认页面
删除 Nginx 默认首页 index.html,业务可以自行创建默认首页代替之。
删除如下配置信息:
location /doc {root /usr/share;autoindex on;allow 127.0.0.1;deny all;}location /images {root /usr/share;autoindex off;}
删除首页 index.html 后,新建其他首页内容不允许出现如下首页内容:
其他配置
隐藏 Nginx 版本信息,打开配置文件 隐藏版本设置:
Server_tokens off;
攻击者在信息收集时候无法判断程序版本,增加防御系数。 禁用非必要的请求方法:
if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; }
trace 请求用于网络诊断,会暴露信息,只允许 GET、HEAD、POST 请求,其他请求直接返回444状态码 (444是 Nginx 定义的响应状态码,会立即断开连接,没有响应正文,TRACE 请求 Nginx 内置405拒绝。)IIS 安全优化建议
IIS 软件的安装
业务应基于 IIS7.0 或以上版本搭建。
删除 IIS 默认站点、无关页面,关闭不需要的服务
1. 删除
c:\\Inetpub
以及其他默认站点目录。 2. 应删除 Defaul.htm、Default.asp、index.htm、index.html、iisstart.htm 等默认文档。
3. 关闭站点不需要的服务如 SMTP、FTP。
删除无关账号
IIS 站点部署后系统会自动生成 IIS 用户账号 IUSRS,在不影响站点正常访问和系统运行维护的前提下删除其他不必要的账号。如 ASPNET 账号、Guest 账号、User 账号等;系统管理员组仅允许管理员账号 administrator 加入。
关闭 Web 目录的写权限
为确保 Web 目录的文件不被非法篡改和删除,应禁止用户对 Web 目录的写权限。
关闭 WebDav
站点若无用户文件操作、文档在线编辑等功能,建议关闭 WebDav 功能。
关闭方法如下图所示:
若必须开启 WebDav,建议禁止 WebDav 目录的“Write”权限:
IIS 访问权限配置
1. 如果 IIS 中有多个网站,建议为每个网站配置不同的匿名访问账户。
2. 新建一个账号,加入Guests 组。
3. “网站属性” > “目录安全性” > “身份验证和访问控制”,将“启用匿名访问”处,用刚新建的账户代替默认账户。
禁用不必要的 Web 服务扩展
打开 IIS 管理器,检查是否有不必要的“ Web 服务扩展”,如果有则禁用掉。
不显示详细的 ASP 错误信息
“ IIS 管理器” > “属性” > “主目录” > “配置” > “调试”,选择“向客户端发送下列文本错误消息”项,自定义出错时返回的错误信息。
修改默认错误页面
“ IIS 管理器” > “属性” > “自定义错误”,用自定义的错误页面替换默认的默认页面。
MySQL 安全优化建议
修改 MySQL 网络监听地址
MySQL 默认配置为绑定所有的 IP,服务器有外网可以被外网访问。为安全起见必须绑定内网 IP,不允许外网访问,可编辑配置文件 my.cnf,在 mysqld 选项中增加一项:
bind_address = 172.16.x.x
,后面的 IP 地址代表需要绑定的内网 IP 地址。修改 MySQL 默认端口
更改默认端口(默认3306),可以从一定程度上防止端口扫描工具的扫描。
编辑
/etc/my.cnf
文件,增加端口参数,并且设定端口,注意该端口未被使用,保存退出。例如:[mysqld]port=3806datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0
非 Root 账户运行 MySQL
首先必须要使用独立的受限账户启动 MySQL,一般是系统中用户名和用户组均为 MySQL 的账户,同时把配置文件拷贝到
/etc
目录。使用 MySQL 来启动 MySQL 服务:/usr/local/mysql/bin/mysqld_safe –user=mysql &
。MySQL Root 账户设置密码
5.6 中,rpm 包安装完 MySQL 后,会随机生成一个 root 密码,保存在
/root/.mysql_secret
。
5.5 以前,rpm 包安装完 MySQL 后,缺省管理员账户的密码为空,需要对该账户设置密码,可以采用如下办法设置管理员密码:mysql> use mysql;
mysql> update user set password=password('upassword') where user='root';
mysql> flush privileges;
删除默认数据库及用户
MySQL 初始化后会自动生成空用户和 test 库,会对数据库安全构成威胁,需要全部删除。可采用如下方法:
mysql>drop database test;mysql>use mysql;
mysql>delete from db;
mysql>delete from user where not(host=”localhost” and user=”root”);
mysql>flush privileges;
控制远程连接
由于 MySQL 是可以远程连接的,需要控制远程连接的范围,如仅内网访问或不允许网络访问,禁止任意远程账户连接。 可以采用如下方式或者通过防火墙来限制 MySQL 的远程访问。
mysql> show grants for username; //显示账户权限
mysql> grant all on dbname.* to 'username'@'ip地址' identified by '密码';
控制数据库的权限
对于使用 Web 脚本进行交互的数据库,建议建立一个用户只针对某个库有 update、select、delete、insert、drop table、 create table 等权限,减小数据库的用户名和密码被黑客窃取后的影响和损失。控制数据库的权限可参考如下:
Mysql> grant select,insert,update,delete,create,drop privileges on dbname.* To user1@localhost identified by ‘密码’;
数据库名,账户及密码需要根据实际情况填写。
文件读写权限控制
在 Mysql 中,提供对本地文件的读取,使用的是
load data local infile
命令,默认在5.0版本中,该选项是默认打开的,该操作令会利用 MySQL 把本地文件读到数据库中,然后用户就可以非法获取敏感信息了,假如您不需要读取本地文件,请务必关闭。
网络上流传的一些攻击方法中就有用它LOAD DATA LOCAL INFILE
的,同时它也是很多新发现的 SQL Injection 攻击利用的手段!黑客还能通过使用LOAD DATALOCAL INFILE
装载“/etc/passwd”
进一个数据库表,然后能用 SELECT 显示它,这个操作对服务器的安全来说,是致命的。在 my.cnf 中添加:
local-infile=0
或者加参数local-infile=0
启动 MySQL。 Redis 安全优化建议
安装下载
使用最新稳定版本,最新版的安全性更高。下载安装命令如下:
wget http://download.redis.io/redis-stable.tar.gz
tar zxvf redis-stable.tar.gz
cd redis-stable
make && sudo make install
安全启动
Redis 配置文件里参数至少包括 requirepass 设置访问密码和 bind 只监听内网 IP,以减少安全风险。更改配置命令如下:
echo "requirepass 密码" >> /etc/redis.conf
echo "bind 内网IP地址" >> /etc/redis.conf
注意
密码长度至少8位,且同时包含大小写字母和数字;内网 IP 地址请自行修改。
新建普通用户 Redis 用于降权启动服务,相关命令参考如下:
useradd redis -d /home/redis -m #新建普通用户chown redis:redis /etc/redis.conf #修改配置文件属主chmod 700 /etc/redis.conf #修改配置文件权限su - redis #切换至普通用户redis-server /etc/redis.conf #启动服务
修改默认端口
修改 Redis 默认端口6379为其他端口,打开配置文件
redis.conf
,如:vim /etc/redis.conf
,将 port 6379修改为 port xxxx。 端口限制访问
遵循最小化原则,按需分配访问权限,以减少安全风险。Iptables 命令参考如下:
iptables -A INPUT -p tcp -s 来源IP地址 --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP
注意
来源 IP 地址请自行修改;Redis 默认监听端口为6379(TCP),若业务修改成其他端口,这里也要做对应修改。
限制 Redis 文件目录访问权限:
设置 Redis 的主目录权限为700,因为 Redis 密码明文存储在配置文件当中,所以配置文件存放的目录权限修改为600。命令参考如下:
chmod 700 /opt/redis 、chmod 600 /opt/redis/conf
MongoDB 安全优化建议
安装下载:
使用最新稳定版本,最新版的安全性更高。最新版下载地址:
http://www.mongodb.org/downloads
。安全配置方案
1. 创建 mongodb 数据库文件夹:
mkdir /mongodb/db
2. 创建 mongodb 日志文件:
touch /mongodb/log/mongodb.log
3. 启动 mongodb 时需要添加— auth 参数,并立即在 admin 数据库创建一个用户(默认情况下 MongoDB 是无需验证的,所以这是至关重要的一步。)
./mongod --dbpath /mongodb/data --logpath /mongodb/log/mongodb.log --nohttpinterface --auth
4. 启动的时候需要加上 -- nohttpinterface 参数,取消默认 Web 管理页面。
5. 非 root 权限启动 mongodb,在机器上登录非 root 账户,给予 mongodb 程序和数据库文件夹,日志文件的该账户读写执行权限。
端口限制访问
iptables -A INPUT -p tcp -s 来源IP地址 --dport 27017 -j ACCEPT
iptables -A INPUT -p tcp --dport 27017 -j DROP
说明
来源 IP 地址请自行修改;mongodb 默认监听端口为27017,若业务修改成其他端口,请做对应修改。且 monggodb 端口禁止对外网访问。
文件目录限制
配置文件只允许属主读取和修改、属组读取。
chmod 640/usr/local/mongodb/mongodb.conf
数据目录只允许属主读取和修改。
chmod 700 /usr/local/mongodb/data/
日志文件目录只允许属主读取和修改、属组读取。
chmod 740 /usr/local/mongodb/log/
Jboss 安全优化建议
设置目录权限
修改
deploy\\jbossdomain\\deploy\\jbossweb-tomcat55.sar\\conf\\
下面的 web.xml 文件中的如下内容:<init-param><param-name>listings</param-name><param-value>false</param-value></init-param>
将 “param-value” 默认值 true 改为 false。
删除危险服务:
Jboss 中存在较多容易出现安全漏洞的组件,需要把 jmx-console 和 web-console 控制台删除,建议直接删除避免引入安全漏洞风险:
删除 Jboss 的 /web-console 控制台:
删除
JBOSS_HOME/server/default/deploy/jbossweb-tomcat55.sar
目录下的root.war
。删除
JBOSS_HOME/server/default/deploy/management/console-mgr.sar/web-console.war
。删除 Jboss 的 /jmx-console 控制台:
删除
JBOSS_HOME/server/default/deploy/jmx-console.war
以及其他目录下的jmx-console.war
文件。
删除JBOSS_HOME/server/default/deploy/jbossws.sar/jbossws-context.war
以及其他目录下的jbossws-context.war
文件。
删除JBOSS_HOME/server/default/deploy/jboss-web.deployer/context.xml
删除 Jboss 的 http-invoker:
删除
JBOSS_HOME/server/default/deploy/http-invoker.sar
目录。
测试一下:<http://XXXX/jmx-console/>
<http://XXXX/web-console>
注意
端口使用实际的,访问不到页面就成功了。
限制危险服务:
设置 Jboss 的 Bootstrap JNP、RMI naming service 服务只允许本地访问。
修改 server/default/conf 下的 jboss-service.xml 文件内容以及其他目录下的 jboss-service.xml 文件。
修改 Bootstrap JNP(端口1099)和 RMI naming service(1098)只允许本地访问。
<mbean code="org.jboss.naming.NamingService"name="jboss:service=Naming"xmbean-dd="resource:xmdesc/NamingService-xmbean.xml"><attribute name="CallByValue">false</attribute><attribute name="Port">1099</attribute><attribute name="BindAddress">127.0.0.1</attribute><attribute name="RmiPort">1098</attribute><attribute name="RmiBindAddress">127.0.0.1</attribute><depends optional-attribute-name="LookupPool"proxy-type="attribute">jboss.system:service=ThreadPool</depends><depends optional-attribute-name="Naming"proxy-type="attribute">jboss:service=NamingBeanImpl</depends></mbean>
vsFTPd 安全优化建议
安装部署:
在
<http://vsftpd.beasts.org/#download>
下载最新版 vsftp 源码包,编译安装。关闭匿名访问功能:
如业务无必要,可关闭匿名访问功能,修改 VSFTP 配置文件 vsftpd.conf,修改以下配置,关闭匿名访问:
anonymous_enable=NO
禁止 VSFTP 显示 Banner,防止泄露版本信息:
1. 登录 FTP 服务器,查看是否显示 Banner:
C:\\>ftp 192.168.10.1Connected to 192.168.10.1220 (vsftpd 2.0.5)User (192.168.10.1:(none)):
2. 修改 VSFTP 配置文件 vsftpd.conf,修改以下语句:
ftpd_banner=Welcome
3. 重新启动 VSFTP 后,查看 Banner:
C:\\>ftp 192.168.10.1Connected to 192.168.10.1220 WelcomeUser (192.168.10.1:(none)):
如允许匿名用户上传文件,建议配置只写目录:
找到
/ var/ftp/pub
目录,通过如下命令创建只写目录:
mkdir /var/ftp/pub/upload_files
限制 FTP 匿名用户访问上传文件目录:
chmod 730 /var/ftp/pub/upload_files
开启日志记录:
修改 VSFTP 配置文件 vsftpd.conf,修改以下行,启用日志记录:
xferlog_enable=YESxferlog_file=/var/log/xferlogdual_log_enable=YESvsftpd_log_file=/var/log/vsftpd.loguse_localtime=YES
SFTP 默认只有上下传记录,没有用户登录等信息的记录。按照上述加固方法,可以在
/var/log/vsftpd.log
查看用户登录记录,创建目录删除目录等信息。Jetty 安全优化建议
禁止目录浏览
修改 etc/webdefault.xml:
<init-param><param-name>dirAllowed</param-name><param-value>false</param-value></init-param>
限定文件解析类型
修改 etc/webdefault.xml,只保留 jsp 相关解析:
<servlet-mapping><servlet-name>jsp</servlet-name><url-pattern>*.jsp</url-pattern><url-pattern>*.JSP</url-pattern></servlet-mapping>
控制文件权限
chmod 755 jetty/etc/*
禁止 CGI
删除
contexts/test.d
这个和下面那个不删也行,启动会报错,但是不影响使用。
删除contexts/test.xml
删除webapps/
目录下的test.war
文件。隐藏服务器版本信息
修改
etc/jetty.xml
,此处默认是 true,修改为 false:<Set name="sendServerVersion">false</Set>