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.
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.