четверг, 8 октября 2009 г.

Автоматическая синхронизация конфигураций 2-х AIP-SSM модулей.

Неизвестно по какой причине, но AIP-SSM модули для ASA не умеют синхронизировать свои конфиги, когда "асы" стоят в фаиловере. Поэтому изменения конфигурации необходимо производить на двух модулях. Неудобно, большой риск допустить ошибку и вообще не комильфо. Можно, однако, сливать конфигурациию с одного модуля на FTP и оттуда заливать ее на второй модуль, при этом настройки, касающиеся сетевой части модуля можно оставить прежними. Эта опция и легла в основе автоматической синхронизации конфигураций.

Вобщем-то, назвать этот процесс синхронизацией немного неправильно, это скорее копирование конфигурации с одного устройства на другое, но суть не в этом.

Итак, имеем две 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, все упрощается в разы.

Unknown комментирует...

1. Спасибо, и тем не менее скрипт работает. Наверное повезло просто.
2. Так и не умеет же, поэтому и выкручиваемся как можем.
P.S. Поправил скрипт.