وقتی Apache پشت پراکسی باشد، همتای اتصال خود پراکسی است. امشب مشخص می‌کنیم چه کسی اجازه دارد IP کلاینت را اعلام کند؛ اعتماد به هر هدر دریافتی allowlist را قابل دور زدن می‌کند.

این جلسه بخشی از دورهٔ آپاچی در ۵۰ شب است. قرارداد نام‌ها، مسیرها و روش اعمال تغییر را در راهنمای دوره بخوان.

محیط: یک Clone مستقل به نام edge روی .40؛ backend وب روی .10 یا .30. فایروال بستهٔ شب قبل به سیاست پایه برگشته باشد؛ برای همین آزمایش دسترسی .40 به پورت backend را نیز با قانون scoped اضافه کن و CA عمومی lab را روی edge داشته باش.

فقط یک همتای مورد اعتماد#

X-Forwarded-For فهرستی از آدرس‌های اعلام‌شده در زنجیرهٔ پراکسی است. در backend، ماژول remoteip را فعال کن؛ در Debian sudo a2enmod remoteip و در RHEL خروجی -M را بررسی کن. در VirtualHost حفاظت‌شده:

RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 192.168.56.40

در این lab کلاینت IP خصوصی دارد؛ RemoteIPInternalProxy برای پذیرش آدرس‌های خصوصی از همتای مشخص به‌کار می‌رود. RemoteIPTrustedProxy رفتار متفاوتی با آدرس‌های خصوصی اعلام‌شده دارد. دامنهٔ اعتماد را به IP دقیق edge محدود کن، نه کل subnet.

از قالب لاگ شب نهم استفاده کن: %a آدرس پس از پردازش و %{c}a همتای واقعی اتصال است. Require ip از آدرس پردازش‌شده استفاده خواهد کرد.

آزمون جعل مستقیم#

از .21 این درخواست را به مسیر IP-محور شب نوزدهم بفرست؛ اگر Basic شب بیستم فعال است credential معتبر را هم بده تا فقط شرط IP سنجیده شود:

curl --cacert ~/apache-lab/pki/ca.crt \
  --resolve www.example.test:443:192.168.56.10 \
  -H 'X-Forwarded-For: 192.168.56.20' https://www.example.test/admin/

نباید دسترسی بگیرد و %a باید .21 باقی بماند. همان اعلام آدرس از ماشین edge، با credential لازم، می‌تواند .20 را به policy تحویل دهد؛ این آزمایش دقیقاً قدرت اعطاشده به پراکسی را نشان می‌دهد.

در edge عمومی Apache، هدر ورودی مهاجم را در context VirtualHost با RequestHeader unset X-Forwarded-For early پاک کن و تولید هدر را به پراکسی بسپار. در زنجیرهٔ چند edge، اعتماد و ترتیب هدرها را طبق توپولوژی واقعی طراحی کن. برنامه نیز باید فقط هدرهای Apache مورد اعتماد را بپذیرد.

بازگشت: دو directive remoteip را بردار و لاگ همتای اتصال را دوباره بررسی کن. در محیط واقعی، firewall backend را نیز فقط برای edgeهای مورد اعتماد باز کن؛ دسترسی مستقیم نباید مسیر جایگزین عمومی باشد.

منبع: mod_remoteip .