Мой пример использования следующий: я хочу открыть какой-нибудь зашифрованный файл (тип файла или шифрование здесь не обязательно имеют значение, это не главное), используя метод с подписью следующим образом:
public Data getMySecretData(char[] password);
Предположим, что Data
- это некоторая информация о классе. Безопасность самой информации здесь не важна - важна безопасность пароля.
Я запускаю простое Java приложение на OpenShift-Cluster. Чтобы убедиться, что пароль надежный, я использую OpenShift Secrets (сравните https://docs.openshift.com/container-platform/3.11/dev_guide/secrets.html). Это означает, что из моего приложения видно, что пароль доступен как переменная среды (скажем, это переменная среды MY_PASSWORD
)
Простой способ получить этот пароль теперь будет (игнорировать потенциальные исключения):
public void unlock()
{
// Retrieve the password from environment variable
String myPassword = System.getenv("MY_PASSWORD");
// Convert it to a char[] so we can access our data with it.
Data myData = getMySecretData(myPassword.toCharArray());
}
Предостережение заключается в том, как мы обрабатываем пароль. OpenShift гарантирует, что наши данные защищены во временном хранилище, что, цитата "никогда не останавливается на узле" . Однако мы сейчас восстановили этот пароль и сохранили его в виде простого текста String
, теперь он доступен в виде открытого текста в нашей локальной памяти Node, поэтому любой, кто получит к нему доступ, может, если он попытается достаточно усердно, извлечь его. Мы работаем в кластерной среде, поэтому, скорее всего, кто-то еще будет запускать приложение на нем. Это другое приложение (или даже наше собственное приложение) может иметь критическую уязвимость, приводящую к тому, что злоумышленник получает права доступа root на всю систему. Теперь они могут также получить доступ к памяти нашего приложения.
Такие вопросы, как Почему char [] предпочтительнее, чем String для паролей? объясняют, почему в целом мы хотим избегать использования Strings, чтобы уменьшить окно возможностей для нашего злоумышленника, чтобы восстановить пароль из памяти. Вот наша цель: уменьшить окно возможностей.
Итак, вот мой вопрос:
Нужно ли обрабатывать пароль, полученный из переменной среды (как в OpenShift с секретами) конкретным c способом для обеспечения безопасности данных и сокращения окна возможностей для потенциальных злоумышленников, и если да, то: Как нам это сделать?