我正在设置一个运行 nginx 的服务器,我需要一些配置技巧。例如,我的目标是确保只有访问主域的正确子域的人才能访问我的 nginx 面板。这意味着如果有人排除子域或使用我的服务器实际 IP 地址,我希望丢弃请求而不将任何数据发送回用户。
到目前为止,我认为以下内容做得很好,但是,我担心如果我在旨在丢弃无效 HTTPS 流量的默认块中指定实际的 SSL 证书,那么攻击者可以检查 SSL 证书并查看域。这主要是扫描仪的问题,扫描仪可以指定我的服务器 IP 地址,然后尝试确定其背后的域。所以,我想知道我是否可以指定一个虚拟证书或任何想法?
我的第二个问题是,当 nginx 确实被 ping 到时,它会因为某种原因从我的实际服务器 IP 地址获取像
favicons/apple-touch-icon.png
和 favicons/favicon-32x32.png
这样的图标,而不是使用云耀斑反向代理。这对我来说毫无意义,除非它是某种默认配置,在我设置它时硬编码到 nginx 中?我的最后一个问题也是最不重要的问题是,有没有办法隐藏细节,比如我正在使用 nginx?
# HTTP catch-all server block to drop all connections
server {
listen 80 default_server;
server_name _;
return 444; # No response for HTTP
}
# Catch-all server block to drop all connections that do not match defined server names
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/letsencrypt/live/example.net/fullchain.pem; # Needed for SSL to work on 443
ssl_certificate_key /etc/letsencrypt/live/example.net/privkey.pem;
return 444; # No response
}
server {
listen 80;
server_name examplePanel1.example.net;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name examplePanel1.example.net;
ssl_certificate /etc/letsencrypt/live/example.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.net/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.net/chain.pem;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM->
ssl_prefer_server_ciphers on;
# See https://hstspreload.org/ before uncommenting the line below.
# add_header Strict-Transport-Security "max-age=15768000; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header Content-Security-Policy "frame-ancestors 'self'";
add_header X-Frame-Options DENY;
add_header Referrer-Policy same-origin;
所以,我想知道我是否可以指定一个虚拟证书或任何想法?
当然。对于虚拟证书,您可以查看 this 示例,从 nginx 1.19.4 开始,您可以选择使用
ssl_reject_handshake
指令,这使得 default_server
块变得更加简单:
server {
listen 80 default_server;
listen 443 ssl http2 default_server;
ssl_reject_handshake on;
return 444;
}
openssl s_client
命令来检查可能的攻击者可以使用哪些证书信息,例如:
openssl s_client -showcerts -connect <IP>:443
我的第二个问题是,当 nginx 确实被 ping 通时,由于某种原因,它会从我的实际服务器 IP 地址获取诸如
和favicons/apple-touch-icon.png
之类的图标,而不是使用云耀斑反向代理。favicons/favicon-32x32.png
不知道这一点,也许这些是一些常见的图标文件名,此类请求用于检查服务器上是否托管有任何站点?
我的最后一个问题也是最不重要的问题是,有没有办法隐藏细节,比如我正在使用 nginx?
server_tokens
指令。