¿ Firewalls Virtuales ?

Actualmente, lo habitual en una organización es disponer de un firewall/cluster y mediante el uso de vlans, ir creando nuevos segmentos dependiendo del crecimiento de la red, lógicamente siempre que el sistema a nivel de procesamiento no se vea afectado. No obstante, puede darse el caso de empresas que den servicio a múltiples clientes con el mismo firewall, de forma que se quiera diferenciar cada cliente de forma unívoca. Para ello, cada vez más aparecen en el mercado soluciones de firewalls virtuales y como casi siempre, el uso de una funcionalidad lleva asociada la licencia correspondiente.

Para este post, vamos a crear un firewall virtual en un dispositivo Cisco ASA 5550, no obstante, fabricantes como Fortinet disponen de soluciones similares.

Centrándonos en nuestro sistema, podemos crear múltiples firewalls virtuales llamados contextos, donde cada contexto es independiente del resto, y dispone de su propia política de seguridad, interfaces, usuarios o rutas, aunque hay otras funcionalidades que no vienen soportadas, como VPN o protocolos de enrutamiento dinámico (parece que en versiones actuales mejoran considerablemente estas limitaciones), no obstante, para nuestro caso, será suficiente.

Existen tres tipos de contexto:

  • system: el contexto raíz donde el administrador gestiona el resto de contextos del sistema, interfaces, recursos, etc.
  • admin: igual que cualquier otro contexto pero donde el administrador tiene permisos para acceder a otros contextos.
  • normal: una partición del firewall donde sólo se puede acceder a la información del propio contexto.

En nuestro ejemplo, partimos de un firewall sin configuración previa, si no lo fuera, deberíamos realizar una copia de seguridad previa. Una vez conectados al sistema, debemos asegurarnos de cuantos firewalls virtuales podemos crear con la licencia disponible:

ciscoasa# show version

Licensed features for this platform:
Maximum Physical Interfaces  : Unlimited
Maximum VLANs                : 250
Inside Hosts                 : Unlimited
Failover                     : Active/Active
VPN-DES                      : Enabled
VPN-3DES-AES                 : Enabled
Security Contexts            : 5
GTP/GPRS                     : Disabled
VPN Peers                    : 5000
WebVPN Peers                 : 2
Advanced Endpoint Assessment : Disabled           

En éste caso, podríamos tener 5 contextos. Aclarado esto, procedemos con la configuración:

1. Configurar el sistema en modo múltiple:

ciscoasa# show mode
Security context mode: single  

ciscoasa(config)# mode  multiple
WARNING: This command will change the behavior of the device
WARNING: This command will initiate a Reboot
Proceed with change mode? [confirm]
Convert the system configuration? [confirm]   

Tras reiniciar, podemos comprobar que el sistema ya aparece configurado en modo múltiple y dispone de configuración específica para el contexto admin:

ciscoasa# show  mode
Security context mode: multiple     

ciscoasa# show run
…...
class default
  limit-resource All 0
  limit-resource ASDM 5
  limit-resource SSH 5
  limit-resource Telnet 5
admin-context admin
context admin
  config-url disk0:/admin.cfg 

2. Crear interfaces virtuales y asociarles identificador de vlan. Ya que vamos a usar vlans para confgurar contextos, necesitamos definir trunks en los switches

ciscoasa(config)# mac-address auto
ciscoasa(config)# interface GigabitEthernet0/1.1
ciscoasa(config-subif)# vlan 100
ciscoasa(config-subif)# no shutdown
ciscoasa(config-subif)# interface GigabitEthernet0/2.1
ciscoasa(config-subif)# no shutdown
ciscoasa(config-subif)# vlan 200
ciscoasa(config-subif)# interface GigabitEthernet0/3.1
ciscoasa(config-subif)# no shutdown
ciscoasa(config-subif)# vlan 300

3. Definir los contextos (el contexto admin ya existe):

