Автоматизация развертывания большого количества шлюзов «С-Терра Шлюз» с помощью «С-Терра КП» при использовании криптобиблиотеки «С-Терра»

Скачать в формате PDF

Вспомогательные скрипты:

ver_4_2_scn_2_12.zip

 

Описание стенда

Данный документ описывает массовую настройку шлюзов при помощи «С-Терра КП».

В рамках данного документа для аутентификации партнеры будут использовать сертификаты. В качестве криптопровайдера будет использована криптографическая библиотека, разработанная компанией «С-Терра СиЭсПи». Клиенты «С-Терра Шлюз 4.2», система управления «С-Терра КП 4.2».

Схема стенда (Рисунок 1):

 

Рисунок 1

 

Логика работы решения

В подсети SN1 на выделенный сервер устанавливается система управления «С-Терра КП». При помощи специального скрипта для PowerShell, администратор создает на сервере управления инсталляционные пакеты для большого числа шлюзов. После доставки и установки скриптов на целевые шлюзы всю дальнейшую их настройку можно будет производить с помощью «С-Терра КП».

В процессе развертывания понадобится использовать базовую LSP для шлюзов. Администратор может как написать свою собственную, так и использовать приложенную LSP.

Приложенная LSP позволяет целевым шлюзам построить защищенное соединение до сервера «С-Терра КП» (на схеме – 192.168.1.100), и только до него. LSP позволяет шлюзам находиться за динамическим NAT. В качестве IPsec партнера выступает шлюз GW1 (на схеме – 10.1.1.1).


 

Настройка стенда

На выделенном сервере в подсети SN1, защищаемой шлюзом GW1, необходимо выполнить следующие этапы настройки:

·         Установка криптопровайдера «КриптоПро CSP»;

·         Установка системы управления «С-Терра КП»;

·         Разворачивание и настройка удостоверяющего центра (УЦ);

·         Настройка системы управления «С-Терра КП»:

o    Импорт гаммы;

o    Настройка «С-Терра КП».

·         Установка утилиты S-Terra UPMSCA.

В данном сценарии вышеперечисленные процессы установки и настройки рассматриваться не будут. Подробно все этапы настройки описаны в документации «Программный продукт «С-Терра КП». Версия 4.2. Руководство администратора».

Предполагается, что используется PowerShell версии 4.0 или выше. Проверить версию можно выполнив команду $PSVersionTable в консоли PowerShell.

Перед началом работы со скриптом рекомендуется создать файлы license.txt и clients.txt. В файле license.txt необходимо поместить лицензии на устройства в формате С-Терра. Пример содержимого файла:

[license]

CustomerCode=test

ProductCode=GATE

LicenseNumber=4

LicenseCode=42000-AAAAA-FFFFF-BBBBB-XXXXX

[license]

CustomerCode=test

ProductCode=GATE

LicenseNumber=5

LicenseCode=42000-AAAAA-EEEEE-HHHHH-YYYYY

[license]

CustomerCode=test

ProductCode=GATE

LicenseNumber=6

LicenseCode=42000-AAAAA-DDDDD-CCCCC-ZZZZZ

В файле clients.txt необходимо поместить имена целевых шлюзов, как они будут отображаться в КП в следующем формате:

GateA

GateB

GateC

Файлы license.txt и clients.txt не должны содержать пустых строк.

В приложении представлены полный текст скрипта для PowerShell и базовая LSP 

Создание текстового файла с лицензиями

Для быстроты и удобства создания текстового файла license.txt с лицензиями в нужном формате, если у вас есть excel файл с лицензиями, можно воспользоваться вспомогательным скриптом lics_txt_gen.ps1. Порядок действий при этом следующий:

1. Переместить скрипт lics_txt_gen.ps1 и excel файл с лицензиями в одну папку.

2. Запустить консоль PowerShell от имени администратора.

3. Разрешить выполнение скриптов командой Set-ExecutionPolicy Unrestricted -f

4. Перейти в директорию со скриптом.

