Apache httpd: Bagaimana saya bisa menolak dari semua, Izinkan dari subnet, tetapi menolak dari IP dalam subnet itu?


26

Saya menjalankan CentOS 5.5 dengan stok Apache httpd-2.2.3.

Saya telah mengaktifkan mod_status di Lokasi / status server. Saya ingin mengizinkan akses ke Lokasi tunggal ini dengan cara berikut:

  1. Tolak semua
  2. Izinkan dari subnet 192.168.16.0/24
  3. Tolak dari IP 192.168.16.100, yang berada dalam subnet 192.168.16.0/24.

1 & 2 itu mudah. Namun, karena saya "Izinkan dari 192.168.16.0/24", apakah mungkin untuk Menolak dari 192.168.16.100?

Saya mencoba menambahkan pernyataan Deny untuk 192.168.16.100 tetapi tidak berhasil. Berikut adalah konfigurasi yang relevan:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Atau:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Namun, ini tidak mencegah akses ke halaman khusus ini, seperti yang ditunjukkan dalam Access log:

www.example.org 192.168.16.100 - - [11/Mar/2011:16:01:14 -0800] "GET /server-status HTTP/1.1" 200 9966 "-" "

Menurut manual untuk mod_authz_host :

Memungkinkan menyangkal

Pertama, semua arahan Allow dievaluasi; setidaknya satu harus cocok, atau permintaan ditolak. Selanjutnya, semua arahan Tolak dievaluasi. Jika ada yang cocok, permintaan ditolak

Alamat IP cocok dengan arahan Tolak, jadi bukankah permintaan itu harus ditolak?

Menurut tabel pada halaman mod_authz_host, alamat IP ini harus "Cocokkan berdua Izinkan & Tolak", dan dengan demikian aturan "Kontrol kecocokan akhir: Ditolak" harus berlaku.

    Match Allow, Tolak hasil Tolak, Bolehkan hasil
    Cocokkan saja yang diizinkan. Permintaan diizinkan. Permintaan diizinkan
    Hanya Tolak Pertandingan. Permintaan ditolak
    Tidak ada kecocokan Default ke arahan kedua: Ditolak Default ke arahan kedua: Diizinkan
    Cocokkan Baik & Tolak Kontrol pertandingan final: Ditolak Kontrol pertandingan final: Diizinkan

Tolak dari semua 192.168.16.100 - Karena Anda menggunakan "semua" di sini, saya berharap semua permintaan ditolak dari alamat IP apa pun. Pikirkan sesuatu yang lain sedang terjadi di sini.
micah

@Michah: Saya juga melakukan Allow from 192.168.16.0/24. Seperti yang saya pahami dokumentasi, setiap IP pemohon dalam jaringan 192.168.16.0/24 akan cocok dengan pernyataan Perbolehkan ini, permintaan diizinkan.
Stefan Lasiewski

Mengikuti dokumentasi yang ditempelkan di atas. "Pertama, semua arahan Izinkan dievaluasi; setidaknya satu harus cocok, atau permintaan ditolak" ==> Ini harus sesuai dengan "Izinkan Anda dari 192.168.16.0/24", tetapi bagian kedua dari "Berikutnya, semua arahan Tolak adalah dievaluasi. Jika ada kecocokan, permintaan ditolak "Dengan" Tolak dari semua ", tidakkah setiap permintaan cocok dengan bagian kedua dan karenanya ditolak?
micah

Anda harus benar-benar mempertimbangkan apakah Anda ingin menolak alamat IP itu untuk akses lengkap ke sistem Anda atau hanya dari httpd. Jika yang pertama melanjutkan dengan pendekatan Anda dalam menggunakan arahan apache. Jika yang terakhir ini harus dilakukan di firewall.
Andrew Case

Terima kasih ACase. Saya hanya ingin menolak akses dari 192.168.16.100 ke halaman khusus ini. Saya ingin 192.168.16.100 dapat mengakses semua halaman lain di server web ini.
Stefan Lasiewski

Jawaban:


35

Saya belum diuji, tapi saya pikir Anda hampir sampai.

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Deny from alltidak dibutuhkan. Bahkan itu akan mengacaukan karena semuanya akan cocok all, dan dengan demikian ditolak (dan saya pikir Apache berusaha menjadi pintar dan melakukan sesuatu yang bodoh). Saya selalu menemukan Apache Order, Allowdan Denyarahan membingungkan, jadi selalu memvisualisasikan hal-hal dalam sebuah tabel (diambil dari dokumen ):

Cocokkan | Izinkan, Tolak hasil | Tolak, Izinkan hasil
-------------------------------------------------- -----
Hanya izinkan | Diizinkan | Diizinkan
Tolak saja | Ditolak | Ditolak
Tidak ada yang cocok | Default: Ditolak | Default: Diizinkan
Cocokkan keduanya | Pertandingan final: Ditolak | Pertandingan final: Diizinkan

Dengan pengaturan di atas:

  • Permintaan dari 192.168.16.100 mendapatkan "Cocokkan keduanya" dan karenanya ditolak.
  • Permintaan dari 192.168.16.12 mendapatkan "Hanya izinkan" dan karenanya diizinkan.
  • Permintaan dari 123.123.123.123 mendapatkan "Tidak cocok" dan karenanya ditolak.

1

Saya mungkin akan melihat juga menambahkan aturan IPTables untuk ini untuk menolak host tunggal pada port 80, menyangkal dari semua, dan mengizinkan subnet.

Anda seharusnya tidak memiliki masalah dalam menyiapkan aturan penolakan dari alamat tertentu setelah Anda mengizinkan subnet. Lakukan saja dalam urutan itu.


Saya telah memperbarui jawaban saya. Saya menyertakan aturan "Deny from 192.168.16.100", tetapi akses masih diizinkan dari 192.168.16.100
Stefan Lasiewski

Saya ingin mengizinkan akses ke semua lokasi lain dari host ini. Namun, saya ingin menolak lokasi tertentu. IPTables tidak membantu saya di sini.
Stefan Lasiewski

IPTables tidak akan secara khusus menolak lalu lintas keluar kecuali jika Anda memberi tahu. Namun Anda dapat, menolak lalu lintas masuk dari dunia, dan alamat tertentu, tetapi semua mengizinkan subnet.
Mike

Saya pikir Anda salah mengerti permintaan saya. Saya ingin menerapkan kontrol akses ini hanya untuk / status server, bukan seluruh host. IPtables tidak bisa melakukan ini dengan mudah, setahu saya.
Stefan Lasiewski

-4

Bisakah Anda menggunakan php? Jika demikian, tambahkan pernyataan php untuk keluar / mengarahkan ulang untuk satu alamat IP tertentu

Contoh:

$ deny = array ("111.111.111", "222.222.222", "333.333.333");

if (in_array ($ _SERVER ['REMOTE_ADDR'], $ deny))

{header ("location: http://www.google.com/ ");

keluar();

Referensi: http://perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/


2
Ini harus ada di setiap halaman yang dihosting oleh server web. Solusi ini tidak praktis dan bukan tempat Anda ingin memfilter akses ke server web.
Andrew Case
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.