Điểm:0

apache đằng sau véc ni; quy tắc từ chối htaccess bị bỏ qua

lá cờ de

Vì vậy, tôi có một trang web wordpress chạy phía sau nginx -> varnish -> httpd

Quy tắc htaccess cho wp-login.php được đặt là:

<Files wp-login.php>
allow from client ip
deny from all
</Files>

Điều này từng hoạt động tốt mà không cần sử dụng véc ni, nhưng khi tôi đặt véc ni ở giữa nginx và httpd, sự cố bộ đệm hoặc sự cố chuyển tiếp IP này bắt đầu xảy ra.

Vì tôi có thể dễ dàng thay đổi cấu hình máy chủ web nên tôi có thể vô hiệu hóa/bật vecni cho một trang web một cách dễ dàng. Vì vậy, để thử nghiệm, tôi đã thay đổi quy tắc htaccess thành:

<Files wp-login.php>
allow from Server Public IP
deny from all
</Files>

Điều này làm cho wp-login có thể truy cập được cho tất cả mọi người. Sau đó, tôi đã vô hiệu hóa véc ni và giữ IP công khai của Máy chủ trong htaccess, và bây giờ không ai có thể truy cập trang (đó là điều đáng lẽ phải xảy ra).

Vì vậy, thủ phạm là vecni.

Tôi đã thiết lập mod_cloudflare trên apache. Tôi cũng đã thử nghiệm bằng cách chuyển nó sang mod_remoteip nhưng không có kết quả.

Đây là các mẫu vhost nginx:443, varnish:82 và apache:8181 của tôi (IP 108.148.54.124 này là một ví dụ cho IP công khai của máy chủ):

người phục vụ {
    nghe 108.148.54.124:443 ssl http2;
    server_name %domain_idn% %alias_idn%;
    
    access_log /usr/local/apache/domlogs/%domain%.bytes byte;
    access_log /usr/local/apache/domlogs/%domain%.log đầy đủ;
    error_log /usr/local/apache/domlogs/%domain%.error.log lỗi;

    ssl_certificate %ssl_cert_path%/%domain%.bundle;
    ssl_certificate_key %ssl_key_path%/%domain%.key;
    ssl_protocols TLSv1.3;
    ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA!RC4:EECDH:!RC4:!aNULL :!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
    bật ssl_prefer_server_ciphers;

    ssl_session_cache được chia sẻ:SSL:10m;
    ssl_session_timeout 60m;

    địa điểm / {
        vị trí ~.*\.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|html|htm|txt |js|css|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso|woff|ttf|svg|eot|sh|webp)$ {
            gốc %docroot%;
            hết hạn tối đa;
            try_files $uri $uri/ @backend;
        }
        
        error_page 405 = @backend;
        error_page 500 = @custom;
        add_header X-Cache "HIT từ phụ trợ";
        add_header Strict-Transport-Security "max-age=31536000";
        add_header X-XSS-Protection "1; mode=block" luôn luôn;
        add_header X-Content-Type-Options "nosniff" luôn;
        proxy_pass %proxy_protocol%/108.148.54.124:82;
        bao gồm proxy.inc;
    }

    vị trí @backend {
        nội bộ;
        proxy_pass %proxy_protocol%/108.148.54.124:82;
        bao gồm proxy.inc;
    }

    vị trí @custom {
        nội bộ;
        proxy_pass %proxy_protocol%/108.148.54.124:82;
        bao gồm proxy.inc;
    }

    vị trí ~ .*\.(php|jsp|cgi|pl|py)?$ {
        proxy_pass %proxy_protocol%/108.148.54.124:82;
        bao gồm proxy.inc;
    }

    vị trí ~ /\.ht {từ chối tất cả;}
    vị trí ~ /\.svn/ {từ chối tất cả;}
    vị trí ~ /\.git/ {từ chối tất cả;}
    vị trí ~ /\.hg/ {từ chối tất cả;}
    vị trí ~ /\.bzr/ {từ chối tất cả;}
    vị trí ~\.(ini|log|conf)$ {từ chối tất cả;error_page 403 =404 / ;}

    disable_symlinks if_not_owner from=%docroot%;

    vị trí /.well-known/acme-challenge {
        default_type "text/plain";
        bí danh /usr/local/apache/autossl_tmp/.well-known/acme-challenge;
    }

    vị trí /.well-known/pki-validation {
        default_type "text/plain";
        bí danh /usr/local/apache/autossl_tmp/.well-known/acme-challenge;
    }
}
.....
phụ trợ %backend_domain% {
    .host = "108.148.54.124";
    .port = "8181";
}