5. Запустить скрипт, передав ему в качестве аргумента имя excel файла, с перенаправлением вывода в файл, например так:

       . .\lics_txt_gen.ps1 .\lic.xlsx >> license.txt

В этом случае в папке рядом со скриптом будет создан файл license.txt, который можно использовать для дальнейшей работы с инструкцией.

Если вызывать скрипт без перенаправления вывода в файл, то вся информация будет выведена в консоль, откуда ее можно вручную скопировать в нужный файл.

Последовательность действий

1.    Создайте директорию в любом удобном месте на сервере управления. В этой директории в процессе выполнения скрипта будут созданы все необходимые для работы файлы.  Перенесите в нее скрипт, файл с именами клиентов и файл с лицензиями. Файл с лицензиями переименуйте в license.txt или замените в скрипте название файла на нужное в следующей строке:

$path_file_lics = $path_output + 'license.txt'

Файл с именами клиентов переименуйте в clients.txt или замените в скрипте название файла на нужное в следующей строке:

$path_client_names = $path_output + 'clients.txt'

2.    Запустите консоль PowerShell от имени Администратора.

3.    Разрешите выполнять PowerShell скрипты:

Set-ExecutionPolicy -ExecutionPolicy Unrestricted –Force

4.    Перейдите в директорию со скриптом.

5.    Выполните следующую команду:

. .\script.ps1

Данная команда позволит выполнять функции из скрипта.

6.    Выполните функцию pre_work:

pre_work

Данная функция создаст необходимые каталоги в рабочей директории.

7.    Выполните функцию parse_lics:

parse_lics

В данной функции из исходного текстового файла с лицензиями делается большое количество отдельных лицензий для каждого шлюза. Один файл с лицензией копируется в хранилище «С-Терра КП» для последующего использования в базовом проекте. Так же лицензии помещаются в каталог lics.

8.    Примечание: здесь и далее при вызове функций в качестве аргументов следует указывать первый и последний индексы диапазона создаваемых клиентов (индексы соответствуют номерам строк в файле clients.txt, начиная с 0). Например, для создания пяти клиентов нужно указывать 0 4, для создания 100 клиентов – 0 99.

Выполните функцию create_requests:

create_requests 0 3

В данной функции с помощью утилиты excont_mgr создаются контейнеры с закрытыми ключами, на основе которого создаются запросы на сертификат.

9.    Выполните функцию send_requests:

send_requests 0 3

      Если ваш CA автоматически обрабатывает запросы и выдает сертификаты, то переходите к пункту 11. Если требуется ручное подтверждение выдачи сертификатов в СА, то перейдите в CA и подтвердите запросы. Также запомните код первого запроса (RequestId) в выводе информации в консоли, он потребуется на следующем шаге.

10.  После подтверждения запросов в CA, вернитесь в консоль и выполните функцию retrieve_requests, где в качестве третьего аргумента нужно передать номер первого запроса:

      retrieve_requests 0 3 7

Данная функция получит сертификаты для каждого отдельного шлюза и сохранит их в папке certs.

11.  Выполните функцию get_certs: 

get_certs 0 3

В данной функции с помощью утилиты certutil сертификат УЦ сохраняется в рабочую директорию. Также один локальный сертификат и сертификат УЦ копируются в хранилище «С-Терра КП» для последующего использования в базовом проекте.

12.  Создайте базовый проект в «С-Терра КП».

12.1.   Запустите VPN UPServer Console. Логин по умолчанию – administrator, пароль – 12345678.

12.2.   Откройте в меню Инструменты раздел Создание VPN-данных.

12.3.   В окне Создание VPN-проекта в качестве VPN-продукта необходимо использовать S-Terra Gate 4.2, а в качестве криптопровайдера – S-Terra.

12.4.   Во вкладке LSP необходимо вставить заранее настроенную политику безопасности.
Примечание: можно использовать базовую LSP из приложения, предварительно заменив в ней IP-адреса сервера управления «С-Терра КП» (по умолчанию: 192.168.1.100) и шлюза-партнера «С-Терра Шлюз 4.2» (по умолчанию: 10.1.1.1), с которым будет строиться первоначальное IPsec соединение, а также логическое имя интерфейса, на который будет назначена криптокарта (по умолчанию: GigabitEthernet0/1).

