Как безопасно получить секрет OpenShift как приложение Java - PullRequest
0 голосов
/ 06 февраля 2020

Мой пример использования следующий: я хочу открыть какой-нибудь зашифрованный файл (тип файла или шифрование здесь не обязательно имеют значение, это не главное), используя метод с подписью следующим образом:

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 способом для обеспечения безопасности данных и сокращения окна возможностей для потенциальных злоумышленников, и если да, то: Как нам это сделать?

...