Вопрос или проблема
Я использую openssl cms
для шифрования и подписи файлов, отправляемых на встроенные устройства с Linux. Для этапа проверки я использую PKI, а для этапа расшифровки – симметричный ключ. Недавно мне пришло в голову, что когда на встроенном устройстве вызывается openssl cms -binary -decrypt -secretkey <ключ в шестнадцатеричном формате> -secretkeyid 0 -inform DER -in <входной файл> -out <выходной файл>
, секретный ключ становится доступен любому, кто вошёл в систему. Например, если кто-то мониторит top
, он увидит ключ как аргумент командной строки. Мне не страшно, если пользователи с правами root могут видеть этот ключ, но я не хочу, чтобы его видели пользователи без прав root.
Некоторые варианты, которые я обдумал:
- Патчить
openssl cms
, чтобы поддерживать другой способ передачи ключа. - Написать C-программу, которая использует функции openssl libcrypto.
- Отказаться от использования симметричного ключа; добавить пару 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. Сохранение ключа в защищенном файле
Одним из самых простых и эффективных способов избежать передачи симметричного ключа в командной строке является хранение его в файле с ограниченными правами доступа. Следующие шаги помогут вам настроить безопасный доступ к ключу:
-
Создайте файл с симметричным ключом:
echo -n "ваш_симметричный_ключ" > /path/to/keyfile.bin
-
Ограничьте доступ к этому файлу, установив права таким образом, чтобы только пользователь root мог его читать:
chmod 600 /path/to/keyfile.bin
-
Используйте команду 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. Выбор метода зависит от вашего уровня комфорта, необходимых ресурсов и специфических требований вашего проекта.
Следуя этим рекомендациям, вы сможете повысить уровень безопасности вашей системы и минимизировать риск несанкционированного доступа к вашим симметричным ключам.