AWS ELB Apache получает IP-адрес клиента, избегая X-Forwarded-для подмены

#amazon-web-services #apache #apache2 #amazon-elb #x-forwarded-for

#amazon-web-services #apache #apache2 #amazon-elb #x-forwarded-для

Вопрос:

Из документов apache (https://httpd.apace.org/docs/2.4/mod/mod_remoteip.html ) мы реализовали следующее назначение на нашем сервере:

 RemoteIPHeader X-Forwarded-For
 

чтобы получить IP-адрес клиента, а не IP-адрес ELB. Однако мы не заметили, что ELB также добавляет все остальные X-Forwarded-For значения слева от этой строки. Таким образом, это небезопасный способ получения IP-адреса клиента.

Мы использовали LogFormat with "%{X-Forwarded-For}i" для проверки того, что передаваемые значения соответствуют задокументированным.

 192.168.0.0, 10.0.0.0
 

это то, что произошло бы, если 192.168.0.0 бы передавался заголовок и 10.0.0.0 был запрашивающим компьютером клиента. Стандартный запрос без заголовка будет:

 10.0.0.0
 

Есть ли способ извлечь самый правый IP-адрес? Я думал о чем-то вроде,

 RemoteIPHeader ('(?:d{1,3}[.]){3}d{1,3}

но не могу найти функцию в apache для настройки этого. Я мог бы сделать это на PHP, но тогда во всех моих журналах будут записаны неправильные IP-адреса.

Я пробовал:

 SetEnvIf X-Forwarded-For '((?:d{1,3}[.]){3}d{1,3})

но это не повлияло.

Обновить:

Конфигурация Apache выполняется с:

 LogFormat "%{%Y-%m-%d %H:%M:%S}t %a %u %A %p %m %U %q %>s "%{User-agent}i" %T/%D "%{X-Forwarded-For}i"" w3c_extended
CustomLog /var/log/httpd/example.com/access.log w3c_extended
 

В настоящее время я получаю либо:

 2021-02-27 14:29:06 10.0.21.150 - 10.0.20.222 443 GET /IPtest.php ?v=1 200 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" 0/2822 "73.149.97.219"
 

или

 2021-02-27 14:29:06 10.0.21.150 - 10.0.20.222 443 GET /IPtest.php ?v=1 200 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" 0/2822 "10.0.21.150, 73.149.97.219"
 

Мне нужно выполнить захват 73.149.97.219 в обоих сценариях.


Комментарии:

1. Когда вы используете remoteIP, вам не нужно использовать %{X-Forwarded-For}i , но %a, каков результат этого?

2. @on8tom не %a является адресом remoteaddr? Это передается как адрес ELB, 10.x.x.x.

3. Просто для ясности, если у клиента есть ip-адрес 1.2.3.4, но он добавляет свой собственный заголовок "x-forwarded-for: 192.2.0.1", тогда ELB изменяет заголовок x-forwarded for на "x-forwarded-for: 192.2.0.1, 1.2.3.4", и вас интересует только адрес 1.2.3.4?

4. @on8tom правильно

5. ну, разве%a не совсем то, что вы хотите?

Ответ №1:

Я тестирую с apache 2.4 и remoteIP

 RemoteIPHeader x-forwarded-for
 

Вам также необходимо сообщить вашему apache, какой внутренний IP-адрес вашего балансировщика нагрузки (обратный прокси-сервер). Не существует надежного простого способа определить этот внутренний IP-адрес, и он может быть "любым" RFC1918 (частным) IP-адресом
Итак, вам нужно добавить эти 3 подсети.

 RemoteIPTrustedProxy 10.0.0.0/8
RemoteIPTrustedProxy 172.16.0.0/12
RemoteIPTrustedProxy 192.168.0.0/16
 

а затем используйте %a для формата журнала

 LogFromat %a
 

я тестировал с

 RemoteIPTrustedProxy 127.0.0.1
LogFormat "%a %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"" combined
 

протестировано с помощью curl

 curl 127.0.0.1/so 
127.0.0.1 - - [27/Feb/2021:15:02:38  0100] "GET /so/ HTTP/1.1" 200 167 "-" "curl/7.52.1"

curl 127.0.0.1/so/ -H "x-forwarded-for:  1.2.3.4"
1.2.3.4 - - [27/Feb/2021:15:04:06  0100] "GET /so/ HTTP/1.1" 200 167 "-" "curl/7.52.1"

curl 127.0.0.1/so/ -H "x-forwarded-for:  8.5.4.1, 1.2.3.4"
1.2.3.4 - - [27/Feb/2021:15:04:31  0100] "GET /so/ HTTP/1.1" 200 167 "-" "curl/7.52.1"
 

Комментарии:

1. RemoteIPHeader x-forwarded-for прошел с моей глобальной сетью, как и ожидалось. RemoteIPTrustedProxy прошел с адресом локальной сети, RemoteIPInternalProxy прошел с другим адресом локальной сети. Я еще не тестировал заголовок forward, потому что стандартный запрос все еще должен отображаться. (Я использую LAN и private ip взаимозаменяемо)

2. Я не уверен, как интерпретировать ваш последний комментарий. но вы также можете добавить RemoteIPInternalProxy 10.0.0.0 / 8, чтобы доверять всем частным IP-адресам в подсети 10/8

3. Я добавил короткое обновление, это понятнее? Если этого ответа достаточно для этого, не могли бы вы указать краткий обзор, например RemoteIPHeader x-forwarded-fornRemoteIPTrustedProxy .... , или в каком порядке они должны идти. Возможно, у меня они неправильные, и один перезаписывает другой

Ответ №2:

Я столкнулся с этой проблемой в другом контексте - apache разрешал имена хостов из измененного X-Forwarded-For заголовка. Например. X-Forwarded-For: mumblemuble.burpcollaborator.com, 1.1.1.1, anotherdomainapachewillresolve.com

Мое решение состояло в том, чтобы изменить X-Forwarded-For заголовок, чтобы включать только IP-адрес, добавленный ELB, и отбрасывать IP-адреса, которые ELB добавил к заголовку.

Вместо других обратных прокси-серверов ELB добавляет существующие X-Forwarded-For адреса и имя хоста перед IP-адресом клиента. Для других обратных прокси-серверов вам следует изменить регулярное выражение, чтобы отбросить все после первой запятой.

 # because of "early", headers can only be set in a main server or virtual host context. 
RequestHeader edit  "X-Forwarded-For" "^(. ),(. )$" "$2" early
 

, X-Forwarded-For,)[0]
но не могу найти функцию в apache для настройки этого. Я мог бы сделать это на PHP, но тогда во всех моих журналах будут записаны неправильные IP-адреса.

Я пробовал:


но это не повлияло.

Обновить:

Конфигурация Apache выполняется с:


В настоящее время я получаю либо:


или


Мне нужно выполнить захват 73.149.97.219 в обоих сценариях.

Комментарии:

1. Когда вы используете remoteIP, вам не нужно использовать %{X-Forwarded-For}i , но %a, каков результат этого?

2. @on8tom не %a является адресом remoteaddr? Это передается как адрес ELB, 10.x.x.x.

3. Просто для ясности, если у клиента есть ip-адрес 1.2.3.4, но он добавляет свой собственный заголовок "x-forwarded-for: 192.2.0.1", тогда ELB изменяет заголовок x-forwarded for на "x-forwarded-for: 192.2.0.1, 1.2.3.4", и вас интересует только адрес 1.2.3.4?

4. @on8tom правильно

5. ну, разве%a не совсем то, что вы хотите?

Ответ №1:

Я тестирую с apache 2.4 и remoteIP


Вам также необходимо сообщить вашему apache, какой внутренний IP-адрес вашего балансировщика нагрузки (обратный прокси-сервер). Не существует надежного простого способа определить этот внутренний IP-адрес, и он может быть "любым" RFC1918 (частным) IP-адресом
Итак, вам нужно добавить эти 3 подсети.


а затем используйте %a для формата журнала


я тестировал с


протестировано с помощью curl


Комментарии:

1. RemoteIPHeader x-forwarded-for прошел с моей глобальной сетью, как и ожидалось. RemoteIPTrustedProxy прошел с адресом локальной сети, RemoteIPInternalProxy прошел с другим адресом локальной сети. Я еще не тестировал заголовок forward, потому что стандартный запрос все еще должен отображаться. (Я использую LAN и private ip взаимозаменяемо)

2. Я не уверен, как интерпретировать ваш последний комментарий. но вы также можете добавить RemoteIPInternalProxy 10.0.0.0 / 8, чтобы доверять всем частным IP-адресам в подсети 10/8

3. Я добавил короткое обновление, это понятнее? Если этого ответа достаточно для этого, не могли бы вы указать краткий обзор, например RemoteIPHeader x-forwarded-fornRemoteIPTrustedProxy .... , или в каком порядке они должны идти. Возможно, у меня они неправильные, и один перезаписывает другой

Ответ №2:

Я столкнулся с этой проблемой в другом контексте - apache разрешал имена хостов из измененного X-Forwarded-For заголовка. Например. X-Forwarded-For: mumblemuble.burpcollaborator.com, 1.1.1.1, anotherdomainapachewillresolve.com

Мое решение состояло в том, чтобы изменить X-Forwarded-For заголовок, чтобы включать только IP-адрес, добавленный ELB, и отбрасывать IP-адреса, которые ELB добавил к заголовку.

Вместо других обратных прокси-серверов ELB добавляет существующие X-Forwarded-For адреса и имя хоста перед IP-адресом клиента. Для других обратных прокси-серверов вам следует изменить регулярное выражение, чтобы отбросить все после первой запятой.


ip_is=$1
RemoteIPHeader %{ip_is}
но это не повлияло.

Обновить:

Конфигурация Apache выполняется с:


В настоящее время я получаю либо:


или


Мне нужно выполнить захват 73.149.97.219 в обоих сценариях.

Комментарии:

1. Когда вы используете remoteIP, вам не нужно использовать %{X-Forwarded-For}i , но %a, каков результат этого?

2. @on8tom не %a является адресом remoteaddr? Это передается как адрес ELB, 10.x.x.x.

3. Просто для ясности, если у клиента есть ip-адрес 1.2.3.4, но он добавляет свой собственный заголовок «x-forwarded-for: 192.2.0.1», тогда ELB изменяет заголовок x-forwarded for на «x-forwarded-for: 192.2.0.1, 1.2.3.4», и вас интересует только адрес 1.2.3.4?

4. @on8tom правильно

5. ну, разве%a не совсем то, что вы хотите?

Ответ №1:

Я тестирую с apache 2.4 и remoteIP


Вам также необходимо сообщить вашему apache, какой внутренний IP-адрес вашего балансировщика нагрузки (обратный прокси-сервер). Не существует надежного простого способа определить этот внутренний IP-адрес, и он может быть «любым» RFC1918 (частным) IP-адресом
Итак, вам нужно добавить эти 3 подсети.


а затем используйте %a для формата журнала


я тестировал с


протестировано с помощью curl


Комментарии:

1. RemoteIPHeader x-forwarded-for прошел с моей глобальной сетью, как и ожидалось. RemoteIPTrustedProxy прошел с адресом локальной сети, RemoteIPInternalProxy прошел с другим адресом локальной сети. Я еще не тестировал заголовок forward, потому что стандартный запрос все еще должен отображаться. (Я использую LAN и private ip взаимозаменяемо)

2. Я не уверен, как интерпретировать ваш последний комментарий. но вы также можете добавить RemoteIPInternalProxy 10.0.0.0 / 8, чтобы доверять всем частным IP-адресам в подсети 10/8

3. Я добавил короткое обновление, это понятнее? Если этого ответа достаточно для этого, не могли бы вы указать краткий обзор, например RemoteIPHeader x-forwarded-fornRemoteIPTrustedProxy .... , или в каком порядке они должны идти. Возможно, у меня они неправильные, и один перезаписывает другой

Ответ №2:

Я столкнулся с этой проблемой в другом контексте — apache разрешал имена хостов из измененного X-Forwarded-For заголовка. Например. X-Forwarded-For: mumblemuble.burpcollaborator.com, 1.1.1.1, anotherdomainapachewillresolve.com

Мое решение состояло в том, чтобы изменить X-Forwarded-For заголовок, чтобы включать только IP-адрес, добавленный ELB, и отбрасывать IP-адреса, которые ELB добавил к заголовку.

Вместо других обратных прокси-серверов ELB добавляет существующие X-Forwarded-For адреса и имя хоста перед IP-адресом клиента. Для других обратных прокси-серверов вам следует изменить регулярное выражение, чтобы отбросить все после первой запятой.


, X-Forwarded-For,)[0]

