Open source
Рекомендация: подборка платных и бесплатных курсов 3D-моделирования – https://katalog-kursov.ru/
В этой статье я расскажу о том, как я решал задачу об интеграции в тестовом режиме с сервисами, которые работают с использованием алгоритмов, определенных ГОСТ Р 34.10-2001 (устарел) и ГОСТ Р 34.10-2012. Приведу примеры некоторых проблем, с которыми столкнулся при решении задачи, дам ссылки на готовое решение и покажу несколько примеров их использования.
- Введение
- Причины
- 3 Браузер Спутник, плагин Госуслуг и плагин КриптоПро
- Установка КриптоПро для работы с корневыми и личными сертификатами
- Установка браузера Chromium или Спутник
- Установка расширения для плагина Госуслуг (ЕПГУ)
- Вход на сайт Госуслуги через Спутник
- Установка КриптоПро «CryptoPro Extension for CAdES Browser Plug-in»
- Добавление сайта в список доверенных сайтов плагина
- Установка сервера ELMA RPA
- Установка сервера на Windows
- Установка сервера через Docker-контейнер на Linux
- Изменение стандартного порта для HTTP подключения
- Сервис для создания подписей для ЕСИА на nodejs с КриптоПро 4. 0 в докер контейнере
- Принцип работы
- Установка лицензии
- Загрузка корневого сертификата
- Загрузка пользовательского сертификата
- Как запустить
- Рест сервер
- Как по быстрому выпустить тестовый сертификат:
- Авторизация
- Возможные проблемы:
- Env контейнера
- Корневые сертификаты
- Онлайн курс по Kubernetes
- Помогла статья? Подписывайся на telegram канал автора
- Поддержка ГОСТ-алгоритмов в PHP
- Проверка лицензии
- Настройка мониторинга Docker
- Создание Docker образа для связки CryptoPro и Nginx
- Описание Dockerfile (очевидные вещи опущены)
- Описание docker-entrypoint
- Полезные команды и информация
- Примеры использования OpenSSL + GOST-engine
- КриптоПро JCP
- Поддержка Рутокена
- Запуск контрольной панели
- Управление персональным сертификатом
- Создание
- Просмотр
- Удаление
- Размещение контейнеров
- Сохранение сертификата в файле
- Импорт персонального сертификата
- Статья про КриптоПро
- Поддержка ГОСТ-сертификатов в nginx
- Сборка OpenSSL, GOST-engine, cURL
- Ссылки
- КриптоПро ЭЦП Browser plug-in
- Установка
- Установка Zabbix Agent 2
- Подписание документа ЭЦП
- Использование образа в работе с языками программирования
- Сертификаты
- Список установленных сертификатов
- Добавление реального сертификата
- Добавление реального сертификата с привязкой к закрытому ключу и возможностью подписывать документы
- Способ с дискетой или флешкой
- С жесткого диска
- Проверка успешности установки закрытого ключа
- Добавление тестового сертификата
- Удаление сертификата
- Проверка сертификата
- Просмотр всех атрибутов сертификата
- Экспорт сертификатов на другую машину
- Проверка подписи ЭЦП
- Заключение
- Заключение
- Используемая литература
Введение
Ранее я уже делал заметку по поводу Zabbix Agent 2, где перечислил основные отличия от прошлого агента. Их там много, так что рекомендую ознакомиться, прежде чем продолжать. Со временем развитие будет получать именно 2-я версия, а старый агент будет просто поддерживаться в том виде, как он есть сейчас. Новый функционал в него уже не будут завозить.
Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:
- Установка CentOS 8.
- Настройка CentOS 8.
- Установка и настройка zabbix сервера.
То же самое на Debian 10, если предпочитаете его:
- Установка Debian 10.
- Базовая настройка Debian.
- Установка и настройка zabbix на debian.
Несколько релизов назад у Zabbix был анонсирован новый агент, расширяющий свой функционал с помощью плагинов. Сегодня я рассмотрю, как с помощью Zabbix Agent 2 настроить мониторинг контейнеров Docker, используя базовый шаблон. Заодно и посмотрю, что из себя представляет новый агент.
Онлайн-курс по Kubernetes – для разработчиков, администраторов, технических лидеров, которые хотят изучить современную платформу для микросервисов Kubernetes. Самый полный русскоязычный курс по очень востребованным и хорошо оплачиваемым навыкам. Курс не для новичков – нужно пройти вступительный тест.
Причины
Для начала стоит сказать, что для продакшн-окружения существуют сертифицированные средства от компаний «Криптоком», «Крипто-Про», «Сигнал-КОМ» и других. Мне же нужно было реализовать взаимодействие в тестовом (девелоперском) окружении на Linux, покупать для этого лицензии не очень-то удобно, но что хуже, в открытом доступе отсутствуют документации по этому вопросу. По запросу «https гост» не так много решений. Среди них упоминается использование OpenSSL + Крипто CSP, я не помню деталей, но эта связка у меня не завелась с поддержкой ГОСТ Р 34.10-2012. Другим результатом, который часто встречался, было предложение использовать OpenSSL 1.0, в котором GOST-engine встроен внутрь, но такое решение тоже не содержало в себе поддержку GOST2012-GOST8912-GOST8912
.
Рабочим решением оказалась сборка OpenSSL 1.1.0g + вынесенный в отдельно подключаемый динамический движок GOST-engine. В интернете часто встречается упоминание, что некая российская компания приложила усилия по его разработке, но в самом репозитории нет сведений об авторах продукта. Пользуясь случаем, выражаю авторам благодарность за движок в open source. На этой странице сказано, что до OpenSSL 1.1.0 использовался встроенный движок GOST, сейчас для GOST используется сторонний от OpenSSL продукт. Судя по конфигурации, скорее всего, это одна и та же библиотека.
Требуемый опыт работы: 1–3 года
Полная занятость, полный день
Москва, Проспект Мира, Проспект Мира
Работодатель, вероятно, уже нашел нужного кандидата и больше не принимает отклики на эту вакансию
Поддержка Инфраструктуры Компании. Обеспечение бесперебойной работы оборудования, ИТ сервисов и пользователей. Администрирование серверов Windows Server 2012R2-2022 (AD…
Квалификация, соответствующая MCP и CCNP. Отличные знания Azure AD\Office365 и MS Exchange Server 2016-2019 (обязательно).
Проведение работ по обслуживанию ИТ- оборудования. Организация приёма-передачи документов. Проверка заполнения документации. Проведение диагностирования оборудования и оценка его технического…
Знание Microsoft Exсel, Word. Знание системного ПО, установка, настройка. Знание функции ВПР, сводные таблицы, фильтры. Знание номенклатуры печатающей техники и…
Работодатель сейчас онлайн
написание отчетов, настройка маршрутизации документов. – администрирование и сопровождение банковского ПО – «iBank», ДБО BS-Client, Correqts Corporate, ИСУБД «Новая Афина». –
высшее инженерно-техническое образование. – профильный стаж работы от 5 лет. Будет плюсом: – опыт работы со СКЗИ (КриптоПро, Валидата). –
Москва
, Октябрьское поле
и еще
1
Пуско-наладка телекоммуникационного оборудования в области VoIP-решений. Подготовка проектной документации в объёме ТЗ, ТП, РД, ИД, ЭД.
Опыт работы в качестве проектировщика и пуско-наладчика с системами IP-телефонии и унифицированных коммуникаций корпоративного класса Eltex, Сател, Агат…
Администрирование серверов (в основном – виртуальных) под управлением Linux. Администрирование прикладного и технологического ПО в Linux, СУБД, кластеров высокой надежности.
Опыт создания сред разработки, настройки CI/CD, пайплайнов и окружений (тэги для понимания стека: docker, docker-compose, k8s…
Анализ, выявление, формализация, уточнение потребностей заказчика. Анализ интерфейсов и формирование CAN-матриц на их основании. Анализ нормативов, правил и стандартов…
Высшее техническое образование. Английский язык на уровне чтения и написания технической документации. Навыки управления требованиями, знание ISO 15288 и ISO…
3 Браузер Спутник, плагин Госуслуг и плагин КриптоПро
Скачать документ
Установка КриптоПро для работы с корневыми и личными сертификатами Установка браузера Chromium или Спутник Установка расширения для плагина Госуслуг (ЕПГУ) Вход на сайт Госуслуги через Chromium Установка КриптоПро «CryptoPro Extension for CAdES Browser Plug-in» Добавление сайта в список доверенных сайтов плагина
Установка КриптоПро для работы с корневыми и личными сертификатами
Для установки КриптоПро перейдите по ссылке.
Установка браузера Chromium или Спутник
Для установки браузера Спутник зайдите на сайт https://sputnik-lab.com/, выберите версию «RED OS Linux 7.1 (64bit)» и нажмите кнопку «Скачать».
Перейдите в каталог со скачанным файлом (в качестве примера /home/test):
Для установки выполните команду:
- для РЕД ОС 7.1 или 7.2:
# yum install sputnik-browser-stable-5.6.6325.0-1.x86_64.rpm
- для РЕД ОС 7.3 и старше:
# dnf install sputnik-browser-stable-5.6.6325.0-1.x86_64.rpm
Для установки браузера Chromium перейдите по ссылке.
Установка расширения для плагина Госуслуг (ЕПГУ)
1. Выполните команду для установки дополнений:
- для РЕД ОС 7.1 или 7.2:
# yum install ifcplugin-chromium.x86_64
- для РЕД ОС 7.3 и старше:
# dnf install ifcplugin-chromium.x86_64
2. Установите расширение для плагина Госуслуг (ЕПГУ), перейдя по ссылке, и нажмите кнопку «Установить».
Вход на сайт Госуслуги через Спутник
1. В браузере Спутник перейдите по ссылке и нажмите кнопку «Вход».
2. На открывшейся странице нажмите на «Вход» с помощью электронной подписи.
3. Подключите токен с ключом к компьютеру и нажмите кнопку «Готово».
4. Выберите сертификат ключа проверки электронной подписи, щёлкнув левой кнопкой мыши по строке с сертификатом.
5. Введите ПИН-код пользователя и нажмите кнопку «Продолжить».
Установка КриптоПро «CryptoPro Extension for CAdES Browser Plug-in»
1. Скачайте плагин, перейдя по ссылке.
2. Распакуйте скачанный архив:
$ tar -xvf cades_linux_amd64.tar.gz
3. Перейдите в папку с распакованным архивом и установите следующие пакеты:
- для РЕД ОС 7.1 или 7.2:
# yum install ./cprocsp-pki*rpm
- для РЕД ОС 7.3 и старше:
# dnf install ./cprocsp-pki*rpm
4. Установите плагин CryptoPro Extension for CAdES Browser Plug-in, перейдя по ссылке, и нажмите кнопку «Установить».
Проверить работу плагина можно по ссылке.
Добавление сайта в список доверенных сайтов плагина
Для добавления сайта откройте меню плагина и выберите пункт «Настройка доверенных сайтов».
Далее откроется страница, на которой можно произвести добавление сайтов:
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.
Установка сервера ELMA RPA
Требуется редакция ELMA RPA Standard или Enterprise.
Вы можете установить сервера ELMA RPA на ОС Windows или Linux.
Установка сервера на Windows
Для работы сервера ELMA RPA на Windows требуется:
- : Windows 10 64-bit: Pro, Enterprise or Education (Build 16299 or later) или Windows Server 2016 / Windows Server 2019;
- : Docker 19.03.1;
- : 2 ядра, тактовая частота 3 GHz и выше (рекомендуется Intel Xeon);
- : 4 Gb;
- : не менее 10 Gb свободного пространства на системном диске.
Процесс установки состоит из нескольких шагов.
Шаг 2. Распакуйте архив elma_rpa_server_v1.0.9_linux_amd64_docker.tar в необходимую папку.
Шаг 3. Откройте PowerShell и перейдите в папку с распакованным архивом.
Шаг 4. Перейдите в папку dockers_images с помощью команды:
Шаг 5. Загрузите образы, находящиеся в папке dockers_images, в Docker с помощью команд:
Шаг 6. Вернитесь к родительской папке.
Шаг 7. Чтобы запустить сервер, выполните команду:
Установка сервера через Docker-контейнер на Linux
Для работы сервера ELMA RPA на Linux требуется:
- : операционная система семейства 64-bit Linux;
- : Docker 19.03.1;
- : 2 ядра, тактовая частота 3 GHz и выше (рекомендуется Intel Xeon);
- : 4 Gb;
- : не менее 10 Gb свободного пространства на системном диске.
Процесс установки состоит из нескольких шагов.
Шаг 1. Скопируйте архив elma_rpa_server_v1.0.9_linux_amd64_docker.tar в папку, где размещается сервер ELMA RPA (корневая папка сервера).
Шаг 2. Распакуйте архив с помощью команды:
Шаг 3. Перейдите в папку rpa_server_docker.
Шаг 4. Запустите bash-скрипт load_docker_imgs с помощью команды:
Скрипт загрузит образы ELMA RPA Server в docker.
Шаг 5. Проверьте наличие загруженных образов с помощью команды:
Шаг 6. Чтобы запустить сервер, выполните команду:
Изменение стандартного порта для HTTP подключения
После установки Оркестратора необходимо проверить корректность его работы.
Если порт занят другим приложением, вы можете изменить его.
Для этого выполните следующие действия (на примере Linux):
- Отредактируйте файл .
- Отредактируйте файл .
Нашли опечатку? Выделите текст, нажмите ctrl + enter и оповестите нас
Сервис для создания подписей для ЕСИА на nodejs с КриптоПро 4. 0 в докер контейнере
Принцип работы
- Устанавливает КриптоПро из установщика
cryptopro/install/linux-amd64_deb.tgz
- Устанавливает лицензию КриптоПро
- Загружает корневой сертификат есиа
- Загружает пользовательский сертификат
- Запускает рест сервер со swagger и методом создания подписей
Установка лицензии
Лицензия устанавливается из аргумента LICENSE, если не указана используется триал версия(работает 3 месяца).
Загрузка корневого сертификата
в зависимости от аргумента ESIA_ENVIRONMENT загружается сертификат нужного окружения есиа:
Корневые сертификаты есиа лежат в папке cryptopro/esia
Загрузка пользовательского сертификата
Необходимо специальным образом сформировать zip-архив certificate_bundle.zip и положить его в папку /cryptopro/certificates.
Пример такого zip-файла лежит в той же директории под названием certificate_bundle_example.zip
Содержимое zip файла:
├── certificate.cer - файл сертификата
└── le-09650.000 - каталог с файлами закрытого ключа
├── header.key
├── masks2.key
├── masks.key
├── name.key
├── primary2.key
└── primary.key
Первый найденный файл в корне архива будет воспринят как сертификат, а первый найденный каталог – как связка файлов закрытого ключа. Пароль от контейнера, если есть, передается аргументом CERTIFICATE_PIN
Как запустить
- Скачать КриптоПро CSP 4.0 для Linux (x64, deb) и положить по пути
install/linux-amd64_deb.tgz
- Подложить архив с сертификатом как
/cryptopro/certificates/certificate_bundle.zip
- Создаем образ
docker build --tag cryptopro-sign --build-arg CERTIFICATE_PIN=12345678 .
- Запускаем
docker run -it --rm -p 3037:3037 --name cryptopro-sign cryptopro-sign
Рест сервер
POST /cryptopro/sign
– подписать текст
Как по быстрому выпустить тестовый сертификат:
- Запустить докер контейнер по инструкции выше
- Заходим в запущенный контейнер
docker exec -ti cryptopro-sign sh
- Создаем запрос на сертификат
cryptcp -creatrqst -dn 'cn=test' -cont '\\.\hdimage\test2' -pin 12345678 tmp/test.csr
(попросит понажимать разные клавиши) - Выводим результат
cat /tmp/test.csr
- Заходим на
http://www.cryptopro.ru/certsrv/certrqxt.asp
и вставляем вывод - В следующем окне выбираем
Base64-шифрование
иСкачать сертификат
- Качаем и сохраняем
certnew.cer
файл в проекте по путиcryptopro/certificates/certnew.cer
- В отдельном терминале переносим файл в запущенный контейнер
docker cp cryptopro/certificates/certnew.cer cryptopro-sign:tmp/test.cer
- Возвращаемся в первый терминал и загружаем сертификат в КриптоПро
cryptcp -instcert -cont '\\.\hdimage\test2' tmp/test.cer
- Попросит ввести пароль. Вводим
12345678
- Переносим на нашу машину приватные ключи
docker cp cryptopro-sign:var/opt/cprocsp/keys/root/test2.000 cryptopro/certificates/test2.000
- В папке проекта
cryptopro/certificates
создаем архив. В архив кладем папкуtest2.000
и файлcertnew.cer
- Архив называем
certificate_bundle.zip
, пересобираем докер образ и запускаем.
Черпал вдохновение и взял многие вещи из этого репозитория
Авторизация
Для использования в продакшене лучше, чтобы сервис был не доступен снаружи инфраструктуры, т.к тут через рест можно что угодно подписать зашитым сертификатом. Если все же инфраструктура открытая, то в сервис следует встроить проверку авторизации.
Возможные проблемы:
Если получаете код ошибки 0x80090010 при вызове метода sign – вероятно срок действия вашего сертификата истек. Попробуйте создать новый по инструкции.
Env контейнера
PORT - numer. Порт рест сервера. Дефолт: 3037
docker run -d --name crypto-nginx --privileged --security-opt seccomp=unconfined --tmpfs /run --tmpfs /run/lock -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 443:443 -t crypto
Получение тестового сертификата для сервера (test.ru заменить на имя сайта). При запросе пароля для криптоконтейнера ввести пустой пароль:
docker -ti crypto-nginx /root/config.sh test.ru
[email protected] /crypto-proxy # docker exec -ti crypto-nginx /root/config.sh navyzet.ru CryptCP 4.0 (c) , 2002-2015. Command prompt Utility file signature and encryption. Creating request... CPCSP: Signing with the use of GOST R 34.10-2001 keys is not allowed from January 1st, 2019. We highly recommend to move to the use of GOST R 34.10-2012 keys advance. Continue with the GOST R 34.10-2001 key generation (o) OK, (c) Cancel o Press keys... [..........................................................................] CryptoPro CSP: Set password on produced container . Password: Retype password: Passwords are not equal Password: Retype password: Sending request to CA... Installing certificate... Certificate is installed. [ReturnCode: 0] Certmgr 1.0 (c) , 2007-2010. program managing certificates, CRLs and stores Install: ============================================================================= 1------- Issuer [email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2 Subject CN=navyzet.ru Serial 0x12002667752E825729E3CF803A000000266775 SHA1 Hash 0x9e8c54c44ad16152ab55a59275a3dd01ef31143f SubjKeyID 80b4d87101a23e4050fb67a12f6ed72c424969c8 Signature Algorithm ГОСТ Р 34.11/34.10-2001 PublicKey Algorithm ГОСТ Р 34.10-2001 (512 bits) Not valid before 05/03/2018 15:15:32 UTC Not valid after 05/06/2018 15:25:32 UTC PrivateKey Link No CA cert URL http://testca.cryptopro.ru/CertEnroll/test-ca-2014_CRYPTO-PRO%20Test%20Center%202.crt OCSP URL http://testca.cryptopro.ru/ocsp/ocsp.srf CDP http://testca.cryptopro.ru/CertEnroll/CRYPTO-PRO%20Test%20Center%202.crl Extended Key Usage 1.3.6.1.5.5.7.3.1 ============================================================================= [ErrorCode: 0x00000000] Certmgr 1.0 (c) , 2007-2010. program managing certificates, CRLs and stores Exporting: ============================================================================= 1------- Issuer [email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2 Subject CN=navyzet.ru Serial 0x12002667752E825729E3CF803A000000266775 SHA1 Hash 0x9e8c54c44ad16152ab55a59275a3dd01ef31143f SubjKeyID 80b4d87101a23e4050fb67a12f6ed72c424969c8 Signature Algorithm ГОСТ Р 34.11/34.10-2001 PublicKey Algorithm ГОСТ Р 34.10-2001 (512 bits) Not valid before 05/03/2018 15:15:32 UTC Not valid after 05/06/2018 15:25:32 UTC PrivateKey Link Yes Container HDIMAGEcontaine.000514 Provider Name Crypto-Pro GOST R 34.10-2001 KC2 CSP Provider Info ProvType: 75, KeySpec: 1, Flags: 0x0 CA cert URL http://testca.cryptopro.ru/CertEnroll/test-ca-2014_CRYPTO-PRO%20Test%20Center%202.crt OCSP URL http://testca.cryptopro.ru/ocsp/ocsp.srf CDP http://testca.cryptopro.ru/CertEnroll/CRYPTO-PRO%20Test%20Center%202.crl Extended Key Usage 1.3.6.1.5.5.7.3.1 ============================================================================= Export [ErrorCode: 0x00000000] openssl: /opt/cprocsp/cp-openssl/lib/amd64/libssl.so.1.0.0: no version information available (required by openssl) openssl: /opt/cprocsp/cp-openssl/lib/amd64/libssl.so.1.0.0: no version information available (required by openssl) openssl: /opt/cprocsp/cp-openssl/lib/amd64/libssl.so.1.0.0: no version information available (required by openssl) openssl: /opt/cprocsp/cp-openssl/lib/amd64/libcrypto.so.1.0.0: no version information available (required by openssl) openssl: /opt/cprocsp/cp-openssl/lib/amd64/libcrypto.so.1.0.0: no version information available (required by openssl) openssl: /opt/cprocsp/cp-openssl/lib/amd64/libcrypto.so.1.0.0: no version information available (required by openssl) openssl: /opt/cprocsp/cp-openssl/lib/amd64/libcrypto.so.1.0.0: no version information available (required by openssl) Reloading nginx configuration nginx
В качестве клиента я использовал Chromium с поддержкой алгоритмов ГОСТ.
Корневые сертификаты
Просмотр корневых сертификатов
certmgr uroot
В более старых версиях вместо uroot следует использовать root:
certmgr root
Добавление корневых сертификатов (под root) из файла cacer.p7b
certmgr uroot cacer.p7b
Необходимо последовательно добавить все сертификаты
Онлайн курс по Kubernetes
Онлайн-курс по Kubernetes – для разработчиков, администраторов, технических лидеров, которые хотят изучить современную платформу для микросервисов Kubernetes. Самый полный русскоязычный курс по очень востребованным и хорошо оплачиваемым навыкам. Курс не для новичков – нужно пройти вступительный тест.
Если вы ответите “да” хотя бы на один вопрос, то это ваш курс:
- устали тратить время на автоматизацию?
- хотите единообразные окружения?;
- хотите развиваться и использовать современные инструменты?
- небезразлична надежность инфраструктуры?
- приходится масштабировать инфраструктуру под растущие потребности бизнеса?
- хотите освободить продуктовые команды от части задач администрирования и автоматизации и сфокусировать их на развитии продукта?
Сдавайте вступительный тест по ссылке и присоединяйтесь к новому набору!.
Помогла статья? Подписывайся на telegram канал автора
Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.
Поддержка ГОСТ-алгоритмов в PHP
PHP, конечно, позволяет делать вызовы системных команд, используя, например, exec. Но, глядя на то, как собирается PHP-FPM в Dockerfile, мне показалось, что можно легко собрать PHP с кастомными сборками OpenSSL и cURL. Как оказалось дальше, я ошибся, что это легко. Всё равно собрал.
По какой-то причине, я начал с PHP-FPM 7.1. Идея была в том, чтобы использовать multi-stage build. Для этого надо заменить в их Dockerfile инструкцию FROM на мою FROM rnix/openssl-gost AS openssl-gost, затем прописать копирования собранных openssl и curl до начала сборки самого php и, наконец, указать в опции сборки путь до этих библиотек –with-openssl-dir=/usr/local/ssl и –with-curl=/usr/local/curl заменив оригинальные.
Сюрпризы ждали отовсюду. Одним из значительных было то, что при сборки php 7.1 используется pkg-config, а явная установка libcurl4-openssl-dev, libssl-dev прописывали в pkg-config версии из пакетов. В результате собиралось не то, что нужно. Если убрать их установку, то /configure php падал, ссылаясь на отсутствие openssl в pkg-config. Пришлось дополнительно копировать из кастомных сборок openssl и curl их lib/pkgconfig /*. После десятков таких сюрпризов сборка начала проходить. Дальше выяснилось, что зависимости устанавливали openssl, тем самым перезатирая ранее скопированный бинарник моей кастомной сборки. Пришлось дополнительно копировать его в самом конце. Но это не всё.
В собранном php появились алгоритмы хешей openssl_get_md_methods()
: GOST R 34.11-2012 with 256 bit hash
, GOST R 34.11-2012 with 512 bit hash
, GOST R 34.11-94
. Это значило, что php подключил GOST-engine. А вот использование расширения curl в php почему-то говорило, что таких алгоритмов не знает, соединяясь с хостом по GOST-HTTPS. Я потратил несколько часов, пытаясь найти причину этого. Я смотрел исходники, как устроено расширение curl в php, как устроен сам curl, как они связываются с openssl. Я искал место, где могут определяться поддерживаемые алгоритмы или подключатся движки. Я искал по master-веткам, много гуглил, но ничего, что решило бы сразу проблему, не нашел. Тогда я вспомнил, что я собираю не последнюю версию PHP.
Я попробовал собрать PHP-FPM 7.2. Пришлось внести некоторые правки в мой скрипт корректировки оригинального Dockerfile PHP-FPM, но сборка начала проходить без большого количества сюрпризов. Главной новостью стало то, что теперь расширение curl внутри php умело общаться по ГОСТ-алгоритмам с хостами, но была одна неприятность. Каждый вызов php писал в stdout GOST engine already loaded. Очень неприятно. Я не сразу понял, кто это делает, но такую строчку нашел в исходниках GOST-engine. Я до сих пор не знаю, в какой части системы случилась ошибка: php, php-curl, curl, openssl. Но, видимо, в php 7.1 php-curl не подключал движок совсем, теперь в php 7.2 начал подключать его дважды. Так как все работало корректно, только был вывод, я решил его убрать правкой исходника инструкцией в Dockerfile:
sed -i 's|printf("GOST engine already loaded\\n");|goto end;|' gost_eng.c
Там строчкой ниже уже есть goto end;, поэтому ничего серьезного я не сделал. Зато, пересобрав весь зоопарк, все начало работать, как и хотелось.
Образ с PHP-FPM + OpenSSL + GOST + cURL запушен в Docker Hub.
Проверка лицензии
Проверить срок истечения лицензии можно командой (обратите внимание на строки Expires:):
cpconfig Server license: -U0030-01C97-HQ92Y-1EY1K Expires: months days Client license: -U0030-01C97-HQ92Y-1EY1K Expires: months days
Для установки другой лицензии выполните (под root):
cpconfig серийный_номер
Серийный номер следует вводить с соблюдением регистра символов.
Настройка мониторинга Docker
Первым делом зайдём в консоль Zabbix сервера и убедимся, что он корректно может забирать данные о Docker с наблюдаемого хоста. Для этого воспользуемся утилитой zabbix_get.
# zabbix_get -s 10.20.50.7 -k docker.info
Если получите ошибку:
ZBX_NOTSUPPORTED: Cannot fetch data: Get http://1.28/info: dial unix /var/run/docker.sock: connect: permission denied.
Возвращайтесь на хост с агентом и docker и проверяйте права доступа пользователя zabbix к сокету докера. Выше я показал, что надо сделать.
Если всё в порядке с доступом, то переходите в web интерфейс сервера мониторинга. Нам нужно добавить к наблюдаемому хосту с Docker соответствующий шаблон. Называется он Docker by Zabbix agent 2.
Если у вас его нет, как это было у меня, то скачайте свежую версию шаблона. Вам нужно выбрать файл template_app_docker.yaml и сохранить его исходный код в какой-то файл, чтобы потом импортировать на сервер Zabbix. Не забудьте указать расширение yaml, иначе импорт не заработает.
На этом собственно настройка мониторинга Docker завершена. Он уже заработал. В шаблоне есть правила автообнаружения образов и контейнеров, которые запускаются каждые 15 минут. Чтобы ускорить начало сбора данных, вы можете вручную их запустить.
После этого в элементах данных появятся контейнеры и связанные с ними айтемы. В Последних данных можно смотреть метрики по тэгу Application: Docker.
В шаблоне присутствуют следующие триггеры:
- Нет информации о статусе службы Docker.
- Служба Docker не запущена.
- Изменилась версия Docker.
- В контейнере зафиксирована ошибка в статусе.
- Контейнер остановлен с ошибкой в exitcode.
Так же в шаблоне есть следующие графики:
- Количество контейнеров с различным статусом.
- Размер дискового пространства, занимаемое различными сущностями (images, layers, conteiners, volumes).
- Docker goroutines (не знаю, что это такое).
- Количество Images.
- Суммарное потребление оперативной памяти докером.
- CPU, Memory usage, сетевая статистика отдельно по каждому контейнеру. Вот только я не понял, как вычисляется метрика по CPU. Она представлена в миллисекундах. Это вычисляемое значение, которое берется из докеровского json со статами, далее выделяется jsonpath $.cpu_stats.cpu_usage.total_usage, переводится в изменения в секунду и в завершении используется арифметический множитель 1.0E-9. Если кто-то знает, подскажите, что это за метрика. Почему ее так считают.
Создание Docker образа для связки CryptoPro и Nginx
Далее по тексту мы используем следующие оговорки:
- Docker образ на основе Centos 6.X
- CryptoPro 4 R2 for linux
- Nginx последняя сборка (на момент написания статьи 1.12.2-1.el6)
- У нас выпущены валидные ключи и сертификаты для доменного имени или сгенерированы с помощью тестового УЦ CryptoPro
- Сертификаты будут устанавливаться в контейеры с типом провайдера КС2, так как nginx работает только с этим типом
Описание Dockerfile (очевидные вещи опущены)
- Копируем специально подготовленный конфигурационный файл openssl в Docker-образ (см. форум CryptoPro)
- Инсталируем необходимое ПО redhat-lsb-core libcurl
- Копируем контейнер (по усмолчанию контейнеры CryptoPro размещаются по пути
/var/opt/cprocsp/keys/...
, где...
имя пользователя, от которого создавался контейнер. В нашем случае root. Меняем владельца папки) - Копируем сертификат (местоназначения скопированного сертификата не имеет значения, но если использовать большую вложенность пути, импорт завершится с ошибкой)
- Копируем файл конфигурации виртуального хоста test.conf
Описание docker-entrypoint
Запускаем сервис CryptoPro:
Указываем CryptoPro где находится библиотека Curl:
/opt/cprocsp/sbin/amd64/cpconfig -ini \\config\\apppath -add string libcurl.so /usr/lib64/libcurl.so
Если переносимый контейнер имеет пароль, то его надо сбросить:
/opt/cprocsp/bin/amd64/csptest -passwd -container ‘\\.\HDIMAGE\test_container’ -change ” -passwd ‘old_password’
Устанавливаем сертификат в контейнер с типом провайдера КС1 (обратите внимание, что имя контейнера идет без порядкового номера, используемого в dockerfile test.000):
/opt/cprocsp/bin/amd64/certmgr -inst -file /tmp/nginx.cer -cont ‘\\.\HDIMAGE\test’
Устанавливаем ПО необходимое для работы с контейнерами типа КС2 (Важно чтобы данный пакет был инсталирован после установки сертификата, но перед линковокой установленного сертификата с контейнером типа КС2):
yum install -y /tmp/lsb-cprocsp-kc2-64-4.0.0-4.x86_64.rpm
Линкуем установленный сертификат с контейнером КС2:
/opt/cprocsp/bin/amd64/certmgr -inst -store uMy -cont ‘\\.\HDIMAGE\test’ -provtype 75 -provname “Crypto-Pro GOST R 34.10-2001 KC2 CSP”
Перековертируем сертификат из формата X509/DER в X.509/PEM:
/opt/cprocsp/cp-openssl/bin/amd64/openssl x509 -inform der -in /tmp/nginx.cer -out /etc/nginx/nginx.pem
Редактируем nginx.conf. Необходимо изменить пользователя, от которого будет запускать nginx. Пользователь должен быть тем, от которого создавался/размещался контейнер с ключами. В нашем случае root
Полезные команды и информация
Запуск контейнера осуществляется командой:
docker run –rm -p 443:443 -p 80:80 –name cprocsp6 –privileged –security-opt seccomp=unconfined –tmpfs /run –tmpfs /run/lock -v /sys/fs/cgroup:/sys/fs/cgroup:ro -d crypto
Экспрот сертификата из контейнера в формате X509/DER (лучше использовать этот формат, так как при экспорте с опцией -base64 в файле сертификата будут отсутствовать строчки —–BEGIN CERTIFICATE—– и —–END CERTIFICATE—–)
/opt/cprocsp/bin/amd64/certmgr -export -store uMy -dest /tmp/nginx.cerПроверить наличие установленных сертификатов в системе (в поле Provider Name должно быть Crypto-Pro GOST R 34.10-2001 KC2 CSP):
/opt/cprocsp/bin/amd64/certmgr -list -store uMy- Работа с выгруженным контейнером формата pfx в Linux-like системах не поддерживается!
Описание файла конфигурации виртуального хоста:
ssl_certificate /etc/nginx/nginx.pem; наш ГОСТовский сертификат ssl_certificate_key engine:gost_capi:node.sdsys.ru; наш ГОСТовский ключ ssl_certificate /etc/nginx/sdsys.crt; ssl_certificate_key /etc/nginx/sdsys.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols TLSv1; ssl_ciphers GOST2001-GOST89-GOST89:HIGH:MEDIUM; описание Ciphers ssl_prefer_server_ciphers on;
В описании location необходимо добавить proxy_set_header X-SSL-Cipher $ssl_cipher;
Используемая литература:
Форум CryptoPro
Другие источники
Примеры использования OpenSSL + GOST-engine
Не буду сильно вдаваться в подробности работы с докер-образами, лишь приведу одну команду для начала работы внутри образа:
docker run --rm -i -t rnix/openssl-gost bash
Для начала можно убедиться, что алгоритмы GOST2012-GOST8912-GOST8912 и GOST2001-GOST89-GOST89 есть в списке поддерживаемых:
openssl ciphers
Если вам известен хост, который работает по HTTPS на основе ГОСТ-алгоритмов, то посмотреть его сертификат и попробовать подключиться можно командой:
openssl s_client -connect gost.example.com:443 -showcerts
Создать закрытый ключ и сертификат по ГОСТ Р 34.10-2012:
openssl req -x509 -newkey gost2012_256 -pkeyopt paramset:A -nodes -keyout key.pem -out cert.pem
Подписать файл ранее созданными сертификатами:
openssl cms -sign -signer cert.pem -inkey key.pem -binary -in file.txt -nodetach -outform DER -nocerts -noattr -out signed.sgn
Извлечь содержимое подписанного файла, сертификатом, который был подписан самим собой:
openssl cms -verify -in signed.sgn -certfile cert.pem -CAfile cert.pem -inform der -out data.txt
С подписями самих сертификатов все немного сложнее. Пока мне не попался сервис, у которого сертификат выдан доверенным центром сертификации. Обычно, требуется дополнительно указывать сертификат удостоверяющего центра при работе с выданными им сертификатами. Это можно сделать глобально для системы (в образе), либо явно указывать в каждой команде.
Программа cURL в использовании не изменилась, просто поддерживает хосты с ГОСТ-сертификатами.
КриптоПро JCP
Для установки КриптоПро JCP нужно установить Oracle Java 1.7.0 (через собственную сборку или пакеты для Fedora)
Распакуйте архив и перейдите в каталог
.install.sh usrjavajre1.7.0_51 XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
Поддержка Рутокена
Выполните:
rtjlib.jar
Запуск контрольной панели
.ControlPane.sh usr
(требует графического дисплея)
Управление персональным сертификатом
Создание
Для создания запроса потребуется:
имя контейнера (в локальном хранилище hdimage: \\.\hdimage\webserver
имя файла запроса webserver.csr
Во время работы программы потребуется нажимать любые кнопки (после запроса «Press keys») и дважды указать пароль на контейнер (после запроса «Password:»).
cryptcp webserver.csr CryptCP c , -. Command prompt Utility signature and encryption. Press keys... ........................................ CryptoPro CSP: Set password on produced container . Password: Retype password: Request is saved file. ReturnCode:
Откройте в браузере ссылку http://www.cryptopro.ru/certsrv/certrqxt.asp (тестовый удостоверяющий центр КриптоПро).
Вставьте в поле «Base-64-шифрованный запрос сертификата» содержимое файла webserver.csr и нажмите кнопку «Выдать». Затем сохраните файл по ссылке «Загрузить сертификат» (по умолчанию предлагается имя certnew.cer.
Установите сертификат (введите пароль на контейнер при запросе):
cryptcp certnew.cer CryptCP c , -. Command prompt Utility signature and encryption. CryptoPro CSP: Type password container Password: Certificate is installed. ReturnCode:
Просмотр
certmgr Certmgr c , -. program managing certificates, CRLs and stores ============================================================================= ------- Issuer : =infocryptopro.ru, =RU, =CRYPTO-PRO, =Test Center CRYPTO-PRO Subject : =webserver Serial : 0x28840500020011AA2550 SHA1 Hash : 0x744fdc41b8d1b9132120a2bdc706b46cfb6d9e8c Not valid before : 09:: UTC Not valid after : 04 07:09: UTC PrivateKey Link : Yes. Container : HDIMAGE\\webserve.000\D0FF ============================================================================= ErrorCode: 0x00000000
Удаление
Удаление сертификата
certmgr
Удаление контейнера:
certmgr
Размещение контейнеров
Контейнеры HDIMAGE: /var/opt/cprocsp/keys/<имя пользователя>/
Сохранение сертификата в файле
cryptcp CERT.cer CryptCP c , -. Command prompt Utility signature and encryption. Openning container... Certificate
Импорт персонального сертификата
Вы можете импортировать собственный сертификат в локальный считыватель HDIMAGE.
Если у вас нет сертификата, самое время его создать:
Создание через cert-sh-functions (требует установки пакета cert-sh-functions
Создание сертификатов PKCS12 (достаточно только пакета openssl)
Допустим, мы пошли по первому пути и создали сертификат web-server:
cert-sh-functions ssl_generate
Сертификат по умолчанию будет лежать в /var/lib/ssl/certs/web-server.cert, а ключ — в /var/lib/ssl/private/web-server.key
Для импорта потребуется файл сертификата и закрытый ключ в контейнере PKCS#12.
Создадим для нашего ключа и сертификата необходимый контейнер:
openssl pkcs12 varlibsslcertsweb-server.cert varlibsslprivateweb-server.pem web-server.p12
При создании контейнера будет дважды запрошен пароль для экспорта. По соображениям безопасности вводимые символы не показываются. После ввода каждого пароля нажимайте Enter.
Проверка созданного контейнера (при запросе введите пароль, введённый в предыдущей команде):
openssl pkcs12 web-server.p12 BEGIN Enter Import Password: MAC verified OK CERTIFICATE----- PRIVATE KEY-----
И сертификат и ключ попали в контейнер.
После генерации сертификата проверим наличие считывателя:
cpconfig reader ^Nick Nick name: FLASH Nick name: HDIMAGE
Если считывателя нет, создайте его:
cpconfig reader HDIMAGE store
Для импорта сертификата в КриптоПро используйте программу certmgr:
certmgr путь к файлу с сертификатом имя контейнера
В нашем случае:
certmgr web-server.p12 HDIMAGE
Статья про КриптоПро
Оригинал статьи
КриптоПро – линейка криптографических утилит (вспомогательных программ) — так называемых криптопровайдеров. Они используются во многих программах российских разработчиков для генерации ЭЦП, работы с сертификатами, организации структуры PKI и т.д.
Поддержка ГОСТ-сертификатов в nginx
Возможность работать из языков программирования это уже много, но хотелось еще две возможности:
- Легко поднимать свой веб-сервер с ГОСТ-сертификатом по HTTPS (TLS).
- Легко проксировать все запросы на хост с ГОСТ-сертификатом
Легко – это означает докер-образ. Его нужно создать. Для этого нужно в Dockerfile собрать nginx с кастомным OpenSSL и GOST-engine. Открыв документацию сборки nginx, я увидел одну опцию о ssl — --with-http_ssl_module
, которая просто булева. Но nginx популярный продукт, инструкций по сборке с openssl много, поэтому я нашел еще опцию --with-openssl=[DIR]
. Как показала практика, nginx хочет, чтобы здесь были исходники openssl, а сборкой скрипты nginx займутся сами. Это не совсем то, что я хотел бы (я хотел использовать multi-stage build). Я ознакомился с help-выводом сборщика nginx, но ничего, что мне там помогло бы, я не нашел.
Пришлось дублировать инструкции выкачивания исходников OpenSSL, распаковки, сборки GOST-engine, включения GOST-engine в конфиги. Всё это начало собираться, но поддержки ГОСТ-алгоритмов в nginx все ещё не было. Это я проверял указанием в конфиге ssl_ciphers GOST2001-GOST89-GOST89:HIGH:MEDIUM;. Выполнение nginx -t говорило, что не знает этого алгоритма.
Как оказалось, openssl, собранный nginx, не поддерживал динамические движки, т.е. ./Configure
выводил no-dynamic-engine [forced]
. Здесь пришлось внимательно почитать документацию сборки OpenSSL, чтобы выяснить, что проставило forced
. Причина нашлась в аргументах сборки openssl, которые вызывал nginx, а именно no-shared
. Если это указано, то нет никаких флагов, чтобы включить поддержку загрузки движков. Пришлось править инструкцию сборки:
sed -i 's|--prefix=$ngx_prefix no-shared|--prefix=$ngx_prefix|' auto/lib/openssl/make
Всё это собралось, но nginx начал ругаться, что не может найти gost.so по пути /usr/lib/x86_64-linux-gnu/, это довольно странно, потому что тот же собранный openssl ищет и находит движки совсем в другом месте, а именно там, где и собирался ./lib/engines-1.1. Добавил инструкцию копирования собранных движков в /usr/lib/x86_64-linux-gnu/, чтобы угодить nginx. Заработало.
Рядом с основным Dockerfile в репозитории я положил демонстрационный Dockerfile, который при сборке создает себе ГОСТ-сертификаты и использует их, обрабатывая соединения на https://gost.example.com. Придется поработать с DNS или docker network, чтобы из одного контейнера попробовать подключится к этому демонстрационному, но все это я описал в документации.
Демонстрационный хост использует ключи по gost2001
, другие варианты это gost2012_256
, gost2012_512
. А вместо GOST2001-GOST89-GOST89
— GOST2012-GOST8912-GOST8912
.
Образ с nginx + GOST запушен в Docker Hub: https://hub.docker.com/r/rnix/nginx-gost/
Сборка OpenSSL, GOST-engine, cURL
Сборка стороннего продукта для тех, кто делает это редко, может быть нетривиальной задачей. Для сборки OpenSSL, GOST-engine и cURL пришлось разобраться с кучей опций и перепробовать несколько комбинаций версий. Если в Dockerfile вы заметите странное, то, скорее всего, это осталось от таких экспериментов.
Я зафиксировал все версии проектов для сборки, чтобы исключить ситуацию, что из-за обновления что-то перестанет работать. Например, я собирал OpenSSL 1.1.0h + GOST-engine и команда openssl ciphers не содержала GOST-алгоритмов, хотя openssl engine показывала GOST-engine в списке. Указав предыдущую версию OpenSSL 1.1.0g, все работало, как ожидалось. Это было очень странно, я повторил это еще раз, потом пытался выяснить причины, но в итоге решил остаться на 1.1.0g.
Собирая сам GOST-engine, я не сразу обратил внимание на наличие файла INSTALL.md в master-ветке, потому что собирал из ветки openssl_1_1_0 по неизвестно откуда взятой документации. Та версия собиралась с кастомной сборкой OpenSSL командой
cmake -DCMAKE_C_FLAGS='-I/usr/local/ssl/include -L/usr/local/ssl/lib' ..
Но master-ветка так собираться перестала, появились ошибки об отсутствии DOPENSSL_ROOT_DIR и подобное. В итоге решение было найдено и зафиксировано.
Для сборки cURL с кастомной сборкой OpenSSL гораздо больше документации, тем не менее, документация успевала устаревать, и с опциями пришлось много экспериментировать.
Результат работы выложен здесь.
Образ запушен в Docker Hub.
Ссылки
- Репозиторий со всеми решениями на GitHub
- Образ на Docker Hub с OpenSSL + GOST + cURL
- ГОСТ Р 34.10-2012 на Википедии со списком сертифицированных решений
- Репозиторий GOST-engine
- О возможностях и ограничениях GOST-engine
- Пример того, как решают вопрос в продакшн-окружении
КриптоПро ЭЦП Browser plug-in
Плагин проверки ЭЦП для браузера требует установленного КриптоПро CSP. Инструкция на сайте производителя: http://www.cryptopro.ru/cadesplugin/Manual.aspx
1. Скачиваем архив по ссылке http://www.cryptopro.ru/products/cades/plugin/get
Будет скачен архив под архитектуру браузера.
2. Распаковываем архив, устанавливаем пакеты:
– сначала из дистрибутива КриптоПро:
lsb-cprocsp-cades-3.6.1-.i486.rpm \ lsb-cprocsp-ocsp-util-3.6.1-.i486.rpm \ lsb-cprocsp-tsp-util-3.6.1-.i486.rpm
– затем сам плагин:
cprocsp-npcades-.rpm
3. Копируем библиотеки:
на 32-битной системе:
optcprocsplibia32libncades.so usrlibbrowser-plugins
на 64-битной системе:
optcprocsplibamd64libncades.so usrlib64browser-plugins
4. В Mozilla Firefox или Chromium перезапустите браузер и откройте адрес about:plugins
. Убедитесь, что плагин установлен.
На странице http://www.cryptopro.ru/cadesplugin/Manual.aspx справа вверху должна появится надпись:
Плагин загружен
и появится ссылка «Демо-страница».
Под Firefox 17.0.6 плагин падает. Более новые версии работают.
На странице работает только усовершенствованная подпись при следующих условиях:
для tsputil и ocsputil есть валидные коммерческие лицензии (запустите программы с командой license, установка лицензии с параметрами license -s <серийный номер>)
При создании обычной подписи показывается ошибка http://ats.cryptopro.ru/forum2/default.aspx?g=posts&m=34173#post34173:
Не удалось создать подпись из-за ошибки: Internal error. (0x800B010A)
Установка
Распакуйте архив и перейдите в распакованную папку
Проверьте доступность репозиториев для установки или установите вручную пакеты lsb, pcsc-lite, libpcsclite-devel
Под правами пользователя root выполните:
lsb-cprocsp-base-3.6.1-.noarch.rpm lsb-cprocsp-rdr-3.6.1-.i486.rpm lsb-cprocsp-capilite-3.6.1-.i486.rpm lsb-cprocsp-kc1-3.6.1-.i486.rpm
Примечания:
Для КриптоПро CSP 3.6 R2 потребуется установить пакет cprocsp-compat-altlinux-1.0.0-1.noarch.rpm
Для установки cprocsp-rdr-gui может понадобиться libXm.so.3 (libopenmotif3) и для вывода кириллицы fonts-bitmap-cyr_rfx-iso8859-5.
Для установки cprocsp-rdr-gui-gtk потребуется предварительно установить libpangox-compat.
Установка Zabbix Agent 2
На хост, где крутятся Docker контейнеры, которые мы мониторим, надо установить Zabbix agent. Установка будет зависеть от системы хоста, но в общем случае это просто подключение нужного репозитория и установка через пакетный менеджер.
На момент написания статьи, последней версией Zabbix была 5.4, так что показываю, как установить Zabbix Agent 2 именно этой версии.
Ubuntu 20:
# wget https://repo.zabbix.com/zabbix/5.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.4-1+ubuntu20.04_all.deb # dpkg -i zabbix-release_5.4-1+ubuntu20.04_all.deb # apt update # apt install zabbix-agent2
Debian 10:
# wget https://repo.zabbix.com/zabbix/5.4/debian/pool/main/z/zabbix-release/zabbix-release_5.4-1+debian10_all.deb # dpkg -i zabbix-release_5.4-1+debian10_all.deb # apt update # apt install zabbix-agent2
Centos 8 и другие rpm-based дистрибутивы:
# rpm -Uvh https://repo.zabbix.com/zabbix/5.4/rhel/8/x86_64/zabbix-release-5.4-1.el8.noarch.rpm # dnf clean all # dnf install zabbix-agent2
Делаем базовую настройку агента. Добавляем в конфиг /etc/zabbix/zabbix_agent2.conf информацию о сервере и имени хоста.
Server=10.20.1.1 ServerActive=10.20.1.1 Hostname=docker-host
Перезапускаем zabbix-agent2 и добавляем в автозагрузку.
# systemctl restart zabbix-agent2 # systemctl enable zabbix-agent2
Дополнительно нам нужно добавить пользователя zabbix, от имени которого работает агент, в группу docker, чтобы у него был доступ к docker.sock.
# usermod -aG docker zabbix
После этого надо перезагрузить хост, чтобы изменения вступили в силу. Если этого делать не хочется или нет возможности, можно напрямую выдать права.
# setfacl --modify user:zabbix:rw /var/run/docker.sock
Теперь переходим на сервер мониторинга Zabbix. Дальнейшая настройка будет проходить там.
Подписание документа ЭЦП
cryptcp КПС pincode src.txt dest.txt.sig
nochain – отменяет проверку цепочки сертификатов
pin – пин-код
КПС1 – критерий поиска сертификата
Пример создания ЭЦП (по SHA1 Hash):
cryptcp 255c249150efe3e48f1abb3bc1928fc8f99980c4 test.txt test.txt.sig
[ReturnCode: x] | Описание | Возвращаемый код завершения в баше $? |
---|---|---|
0 | успешно | 0 |
0x8010006b | Введен неправильный PIN | 107 |
0x2000012d | Сертификат не найден | 45 |
0x20000065 | Не удалось открыть файл | 101 |
Использование образа в работе с языками программирования
Если язык программирования позволяет исполнять установленные в системе программы, то задача использования ГОСТ-алгоритмов проще всего решается копированием бинарников собранных openssl и curl в конце Dockerfile языка программирования с использованием multi-stage build. Например:
FROM rnix/openssl-gost AS openssl-gost
# Replace with any other image based on Debian x86_64
FROM debian:stretch-slim
COPY --from=openssl-gost /usr/local/ssl /usr/local/ssl
COPY --from=openssl-gost /usr/local/ssl/bin/openssl /usr/bin/openssl
COPY --from=openssl-gost /usr/local/curl /usr/local/curl
COPY --from=openssl-gost /usr/local/curl/bin/curl /usr/bin/curl
COPY --from=openssl-gost /usr/local/bin/gostsum /usr/local/bin/gostsum
COPY --from=openssl-gost /usr/local/bin/gost12sum /usr/local/bin/gost12sum
Даже необязательно копировать в /usr/bin, это можно сделать в любой каталог, а затем вызывать из вашей программы, передав полный путь и все аргументы.
Сертификаты
Список установленных сертификатов
certmgr -list, например:
1------- Issuer : [email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2 Subject : CN=test2 Serial : 0x120007E4E683979B734018897B00000007E4E6 SHA1 Hash : 0x71b59d165ab5ea39e4cd73384f8e7d1e0c965e81 Not valid before : 07/09/2015 10:41:18 UTC Not valid after : 07/12/2015 10:51:18 UTC PrivateKey Link : Yes. Container : HDIMAGE\\test2.000\F9C9 2------- Issuer : [email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2 Subject : CN=webservertest Serial : 0x120007E47F1FD9AE0EDE78616600000007E47F SHA1 Hash : 0x255c249150efe3e48f1abb3bc1928fc8f99980c4 Not valid before : 07/09/2015 09:56:10 UTC Not valid after : 07/12/2015 10:06:10 UTC PrivateKey Link : Yes. Container : HDIMAGE\\webserve.001\2608
Добавление реального сертификата
Добавить только сертификат (только проверка ЭЦП):
certmgr cert.cer
Добавление реального сертификата с привязкой к закрытому ключу и возможностью подписывать документы
Закрытый ключ состоит из шести key-файлов:
header.key masks2.key masks.key name.key primary2.key primary.key
Способ с дискетой или флешкой
Скопировать в корень дискеты или флэшки сертификат и приватный ключ (из каталога 999996.000, 999996 – название (alias) контейнера):
pathtokey mediaflashdrive pathtocertclient.cer mediaflashdrive
Выполнить команду по копированию ключа с флэшки на диск, ключ попадет в пользовательское хранилище My.
Необходимо выполнять под пользователем, который будет использовать данный контейнер для подписи.
[email protected] – то, что прописано в поле E сертификата (можно посмотреть командой keytool --printcert -file /path/to/cert/client.cer
):
csptest
С жесткого диска
«Ручной способ».
Скопировать приватный ключ в хранилище (контейнер), где <username>
– имя пользователя linux:
pathtokey varoptcprocspkeysusername
Поставить «минимальные» права:
varoptcprocspkeysusername
Узнать реальное название контейнера:
csptest -enum_cont
Ассоциировать сертификат с контейнером, сертификат попадет в пользовательское хранилище My:
certmgr pathtofileclient.cer
Если следующая ошибка, нужно узнать реальное название контейнера (см. выше):
Failed to open container \\.\HDIMAGE\<container> [ErrorCode: 0x00000002]
Установить сертификат УЦ из-под пользователя root командой:
certmgr uroot pathtofileCA.cer
Проверка успешности установки закрытого ключа
certmgr
Если выводится PrivateKey Link: Yes. Container: HDIMAGE\\999996.000\D7BB, то есть и сертификат, и приватный ключ, а если выводится PrivateKey Link: No – связи нет, и использовать такой контейнер для подписи не удастся.
Источник
Добавление тестового сертификата
Добавление работает только на той же машине, и в тот же контейнер, где был сформированы следующий запрос на добавление:
cryptcp test.csr
Ввести пароль на контейнер test123.
cryptcp myname.csr
Пароль mysecurepass
Откройте в браузере ссылку тестовый удостоверяющий центр КриптоПро
cryptcp certnew.cer
Ввести пароль на контейнер. По-умолчанию: 12345678
Удаление сертификата
Проверка сертификата
certmgr file.sig
Ответ:
1------- Issuer : [email protected], C=RU, L=Москва, O=ООО КРИПТО-ПРО, CN=УЦ KPИПTO-ПPO Subject : [email protected], C=RU, L=г. Москва, O="ООО ""Верес""", OU=Руководство, CN=Иванов Иван Иванович, T=Генеральный директор Serial : 0x75F5C86A000D00016A5F SHA1 Hash : 0x255c249150efe3e48f1abb3bc1928fc8f99980c4 Not valid before : 08/12/2014 09:04:00 UTC Not valid after : 08/12/2019 09:14:00 UTC PrivateKey Link : No
Подписание пустого файла (размер 0) проходит успешно, но при просмотре сертификатов этого файла выдается ошибка:
Can't open certificate store: '/tmp/tmp.G8cd13vzfZ.sig'. Error: No certificate found. /dailybuilds/CSPbuild/CSP/samples/CPCrypt/Certs.cpp:312: 0x2000012D [ErrorCode: 0x2000012d]
Будьте внимательны!
Просмотр всех атрибутов сертификата
В cryptcp нет необходимых инструментов для получения всех атрибутов сертификата. Поэтому следует использовать openssl, но настроив его.
Получаем SHA 1 хеши:
certmgr -list -f file.sig | grep 'SHA1 Hash'
В цикле извлекаем сертификаты:
cryptcp -nochain -copycert -thumbprint 255c249150efe3e48f1abb3bc1928fc8f99980c4 -f file.sig -df certificate.der -der
openssl x509 -in certificate.der -inform der -text -noout
Настройка openssl для поддержки ГОСТ:
В файл /etc/ssl/openssl.cnf
openssl_def # Это в начало файла #Все что ниже в конец /usr/lib/ssl/engines/libgost.so # заменить реальным файлом
Проверка:
openssl ciphers gost GOST2001-GOST89-GOST89 GOST94-GOST89-GOST89
Экспорт сертификатов на другую машину
Закрытые ключи к сертификатам находятся тут: /var/opt/cprocsp/keys. Поэтому эти ключи переносятся просто: создаем архив и переносим на нужную машину в тот же каталог.
Экспорт самих сертификатов (если их 14):
i ; certmgr .cer;
Переносим эти файлы на машину и смотрим, какие контейнеры есть:
csptest -keyset -enum_cont -verifycontext -fqcn
И как обычно, связываем сертификат и закрытый ключ:
certmgr -inst -file 1.cer -cont '\\.\HDIMAGE\container.name'
Если закрытый ключ и сертификат не подходят друг к другу, будет выведена ошибка:
Can not install certificate Public keys in certificate and container are not identical
Если все успешно:
Если нет закрытого ключа, то просто ставим сертификат:
certmgr -inst -file 1.cer
Проверка подписи ЭЦП
Для верифицирования сертификатов нужен сертификат удостоверяющего центра и актуальный список отзыва сертификатов,
либо настроенный для этого revocation provider.
Корневой сертификат УЦ, список отзыва сертификата является одним из реквизитов самого сертификата.
Контрагенты когда открывают подписи в КриптоАРМ используют revocation provider, он делает проверки отзыва сертификата онлайн.
Как реализована проверка в Шарепоинте не знаю. Знаю только что используется библиотека Крипто.Net
cryptcp
Проверка конкретной подписи из локального хранилища по его хешу:
cryptcp 255c249150efe3e48f1abb3bc1928fc8f99980c4 test.txt.sig
Проверить, взяв сертификат из file1.sig, подпись файла file2.sig. Практически, надо использовать один и тот же файл:
cryptcp file1.sig file2.sig
Ответ:
Certificates found: 2 Certificate chains are checked. Folder './': file.xls.sig... Signature verifying... Signer: Старший инженер, Иванов Иван Иванович, Отдел закупок, ООО «Верес», Москва, RU, [email protected] Signature's verified. Signer: Генеральный директор, Сидоров Иван Петрович, Руководство, ООО «Кемоптика», Москва, RU, [email protected] Signature's verified. [ReturnCode: 0]
Результат:
[ReturnCode: x] | Текст | Описание | Возвращаемый код завершения в баше $? |
---|---|---|---|
0 | Успешно | 0 | |
0x80091004 | Invalid cryptographic message type | Неправильный формат файла | 4 |
0x80091010 | The streamed cryptographic message is not ready to return data | Пустой файл | 16 |
Заключение
Мной изучена проблема работы с ГОСТ-алгоритмами в системах Linux, предоставлено решение в виде docker-образов, все это сопровождено документацией и примерами. Решение оформлено в виде репозитория на GitHub.
Стоит сказать о безопасности использования такого решения. Главное, не стоит доверять образам на Docker Hub, даже если там написано Automated Build. Я все равно могу собрать образ с любыми правками всех используемых библиотек и систем и запушить его в свой Docker Hub под любым тегом. Поэтому рекомендую форкать репозиторий на гитхабе, пулить его себе и уже самостоятельно собирать, проверив инструкции в Dockerfile на наличие того, что используются только официальные ресурсы без подозрительных модификацией по ходу сборки.
Собирая образ самостоятельно, вы можете убедиться, что в код не попали злонамеренные правки, потому что сборка происходит только из открытого кода, который доступен для просмотра всем желающим. Тем не менее, это не гарантирует, что в нем нет ошибок и уязвимостей. Использование проприетарных сертифицированных средств так же не гарантирует отсутствие ошибок и уязвимостей, но к тому же их код от вас закрыт.
Заключение
Сколько бы Zabbix не хоронили, но он живее всех живых и развивается в правильном направлении. С его помощью нет никаких проблем в настройке мониторинга Docker, несмотря на то, что это динамически изменяемая среда. Все изменения отслеживаются и мониторинг настраивается автоматически. Участие оператора не требуется. Достаточно один раз все сделать. Причем допиливать что-то тоже нет необходимости. Всё работает из коробки с помощью штатного функционала.
Используемая литература
ЖТЯИ.00050-03 90 02-02. СКЗИ «КриптоПро CSP». Руководство администратора безопасности. Использование СКЗИ под управлением ОС Linux (из электронной документации по КриптоПро; доступно для скачивания с демонстрационной версией)
ЖТЯИ.00050-03 90 07. КриптоПро CSP. Приложение командной строки