Magazine Informatica

Apache virtual host su IP pubblico dedicato

Creato il 29 aprile 2013 da Nightfly

Scenario

Un virtual host di Apache che deve essere accessibile solo da determinati indirizzi IP pubblici.

Problema

Sulla macchina sono presenti anche altri virtual host "pubblici".

Soluzione

Mettere in bind il virtual host in oggetto su un indirizzo IP pubblico dedicato e successivamente creare delle regole ad hoc mediante Iptables.

 

apache,virtual host,httpd,bind,virtual interface,dedicated public ip,private access,logging,syslogd,iptables,rc.local

Per prima cosa occorre creare un'interfaccia virtuale da associare all'indirizzo IP pubblico dedicato. Su CentOS tale operazione è piuttosto banale e consta dei seguenti passi:

1) Creo il file contenente i parametri dell'interfaccia all'interno della directory /etc/sysconfig/network-scripts/:

[root@server network-scripts]# sudo nano ifcfg-eth0:0

il cui contenuto dovrà essere simile al seguente:

DEVICE=eth0:0
ONBOOT=yes
HWADDR=
IPADDR=<indirizzo IP pubblico>
NETMASK=<netmask>
BROADCAST=<indirizzo di broadcast>
GATEWAY=<indirizzo del default gw>
NETWORK=
TYPE=Ethernet

2) Attivo l'interfaccia virtuale e mi sincero che sia effettivamente operativa:

[root@server network-scripts]# ifup eth0:0

[root@server network-scripts]# ifconfig

il cui output dovrebbe essere simile al seguente:

eth0:0   Link encap:Ethernet  HWaddr <mac address>
   inet addr:<indirizzo IP>  Bcast:<indirizzo di broadcast>  Mask:<netmask>
   UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
   Interrupt:169 Memory:fb5e0000-fb600000

Successivamente creo la configurazione del virtual host all'interno della directory /etc/httpd/vhosts.d/:

[root@server vhosts.d]# nano privatevhost.conf

il cui contenuto dovrà essere:

Listen <ip pubblico assegnato all'interfaccia virtuale>:80
NameVirtualHost <ip pubblico assegnato all'interfaccia virtuale>:80
<VirtualHost <ip pubblico assegnato all'interfaccia virtuale:80>
  ServerName privatevhost.dominio.com
  ServerAlias privatevhost.dominio.com
  DocumentRoot /var/www/virtual/privatevhost.dominio.com/htdocs
  ErrorLog /var/www/virtual/privatevhost.dominio.com/logs/error.log
  CustomLog /var/www/virtual/privatevhost.dominio.com/logs/access.log combined
  #ServerSignature Off
  Redirect 404 /favicon.ico
  <Location /favicon.ico>
   ErrorDocument 404 "No favicon"
  </Location>
</VirtualHost>

Lancio un reload della configurazione di Apache per rendere effettive le suddette modifiche:

[root@server vhosts.d]# service httpd reload

A questo punto posso procedere con la creazione dei filtri di accesso mediante iptables:

iptables -F
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -s <IP sorgente consentito>/32 -d <IP pubblico assegnato all'interfaccia virtuale>/32 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -s <IP sorgente consentito>/32 -d <IP pubblico assegnato all'interfaccia virtuale>/32 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -s <IP sorgente consentito>/32 -d <IP pubblico assegnato all'interfaccia virtuale>/32 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -s <IP sorgente consentito>/32 -d <IP pubblico assegnato all'interfaccia virtuale>/32 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -d <IP pubblico assegnato all'interfaccia virtuale>/32 -j LOG  --log-prefix "Private Area Access Attempt:" --log-level 4
iptables -A INPUT -d <IP pubblico assegnato all'interfaccia virtuale>/32 -p ICMP -j ACCEPT
iptables -A INPUT -d <IP pubblico assegnato all'interfaccia virtuale>/32 -j DROP
exit 0
In soldoni, ho prima consentito l'accesso via Web al suddetto virtual host solo a determinati indirizzi IP pubblici. Successivamente ho impostato una regola per il logging dei tentativi di accesso non autorizzati, consentendo solo il traffico ICMP (aka ping) proveniente da qualunque indirizzo sorgente (per questione di praticità durante le eventuali operazioni di diagnostica).

Infine ho droppato tutto il traffico diretto all'interfaccia virtuale che non rispetta nessuna delle regole definite in precedenza.

Copio le suddette regole all'interno del file /etc/rc.local per renderle attive anche dopo eventuali reboot della macchina e facciamo alcuni test per verificare che tutto funzioni correttamente (tentativo di accesso via Browser al virtual host, prima da indirizzo IP consentito e successivamente da indirizzo IP non consentito).

Inoltre, per loggare i tentativi di accesso non autorizzati, occorre modificare la configurazione del file syslog.conf, aggiungendo la seguente entry all'inizio del file in questione:

kern.warning   /var/log/iptables.log

Infine, lancio un restart del demone di logging:

[root@server vhosts.d]# service syslog restart

E' tutto, alla prossima.


Ritornare alla prima pagina di Logo Paperblog