Настройка HTTP Basic авторизации

Настройка HTTP Basic авторизации

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

Копирование материалов сайта возможно только с указанием ссылки на первоисточник.