phụ vcl_recv {
    if (req.http.host ~ "%domain%") {
        đặt req.backend_hint = %backend_domain%;

        # Luôn lưu trữ các loại tệp sau cho tất cả người dùng.
        if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$") {
            hủy đặt req.http.Cookie;
        }

        # Xóa mọi cookie dựa trên Google Analytics
        đặt req.http.Cookie = regsuball(req.http.Cookie, "has_js=[^;]+(; )?", "");
        đặt req.http.Cookie = regsuball(req.http.Cookie, "__utm.=[^;]+(; )?", "");
        đặt req.http.Cookie = regsuball(req.http.Cookie, "_ga=[^;]+(; )?", "");
        đặt req.http.Cookie = regsuball(req.http.Cookie, "utmctr=[^;]+(; )?", "");
        đặt req.http.Cookie = regsuball(req.http.Cookie, "utmcmd.=[^;]+(; )?", "");
        đặt req.http.Cookie = regsuball(req.http.Cookie, "utmccn.=[^;]+(; )?", "");

        # Không lưu trữ các yêu cầu AJAX.
        if (req.http.X-Requested-With == "XMLHttpRequest") {
            trả lại (vượt qua);
        }

        # Yêu cầu bài viết sẽ không được lưu trữ
        if (req.http.Authorization || req.method == "POST") {
            trở về (vượt qua);
        }
        if (req.method != "GET" && req.method != "HEAD") {
            trở về (vượt qua);
        }

        # Không lưu trữ các yêu cầu được ủy quyền.
        nếu (req.http.Authorization) {
            trả lại (vượt qua);
        }

        # LetsEncrypt xác nhận certbot
        if (req.url ~ "^/\.well-known/acme-challenge/") {
            trở về (vượt qua);
        }

        if (req.url ~ "^/\.well-known/pki-validation/") {
            trở về (vượt qua);
        }

        # Chuyển tiếp IP của khách hàng đến phụ trợ
        nếu (req.restarts == 0) {
            nếu (req.http.X-Real-IP) {
                đặt req.http.X-Forwarded-For = req.http.X-Real-IP;
            } khác nếu (req.http.X-Forwarded-For) {
                đặt req.http.X-Forwarded-For = req.http.X-Forwarded-For + "," + client.ip;
            } khác {
                đặt req.http.X-Forwarded-For = client.ip;
            }
        }

        ### Wordpress ###
        if (req.url ~ "(wp-admin|post\.php|edit\.php|wp-login)") {
            trả lại (vượt qua);
        }
        if (req.url ~ "/wp-cron.php" || req.url ~ "preview=true") {
            trở về (vượt qua);
        }

        # WP-Chi nhánh
        nếu ( req.url ~ "\?ref=" ) {
            trở về (vượt qua);
        }

        đặt req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-1=[^;]+(; )?", "");
        đặt req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-time-1=[^;]+(; )?", "");
        đặt req.http.Cookie = regsuball(req.http.Cookie, "wordpress_test_cookie=[^;]+(; )?", "");
        đặt req.http.Cookie = regsuball(req.http.Cookie, "PHPSESSID=[^;]+(; )?", "");

        trả lại (băm);
    }
}
<VirtualHost 108.148.54.124:8443>
    ServerName %domain_idn%
    %domain_aliases%
    ServerAdmin webmaster@%domain%
    DocumentRoot %docroot%
    UseCanonicalName Off
    ScriptAlias /cgi-bin/ %docroot%/cgi-bin/

    CustomLog /usr/local/apache/domlogs/%domain%.bytes bytes
    CustomLog /usr/local/apache/domlogs/%domain%.log combined
    ErrorLog /usr/local/apache/domlogs/%domain%.error.log

    ## Custom settings are loaded below this line (if any exist)
    # IncludeOptional "/usr/local/apache/conf/userdata/%user%/%domain%/*.conf"

    SSLEngine on
    SSLCertificateFile %ssl_cert_path%/%domain%.cert
    SSLCertificateKeyFile %ssl_key_path%/%domain%.key
    SSLCertificateChainFile %ssl_cert_path%/%domain%.bundle
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown

    <IfModule mod_userdir.c>
        UserDir disabled
        UserDir enabled %user%
    </IfModule>

    <IfModule mod_suexec.c>
        SuexecUserGroup %user% %group%
    </IfModule>

    <IfModule mod_suphp.c>
        suPHP_UserGroup %user% %group%
        suPHP_ConfigPath %home%/%user%
    </IfModule>

    <IfModule mod_ruid2.c>
        RMode config
        RUidGid %user% %group%
    </IfModule>

    <IfModule itk.c>
        AssignUserID %user% %group%
    </IfModule>

    <Directory "%docroot%">
        AllowOverride All
        SSLRequireSSL
        Require all granted
    </Directory>

    <IfModule proxy_fcgi_module>
        <FilesMatch \.php$>
            SetHandler "proxy:%backend_fcgi%|fcgi://localhost"
        </FilesMatch>
    </IfModule>

