Автоматизация развертывания большого количества шлюзов «С-Терра Шлюз» с помощью «С-Терра КП» при использовании криптобиблиотеки «С-Терра»
Вспомогательные скрипты:
Данный документ описывает массовую настройку шлюзов при помощи «С-Терра КП».
В рамках данного документа для аутентификации партнеры будут использовать сертификаты. В качестве криптопровайдера будет использована криптографическая библиотека, разработанная компанией «С-Терра СиЭсПи». Клиенты «С-Терра Шлюз 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.
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
}
}
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
)