12.4.1   Важно! Не используйте Wizard при создании базового проекта.

12.4.2   Убедитесь, что структуры LSP IdentityEntry local_auth_identity_01 и CertDescription local_cert_dsc_01 описаны следующим образом:

IdentityEntry local_auth_identity_01(

    DistinguishedName *= USER_SPECIFIC_DATA

)

CertDescription local_cert_dsc_01(

)

12.5.   Во вкладке Сертификаты добавьте доверенный CA-сертификат и локальный сертификат из раздела PUBLIC окна Удаленное файловое хранилище (данные сертификаты будут скопированы в хранилище при выполнении функции get_certs). Имя контейнера при задании настроек для локального сертификата можно сгенерировать автоматически. Пароль контейнера можно не задавать. Данные поля будут в дальнейшем изменены скриптом.

12.6.   Во вкладке Лицензия подгрузите файл лицензии из раздела PUBLIC окна Удаленное файловое хранилище (данный файл будет скопирован в хранилище при выполнении функции parse_lics).

12.7.   Сохраните настроенный шаблон. Меню Файл, раздел Сохранить как….

12.8.   Закройте созданный проект. Откройте меню Инструменты раздел Удаленное файловое хранилище и выгрузите файл проекта в директорию со скриптом под именем base.vpd.

13.  Вернитесь в консоль PowerShell и выполните функцию vpd_clone:

vpd_clone 0 3

В данной функции с помощью утилиты vpnmaker из базового проекта генерируются новые проекты с заменой лицензии, локального сертификата, пути до контейнера и пароля на контейнер.

14.  Выполните функцию cont_list:

cont_list 0 3

В данной функции создаются служебные файлы с настройками для добавления контейнера в конечный установочный файл.

15.  Выполните функцию kp_reg:

kp_reg 0 3

В данной функции с помощью утилиты upmgr на основе ранее созданных проектов создаются записи о клиентах в системе управления «С-Терра КП», данные записи активируются и выпускаются установочные скрипты для развертывания на конечных устройствах.

16.  Готовые скрипты для развертывания на шлюзах лежат в папке scripts в директории проекта. Развертывание следует проводить в соответствии с инструкцией, предварительно задав у шлюзов на WAN-интерфейсе IP-адрес и маршрут по умолчанию.


17.   

Приложение

Текст скрипта script.ps1

param(

    [Int32]$first=0,

    [Int32]$last=0

    )

 

$path_kp = 'C:\Program Files (x86)\S-Terra\S-Terra KP\'

$path_excont_st = $path_kp + 'lca\ST\excont_mgr.exe'

$path_cont_st = $path_kp + 'lca\ST\cont_mgr.exe'

$path_vpnmaker = $path_kp + 'vpnmaker.exe'

$path_upmgr = $path_kp + 'upmgr.exe'

$path_storage = 'C:\ProgramData\UPServer\storage\PUBLIC\'

 

$path_output = $(split-path -parent $MyInvocation.MyCommand.Definition) + '\'

$path_requests = $path_output + 'reqs\'

$path_certs = $path_output + 'certs\'

$path_lics = $path_output + 'lics\'

$path_vpd = $path_output + 'vpd\'

$path_scripts = $path_output + 'scripts\'

$path_cont_list = $path_output + 'cont_list\'

 

$path_client_names = $path_output + 'clients.txt'

$path_file_lics = $path_output + 'license.txt'

$path_base_vpd = $path_output + 'base.vpd'

 

$client_names = Get-Content $path_client_names

 

$cn = 'C=RU,O=Organization,OU=Department'

$pin = '1234'

 

function pre_work ()

{

    Write-Host '------Creating subfolders-------'

    foreach ($i in $path_requests, $path_certs, $path_lics, $path_vpd, $path_cont_list, $path_scripts)

    {

        if (! (Test-Path $i))

        {

            New-Item $i -type directory

        }

    }

}

 

