MeteorCat / 正式环境搭建

Created Fri, 29 Sep 2023 15:42:14 +0800 Modified Wed, 29 Oct 2025 23:24:53 +0800
2007 Words

正式环境搭建

这里需要说明所有 Linux 应用部署过程之后, 对外隐藏可能暴露的信息/接口的处理方法.

PHP

隐藏版本号和禁用系统API

相关文件配置: /etc/php.ini

# 在 php.ini 之中找到下列项改写 Off, 这是在响应页面 Header 之中隐藏 PHP 版本信息
expose_php = Off
 
# 在 php.ini 之中找到下列项目追加禁用函数
disable_functions = syslog,readlink,passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,symlink,popen,putenv,fsocket,fsockopen

NGINX

相关文件配置: /etc/nginx/nginx.conf

隐藏版本和禁止爬虫请求

http{
    # 关闭 NGINX 版本号展示
    server_tokens off;
 
    # 设置客户端下载文件最大大小
    client_max_body_size 2048M
}

简单排除脚本请求

排除掉某些脚本小子简单爬虫, 首先创建配置文件:

sudo vim /etc/nginx/block.conf # 追加禁用配置

填写配置内容:

# 只允许 GET/POST 请求
if ($request_method !~* GET|POST) { return 444; }
 
# 防止SQL注入(仅仅针对GET)
if ($query_string ~* "[;'<>].*") { return 509; }
if ($request_uri ~ " ") { return 509; }
if ($request_uri ~ (\/\.+)) { return 509; }
if ($request_uri ~ (\.+\/)) { return 509; }
 
 
# 防止SQL注入(仅仅针对GET)
if ($request_uri ~* "(cost\()|(concat\()") { return 504; }
if ($request_uri ~* "[+|(%20)]union[+|(%20)]") { return 504; }
if ($request_uri ~* "[+|(%20)]and[+|(%20)]") { return 504; }
if ($request_uri ~* "[+|(%20)]select[+|(%20)]") { return 504; }
if ($request_uri ~* "[+|(%20)]or[+|(%20)]") { return 504; }
if ($request_uri ~* "[+|(%20)]delete[+|(%20)]") { return 504; }
if ($request_uri ~* "[+|(%20)]update[+|(%20)]") { return 504; }
if ($request_uri ~* "[+|(%20)]insert[+|(%20)]") { return 504; }
if ($query_string ~ "(<|%3C).*script.*(>|%3E)") { return 505; }
if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") { return 505; }
if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") { return 505; }
if ($query_string ~ "proc/self/environ") { return 505; }
if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)") { return 505; }
if ($query_string ~ "base64_(en|de)code\(.*\)") { return 505; }
if ($query_string ~ "[a-zA-Z0-9_]=http://") { return 506; }
if ($query_string ~ "[a-zA-Z0-9_]=(\.\.//?)+") { return 506; }
if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") { return 506; }
if ($query_string ~ "b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)b") { return 507; }
if ($query_string ~ "b(erections|hoodia|huronriveracres|impotence|levitra|libido)b") {return 507; }
if ($query_string ~ "b(ambien|bluespill|cialis|cocaine|ejaculation|erectile)b") { return 507; }
if ($query_string ~ "b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)b") { return 507; }

完成之后只需要需要启用的配置 server 配置区块追加引入即可:

server {
    # 引入禁用模块
    include /etc/nginx/block.conf;
    # 其他略......
}

X-Frame-Options 保护

X-Frame-Options 保护 <frame>/<iframe>/<object> 标记, 避免自己网站片段被嵌入其他网站之中, 在需要 server 块之中添加 Header:

server{
    # 这里添加该 Header 只允许 Frame 被同个域名下网站访问
    add_header X-Frame-Options sameorigin always;
 
    # 如果跨域名请求也允许请求到, 则追加以下规则(允许多条), 这里假设非同域名的 demo.example.com 需要请求到.
    add_header X-Frame-Options:ALLOW-FROM https://demo.example.com;
}

X-Content-Type-Options 保护

在网络上面会根据请求 Header 的 Content-Type 来判断调用的资源类型是什么, 可能是图片/压缩包/文本等, 有些攻击会利用该原理将图片伪装成脚本, 通过 Content-Type 请求头变动解析还原成脚本.

server{
    # 追加 Header 禁止浏览器加载 MIME 识别脚本
    add_header X-Content-Type-Options: nosniff;
}

X-XSS-Protection 保护

现在主流浏览器都默认启用 XSS 保护, 但是这个加上去毕竟没什么损失.

server{
    # 主要开启没什么损失, 关闭可能有某些浏览器本身不支持 XSS 系统防护而被攻击
    add_header X-Xss-Protection: 1;
    add_header X-Xss-Protection: mod=block;
}

Tomcat

这里假设系统源安装了 Tomcat9, webappes 所在目录为 /var/lib/tomcat9/webapps.

安装清理

首先安装完成之后要完全删除 webapps 目录内部所有代码, 保证内部清空没有项目, 命令如下:

