Существует ли способ использовать openssl cms с симметричным ключом, не exposing ключ в командной строке?

Вопрос или проблема

Я использую openssl cms для шифрования и подписи файлов, отправляемых на встроенные устройства с Linux. Для этапа проверки я использую PKI, а для этапа расшифровки – симметричный ключ. Недавно мне пришло в голову, что когда на встроенном устройстве вызывается openssl cms -binary -decrypt -secretkey <ключ в шестнадцатеричном формате> -secretkeyid 0 -inform DER -in <входной файл> -out <выходной файл>, секретный ключ становится доступен любому, кто вошёл в систему. Например, если кто-то мониторит top, он увидит ключ как аргумент командной строки. Мне не страшно, если пользователи с правами root могут видеть этот ключ, но я не хочу, чтобы его видели пользователи без прав root.

Некоторые варианты, которые я обдумал:

  1. Патчить openssl cms, чтобы поддерживать другой способ передачи ключа.
  2. Написать C-программу, которая использует функции openssl libcrypto.
  3. Отказаться от использования симметричного ключа; добавить пару PKI для этой расшифровки.

Я не хочу делать вариант #3, потому что это нарушит существующую совместимость.

Есть ли другой способ, с помощью которого я могу достичь желаемого?

Я бы сказал, что вариант 2 довольно соблазнителен – особенно поскольку бинарник openssl уже существует и показывает, как это сделать. Если вы немного ленивы, и это будет правильно, вы можете запустить вашу команду openssl со всеми опциями через ltrace, чтобы увидеть, что вызывается в каком порядке, а затем сопоставить это с документацией этих функций.

Что если вы сохраните ключ в файле с ограниченным доступом только для пользователя root, поместив симметричный ключ в файл и установив его разрешения так, чтобы только root мог его читать:

1. echo -n "ваш_симметричный_ключ_здесь" > /path/to/keyfile.bin
2. chmod 600 /path/to/keyfile.bin

Вы можете затем использовать подсессии для безопасного чтения содержимого, не передавая ключ напрямую как аргумент командной строки.

openssl cms -encrypt -aes-256-cbc -in plaintext.txt -out encrypted.txt -inkey /path/to/keyfile.bin

Ответ или решение

Использование OpenSSL для шифрования и подписывания файлов с использованием симметричных ключей имеет свои тонкости, особенно когда дело касается безопасности и защиты от несанкционированного доступа. Ваша задача состоит в том, чтобы эффективно использовать OpenSSL CMS для шифрования и дешифрования без необходимости открывать симметричный ключ в командной строке, что может представлять собой уязвимость для ненадежных пользователей системы.

1. Сохранение ключа в защищенном файле

Одним из самых простых и эффективных способов избежать передачи симметричного ключа в командной строке является хранение его в файле с ограниченными правами доступа. Следующие шаги помогут вам настроить безопасный доступ к ключу:

  1. Создайте файл с симметричным ключом:

    echo -n "ваш_симметричный_ключ" > /path/to/keyfile.bin
  2. Ограничьте доступ к этому файлу, установив права таким образом, чтобы только пользователь root мог его читать:

    chmod 600 /path/to/keyfile.bin
  3. Используйте команду OpenSSL, чтобы прочитать содержимое файла без передачи ключа как аргумента командной строки. Это можно сделать с использованием подчеркивания:

    openssl cms -decrypt -secretkey "$(cat /path/to/keyfile.bin)" -inform DER -in <input file> -out <output file>

Таким образом, благодаря ограничению прав доступа к файлу, вы можете быть уверены, что никто, кроме пользователя с правами root, не сможет получить доступ к симметричному ключу.

2. Альтернативные подходы к безопасному управлению ключами

Если вы рассматриваете другие методы, которые также могут повысить безопасность вашего процесса, вот несколько рекомендаций:

  • Использование утилит управления секретами: Рассмотрите возможность использования специализированных решений для управления конфиденциальными данными, таких как HashiCorp Vault или AWS Secrets Manager. Эти инструменты позволяют безопасно хранить и управлять ключами, а также предоставляют API для доступа к ним без необходимости открывать ключи в командной строке.

  • Написание C программы с использованием библиотеки OpenSSL: Вы также можете написать собственное приложение на C, которое будет использовать функции библиотеки OpenSSL для шифрования и дешифрования с симметричными ключами. Это даст вам полный контроль над процессом, однако потребует значительных усилий для реализации и тестирования.

  • Использование переменных окружения: В качестве альтернативы передаче ключа напрямую в командной строке вы можете использовать переменные окружения. Например:

    export SECRET_KEY="ваш_симметричный_ключ"
    openssl cms -decrypt -secretkey $SECRET_KEY -inform DER -in <input file> -out <output file>

Однако следует помнить, что переменные окружения также могут быть видимы для других пользователей, если они имеют возможность выполнять команды вроде ps.

Заключение

Существует несколько способов защиты симметричного ключа при использовании OpenSSL CMS, и каждый из них имеет свои преимущества и недостатки. Хранение ключа в файле с ограниченными правами доступа является одним из наиболее простых и эффективных методов, обеспечивающим уровень безопасности, необходимый для критически важных операций. Если требуется еще более высокий уровень защиты, рассмотрите возможность использования специализированных инструментов для управления секретами или пишите собственные приложения с использованием библиотеки OpenSSL. Выбор метода зависит от вашего уровня комфорта, необходимых ресурсов и специфических требований вашего проекта.

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

Оцените материал
Добавить комментарий

Капча загружается...