Вопрос или проблема
Я занимаюсь заменой моего старого балансировщика нагрузки nginx на HAProxy и мне очень нравится панель статистики из-за графического интерфейса, который я могу использовать, чтобы помещать серверы в режим дренажа или обслуживания. Однако меня беспокоит то, что имя пользователя и пароль для этого конфигурируются в открытом виде в одном из конфигурационных файлов. Я не смог найти информацию, которая позволила бы мне перенести это на другой вариант аутентификации, например LDAP, или защитить данные в хешированной форме.
Существует ли какой-либо способ не хранить эту информацию в открытом виде в конфигурации?
Да, они должны быть в открытом виде. Согласно руководству:
Поскольку метод аутентификации — это HTTP Basic Authentication, пароли циркулируют в открытом виде по сети. Таким образом, было принято решение, чтобы файл конфигурации также использовал открытые пароли, чтобы напомнить пользователям, что эти пароли не должны быть конфиденциальными и не должны делиться с другими учетными записями.
Обходной путь, который скрывает пароль stats.cfg
, — это использование значения переменной окружения вместо пароля в конфигурационном файле.
Таким образом, stats.cfg
может выглядеть следующим образом:
listen stats
bind *:1936
mode http
stats auth admin:"$PASS"
...
Переменная окружения PASS
хранит пароль. Пароль может быть заполнен через какой-либо секретный файл.
Есть возможность защитить вашу страницу статистики с помощью списка пользователей и хешированного пароля в конфигурационном файле.
Рабочий пример может выглядеть так:
userlist stats-auth
group admin users admin
group readonly users user1, user2
user admin password $6$o9HkZQwkJhh8bK$0TDm5DCA8vQ...0kNNaD53QdYpWfNWHbboegayK0
user user1 password $6$N2n7dooaQ$oQlLQ.mQ80BvUWtg...WvVYMs1U3Xod3.wR9VCtYGhrm1
user user2 password $6$wGOwRT5JG8T$RWWW3oSwSax4ON...3Tpi2M20lcPmYv6aIju.VNYWC/
listen HAProxy-Statistics
bind :81
mode http
stats enable
acl isAuth http_auth(stats-auth)
acl isAuthAmin http_auth_group(stats-auth) admin
stats refresh 10s
stats show-node
stats show-legends
stats uri /stats
stats http-request auth unless isAuth
stats admin if isAuthAmin
Затем можно использовать mkpasswd для генерации валидного и надежного хешированного пароля:
sudo apt install whois
mkpasswd -m sha-512 "MyPassword123!"
Вот различные ссылки, которые можно проконсультироваться по поводу этой реализации:
Ссылка на базовую аутентификацию и альтернативы для хранения пароля:
https://www.haproxy.com/documentation/haproxy-configuration-tutorials/authentication/basic-authentication/
Ссылка для определения пользователя с хешированным паролем:
https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#3.4-user
Ссылка для определения страницы статистики и защиты ее с помощью списка пользователей.
https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#4.2-stats%20admin
Ответ или решение
Введение в практики информационной безопасности в современных IT-системах играет критическую роль. В процессе перехода с одного балансировщика нагрузки на другой нередко возникают вопросы, связанные с безопасностью, в частности с защитой конфиденциальной информации. В данном случае, ваше беспокойство, связанное с использованием HAProxy и необходимости хранения имени пользователя и пароля в открытом виде, вполне оправдано.
Теория
HAProxy предоставляет широкие возможности для управления и мониторинга, включая функцию статистической панели, которая значительно упрощает поддержку и контроль за работой серверов. Однако, по умолчанию, аутентификация на этой странице осуществляется с использованием HTTP Basic Authentication, где пароль передается в открытом виде. Это вызывает очевидные вопросы безопасности, так как подобные данные могут быть уязвимы к перехвату в сетевой среде. Кроме того, традиционно в конфигурационных файлах HAProxy пароли также хранятся в открытом виде. Хотя это делается для повышения осведомленности пользователей о необходимости использования уникальных и несекретных учетных данных, возникает вопрос, как повысить безопасность без необходимости менять архитектуру всей системы.
Пример
Имеется несколько методов, которые можно применить для увеличения безопасности при использовании HAProxy. Основное решение — это использование хэшированных паролей или переменных окружения для сокрытия конфиденциальной информации в конфигурационных файлах. Пример с использованием переменной окружения может выглядеть следующим образом:
listen stats
bind *:1936
mode http
stats auth admin:"$PASS"
В данном случае переменная окружения PASS
хранит пароль, который может загружаться из защищенного файла секретов. Это позволяет избежать хранения пароля в виде чистого текста в конфигурационном файле.
Другой подход, более надежный, заключается в использовании хэширования паролей. В этом случае конфигурация может выглядеть так:
userlist stats-auth
group admin users admin
user admin password $6$o9HkZQwkJhh8bK$0TDm5DCA8vQ...0kNNaD53QdYpWfNWHbboegayK0
listen HAProxy-Statistics
bind :81
mode http
stats uri /stats
stats auth unless isAuth
stats admin if isAuthAdmin
Здесь используется SHA-512 для хэширования паролей, что значительно повышает уровень безопасности по сравнению с хранилищем в открытом виде.
Применение
Чтобы использовать вышеперечисленный подход, сначала необходимо установить утилиту для генерации хэшированных паролей. Например, в Ubuntu это можно сделать с помощью утилиты whois
, поставив соответствующий пакет:
sudo apt install whois
mkpasswd -m sha-512 "MyPassword123!"
Вышеописанные методы применения позволяют не только повысить безопасность, но и создать более гибкую инфраструктуру для управления пользователями в системе HAProxy.
В заключение, использование механизмов хэширования и переменных окружения представляют собой простые, но эффективные методы повышения защищенности конфигурации HAProxy. Это не только улучшает общую архитектуру безопасности, но и минимизирует возможные пути компрометации системы. С учетом этих методов можно значительно сократить риск перехвата или утечки критически важной информации в среде вашей IT-инфраструктуры.