Семь быстрых тестов при внедрении DLP

Автор: Галиулин Тимур, старший инженер внедрения.

Здравствуйте, уважаемые читатели!

В этой статье я хотел бы затронуть тему тестирования DLP-системы. В отличие от вдумчивых тестов в виртуальной среде, в полевых условиях полноценных испытаний провести не удается по нескольким причинам:

  • время ограничено;
  • специалисты заказчика отвлекают и задают неудобные вопросы;
  • непросто переключиться с алгоритмов на организационные моменты.

Когда мы находимся на обьекте внедрения системы или подтверждаем ее работоспособность на приемо-сдаточных испытаниях, не всегда удается все настроить с первого раза. Принципиально важно быстро понять источник проблемы и также быстро его устранить. Я взял за основу несколько решений для типичных задач, встречающихся на каждом внедрении, и автоматизировал их. Это минискрипты, которые можно написать на месте и решить самые популярные вопросы, ничего не устанавливая отдельно и не усложняя процесс.

Основные вопросы, с которыми я уже столкнулся и хочу описать в статье:

  1. Быстрое тестирование определенного функционала системы с минимальным привлечением специалистов отделов информационных технологий и информационной безопасности, а также пользователей.
  2. Быстрая проверка готовности инфраструктуры заказчика для внедрения и проверки того, будут ли работать наши каналы перехвата на местах, сможем ли тестировать задачи настройки из п.1.
  3. Оперативный мониторинг того, как отреагирует система на определенное событие в трафике, не дожидаясь самого события. Необходимый пункт для получения входных данных при последующей настройке политики. Это могут быть отправители, типы файлов, веб-ресурсы или что-то другое.
  4. Как быстро и без проблем сгенерировать много событий из п.3 со схожими либо различными параметрами и отправить их, например, по расписанию для имитации реальной работы системы.

Разобьем задачу на фрагменты.
Отдельно протестируем каждый канал перехвата и доступность инфраструктуры, для чего используем powershell. Его не надо ставить отдельно. В наших требованиях к испытаниям указана рабочая станция с ОС Windows. Эта операционная система встречается у заказчиков в 90% случаев.

Рассмотрим сложности каждого этапа работы подробно:

<source lang="powershell">
#Test file presence
if (test-path -path C:\file.txt)
   {
 Write-Host "$Server; Есть файл " -ForegroundColor Green
 remove-item "$path"
 }
 else
 {
 Write-Host "$Server; Нет файла" -ForegroundColor Red
 $File= New-Item -Path "$path" -ItemType "file"
 }