ciscoasa(config)# context Cliente1
Creating context 'Cliente1'... Done. (2)
ciscoasa(config-ctx)# description Contexto1

4. Asignar visibilidad sobre las interfaces a cada contexto e indicar el fichero de configuración del mismo:

ciscoasa(config-ctx)# allocate-interface GigabitEthernet0/1.1 inside
ciscoasa(config-ctx)# allocate-interface GigabitEthernet0/2.1 outside
ciscoasa(config-ctx)# allocate-interface GigabitEthernet0/3.1 dmz
ciscoasa(config-ctx)# config-url disk0:/cliente1.cfg

Una vez configurados los contextos, podemos cambiar a un contexto específico y configurarlo como si de un único firewall se tratara. Una vez nos situamos en el contexto, vemos que el prompt cambia:

ciscoasa# changeto context Cliente1
ciscoasa/Cliente1# show running-config
...
interface inside
 no nameif
 no security-level
 no ip address
!
interface outside
 no nameif
 no security-level
 no ip address
!
interface dmz
 no nameif
 no security-level
 no ip address

En este punto, podemos volver al contexto system para crear un nuevo contexto:

ciscoasa/Cliente1(config)# changeto system
ciscoasa(config)# context Cliente2
Creating context 'Cliente2'... Done. (3)
ciscoasa(config-ctx)# description Contexto2
ciscoasa(config-ctx)# allocate-interface GigabitEthernet0/1.2 inside
ciscoasa(config-ctx)# allocate-interface GigabitEthernet0/2.2 outside
ciscoasa(config-ctx)# allocate-interface GigabitEthernet0/3.2 dmz
  config-url disk0:/cliente2.cfg

Una vez creado (no tiene asignadas vlans todavía), podemos ver los contextos definidos en el sistema:

ciscoasa(config)# show context
Context Name      Class      Interfaces           URL
*admin            default                         disk0:/admin.cfg
 Cliente1         default    GigabitEthernet0/1.1, disk0:/cliente1.cfg
                             GigabitEthernet0/2.1,
                             GigabitEthernet0/3.1
 Cliente2         default    GigabitEthernet0/1.2, disk0:/cliente2.cfg
                             GigabitEthernet0/2.2,
                             GigabitEthernet0/3.2                               

Total active Security Contexts: 3

Antes de entrar a configurar nuestro contexto, si nos fijamos en la salida del comando anterior, vemos que aparece una class definida por defecto. Esta opción es útil si queremos limitar los recursos de nuestros contextos, ya sea para evitar la saturación del sistema, o por que dispongamos de contratos gold/silver y en cada uno de ellos, limitemos los recursos contratados.

Tras esto, volvemos a configurar nuestro contexto de forma independiente:

ciscoasa# changeto context Cliente1
ciscoasa/Cliente1(config)# hostname ASA1
ciscoasa/Cliente1(config)# domain-name cliente1.com
ciscoasa/Cliente1(config)# username admin password admin privilege 15
ciscoasa/Cliente1(config)# interface inside
ciscoasa/Cliente1(config-if)# nameif inside
ciscoasa/Cliente1(config-if)#  security-level 100
ciscoasa/Cliente1(config-if)#  ip address 172.18.0.200 255.255.255.0
ciscoasa/Cliente1(config-if)#  no shutdown
ciscoasa/Cliente1(config)# http server enable
ciscoasa/Cliente1(config)# crypto key generate rsa
ciscoasa/Cliente1(config)# show crypto key mypubkey  rsa
Key pair was generated at: 06:14:35 UTC Dec 17 2013
Key name: 
 Usage: General Purpose Key
 Modulus Size (bits): 1024
 Key Data:                                                                      

  30819f30 0d06092a 864886f7 0d010101 05000381 8d003081 89028181 00d81874
  dcca041b fbb5752c 5f5562f1 95422b42 e825e7b4 0b7b0aee 5cd90c04 e3302ddc
  d9ee6c98 8664e8cd 2a3ad611 aa6b9d35 09cc81f3 48eccbe3 129d5483 17170a54
  b1bef1ca b351ede5 86e3b26b 8f8619f9 b5d928c7 3b391861 8a1c72de 449e0fbc
  b2acddee 3deaa0ff db55df25 4ba26f7b 6446972c e05e1839 52a09bad 45020301 0001 

