VestaCPの現在のバージョンでは、インストールしてサーバーのIPにアクセスすると、VestaCPに追加した最新のWebサイトが返されます。
これは非常に多くのレベルで悪いことであり、脆弱性だと思います。たとえば、Cloudflareのようなサービスを使用してWebサイトをホストし、非表示にしている場合、Cloudflareを使用していても、攻撃者はShodan.ioやDDoSなどのサービスを使用してサーバーのIPを見つけることができます。別の例では、匿名のTOR Webサイトをホストしていますが、Shodan.ioを使用してサーバーのIPを見つけることができるため、anonymous部分が破壊されます。
IP経由でサーバーに直接アクセスしたときに444応答が返されるようにしたいと思います。
現在、これはVestaCPを使用してNGINX設定がどのように機能するかです:
/etc/nginx/nginx.conf:
# Server globals
user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log crit;
pid /var/run/nginx.pid;
# Worker config
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
# Main settings
sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_header_timeout 1m;
client_body_timeout 1m;
client_header_buffer_size 2k;
client_body_buffer_size 256k;
client_max_body_size 256m;
large_client_header_buffers 4 8k;
send_timeout 30;
keepalive_timeout 60 60;
reset_timedout_connection on;
server_tokens off;
server_name_in_redirect off;
server_names_hash_max_size 512;
server_names_hash_bucket_size 512;
# Log format
log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format bytes '$body_bytes_sent';
#access_log /var/log/nginx/access.log main;
access_log off;
# Mime settings
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Compression
gzip on;
gzip_comp_level 9;
gzip_min_length 512;
gzip_buffers 8 64k;
gzip_types text/plain text/css text/javascript text/js text/xml application/json application/javascript application/x-javascript application/xml application/xml+rss application/x-font-ttf image/svg+xml font/opentype;
gzip_proxied any;
gzip_disable "MSIE [1-6]\.";
# Proxy settings
proxy_redirect off;
proxy_set_header Host $Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Set-Cookie;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
# Cloudflare https://www.cloudflare.com/ips
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
#set_real_ip_from 2400:cb00::/32;
#set_real_ip_from 2606:4700::/32;
#set_real_ip_from 2803:f800::/32;
#set_real_ip_from 2405:b500::/32;
#set_real_ip_from 2405:8100::/32;
#set_real_ip_from 2c0f:f248::/32;
#set_real_ip_from 2a06:98c0::/29;
real_ip_header CF-Connecting-IP;
# SSL PCI Compliance
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
# Error pages
error_page 403 /error/403.html;
error_page 404 /error/404.html;
error_page 502 503 504 /error/50x.html;
# Cache settings
proxy_cache_path /var/cache/nginx levels=2 keys_zone=cache:10m inactive=60m max_size=1024m;
proxy_cache_key "$Host$request_uri $cookie_user";
proxy_temp_path /var/cache/nginx/temp;
proxy_ignore_headers Expires Cache-Control;
proxy_cache_use_stale error timeout invalid_header http_502;
proxy_cache_valid any 1d;
# Cache bypass
map $http_cookie $no_cache {
default 0;
~SESS 1;
~wordpress_logged_in 1;
}
# File cache settings
open_file_cache max=10000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors off;
# Wildcard include
include /etc/nginx/conf.d/*.conf;
}
ファイルの最後にあるように、.confで終わる/etc/nginx/conf.d/内のすべてのファイルが含まれています。
/etc/nginx/conf.d/ディレクトリには、92.222.36.xxx.conf、status.conf、およびVesta.confの3つの注目すべきファイルがあります。
92.222.36.xxx.conf:(デフォルトではこれはサーバーのパブリックIPであり、サーバーのIPを隠すために最後の3つの数字を削除しました)
server {
listen 92.222.36.xxx:80 default;
server_name _;
#access_log /var/log/nginx/92.222.36.xxx.log main;
location / {
proxy_pass http://92.222.36.xxx:8080;
}
}
私の知る限り、これはデフォルトとして使用され、定義されたserver_nameがないApache2にすべてのHTTP接続を転送します。
status.conf:
server {
listen 127.0.0.1:8084 default;
server_name _;
server_name_in_redirect off;
location / {
stub_status on;
access_log off;
}
}
NGINXのステータスを確認するために内部的に使用されます。
include /home/admin/conf/web/exampledomain.net.nginx.conf;
include /home/admin/conf/web/exampledomain.net.nginx.ssl.conf;
追加する新しいサイトごとに、これらのファイルが作成されます。
これらのファイルは次のようになります。
exampledomain.net.nginx.conf:
server {
listen 92.222.36.xxx:80;
server_name exampledomain.net www.exampledomain.net;
error_log /var/log/httpd/domains/exampledomain.net.error.log error;
location / {
proxy_pass http://92.222.36.xxx:8080;
location ~* ^.+\.(jpg|jpeg|gif|png|ico|svg|css|Zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|odt|ods|odp|odf|tar|wav|bmp|rtf|js|mp3|avi|mpeg|flv|html|htm)$ {
root /home/admin/web/exampledomain.net/public_html;
access_log /var/log/httpd/domains/exampledomain.net.log combined;
access_log /var/log/httpd/domains/exampledomain.net.bytes bytes;
expires max;
try_files $uri @fallback;
}
}
location /error/ {
alias /home/admin/web/exampledomain.net/document_errors/;
}
location @fallback {
proxy_pass http://92.222.36.xxx:8080;
}
location ~ /\.ht {return 404;}
location ~ /\.svn/ {return 404;}
location ~ /\.git/ {return 404;}
location ~ /\.hg/ {return 404;}
location ~ /\.bzr/ {return 404;}
include /home/admin/conf/web/exampledomain.net.conf*;
}
server {
listen 92.222.36.xxx:443;
server_name exampledomain.net www.exampledomain.net;
ssl on;
ssl_certificate /home/admin/conf/web/ssl.exampledomain.net.pem;
ssl_certificate_key /home/admin/conf/web/ssl.exampledomain.net.key;
error_log /var/log/httpd/domains/exampledomain.net.error.log error;
location / {
proxy_pass https://92.222.36.xxx:8443;
location ~* ^.+\.(jpg|jpeg|gif|png|ico|svg|css|Zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|odt|ods|odp|odf|tar|wav|bmp|rtf|js|mp3|avi|mpeg|flv|html|htm)$ {
root /home/admin/web/exampledomain.net/public_html;
access_log /var/log/httpd/domains/exampledomain.net.log combined;
access_log /var/log/httpd/domains/exampledomain.net.bytes bytes;
expires max;
try_files $uri @fallback;
}
}
location /error/ {
alias /home/admin/web/exampledomain.net/document_errors/;
}
location @fallback {
proxy_pass https://92.222.36.xxx:8443;
}
location ~ /\.ht {return 404;}
location ~ /\.svn/ {return 404;}
location ~ /\.git/ {return 404;}
location ~ /\.hg/ {return 404;}
location ~ /\.bzr/ {return 404;}
include /home/admin/conf/web/snginx.exampledomain.net.conf*;
}
今、私はこれに92.222.36.xxx.confを編集しようとしました:
server {
listen 92.222.36.xxx:80 default;
server_name _;
#access_log /var/log/nginx/92.222.36.xxx.log main;
return 444;
}
そしてそれはうまくいくようで、ドメイン名を使用して私のウェブサイトにアクセスでき、IP経由でアクセスするとERR_EMPTY_RESPONSEになります
しかし、 https://92.222.36.xxx/ にアクセスしている間、ドメイン名のHTTPSバージョンが返されますが、これがトラブルの始まりです。
92.222.36.xxx.confでこれを試しました
server {
listen 92.222.36.xxx:80 default;
listen 92.222.36.xxx:443 default;
server_name _;
#access_log /var/log/nginx/92.222.36.xxx.log main;
return 444;
}
HTTPSを使用してIPを使用してサービスにアクセスすると、ERR_SSL_PROTOCOL_ERRORが返され、HTTPSを使用してドメイン名を使用してアクセスすると、ERR_SSL_PROTOCOL_ERRORも返されます。
私はこれを数時間修正しようとしましたが、できませんでした。
これを修正するための助けをいただければ幸いです。
ありがとうございました。
私は解決策を見つけましたが、それは完全に機能します。
これは、動作している92.222.36.xxx.confがどのように見えるかです:
server {
listen 92.222.36.xxx:80 default;
server_name _;
return 444;
}
server {
listen 92.222.36.xxx:443 default;
server_name _;
ssl on;
ssl_certificate /home/admin/conf/web/example.net.pem;
ssl_certificate_key /home/admin/conf/web/example.net.key;
return 444;
}
証明書と証明書キーはダミーです。サーバーでホストされている他のWebサイトのドメイン名が漏洩しないようにしてください。