# 千万不要轻易执行 rm 命令, 最好移动 tmp, 没问题清理 /tmp 内部即可.
sudo mv -f /var/lib/tomcat9/webapps/* /tmp

禁用系统关闭接口

默认 Tomcat 可能会挂起 8005 端口, 通过该端口请求 SHUTDOWN 就能直接关闭 Tomcat, 所以要禁用该函数:

sudo vim /etc/tomcat9/server.xml # 进入配置文件

确认找到或者添加以下内容已经配置:

<Server port="-1" shutdown="SHUTDOWN">

注释不需要的用户

Tomcat 有个自带的管理后台, 实际上大多数也不需要用到, 所以直接去除掉那些用户最好:

sudo vim /etc/tomcat9/tomcat-users.xml

确认找到或者添加以下内容已经配置:

<?xml version='1.0' encoding='utf-8'?>
<!-- 这里 tomcat-users 注释或者删除让其为空结点 -->
<tomcat-users>
    <!-- 内部要么全注释, 要么全部删除 -->
</tomcat-users>

隐藏 Tomcat 版本信息

这里需要分两部分, 首先就是常规页面 Header 响应项的版本信息隐藏:

sudo vim /etc/tomcat9/server.xml

确认找到或者添加以下内容已经配置:

<!-- 找到添加修改 `server` 该项 -->
<Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443"
    URIEncoding="utf-8"
    server="Tomcat" />

重启之后能看到正常页面的 Header 现在仅仅带 Tomcat 而不带版本信息, 但是 404 页面的时候还可以看到错误页面带有版本号, 接下来就是修改 404 错误导致的版本显示, 这里需要创建文件:

# 生成服务器信息配置文件
sudo mkdir -p /var/lib/tomcat9/lib/org/apache/catalina/util # 创建配置目录
sudo vim /var/lib/tomcat9/lib/org/apache/catalina/util/ServerInfo.properties # 生成配置文件

内部追加隐藏信息配置:

# Hidden version
server.info=Apache Tomcat
server.number=
server.built=

之后重启服务器生效即可, 其实最好写成 Nginx, 这样通过 Nginx 代理转发的时候外部没办法知道后端处理是 Tomcat, 也就不会去试探 Tomcat 漏洞.

压缩配置

这里不推荐使用 Tomcat 来进行压缩处理, 最好采用 Nignx-Tomcat 的代理转发方案, 将压缩数据移交给 Nginx 而非 Tomcat; 如果坚持要开启, 则直接 server.xml 配置:

sudo vim /etc/tomcat9/server.xml # 打开配置文件

找到添加修改配置项目:

<!-- compression="on|off" 开启关闭数据压缩 -->
<!-- ompressionMinSize="2048" 压缩数据内容大小 -->
<!-- compressableMimeType="text/javascript,text/css" 压缩数据内容类型,逗号分隔 MIME -->
<Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443"
    URIEncoding="utf-8"
    compression="on"
    ompressionMinSize="2048"
    compressableMimeType="text/xml,text/javascript,text/css"
    server="Tomcat" />

强烈说明: 最好不要采用 Tomcat 来直接处理压缩, 移交给 Nginx 更好发挥 Tomcat 性能.

关闭自动部署

这步操作实际上见仁见智, 默认 Tomcat 会扫描 webapps 目录之后自动对 war 包进行自动解压部署, 有的防止被注入木马病毒等会将自动部署关闭采用手动解压, 这里修改 server.xml 来处理:

<!-- unpackWARs, 是否设置自动解压 War 包 -->
<!-- autoDeploy, 检测内部 appBase 目录是否放置更新版本包, 开始自动解压部署项目 -->
<Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true">
    <!-- 其他内容略 -->
</Host>

Java

Java 环境处理大部分围绕启动参数微调, 涉及基本上的线程/内存/安全方面.

正式环境禁止安装JDK

服务器不需要编译打包, 只需要保证 Java 程序已经安装即可. 一旦服务器被入侵, 可以防止被用于 JDK 打包编译.

Java的优化内存配置

这里因为系统安装, 所以默认的启动脚本在 /lib/systemd/system/tomcat9.service 之中, 追加或修改以下配置:

# 最简单的配置, 后续可以按照需求自己来处理调优
# Xms: 初始化栈空间大小
# Xmx: 指定占用最大的栈空间大小
Environment="JAVA_OPTS=-Djava.awt.headless=true -Xms512m -Xmx4096m"

之后重新加载配置命令并重启:

sudo systemctl daemon-reload # 加载修改配置
sudo systemctl restart tomcat9.service # 重启服务

随机数生成器优化

这个配置众说纷纭, 有说是 bug, 又说是法律风险问题, 这里直接按照处理方法处理即可:

# 习惯性先看看该文件放置在哪里
sudo find / -name java.security
# 这里显示两个, 不清楚是不是链接符号, 先处理一个之后再看看下个会不会变动, 不会的情况再改
# /usr/lib/jvm/java-11-openjdk-amd64/conf/security/java.security
# /etc/java-11-openjdk/security/java.security
# 以下确认服务器已经安装好 Java, 不是 JDK
sudo vim /etc/java-11-openjdk/security/java.security # 进入文件内部

找到并替换以下内容:

#securerandom.source=file:/dev/random
securerandom.source=file:/dev/./urandom