function create_requests ($first, $last)

{

    Write-Host '------Creating requests-------'

    for ($i=$first; $i -le $last; $i++)

    {

        Write-Host $('Creating request for ' + $client_names[$i])

        $full_cn = $cn + ',CN=' + $client_names[$i]

        $gate_full_path = $path_requests + $client_names[$i] + '.req'

        & $path_excont_st create_req -subj $full_cn -disableInteractive -GOST_R341012_256 -kc $client_names[$i] -kcp $pin -fo "$gate_full_path"

    }

}

 

 

function send_requests ($first, $last)

{

    Write-Host '------Sending requests-------'

    for ($i=$first; $i -le $last; $i++)

    {

        $gate_req = $path_requests + $client_names[$i] + '.req'

        $gate_cert = $path_certs + $client_names[$i] + '.cer'

        certreq.exe -submit -q $gate_req $gate_cert

    }

 

}

 

function retrieve_requests ($first_client, $last_client, $first_cert_req)

{

    for ($i=$first_client; $i -le $last_client; $i++)

    {

        $gate_cert = $path_certs + $client_names[$i] + '.cer'

        certreq.exe -retrieve -f -q $first_cert_req  $gate_cert

        $first_cert_req++

    }

}

 

function get_certs ($first, $last)

{

    Write-Host '------Getting certificates-------'

    # -ca.cert flag working only from argument list of start-process

    Start-Process 'certutil.exe' -ArgumentList $('-ca.cert ' + $path_output + 'ca.cer') -Wait

    Copy-Item $($path_output + 'ca.cer')  $($path_storage + 'ca.cer')

    Copy-Item $($path_certs + $client_names[0] + '.cer')  $($path_storage + $client_names[0] + '.cer')

}

 

function parse_lics ()

{

    Write-Host '------Parsing lic file-------'

    $l = Get-Content $path_file_lics

    $n=0

    for ($i=0; $i -le $l.Count ; $i=$i+5)

    {

        if ($l[$i] -eq '[license]')

        {

            $gate_lic = $path_lics + $client_names[$n] + '.lic'

            Out-File -FilePath $gate_lic -InputObject $l[$i] -Encoding UTF8

            Add-Content $gate_lic $l[$i+1]

            Add-Content $gate_lic $l[$i+2]

            Add-Content $gate_lic $l[$i+3]

            Add-Content $gate_lic $l[$i+4]

        }

        $n=$n+1

    }

    Copy-Item $($path_lics + $client_names[0] + '.lic')  $($path_storage + $client_names[0] + '.lic')

}

 

function vpd_clone ($first, $last)

{

    Write-Host '------Cloning VPD file-------'

    for ($i=$first; $i -le $last; $i++)

    {

        $gate_vpd = $path_vpd + $client_names[$i] + '.vpd'

        $gate_lic = $path_lics + $client_names[$i] + '.lic'

        $gate_cert = $path_certs + $client_names[$i] + '.cer'

        $gate_cont_dest = 'file_p15://' + $client_names[$i]

        & $path_vpnmaker replace -fi $path_base_vpd -fo $gate_vpd -lic $gate_lic -cert $gate_cert -certkey $gate_cont_dest -certkeypwd $pin

    }

}

 

function cont_list ($first, $last)

{

    Write-Host '------Generating containers configuration files-------'

    for ($i=$first; $i -le $last; $i++)

    {

        $gate_cont_list = $path_cont_list + $client_names[$i] + '.ini'

        $a = '[CONTAINER_1]'

        $b = 'SourceName=file_p15://' + $client_names[$i]

        $c = 'SourcePassword=' + $pin

        $d = 'DestinationName=file_p15://' + $client_names[$i]

        $e = 'DestinationPassword=' + $pin

        Out-File -FilePath $gate_cont_list  -InputObject $a -Encoding UTF8

        Add-Content $gate_cont_list $b

        Add-Content $gate_cont_list $c

        Add-Content $gate_cont_list $d

        Add-Content $gate_cont_list $e

    }

}

 

