Рейтинг:0

апач за лаком; правила запрета htaccess игнорируются

флаг de

Итак, у меня есть веб-сайт WordPress, работающий за nginx -> лак -> httpd

Правило htaccess для wp-login.php установлено как:

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

Раньше это работало нормально без использования лака, но когда я поместил лак посередине между nginx и httpd, возникла проблема с кэшированием или переадресацией IP.

Поскольку я могу легко изменить конфигурацию веб-сервера, я могу легко отключить/включить лак для сайта. Итак, в качестве теста я изменил правило htaccess на:

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

Это сделало wp-login доступным для всех. Затем я отключил лак и оставил публичный IP-адрес сервера в htaccess, и теперь никто не может получить доступ к странице (что и должно произойти).

Итак, виноват лак.

У меня настроен mod_cloudflare на apache. Я также проверил, переключив его на mod_remoteip, но безрезультатно.

Вот мои шаблоны vhost nginx: 443, лак: 82 и apache: 8181 (этот IP-адрес 108.148.54.124 является примером для общедоступного IP-адреса сервера):

сервер {
    слушать 108.148.54.124:443 ssl http2;
    server_name %domain_idn% %alias_idn%;
    
    access_log /usr/local/apache/domlogs/%domain%.bytes bytes;
    журнал доступа /usr/local/apache/domlogs/%domain%.log заполнен;
    error_log /usr/local/apache/domlogs/%domain%.error.log ошибка;

    ssl_certificate %ssl_cert_path%/%domain%.bundle;
    ssl_certificate_key %ssl_key_path%/%domain%.key;
    ssl_протоколы 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;
    ssl_prefer_server_ciphers включен;

    ssl_session_cache общий: SSL: 10 м;
    ssl_session_timeout 60 м;

    место расположения / {
        расположение ~.*\.(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)$ {
            корень %docroot%;
            истекает макс.;
            try_files $uri $uri/ @backend;
        }
        
        error_page 405 = @backend;
        error_page 500 = @custom;
        add_header X-Cache «УДАЛ из бэкенда»;
        add_header Strict-Transport-Security "max-age=31536000";
        add_header X-XSS-Защита "1; режим = блок" всегда;
        add_header X-Content-Type-Options «нюхать» всегда;
        proxy_pass %proxy_protocol%://108.148.54.124:82;
        включить proxy.inc;
    }

    местоположение @backend {
        внутренний;
        proxy_pass %proxy_protocol%://108.148.54.124:82;
        включить proxy.inc;
    }

    местоположение @custom {
        внутренний;
        proxy_pass %proxy_protocol%://108.148.54.124:82;
        включить proxy.inc;
    }

    расположение ~ .*\.(php|jsp|cgi|pl|py)?$ {
        proxy_pass %proxy_protocol%://108.148.54.124:82;
        включить proxy.inc;
    }

    местоположение ~ /\.ht {запретить все;}
    местоположение ~ /\.svn/ {запретить все;}
    местоположение ~ /\.git/ {запретить все;}
    местоположение ~ /\.hg/ {запретить все;}
    расположение ~ /\.bzr/ {запретить все;}
    location ~\.(ini|log|conf)$ {запретить все;error_page 403 =404 / ;}

    disable_symlinks if_not_owner from=%docroot%;

    местоположение /.well-known/acme-challenge {
        default_type "текст/обычный";
        псевдоним /usr/local/apache/autossl_tmp/.well-known/acme-challenge;
    }

    местоположение /.well-known/pki-validation {
        default_type "текст/обычный";
        псевдоним /usr/local/apache/autossl_tmp/.well-known/acme-challenge;
    }
}
.....
серверная часть %backend_domain% {
    .хост = "108.148.54.124";
    .порт = "8181";
}

суб vcl_recv {
    если (req.http.host ~ "%domain%") {
        установить req.backend_hint = %backend_domain%;

        # Всегда кэшировать следующие типы файлов для всех пользователей.
        если (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$") {
            отключить req.http.Cookie;
        }

        # Удалите все файлы cookie на основе Google Analytics
        установить req.http.Cookie = regsuball(req.http.Cookie, "has_js=[^;]+(; )?", "");
        установить req.http.Cookie = regsuball(req.http.Cookie, "__utm.=[^;]+(; )?", "");
        установить req.http.Cookie = regsuball(req.http.Cookie, "_ga=[^;]+(; )?", "");
        установить req.http.Cookie = regsuball(req.http.Cookie, "utmctr=[^;]+(; )?", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "utmcmd.=[^;]+(; )?", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "utmccn.=[^;]+(; )?", "");

        # Не кэшировать запросы AJAX.
        если (req.http.X-Requested-With == "XMLHttpRequest") {
            вернуться (пройти);
        }

        # Почтовые запросы не будут кэшироваться
        if (req.http.Authorization || req.method == "POST") {
            вернуться (пройти);
        }
        if (req.method!= "GET" && req.method!= "HEAD") {
            вернуться (пройти);
        }

        # Не кэшировать авторизованные запросы.
        если (треб.http.Авторизация) {
            вернуться (пройти);
        }

        # Прохождение LetsEncrypt Certbot
        if (req.url ~ "^/\.well-known/acme-challenge/") {
            вернуться (пройти);
        }

        if (req.url ~ "^/\.well-known/pki-validation/") {
            вернуться (пройти);
        }

        # Переадресация IP клиента на серверную часть
        если (треб. перезапусков == 0) {
            если (треб.http.X-Real-IP) {
                установить req.http.X-Forwarded-For = req.http.X-Real-IP;
            } иначе если (req.http.X-Forwarded-For) {
                установить req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
            } еще {
                установить req.http.X-Forwarded-For = client.ip;
            }
        }

        ### Вордпресс ###
        if (req.url ~ "(wp-admin|post\.php|edit\.php|wp-логин)") {
            вернуться (пройти);
        }
        if (req.url ~ "/wp-cron.php" || req.url ~ "preview=true") {
            вернуться (пройти);
        }

        # WP-партнерка
        если ( req.url ~ "\?ref=" ) {
            вернуться (пройти);
        }

        set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-1=[^;]+(; )?", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-time-1=[^;]+(; )?", "");
        установить req.http.Cookie = regsuball(req.http.Cookie, "wordpress_test_cookie=[^;]+(; )?", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "PHPSESSID=[^;]+(; )?", "");

        возврат (хэш);
    }
}
<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>