$path= "C:\file.txt"
$DATA= "строго конфиденциально"
#Increasing Filesize up to 100Kb
set-content -value (new-object byte[] 100kb) -encoding byte $path
add-Content -value $DATA -Path $path -Encoding UTF8</source>

  1. Ищем устройства
    Если заказчик не знает всю свою сеть, это не значит, что он не хочет всю ее обезопасить. Помогаем найти устройства. Задача в принципе банальная: проверить тип устройства , отвечает ли оно на SNMP-запросы, можно ли туда поставить наш софт. Под эти задачи давно существуют совершенно монструозные программы со встроенными браузерами, базами данных и планировщиками, хотя все эти задачи можно решить в пару строчек.
    Воспользуемся замечательным оператором интервала powershell. Вариант сканера сети в одну строчку, который я использую:
    <source lang="powershell">1..254 | ForEach {Test-Connection "172.16.1.$_" -Count 1 -ErrorAction SilentlyContinue}</source>

    Можно дописывать скрипт – экспортировать в файл и выбирать нужные поля из обьекта, но зачем? Достаточно просто скопировать список отозвавшихся хостов и вставить в csv-файл.
    Хотите имена хостов? Поищем их в DNS, обратившись к .NET-классу напрямую:
    <source lang="powershell">Import-Csv e:\file.csv|ForEach{$host =[System.Net.Dns]::GetHostByAddress($_.IPAddress)).Hostname </source>
  2. Тестируем все порты для нужных клиентов
    В случае если устройство найдено, но поставить агент туда мы почему-то не можем, скорее всего, мешает файервол. Поищем все открытые/закрытые порты, заявленные для корректной работы нашего ПО. Попутно формулируем ответы на вопросы, почему оно не ставится? Здесь можно вспомнить одно из самых популярных применение протокола telnet. Конечно, мы можем поставить telnet на нашу машину и поискать открытые порты на каждом устройстве.Но в этом нет необходимости – это слишком долго.
    Я использую основу для скрипта, которую уже давно нашел в глубинах интернета.
    Зададим список нужных нам портов и диапазон адресов. И сделаем два цикла:
    <source lang="powershell">
    $port = "25","21","22","15101","15003","15100","15505","15506","593","138", "137","139","445","1433","3389","443"
    $net = "10.60.20"
    $range = 1..4
    foreach ($px in $port)
    {
    foreach ($r in $range)
    {
    $ip = "{0}.{1}" -F $net,$r if(Test-Connection -BufferSize 32 -Count 1 -Quiet -ComputerName $ip){
    try
    {
    $socket = new-object System.Net.Sockets.TcpClient($ip, $px)
    If($socket.Connected)
    {
    write "$ip $px open"
    $socket.Close()
    }
    }catch{}
    }
    }
    } </source>
    На выходе получим примерно следующее:
    192.168.1.5 22 open
    192.168.1.5 443 open
  3. Исключаем приложения в массовом порядке
    Вы успешно открыли порты и поставили агент DLP, но получили оккупационную армию на своем компьютере: половина ваших приложений отказывается выйти в интернет, другая половина перестала подключаться ко внутренним ресурсам? Все дело в измененном сертификате.
    Агент DLP подменяет сертификат приложения и, если сервер не в состоянии его проверить, возникает ошибка. Стоит сказать, что это происходит только в случае проверки сертификата на другом конце, и большинство вендоров (например, KasperskyLab, VMware, и InfoWatch в том числе) подобную проверку проводят.
    Рассмотрим пример:
    Необходимо единовременно внести более сотни исключений приложений из перехвата. Приложения собраны в отдельной директории, распределены по поддиректориям, имеющим понятные названия, например:
    c:\исключения
    • Photoshop.exe
    • Illustrator.exe
    • MSACCESS.EXE
    • OUTLOOK.EXE
    • WINWORD.EXE
    • Delphi 7
    • tnsping.exe
    и т.д. Пишем сценарий, который просмотрит все файлы в указанной директории, и SQL-сценарий, загружающий исключения непосредственно в БД MS SQL.
    Уместимся примерно в 20 строчек. Сначала мы пройдемся по файлам и вытащим из них цифровую подпись издателя, которая нужна для создания исключения.
    <source lang="powershell">
    $path="C:\ исключения\"
    $list=Get-ChildItem $path|? {$_.name -like "*.exe"}
    foreach ($i in $list) {
    $a=Get-AuthenticodeSignature .\program.exe|Select -ExpandProperty SignerCertificate|fl -Property Subject
    $b=$a|Out-String
    $b -match "CN=(\w+\s+\w+)"
    $matches[1]> file.txt
    }</source>

    В системе уже есть некие исключения, но если заглянуть в СУБД MSSQL, их точно меньше 50. Чтобы не попасть на constraint и не получить ошибку, сделаем ID первого исключения равным 99.
    Рассмотрим вариант скрипта для MSSQL с Windows-авторизацией:
    <source lang="powershell">$inc=99
    $conn= New-Object system.data.sqlclient.sqlconnection
    $conn.ConnectionString="data Source=localhost\SQLEXPRESS;Initial catalog=DBO;Integrated Security=SSPI"
    $conn.open()
    $cmd=$conn.createcommand()
    $cmd.connection=$conn
    foreach ($line in $list=gc "file.txt") {
    $inc=$inc+1
    $query= "INSERT INTO [sqlexpress].[dbo].[ExcludedApplication]([Id],[Description],[ApplicationName],[Interceptor],[OriginalName],[SubjectDN]
    ,[Path]) VALUES ('$inc','$line.name','$line.name','3','test','test','')"
    $cmd.commandtext=$query
    $cmd.ExecuteNonQuery()
    }
    $conn.close() </source>

     

    В строчке с INSERT я пишу test в полях обязательных к заполнению, но это всего лишь пример.

  4. Тестируем почту
    Вы поставили агент и все у вас работает. Известно, что сама по себе DLP не представляет для заказчика большого интереса. Необходимы кастомизация и настройки перехвата тех данных, которые нельзя отправлять наружу.
    Особенно остро эта проблема стоит в случае обновления или донастройки уже работающих систем. Возникает дилемма. С одной стороны, нельзя потерять трафик потенциальных нарушителей в процессе тестирования, с другой, систему все-таки нужно настроить, отправив события на анализ.
    Начнем с основного канала передачи данных – почты. Отправим письмо без клиентов и веб-интерфейса. Вы все еще используете telnet для отправки писем? Учитываем, что попадание тестовых писем к реальным пользователям нежелательно.
    Разумеется, ваш почтовый сервер должен позволить вам отправить почту. Впрочем, вы можете отправлять напрямую в DLP, если открыть 25 порт. Вдаваться в подробности не буду, дабы не раскрывать архитектуру продукта. В скрипте подстрахуемся на случай битых кодировок, явно ее указав.
    В простом случае поместимся в две строчки:
    <source lang="powershell">$enc=[system.text.encoding]::UTF8
    Send-MailMessage -From -To -Subject Hello -SmtpServer 127.0.0.1 -Encoding $enc -Attachments "C:\text.txt" -Body "строго конфиденциально"</source>

    Тут вы можете отправить любые термины и любые вложения в письме, можете тестировать любое количество адресатов и периметров. Завернув пример в цикл, получится имитировать реальный трафик и выполнять настройку, не отвлекаясь на генерацию событий в систему. Если вы уже все закрыли и настроили SSL и авторизацию, все будет сложнее и длиннее, не стоит с этим торопиться, пока все не проверите.
    <source lang="powershell">$SMTPAuthUsername = "username"
    $SMTPAuthPassword = "password"
    $emailattachment = ""
    function send_email {
    $mailmessage = New-Object system.net.mail.mailmessage
    $mailmessage.from = ("")
    $mailmessage.To.add("")
    $mailmessage.Subject = "LOGON"
    $mailmessage.Body = $emailbody
    $attachment = New-Object System.Net.Mail.Attachment($emailattachment, 'text/plain')
    $mailmessage.Attachments.Add($attachment)
    $SMTPClient.EnableSsl = $true
    $mailmessage.IsBodyHTML = $true
    < $SMTPClient = New-Object Net.Mail.SmtpClient("192.168.34.11", 25)
    < $SMTPClient.Credentials = New-Object System.Net.NetworkCredential("$SMTPAuthUsername", "$SMTPAuthPassword")
    < $SMTPClient.Send($mailmessage)
    < }
    < send_email </source>
  5. Тестируем запись теневых копий файлов на диск
    Второе по популярности применение DLP – это контроль съёмных носителей.
    Допустим, нам нужно видеть в системе файлы определенных расширений и размера с целью перехвата, либо исключения.
    Тут есть нюанс: при подключении носителя система сама выбирает метку тома. Чтобы найти метку по имени примонтированого устройства, понадобится написать скрипт побольше. Метку тома лучше запомнить и указать в пути, дабы не тратить время. Не отключайте флешку. Сложнее всего найти алгоритм быстрого заполнения файла мусором. Операция для ста файлов оказалась слишком долгой.
    Приведу простой пример. Проверим, создали ли мы уже файл, если нет – создаем, если есть – удаляем и создаем.
  6. Выложим файл в сеть
    Сейчас уже появились сайты вроде dlptest.com. Но выход в интернет может быть ограничен и возможности скрипта все же шире. По умолчанию система работает только с post-запросами, значит, в сеть надо выложить хоть что-то. При авторизации на сайте можно протестировать систему на перехват паролей. Воспользуемся встроенным web-клиентом. В случае наличия прокси – вам понадобится также указать настройки сервера:
    <source lang="powershell">
    #UPLOAD FILE
    $srv = “http://www.filedropper.com”
    $proxylgn="domain\user"
    $proxypwd="Password"
    $proxyadr= "proxy:8080"
    $File= “C:\test.txt”
    Write-Host -Object "http url: $srv"
    $webclient = New-Object -TypeName System.Net.WebClient

    #Other user
    #$creds=Get-Credential
    #$webclient.Proxy.Credentials=$creds

    # Custom proxy
    #$WP =New-Object System.Net.WebProxy $proxyadr
    #$lgn= ConvertTo-SecureString $proxylgn -AsPlainText -Force
    #$pwd = ConvertTo-SecureString $proxypwd -AsPlainText -Force
    #$WP.Credentials = New-Object System.Net.NetworkCredential ("$lgn", "$pwd")
    #$webclient.proxy.credentials=$WP.Credentials

    #Logon on site
    #$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass)

    $url = New-Object -TypeName System.Uri -ArgumentList $srv
    Write-Host -Object "Uploading $File..."
    $webclient.UploadFile($url, $File) </source>
  7. Тестируем печать
    Когда я начал тестировать печать для быстрого формирования событий на корпоративном стенде, мне позвонили из московского офиса и сообщили, что их принтер вышел из строя, и попросили завершить процесс. Пришлось переключиться на печать в XPS – открытый формат разметки на базе XML. В этом случае вам и принтер под рукой не нужен, и событие вы создадите. Строчку для печати на принтер по умолчанию я закомментировал:
    <source lang="powershell">
    #PRINT TEST - default page
    #$printer=gwmi win32_printer|? {$_.default -eq "True"}
    #$printer.printtestpage()
    < #For XPS print
    < $ptr = (gwmi win32_printer | ? { $_.name -match 'xps'}|Select-Object -First 1).name
    < $ptr
    < echo "DATA"| Out-Printer -Name $ptr</source>

Что получилось и зачем это нужно:

  • Вы можете создать практически любой тип события из командной строки, поставив на устройство только DLP-клиент.
  • Вам не нужен ни браузер, ни приложение печати, ни текстовый редактор, ни почтовый клиент. Не нужно устанавливать лишний софт только для проверки.
  • Вам не нужно тратить время на работу в интерфейсе, не нужна рабочая станция для тестов – все можно сделать с сервера.
  • Вы можете имитировать реальный трафик системы.

Удачных тестов!

Подпишитесь на рассылку INFOWATCH
l.12-.057c.834-.407 1.663-.812 2.53-1.211a42.414 42.414 0 0 1 3.345-1.374c2.478-.867 5.078-1.427 7.788-1.427 2.715 0 5.318.56 7.786 1.427z" transform="translate(-128 -243)"/>