function kp_reg ($first, $last)

{

    Write-Host '------Registering gates in KP and generating scripts-------'

    for ($i=$first; $i -le $last; $i++)

    {

        $gate_name = $client_names[$i]

        $gate_vpd = $path_vpd + $client_names[$i] + '.vpd'

        $gate_cont_list = $path_cont_list + $client_names[$i] + '.ini'

        $gate_scripts = $path_scripts + $client_names[$i]

 

        if (! (Test-Path $gate_scripts))

        {

            New-Item $gate_scripts -type directory | Out-Null

        }

 

        Write-Host $('Registering gate ' + $client_names[$i])

 

        & $path_upmgr create -i $gate_name -p $gate_vpd

        & $path_upmgr enable -i $gate_name

        & $path_upmgr get -i $gate_name -cont_list $gate_cont_list -d $gate_scripts

    }

}

Базовая LSP

GlobalParameters(

    Title                       = "Predefined LSP"

    Version                     = LSP_4_2

    CRLHandlingMode             = OPTIONAL

    PreserveIPsecSA             = FALSE

)

 

IdentityEntry local_auth_identity_01(

 

  DistinguishedName *= USER_SPECIFIC_DATA

)

 

CertDescription local_cert_dsc_01(

)

 

IKEParameters(

    FragmentSize = 0

)

 

FirewallParameters(

    TCPSynSentTimeout = 30

    TCPFinTimeout = 5

    TCPClosedTimeout = 30

    TCPSynRcvdTimeout = 30

    TCPEstablishedTimeout = 3600

    TCPHalfOpenLow = 400

    TCPHalfOpenMax = 500

    TCPSessionRateLow = 400

    TCPSessionRateMax = 500

)

 

IKETransform crypto:isakmp:policy:1

(

    CipherAlg   = "G2814789CPRO1-K256-CBC-65534"

    HashAlg     = "GR341112_256TC26-65128"

    GroupID     = VKO2_1B

    RestrictAuthenticationTo = GOST_SIGN

    LifetimeSeconds = 86400

)

 

ESPProposal TSET:ESP

(

    Transform* = ESPTransform

    (

        CipherAlg*          = "G2814789CPRO2-K288-CNTMAC-253"

        LifetimeSeconds     = 3600

        LifetimeKilobytes   = 4608000

    )

)

 

AuthMethodGOSTSign GOST:Sign

(

    LocalID        =  IdentityEntry( DistinguishedName* = USER_SPECIFIC_DATA )

    SendRequestMode    =  ALWAYS

    SendCertMode       =  ALWAYS

)

 

IKERule IKERule:CMAP:1

(

    IKEPeerIPFilter = 10.1.1.1

    Transform = crypto:isakmp:policy:1

    AggrModeAuthMethod  = GOST:Sign

    MainModeAuthMethod  = GOST:Sign

    DPDIdleDuration     = 10

    DPDResponseDuration = 2

    DPDRetries          = 5

    Priority            = 10

)

 

IPsecAction IPsecAction:CMAP:1

(

    TunnelingParameters = TunnelEntry(

        PeerAddress = 10.1.1.1

        DFHandling=COPY

        Assemble=TRUE

    )

    ContainedProposals = ( TSET:ESP )

    IKERule = IKERule:CMAP:1

)

 

FilterChain IPsecPolicy:CMAP (

    Filters = Filter (

        ProtocolID = 17

        SourcePort = 500, 4500

        Action = PASS

        PacketType = LOCAL_UNICAST, LOCAL_MISDIRECTED

    ),

    Filter (

        DestinationIP = 192.168.1.100

        Action = PASS

        ExtendedAction = ipsec< sa = IPsecAction:CMAP:1 >

        LogEventID = "IPsec:Protect:CMAP:1:LIST"

    )

)

 

NetworkInterface (

    LogicalName = "GigabitEthernet0/1"

    IPsecPolicy = IPsecPolicy:CMAP

)