Веселые уроки WinCC OA. Шифрованные коммуникации c PLC Simatic S7-1200/S7-1500
Компания Siemens в версии 17 TIA Portal Step7 для FW ≥4.5 (S7-1200) и FW ≥2.9 (S7-1500) встала на путь легкого принуждения к повышению уровня информационной безопасности. Теперь TIA Portal мягко предлагает задать пароль на хранилище сертификатов CPU, пароль на чтение/запись программы CPU, пароль на обмен с HMI и, конечно же, шифрованный обмен с применением сертификата. Все это, конечно, отключаемо, но зачем отключать то, что предлагается «из коробки»? События этого века показали всю важность инфобеза систем промышленной автоматики, а так же показали, что происходит при защите систем «от честного человека» (я про stuxnet, да). Основная причина, по которой, как мне кажется, шифрование не применяется - непонимание принципов работы и инерционность мышления (наши деды ни про какой TLS не слышали, и мы тоже не будем). В рамках одного проекта TIA Portal все еще более-менее ясно, а как быть с подключением «непортальных» систем? Рассмотрим такое подключение на примере S7-1500 FW2.9 и WinCC OA 3.18. Поскольку главная задача- это настройка со стороны WinCC OA, то на стороне TIA Portal мы не будем использовать global security settings, обойдемся «простым» проектом. Кстати, вот настройки безопасности, которые появляются после выполнения «визарда» при добавлении CPU в проект.
Тут задается пароль ПЛК для доступа к секретным данным, вроде сертификатов.
А это уровни доступа к ПЛК по паролю. Делятся на «пароль не нужен», «только чтение данных + связь с HMI», «только связь с HMI» и «пароль на все». В данном случае выбран режим «пароль на все» и задано два пароля - один пароль на полный доступ будет знать только разработчик ППО CPU (и его начальник, но это организационные меры), а пароль на связь с панелью или скадой по секрету сообщается разработчику прикладного проекта WinCC OA.
На этой вкладке указано, что мы работаем только по безопасным каналам связи с программатором, скадой и панелью, выбран сертификат со стороны ПЛК. Обратите внимание, что опция «разрешить put/get» недоступна. Все правильно, ибо в словах «put/get» the letter «s» stands for security, а по-русски: «такой механизм вообще нельзя использовать при шифрованной связи».
А вот тут мы видим список сертификатов CPU. И я предлагаю сразу проэкспортировать сертификат из проекта Portal куда-нибудь на диск в виде файлика. Напомнию про организационные меры - это очень важный файл, не надо выкладывать его на торренты с точным указанием, на каком объекте и в какой системе он применяется.
В обязательном порядке выполняем экспорт данных PLC. Для этого в TIA Portal должна быть установлена бесплатная опция SIMATIC SCADA Export соответствующей версии.
Экспорт данных ПЛК в виде файла Export.zip сохраняется на рабочем столе моего ПК.
Ну, а теперь перейдем к верхнему уровню. Создаем «legacy standart project» или же «стандартный с базовыми настройками безопасности», так как тип проекта не влияет на работу драйвера. Добавляем в консоль драйвер S7plus под номером 2 и запускаем его.
Сейчас необходимо скопировать файл экспорта и файл сертификата в соответствующие директории прикладного проекта WinCC OA.
Export.zip - в <project_name>\data\TIAProjects
Сертификат - в <project_name>\data\s7plus\cert
Открывает модуль «управление системой» и заходим в пункт «драйверы S7».
Нажимаем кнопку Создать, задаем имя соединения и приступаем к его настройке.
Выбираем в качестве источника имен тэгов и конфигурации TIA Project, проверяем номер драйвера (2) и жмем ОК. В следующем окне выбираем имя проекта (Export, мы его уже скопировали) и имя ПЛК в рамках проекта, это PLC_1. ПЛК можно развернуть и посмотреть его тэги. В завершении жмем ОК.
Проверяем настройки PG/PC. Мой ноутбук смотрит в сеть контроллера беспроводным интерфейсом и общается в режиме TCP/IP, все верно.
Если прямо сейчас в окне соединения мы попытаемся установить связь, то ничего не получится, мы увидим в журнале событий сообщение о невозможности законнектиться, ибо TLS. Так что, даже не пытаемся, продолжаем настройки... Хотя, нет. Попытаемся! Ииииии: SEVERE, 88/s7plus, S7PlusConnection, async command type 1, get_request_error, _myS7enc, Response from PLC, when TLS must be used (TLS_only). (-6772897069067010568)
Очевидно, не работает от того, что не настроено шифрование. Перейдем на вкладку расширенных настроек и выставим галочку Use TLS, источником сертификата оставим файл, а сам файл мы уже скопировали в нужную папку проекта.
Теперь остается указать пароль. Но какой? Их у нас целых три. Очевидно, что пароль на доступ к секьюрным данным ПЛК - не тот, что нам нужен. Остается пароль полного доступа и пароль HMI. Вводим пароль доступа HMI, и нам тут же предлагают сгенерировать ключ со стороны WinCC OA.
Устанавливаем соединение при помощи соответствующей галочки и смотрим журнал.
На самом деле никто не запрещает нам со стороны WinCC OA применить пароль полного доступа. Тоже будет работать, ибо Full Access включает в себя и HMI в том числе. Если же вдруг опечатались или ввели не тот пароль, лог будет забиваться следующими сообщениями:
SEVERE, 54, Unexpected state, NotificationHandler, handle_notification, _myS7enc, Invalid value retrieved for subscription. Access denied = 1, Out of memory = 0, Status = 10
Access denied = 1, т.е. доступ запрещен.
Кроме того, возможна ситуация отсутствия пароля, как в примере ниже.
Оставляем строчку пароля пустой, и все прекрасно работает. Шифрование связи при этом сохраняется, а без файла сертификата никто не подключится.
Далее необходимо убедиться, в наличии обмена на уровне тэга. Для этого запускаем модуль para, создаем точку данных в типе ExampleDP_Bit и навешаем на нее адресный конфиг.
Настраиваем переменную на чтение. Я выбрал стандартный тэг из серии Clock (меняет свое значение с известной частотой), выбираем поллинг, создаем группу опроса и делаем ее активной, ну и делаем активным сам конфиг.
После чего убеждаемся, что значение переменной меняется.
Надеюсь, этот незамысловатый гайд поможет многим коллегам быстро найти ответ на вопрос «А чего это мы не подключаемся к контроллеру, а к соседнему подключаемся, сделав точно такие же настройки».