но не могу найти функцию в apache для настройки этого. Я мог бы сделать это на PHP, но тогда во всех моих журналах будут записаны неправильные IP-адреса.

Я пробовал:


но это не повлияло.

Обновить:

Конфигурация Apache выполняется с:


В настоящее время я получаю либо:


или


Мне нужно выполнить захват 73.149.97.219 в обоих сценариях.

Комментарии:

1. Когда вы используете remoteIP, вам не нужно использовать %{X-Forwarded-For}i , но %a, каков результат этого?

2. @on8tom не %a является адресом remoteaddr? Это передается как адрес ELB, 10.x.x.x.

3. Просто для ясности, если у клиента есть ip-адрес 1.2.3.4, но он добавляет свой собственный заголовок «x-forwarded-for: 192.2.0.1», тогда ELB изменяет заголовок x-forwarded for на «x-forwarded-for: 192.2.0.1, 1.2.3.4», и вас интересует только адрес 1.2.3.4?

4. @on8tom правильно

5. ну, разве%a не совсем то, что вы хотите?

Ответ №1:

Я тестирую с apache 2.4 и remoteIP


Вам также необходимо сообщить вашему apache, какой внутренний IP-адрес вашего балансировщика нагрузки (обратный прокси-сервер). Не существует надежного простого способа определить этот внутренний IP-адрес, и он может быть «любым» RFC1918 (частным) IP-адресом
Итак, вам нужно добавить эти 3 подсети.


