Автоматизация развертывания большого количества клиентов «С-Терра Клиент» с помощью «С-Терра КП»
Вспомогательные скрипты:
ver_4_2_mass_clients_changes.rar
Данный документ описывает массовую настройку клиентов при помощи «С-Терра КП».
В рамках данного документа для аутентификации партнеры будут использовать сертификаты. В качестве криптопровайдера будет использована криптографическая библиотека, разработанная компанией «С-Терра СиЭсПи». Клиенты «С-Терра Клиент 4.2», система управления «С-Терра КП 4.2».
Схема стенда (Рисунок 1):
Рисунок 1
В подсети SN1 на выделенный сервер устанавливается система управления
«С-Терра КП». При помощи специального скрипта для PowerShell, администратор
создает на сервере управления инсталляционные пакеты для большого
числа клиентов. После доставки и установки пакетов на целевые устройства
всю дальнейшую их настройку можно будет производить с помощью «С-Терра
КП».
Центральный шлюз GW1 должен иметь пул IKECFG адресов для выдачи клиентам и соответствующее правило шифрование трафика между КП и клиентской сетью.
На выделенном сервере в подсети SN1, защищаемой шлюзом GW1, необходимо выполнить следующие этапы настройки:
· Установка криптопровайдера «КриптоПро CSP»;
· Установка системы управления «С-Терра КП»;
· Разворачивание и настройка удостоверяющего центра (УЦ);
· Настройка системы управления «С-Терра КП»:
o Импорт гаммы;
o Настройка «С-Терра КП».
· Установка утилиты S-Terra UPMSCA.
В данном сценарии вышеперечисленные процессы установки и настройки рассматриваться не будут. Подробно все этапы настройки описаны в документации «Программный продукт «С-Терра КП». Версия 4.2. Руководство администратора».
Предполагается, что используется PowerShell версии 4.0 или выше.
Проверить версию можно выполнив команду $PSVersionTable
в консоли PowerShell.
Внимание! При работе со скриптами в рамках данного сценария требуется разрешить выполнение скриптов в консоли PowerShell. После завершения работы со сценарием необходимо восстановить политику выполнения скриптов в исходное состояние. Текущий статус можно посмотреть с помощью команды Get-ExecutionPolicy.
Перед началом работы со скриптом рекомендуется создать файлы license.txt и clients.txt. В файле license.txt необходимо поместить лицензии на устройства в формате С-Терра. Пример содержимого файла:
[license]
CustomerCode=test
ProductCode=CLIENT
LicenseNumber=4
LicenseCode=42000-AAAAA-FFFFF-BBBBB-XXXXX
[license]
CustomerCode=test
ProductCode= CLIENT
LicenseNumber=5
LicenseCode=42000-AAAAA-EEEEE-HHHHH-YYYYY
[license]
CustomerCode=test
ProductCode= CLIENT
LicenseNumber=6
LicenseCode=42000-AAAAA-DDDDD-CCCCC-ZZZZZ
В файле clients.txt необходимо поместить имена клиентов, как они будут отображаться в КП. Каждая строка должна содержать только одно имя, например так:
ClientA
ClientB
ClientC
Файлы license.txt и clients.txt не должны содержать пустых строк.
В приложении представлен полный текст скрипта для PowerShell.
Для быстроты и удобства создания текстового файла license.txt с лицензиями в нужном формате, если у вас есть excel файл с лицензиями и установлен Microsoft 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'
Опционально: в скрипте отредактируйте значения в следующей строке на свое усмотрение:
$cn = 'C=RU,O=Organization,OU=Department'
Здесь прописаны значения полей локального сертификата у развертываемых клиентов. Имя CN будет вставлено автоматически.
2. Запустите консоль PowerShell от имени Администратора.
3. Разрешите выполнять PowerShell скрипты:
Set-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
В данной функции с помощью утилиты certutil сертификат УЦ сохраняется в рабочую директорию. Также один локальный сертификат и сертификат УЦ копируются в хранилище «С-Терра КП» для последующего использования в базовом проекте.
12. Создайте базовый проект в «С-Терра КП».
12.1. Запустите VPN UPServer Console. Логин по умолчанию – administrator, пароль – 12345678.
12.2. Откройте в меню Инструменты раздел Создание VPN-данных.
12.3. В окне Создание VPN-проекта в качестве VPN-продукта необходимо использовать S-Terra Client 4.2, а в качестве криптопровайдера – S-Terra.
12.4. Запустите Wizard.
12.5. На первом шаге добавьте сертификат УЦ и локальный сертификат клиента из директории PUBLIC удаленного файлового хранилища, используя кнопку «Добавить». Имя контейнера для локального сертификата можно сгенерировать автоматически, пароль можно не задавать.
12.6. На втором шаге добавьте правило обработки трафика следующим образом:
12.6.1 Нажмите «Добавить»
12.6.2 В открывшемся окне в разделе IP-адрес партнера пропишите адрес сервера «С-Терра КП» с маской 32 бита (в данном сценарии – 192.168.1.100).
12.6.3 В разделе Действие в выпадающем списке выберите пункт «Защита IPsec».
12.6.4 Рядом со строкой Объект аутентификации нажмите на кнопку «…». В открывшемся окне в разделе Локальный ID удалите все содержимое строки Значение ID и нажмите ОК (Рисунок 2). Возникнет окно с предупреждением о пустом значении, закройте его нажав Да.
Рисунок 2
12.6.5 Добавьте адрес IPsec партнера (в данном сценарии им является центральный шлюз – 10.1.1.1).
12.6.6 Нажмите на кнопку «Дополнительно». В открывшемся окне перейдите на вкладку IKECFG настройки и поставьте флажок в поле «Запросить IKECFG-данные от партнера». Нажмите ОК.
12.6.7 Нажмите ОК, закрыв окно работы с данным правилом. В списке правил переместите его на самый верх списка (Рисунок 3). Таким образом, трафик между клиентом и сервером «С-Терра КП» будет защищен IPsec, весь остальной трафик разрешен, но защищаться не будет.
Рисунок 3
12.7. На третьем шаге нужно задать лицензию для клиента. Нажмите кнопку «Загрузить» и выберите файл с лицензией в директории PUBLIC удаленного файлового хранилища.
12.8. Завершите работу мастера нажав кнопку «Закончить».
12.9. Во вкладе LSP появится автоматически сгенерированная LSP на основе только что заданных правил. В тексте LSP найдите раздел CertDescription local_cert_dsc_01 и удалите внутри него все строки так, чтобы он выглядел следующим образом:
CertDescription local_cert_dsc_01(
)
12.10.Сохраните настроенный шаблон. Меню Файл, пункт Сохранить как….
12.11.Закройте созданный проект. Откройте меню Инструменты раздел Удаленное файловое хранилище и выгрузите файл проекта в директорию со скриптом под именем 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
в директории проекта. Установку производить в соответствии с документацией.
После установки клиенты станут доступны для дальнейшей настройки в
«С-Терра КП».
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
}
}