и это основной файл конфигурации nginx:

пользователь никто;
рабочие_процессы авто;
#worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log крит;
pid /var/run/nginx.pid;

События {
    worker_connections 1024;
    использовать эполл;
    мульти_принять;

}
http {
    отправить файл включен;
    tcp_nopush включен;
    tcp_nodelay включен;
    client_header_timeout 3 минуты;
    client_body_timeout 3 м;
    client_max_body_size 256 м;
    client_header_buffer_size 4k;
    client_body_buffer_size 256 КБ;
    large_client_header_buffers 4 32 КБ;
    send_timeout 3 м;
    keepalive_timeout 60 60;
    reset_timedout_connection включен;
    server_names_hash_max_size 1024;
    server_names_hash_bucket_size 1024;
    ignore_invalid_headers включено;
    connection_pool_size 256;
    request_pool_size 4 КБ;
    output_buffers 4 32k;
    отложить_выход 1460;

    включить mime.types;
    default_type application/octet-stream;

    # Сжатие gzip
    gzip включен;
    gzip_vary включен;
    gzip_disable "MSIE [1-6]\.";
    gzip_proxy любой;
    gzip_min_length 512;
    gzip_comp_level 6;
    gzip_buffers 8 64k;
    gzip_types text/простой текст/xml text/css text/js application/x-javascript application/xml image/png image/x-icon image/gif image/jpeg image/svg+xml application/xml+rss text/javascript application/ приложение atom+xml/приложение javascript/приложение json/шрифт x-font-ttf/opentype;

    # Настройки прокси
    прокси_перенаправление выключено;
    proxy_set_header Хост $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 300;
    proxy_send_timeout 300;
    proxy_read_timeout 300;
    proxy_buffers 32 4k;
    proxy_cache_path /var/cache/nginx level=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 Истекает Cache-Control;
    proxy_cache_use_stale ошибка timeout invalid_header http_502;
    proxy_cache_valid любой 1d;

    open_file_cache_valid 120 с;
    open_file_cache_min_uses 2;
    open_file_cache_errors выключен;
    open_file_cache макс. = 5000 неактивных = 30 с;
    open_log_file_cache max=1024 inactive=30s min_uses=2;

    # Настройки SSL
    ssl_session_cache общий: SSL: 10 м;
    ssl_протоколы TLSv1.3;
    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";

    # Журналы
    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 full '[$time_local] $remote_addr $remote_user - "$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 основной;
    доступ_лог выключен;

    # Обход кеша
    карта $http_cookie $no_cache {
        по умолчанию 0;
        ~СЕСС 1;
        ~wordpress_logged_in 1;
    }

    # Включить дополнительную конфигурацию
    включить /etc/nginx/cloudflare.inc;
    включить /etc/nginx/conf.d/*.conf;
}
iraqiboy90 avatar
флаг de
Статус сервера для apache показывает только IP-адрес сервера в качестве клиента, независимо от того, включен ли лак или нет.
Рейтинг:0
флаг in

X-вперед-для заголовок должен содержать IP-адрес клиента. Этот заголовок будет установлен Nginx, а также будет использоваться Varnish.

Возможно, что X-вперед-для заголовок выглядит так:

X-Forwarded-For: 1.2.3.4, 5.6.7.8

Это вопрос извлечения первого значения и сопоставления с ним в вашем .htaccess файл.

В этой статье представлен простой способ выполнить разрешить от звонки в зависимости от стоимости X-переадресовано-для заголовок: Apache, используйте X-Forwarded-For для разрешения

Это может привести к следующей конфигурации:

<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>

Вы также можете ограничить доступ к wp-login.php в вашей конфигурации Nginx или в вашем Varnish VCL.

iraqiboy90 avatar
флаг de
Спасибо, но это почти повторяет тот же ответ, который я написал выше ... Единственное, что я не упомянул в вопросе, это то, почему я вообще пытался «разрешить с IP-адреса СЕРВЕРА». Это было из-за того, что mod_security блокировал некоторые запросы, сделанные сервером, поэтому я внес сервер в белый список, в результате чего все были внесены в белый список из mod_security, что привело меня к тому, что белый список при наличии лака перед apache будет проблемой.
Рейтинг:0
флаг de

Я только что нашел решение, которое должно использовать это вместо этого

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

Я также могу поместить SetEnvIf снаружи, то есть вверху файла htaccess, и просто менять ip в этой строке каждый раз, когда мой IP меняется.

SetEnvIf X-Forwarded-For %Client_IP% allow_me
<Файлы wp-login.php>
Разрешить из env=allow_me
отрицать от всех
</файлы>

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.