а затем используйте %a для формата журнала


я тестировал с


протестировано с помощью curl


Комментарии:

1. RemoteIPHeader x-forwarded-for прошел с моей глобальной сетью, как и ожидалось. RemoteIPTrustedProxy прошел с адресом локальной сети, RemoteIPInternalProxy прошел с другим адресом локальной сети. Я еще не тестировал заголовок forward, потому что стандартный запрос все еще должен отображаться. (Я использую LAN и private ip взаимозаменяемо)

2. Я не уверен, как интерпретировать ваш последний комментарий. но вы также можете добавить RemoteIPInternalProxy 10.0.0.0 / 8, чтобы доверять всем частным IP-адресам в подсети 10/8

3. Я добавил короткое обновление, это понятнее? Если этого ответа достаточно для этого, не могли бы вы указать краткий обзор, например RemoteIPHeader x-forwarded-fornRemoteIPTrustedProxy .... , или в каком порядке они должны идти. Возможно, у меня они неправильные, и один перезаписывает другой

Ответ №2:

Я столкнулся с этой проблемой в другом контексте — apache разрешал имена хостов из измененного X-Forwarded-For заголовка. Например. X-Forwarded-For: mumblemuble.burpcollaborator.com, 1.1.1.1, anotherdomainapachewillresolve.com

Мое решение состояло в том, чтобы изменить X-Forwarded-For заголовок, чтобы включать только IP-адрес, добавленный ELB, и отбрасывать IP-адреса, которые ELB добавил к заголовку.

Вместо других обратных прокси-серверов ELB добавляет существующие X-Forwarded-For адреса и имя хоста перед IP-адресом клиента. Для других обратных прокси-серверов вам следует изменить регулярное выражение, чтобы отбросить все после первой запятой.