Рейтинг:1

настроить nginx, чтобы он требовал определенных условий местоположения для всех, кроме данного исходного IP-адреса

флаг de

Я ищу настройку, в которой я хотел бы иметь клиентские сертификаты SSL для всех, кроме одного исходного IP-адреса.

Моя идея состоит в том, чтобы установить

 ssl_verify_client необязательно;

и добавить сложный оператор if к местоположениям. Однако я не знаю, как написать такой оператор if.

  # для этого требуются клиентские сертификаты ssl для всех местоположений
  место расположения / {
    если ($ ssl_client_verify! = "УСПЕХ") { 
       вернуть 403; 
    ...
  }

  # теперь, что написать, чтобы требовать ssl-сертификаты, за исключением случаев, когда исходный IP-адрес, например, 1.2.3.4
  местоположение / два {
    если (?????) { 
       вернуть 403; 
    ...
  }

Изменить: дополнительная информация

Переключатель ssl_verify_client со значением по желанию сообщает клиентам, что они могут, но не обязаны отправлять клиентские сертификаты.

Итак, проверив переменную $var_ssl_client_verify Я могу видеть, был ли сертификат клиента представлен и действителен (УСПЕХ) или не. Это правило должно применяться ко всем клиентам, у которых нет данного исходного IP. Для одного конкретного исходного IP я не хочу проверять клиентские сертификаты.

Мне нужно что-то вроде

    если ($ ssl_client_verify! = "УСПЕХ" и source_ip! = 1.2.3.4) { 
       вернуть 403; 
    }

Редактировать 2: Я изменил название с настроить nginx так, чтобы клиентские сертификаты требовались для всех, кроме заданного IP-адреса источника к настроить nginx, чтобы он требовал определенных условий местоположения для всех, кроме данного исходного IP-адреса поскольку то, с чем я действительно борюсь, не имеет ничего общего с клиентскими сертификатами, а с объединением операторов if и условной фильтрацией исходного IP-адреса.

флаг us
Использование `if` внутри местоположений не работает так, как вы ожидаете: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
Рейтинг:1
флаг sv

Несколько условий не поддерживаются в Nginx для если утверждение. Таким образом, в качестве обходного пути и поскольку IP-адрес клиента оценивается в нашем случае использования, решение может быть достигнуто аналогично тому, как оно было достигнуто в https://www.nginx.com/blog/rate-limiting-nginx/#Advanced-Configuration-Examples . В принципе, решение выглядит так...

гео $лимит {
    по умолчанию 1;
    1.2.3.4 0; #пожалуйста, замените IP-адрес примера фактическим IP-адресом.
}

ssl_verify_client необязательно;
ssl_client_certificate /path/to/cert.pem;

карта $limit $limit_key {
    0 "УСПЕХ";
    1 $ssl_client_verify;
}

сервер {
    # ... другие директивы
    место расположения / {
        если ( $limit_key != 'УСПЕХ' ) { return 403; }
        # ... другие директивы
    }
}

По сути, мы присваиваем значение «УСПЕХ» переменной для конкретного IP. Для каждого другого IP мы присваиваем фактическое значение $ssl_client_verify.

Альтернативный ответ

ssl_verify_client необязательно;
ssl_client_certificate /path/to/cert.pem;
сервер {
    # ... другие директивы
    
    # начальное значение переменной $ является фактическим значением $ssl_client_verify
    установить $переменную $ssl_client_verify;

    # здесь мы переназначаем переменную $ с "SUCCESS" для нашего конкретного IP
    # пожалуйста, замените 1.2.3.4 фактическим IP
    если ( $remote_addr = "1.2.3.4" ) {
        установить переменную $ "УСПЕХ";
    }

    место расположения / {
        если ( $переменная != 'УСПЕХ' ) { return 403; }
        # ... другие директивы
    }
}
флаг sv
@gelonida Извиняюсь за неправильное понимание вашего вопроса изначально.
gelonida avatar
флаг de
Спасибо за Ваш ответ. Это должно сделать работу. Таким образом, идея состоит в том, чтобы использовать `geo` для сопоставления исходного IP-адреса, операторы `map` для создания одной переменной, которую, наконец, можно использовать в `if ( $variable != "SUCCESS") { return 403; }` По поводу первоначального непонимания. Это заставило меня переписать свой вопрос (надеюсь) менее двусмысленным и более общим. Я отмечу вопрос как ОК, как только у меня будет возможность протестировать его в своей среде. На самом деле мой сценарий немного сложнее, так как IP-адрес будет определяться через прокси-протокол.
флаг sv
@gelonida Вы правы. См. обновленный ответ, который включает альтернативное решение.
gelonida avatar
флаг de
Альтернативный ответ работает для меня. Первый пока не пробовал.
флаг sv
Рад узнать, что это сработало.

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

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