ciscoasa/Cliente1(config)# http 172.18.0.150 255.255.255.255 inside
ciscoasa/Cliente1(config)# ssh 172.18.0.150 255.255.255.255 inside
ciscoasa/Cliente1(config)# wr mem

En este punto, ya podríamos acceder de forma remota al dispositivo y gestionarlo de forma independiente.

Desde el contexto admin, podemos ver la configuración de los contextos con el comando show running-config all context [name] y los recursos consumidos con show resource usage context [name]:

ciscoasa(config)#  show resource usage context Cliente1
Resource              Current         Peak      Limit        Denied Context
ASDM                        1            1          5             0 Cliente1
Conns                       2            9  unlimited             0 Cliente1
Hosts                       2            2  unlimited             0 Cliente1
Conns [rate]                1           11  unlimited             0 Cliente1

También podemos guardar todos los cambios de los contextos:

ciscoasa(config)# wr mem all
Building configuration...
Saving context :           system : (000/003 Contexts saved)
Cryptochecksum: 1eb2b9ed bf4f0170 628827cb cda1116d                                                                                     

1612 bytes copied in 3.300 secs (537 bytes/sec)
Saving context :            admin : (001/003 Contexts saved)
Cryptochecksum: d367f98b 4f1280c6 2a3275f4 5e0df5eb                                                                                     

1313 bytes copied in 0.200 secs
Saving context :         Cliente1 : (002/003 Contexts saved)
Cryptochecksum: fc0590ec a8514229 3d126e92 4052d174                                                                                     

1572 bytes copied in 0.210 secs
Saving context :         Cliente2 : (003/003 Contexts saved)
Cryptochecksum: 81553ccc ebd17807 b63b1f4b ee30b125                                                                                     

1432 bytes copied in 0.200 secs
[OK]

Finalmente, podemos borrar contextos o volver a dejar el sistema en modo single:

ciscoasa(config)#  no context Cliente2
WARNING: Removing context 'Cliente2'
Proceed with removing the context? [confirm]
Removing context 'Cliente2' (3)... Done  

ciscoasa(config)# show  context
Context Name      Class      Interfaces           URL
*admin            default                         disk0:/admin.cfg
 Cliente1         default    GigabitEthernet0/1.1, disk0:/cliente1.cfg
                             GigabitEthernet0/2.1,
                             GigabitEthernet0/3.1                                                                                       

Total active Security Contexts: 2

Para restaurar el sistema, debemos recuperar la copia de seguridad previa si disponemos de ella, en otro caso, perderemos los cambios iniciales:

ciscoasa(config)# mode single
WARNING: This command will change the behavior of the device
WARNING: This command will initiate a Reboot
Proceed with change mode? [confirm]
Security context mode: single

Tras reiniciar, podremos borrar los ficheros generados anteriormente

ciscoasa# delete disk0:/cliente1.cfg
Delete filename [cliente1.cfg]?                                                                                                         

Delete disk0:/cliente1.cfg? [confirm]                                                                                                   

ciscoasa# delete disk0:/cliente2.cfg
Delete filename [cliente2.cfg]?
Delete disk0:/cliente2.cfg? [confirm]    

ciscoasa# delete disk0:/admin.cfg
Delete filename [admin.cfg]?
Delete disk0:/admin.cfg? [confirm]

De esta forma, y salvado las limitaciones existentes, podríamos disponer de mútiples firewalls independientes para dar soporte a distintos clientes en una única plataforma.

Fuente: Security Art Work

¡ Gracias por leer !

DynamicSec.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s