</VirtualHost>

và đây là tệp conf nginx chính:

người dùng không ai;
worker_processes tự động;
#worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log crit;
pid /var/run/nginx.pid;

sự kiện {
    công_nhân kết_nối 1024 ;
    sử dụng epoll;
    multi_accept on;

}
http {
    gửi tệp trên;
    bật tcp_nopus;
    bật tcp_nodelay;
    client_header_timeout 3 phút;
    client_body_timeout 3 phút;
    client_max_body_size 256m;
    client_header_buffer_size 4k;
    client_body_buffer_size 256k;
    large_client_header_buffers 4 32k;
    gửi_thời gian chờ 3 phút;
    keepalive_timeout 60 60;
    reset_timedout_connection bật;
    server_names_hash_max_size 1024;
    server_names_hash_bucket_size 1024;
    bỏ qua_invalid_headers bật;
    kết_nối_pool_size 256;
    request_pool_size 4k;
    đầu ra_bộ đệm 4 32k;
    hoãn_xuất 1460 ;

    bao gồm mime.types;
    ứng dụng default_type/octet-stream;

    # Nén gzip
    bật gzip;
    bật gzip_vary;
    gzip_disable "MSIE [1-6]\.";
    gzip_proxied bất kỳ;
    gzip_min_length 512;
    gzip_comp_level 6;
    gzip_buffers 8 64k;
    văn bản gzip_types/văn bản thuần túy/văn bản xml/văn bản css/ứng dụng js/ứng dụng x-javascript/hình ảnh xml/hình ảnh png/hình ảnh biểu tượng x/hình ảnh gif/hình ảnh jpeg/ứng dụng svg+xml/văn bản xml+rss/ứng dụng javascript/ ứng dụng nguyên tử + xml/ứng dụng javascript/ứng dụng json/phông chữ x-font-ttf/opentype;

    # Cài đặt proxy
    proxy_redirect tắt;
    proxy_set_header Máy chủ lưu trữ $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass_header Đặt cookie;
    proxy_connect_timeout 300;
    proxy_send_timeout 300;
    proxy_read_timeout 300;
    proxy_buffers 32 4k;
    proxy_cache_path /var/cache/nginx levels=2 keys_zone=cache:10m inactive=60m max_size=512m;
    proxy_cache_key "$host$request_uri $cookie_user";
    proxy_temp_path /var/cache/nginx/temp;
    proxy_ignore_headers Hết hạn kiểm soát bộ đệm;
    hết thời gian chờ lỗi proxy_cache_use_stale invalid_header http_502;
    proxy_cache_valid 1 ngày bất kỳ;

    open_file_cache_valid 120s;
    open_file_cache_min_uses 2;
    open_file_cache_errors tắt;
    open_file_cache max=5000 không hoạt động=30s;
    open_log_file_cache max=1024 không hoạt động=30s min_uses=2;

    # Cài đặt SSL
    ssl_session_cache được chia sẻ:SSL:10m;
    ssl_protocols TLSv1.3;
    bật ssl_prefer_server_ciphers;
    ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA!RC4:EECDH:!RC4:! aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";

    # Nhật ký
    log_format chính '$remote_addr - $remote_user [$time_local] $request '
                        '"$status" $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
    log_format full '[$time_local] $remote_addr $remote_user - "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"';
    byte log_format '$body_bytes_sent';
    #access_log /var/log/nginx/access.log chính;
    truy cập_đăng xuất;

    # Bỏ qua bộ đệm
    bản đồ $http_cookie $no_cache {
        mặc định 0;
        ~PHẦN 1;
        ~wordpress_logged_in 1;
    }

    # Bao gồm cấu hình bổ sung
    bao gồm /etc/nginx/cloudflare.inc;
    bao gồm /etc/nginx/conf.d/*.conf;
}
iraqiboy90 avatar
lá cờ de
Trạng thái máy chủ cho apache chỉ hiển thị IP Máy chủ là máy khách cho dù véc ni có được bật hay không.
Điểm:0
lá cờ de

Tôi vừa tìm thấy một giải pháp, đó là sử dụng cái này thay thế

<Files wp-login.php>
SetEnvIf X-Forwarded-For %Client_IP% allow_me
Allow from env=allow_me
deny from all
</Files>

Tôi cũng có thể đặt SetEnvIf bên ngoài, tức là ở đầu tệp htaccess và chỉ cần thay đổi ip trên dòng này mỗi khi IP của tôi thay đổi.

SetEnvIf X-Forwarded-For %Client_IP% allow_me
<Tệp wp-login.php>
Cho phép từ env=allow_me
tư chôi tât cả
</Tệp>
Điểm:0
lá cờ in

Các X-Forward-For tiêu đề phải chứa địa chỉ IP của máy khách. Tiêu đề này sẽ được đặt bởi Nginx và cũng sẽ được sử dụng bởi Varnish.

Có thể là X-Forward-For tiêu đề trông như thế này:

X-Forwarded-For: 1.2.3.4, 5.6.7.8

Đó là vấn đề trích xuất giá trị đầu tiên và khớp với giá trị đó trong tập tin .htaccess.

Bài viết này cung cấp một cách dễ dàng để thực hiện cho phép từ cuộc gọi dựa trên giá trị của X-Forwarded-For tiêu đề: Apache, sử dụng X-Forwarded-For để cho phép

Điều này có thể chuyển thành cấu hình sau:

<Files wp-login.php>
    SetEnvIf X-Forwarded-For ^1\.2\.3\.4 proxy_env
    Order allow,deny
    Satisfy Any
    Allow from env=proxy_env
    Deny from all
</Files>

Bạn cũng có thể hạn chế quyền truy cập vào wp-đăng nhập.php trong cấu hình Nginx của bạn hoặc trong VCL Varnish của bạn.

iraqiboy90 avatar
lá cờ de
Cảm ơn, nhưng điều này gần như lặp lại cùng một câu trả lời mà tôi đã viết ở trên... Điều duy nhất tôi không đề cập đến trong câu hỏi là tại sao tôi lại cố gắng "cho phép từ IP MÁY CHỦ" ngay từ đầu. Đó là vì mod_security đang chặn một số yêu cầu do máy chủ thực hiện, vì vậy tôi đã đưa máy chủ vào danh sách trắng, điều này khiến mọi người đều được đưa vào danh sách trắng từ mod_security, điều này đã dẫn tôi vào con đường đưa vào danh sách trắng trong khi có véc ni trước apache sẽ gặp rắc rối.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.