HTTP Basic авторизация — это простой метод ограничения доступа к веб-сайту, где клиент должен предоставить имя пользователя и пароль для доступа.
Механизм авторизации достаточно прост: логин и пароль передаются в заголовке запроса, отправляемого браузером, или их можно ввести прямо в адресной строке, следуя указанному правилу:https://LOGIN:PASS@varnote.ru
При этом пароль обычно использует формат с алгоритмами хеширования: MD5, SHA-1 или bcrypt. На сегодняшний день bcrypt считается самым безопасным.
Создание пароля
Создать хешированный пароль можно множеством способов. Самые распространенные:
- Через утилиту
htpasswd
- Через
openssl
- Или через онлайн-сервисы
Рассмотрим пример, как настроить HTTP Basic авторизацию для различных веб-серверов и сред. Для генерации пароля используем htpasswd
с параметром -B
для создания хеша с алгоритмом bcrypt.
Установите утилиту apache2-utils, если она еще не установлена:
sudo apt install apache2-utils
.htaccess
Файл .htaccess используется для настройки конфигураций на уровне директорий в веб-серверах Apache.
Создайте файл .htpasswd, который будет содержать имена пользователей и пароли. Используйте команду htpasswd для создания файла:
htpasswd -cB /path/to/.htpasswd username
Вам будет предложено ввести пароль для указанного пользователя.
Создайте или отредактируйте файл .htaccess
в директории, которую хотите защитить, добавив строки:
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /path/to/.htpasswd # укажите полный путь к вашему файлу .htpasswd
Require valid-user
Apache2
Также можно настроить HTTP Basic авторизацию непосредственно в самом Apache2.
Создайте файл .htpasswd:
sudo htpasswd -cB /etc/apache2/.htpasswd username
Добавьте конфигурацию в виртуальный хост или в директиву <Directory>
:
<Directory "/var/www/html/protected-directory">
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
Перезагрузите сервер Apache:
sudo service apache2 reload
# или
sudo systemctl restart apache2
Nginx
Если у вас php-fpm, то настроить Basic авторизацию можно в Nginx.
Создаем пароль в директории /etc/nginx
с помощью такой же команды:
sudo htpasswd -cB /etc/nginx/.htpasswd username
Добавляем конфигурацию в блок server или location:
server {
listen 80;
server_name example.com;
location /protected-directory {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
Перезагружаем Nginx:
sudo service nginx reload
# или
sudo systemctl restart nginx
Traefik
В Traefik существует несколько способов настройки Basic авторизации. Мы пропишем логин и пароль в файле конфигурации traefik.toml
. Остальные варианты можно посмотреть в документации Traefik
Для начала сформируем строку логина и пароля командой:
htpasswd -nbB username password
Здесь мы используем другие параметры:
- параметр
-b
определяет, что пароль должен быть передан из командной строки (используйте с осторожностью, так как пароль будет виден в консоли и сохранится в истории shell) - параметр
-n
отображает результат в стандартный вывод, а не сохраняет его в файл
Далее нужно создать middleware-компонент и добавить его в http-роут.
[http.middlewares]
[http.middlewares.test-auth.basicAuth]
users = [
"username:hashedpassword"
]
[http.routers.my-router]
rule = "Host(`example.com`)"
service = "my-service"
middlewares = ["test-auth"]
После этого перезапускаем службу:
sudo service traefik restart
# или
sudo systemctl restart traefik
Kubernetes
В конфигурации Kubernetes Basic авторизацию можно настроить посредством секретов. Рассмотрим на примере Nginx Ingress
Создайте файл auth
с логином и паролем:
htpasswd -cB auth username
Создайте секрет, указав файл auth
в качестве параметра:
kubectl create secret generic basic-auth --from-file=auth
Обновите конфигурацию Ingress для использования созданного секрета:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/auth-type: "basic"
nginx.ingress.kubernetes.io/auth-secret: "basic-auth"
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
nginx.ingress.kubernetes.io/server-snippet: |
satisfy any;
auth_basic basic;
auth_basic_user_file basic-auth;
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
Примените манифест Ingress:
kubectl apply -f ingress.yaml
Помните, что HTTP Basic Auth обеспечивает базовый уровень защиты. Для повышения безопасности как минимум нужно использовать ее в сочетании с HTTPS, чтобы защитить данные от перехвата в процессе передачи. Кроме того, для критически важных систем и приложений стоит рассмотреть более надежные методы аутентификации и авторизации.