Вобщем-то, назвать этот процесс синхронизацией немного неправильно, это скорее копирование конфигурации с одного устройства на другое, но суть не в этом.
Итак, имеем две ASA с Active/Stanby Failover, в каждую из которых установлен модуль AIP-SSM-20. Необходимо копировать конфигурацию с модуля, стоящего в Active ASA (обзовем его Master), на модуль в Failover ASA (Slave). Для определения кто из них кто, воспользуемся скриптом для Nagios check-cisco-firewall.sh. Скрипт возвращает 0 - если Primary = Active, 1 - если Primare = Standby, Secondary = Active.
Для выполнения команд на устройствах нам будут необходимы два пакета: clogin и expect. Оба они входят в состав утилиты rancid (Really Awesome New Cisco config Differ). Rancid можно найти в пакетах для своего дистрибутива, в портах FreeBSD или в исходниках.
Принцип действия простой. Clogin логинится на устройство и выполняет там соответствующий скрипт expect, в котором указывается куда сливать конфиг по FTP, либо откуда его забрать.
Сама процедура на модуле выглядит примерно так:
ssm-up# copy current-config ftp://10.1.1.10 User: ips_ftp File name: aip-ssm-up.cfg Password: *********** ssm-up# ... ssm-down# copy ftp://10.1.1.10 current-config User: ips_ftp File name: aip-ssm-up.cfg Password: *********** Warning: Copying over the current configuration may leave the box in an unstable state. Would you like to copy current-config to backup-config before proceeding? [yes]: yes Warning: Replacing existing network-settings may leave the box in an unstable state. Would you like to replace existing network settings(host-name/ipaddress/netmask/gateway/access-list) on the sensor? [no]: no ssm-down#Соответственно необходимо написать два expect-скрипта с соответствующими ответами, один из которых будет сливать конфиг, а другой заливать его на вторую железку.
Итак, первый - ips_config-download.exp:
set prompt "ssm.*#" set ftp_user "ips_ftp" set ftp_pass "password" set config_file "aip-ssm-temp.cfg.auto" set ftp_addr "10.1.1.10" send "\r" expect -re "$prompt" { send "copy current-config ftp://$ftp_addr\r" sleep 5 } expect { "User:" { send "$ftp_user\r" exp_continue } "File name:" { send "$config_file\r" exp_continue } "Password:" { send "$ftp_pass\r" exp_continue } timeout { exit } -re "Generating current config" { exp_continue } -re "$prompt" { send -- "exit\r" } } closeВторой - ips_config-upload.exp
set prompt "ssm.*#" set ftp_user "ips_ftp" set ftp_pass "password" set config_file "aip-ssm-temp.cfg.auto" set ftp_addr "10.1.1.10" send "\r" expect -re "$prompt" { send "copy ftp://$ftp_addr current-config\r" sleep 5 } expect { "User:" { send "$ftp_user\r" exp_continue } "File name:" { send "$config_file\r" exp_continue } "Password:" { send "$ftp_pass\r" exp_continue } timeout { exit } -re "Would you like to copy current-config to backup-config before proceeding" { send "yes\r" exp_continue } -re "Would you like to replace existing network settings" { send "no\r" exp_continue } -re "current config" { exp_continue } -re "Processing config" { exp_continue } -re "$prompt" { send -- "exit\r" } } closeТеперь необходимо сконфигурировать для clogin имя пользователя, пароли и способ соединения. Для этого в домашней папке пользователя, под которым будет выполняться скрипт создаем файл .cloginrc примерно такого содержания (10.100.1.85 и 10.100.1.81 - ip-адреса management интерфейсов AIP-SSM):
add user 10.100.1.85 ips_ftp add user 10.100.1.81 ips_ftp add autoenable 10.100.1.85 add autoenable 10.100.1.81 add password 10.100.1.85 password add password 10.100.1.81 password add method * sshИ, наконец, непосредственно скрипт запуска ips_sync.sh
#!/bin/sh ips_pri="10.100.1.85" ips_sec="10.100.1.81" asa="10.100.1.65" tmp_cfg="/home/ips_ftp/aip-ssm-temp.cfg.auto" ips_pri_cfg="/home/ips_ftp/aip-ssm-pri.cfg.auto" ips_sec_cfg="/home/ips_ftp/aip-ssm-sec.cfg.auto" #Nagios script, checks if failover is ok /usr/local/etc/nagios/scripts/bin/check_cisco_firewall.sh -H $asa -V 1 -M failover -C public RETVAL=$? if [ $RETVAL -eq 0 ] then master=$ips_pri master_cfg=$ips_pri_cfg slave=$ips_sec slave_cfg=$ips_sec_cfg else if [ $RETVAL -eq 1 ] then master=$ips_sec master_cfg=$ips_sec_cfg slave=$ips_pri slave_cfg=$ips_pri_cfg else echo "Failover Failiure. Exiting.." exit fi fi #Login to master device and downloading config to temporary file clogin -autoenable -s ips_config-download.exp $master if [ $? -eq 0 ] then echo "Config downloaded successfully.. Proceeding with upload.." else echo "Some problem have occured during downloading the config from master device. Exiting with error." exit fi #Copying temporary file to master config file cp $tmp_cfg $ips_pri_cfg if [ $? -ne 0 ] then echo "Copying from temporary file has failed" exit fi #Login to slave device and uploading config clogin -autoenable -s ips_config-upload.exp $slave if [ $? -eq 0 ] then echo "Config uploaded successfully." else echo "Some problem have occured during uploading the config to slave device. Exiting with error." exit fi #Copying temporary file to slave config file and deleting temp cp $tmp_cfg $ips_sec_cfg if [ $? -ne 0 ] then echo "Copying from temporary file has failed" fi rm $tmp_cfg if [ $? -ne 0 ] then echo "Error has occured when removing temporary file." fi echo "Synchronizing AIP-SSM configs done successfully."В начале скрипта необходимо задать адреса management интерфейсов модулей и самой ASA, пути, куда складывать и откуда брать конфиги, а также путь с скрипту check-cisco-firewall.sh. Не надо также забывать выставить соответствующие разрешения на запуск скриптов.
Вот собственно и все. Складываем их в одну директорию и настраиваем запуск ips_sync.sh по cron'у.
2 комментария:
Идея хороша, но:
1. ips_sync.sh в таком виде работать не будет, где формальный показатель того, что echo не захватывает fi?
echo без экранирующих " " или ' ' -- моветон.
2. Если AIP-SSM умеет rsh, все упрощается в разы.
1. Спасибо, и тем не менее скрипт работает. Наверное повезло просто.
2. Так и не умеет же, поэтому и выкручиваемся как можем.
P.S. Поправил скрипт.
Отправить комментарий