Аутентификация по OTP на Web-сервере Apache / Хабр

Introduction

When setting up a web server, there are often sections of the site that you wish to restrict access to. Web applications often provide their own authentication and authorization methods, but the web server itself can be used to restrict access if these are inadequate or unavailable.

In this guide, we’ll demonstrate how to password protect assets on an Apache web server running on Ubuntu 14.04.

Configuring access control with .htaccess files

If you wish to set up password protection using .htaccess files instead, you should begin by editing the main Apache configuration file to allow .htaccess files:

  1. sudonano /etc/apache2/apache2.conf

Digest

Работа Digest авторизации чуть сложнее. Прежде всего, при первом сообщении клиенту о необходимости прохождения авторизации (шаг 2), сервер передает в заголовке ряд параметров

  • realm – имя защищенной области (помните, мы акцентировали на ней внимание при настроке файла конфигурации?) Здесь значение этого параметра играет роль (в отличии от Basic авторизации)
  • nonce – уникальный ключ, генерируемый сервером в момент отправки сообщения клиенту
  • algorithm – название алгоритма (как правило, MD5)

Install the apache utilities package

In order to create the file that will store the passwords needed to access our restricted content, we will use a utility called htpasswd. This is found in the apache2-utils package within the Ubuntu repositories.

Update the local package cache and install the package by typing this command. We will take this opportunity to also grab the Apache2 server in case it is not yet installed on the server:

  1. sudoapt-get update
  2. sudoapt-getinstall apache2 apache2-utils

Авторизация через .htaccess

У сервера apache есть возможность сделать базовую авторизацию. Чтобы закрыть директорию, в неё нужно поместить два файла – .htaccess и .htpasswd.

Похожее:  ИНТЕРНЕТ КАБЕЛЬНОЕ ТЕЛЕВИДЕНИЕ ВИДЕОНАБЛЮДЕНИЕ УМНЫЙ ДОМОФОН

AuthName "Authorization" – сообщение в окне ввода логина и пароля, кириллица не поддерживается, в Google Chrome вообще не выводится.

AuthUserFile /путь_до_директории/.htpasswd – путь до файла с паролями.

Чтобы узнать полный путь к директории достачно поместить в неё PHP файл и запустить его в браузере.

Авторизацией можно закрыть только определенные файлы, например архивы ZIP.

На некоторых хостингах авторизация на статические файлы (изображения, шрифты и т.д.) может не работать т.к. они отдаются через Nginx.

Стоит проверить прямой доступ к самим файлам .htaccess и .htpasswd из браузера, если да, то закрыть его:

В файле хранится пары логина и хеша пароля, например:

admin:$apr1$TCrF2kqA$TSMYziwt.qCkrct9yx4vv1

Логин может содержать латинские буквы, цифры, - и _, регистрозависимый.

Хеш можно сгенерировать в PHP, возможны следующие алгоритмы:

В настоящее время считается очень безопасным, работает начиная с версии 2.4, формат:

$2y$ или $2a$ результат алгоритма crypt_blowfish.

function bcrypt($password)
{
	$rounds = 12;
	$salt = sprintf('$2a$d$', $rounds) . substr(str_replace(' ', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22);
	return crypt($password, $salt);
}

echo bcrypt('123456'); // $2a$12$dMHIiiPfeSMxqj3/Wt1.z.Mo7NPza1x/WANl7hDXZJzxxKKorz5um

Специфический алгоритм Apache (1000 итераций MD5 случайной соли и пароля), работает во всех версиях.

$apr1$ результат алгоритма.

function crypt_apr1_md5($password)
{
	$salt = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789'), 0, 8);
	$len = strlen($password);
	$text = $password . '$apr1$' . $salt;
	$bin = pack('H32', md5($password . $salt . $password));
	for($i = $len; $i > 0; $i -= 16) {
		$text .= substr($bin, 0, min(16, $i));
	}
	for($i = $len; $i > 0; $i >>= 1) {
		$text .= ($i & 1) ? chr(0) : $password{0};
	}
	$bin = pack('H32', md5($text));
	for($i = 0; $i < 1000; $i  ) {
		$new = ($i & 1) ? $password : $bin;
		if ($i % 3) {
			$new .= $salt;
		}
		if ($i % 7) {
			$new .= $password;
		}
		$new .= ($i & 1) ? $bin : $password;
		$bin = pack('H32', md5($new));
	}
   
	$tmp = '';
	for ($i = 0; $i < 5; $i  ) {
		$k = $i   6;
		$j = $i   12;
		if ($j == 16) $j = 5;
		$tmp = $bin[$i] . $bin[$k] . $bin[$j] . $tmp;
	}
	$tmp = chr(0) . chr(0) . $bin[11] . $tmp;
	$tmp = strtr(
		strrev(substr(base64_encode($tmp), 2)),
		'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 /',
		'./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
	);
 
	return '$apr1$' . $salt . '$' . $tmp;
}

echo crypt_apr1_md5('123456'); // $apr1$h9j4azoy$unmKNqjZlRfZv5xRetm9p1

Работает только на Unix хостингах и до версии Apache 2.2.17. Ограничивает длину пароля до 8 символов. Считается небезопасным.

Этот алгоритм небезопасен по современным стандартам, работает во всех версиях.

{SHA} результат SHA-1 (бинарная строка из 20-ти символов) закодированный в Base64.

Реквизиты доступа к закрытой директории можно передать в URL:

https://логин:пароль@example.com/path

Если такие URL использовать в src изображений, скриптов и стилей, то работать они не будут, вызвав ошибку:

Subresource requests whose URLs contain embedded credentials (e.g. `https://user:pass@host/`) are blocked.

Завершение сеанса происходит по закрытию браузера, но не вкладки. Другого варианта не предусмотрено.

В PHP можно отследить авторизированного пользователя по переменным массива $_SERVER.

Если их нет, значит пользователь не авторизирован. Вывести диалог входа из PHP:

Добавление пользователя с правами сетевого доступа

Создаём пользователя и на вкладке Dial-in предоставляем права сетевого доступа:

image

Контроль по ip

Если вам нужно просто разрешить или блокировать доступ к какой-либо части сайта или всему серверу в целом для определенных IP, используйте следующие директивы.

Внимание! Если вы хотите использовать эти директивы в файле .htaccess, проверьте, что бы для вашего хоста директива AllowOverride корневого файла конфигурации Apache включала опцию Limit

Order

Значения: Order (allow,deny | deny,allow)

Директива Order указывает порядок, в котором будет производиться чтение из директив Allow и Deny

  • Allow,deny – сначала читаются директивы Allow. Если пользователя нет в этом списке, то он блокируется. Если же он есть, то далее считываются директивы Deny(процесс еще не закончен). Если же пользователь есть и там, то он блокируется. Если его там нет, то он пропускается. Т.е пользователь пропускается только при наличии только в списке Allow, но не в Deny
  • Deny,allow – сначала обрабатываются директивы Deny и отсеиваются те пользователи, которые есть в этом списке. Любые другие пропускаются. Т.е пользователь пропускается всегда, но если его нет в списке Deny

Allow и Deny

Формат директив: (Allow | Deny) from (IP | IPs | all) (IP | IPs | all) : (IP | IPs | all)

Директивы Allow и Deny определяют клиентов, которым разрешить или запретить доступ к серверу.

Директивы допускают использование:

  • Одиночного IP(IP) – обычный вид IP, например, 127.0.0.1
  • Группы IP(IPs) – группа IP, например, для доступа, только из локальной сети, 192.168.1.0/24
  • Любого IP(all) – обозначает любой IP

После слова from может идти любое количество указанных директив, разделенных пробелом

Примеры

Файл .htaccess

Order allow,deny
# Deny from all # если вы это напишите, то даже те адреса,
# которые указаны в директивах Allow не будет пропущены
Allow from 192.168.1.0/24 11.11.11.12

В этом файле указывается доступ только для клиентов из локальной сети или с IP 11.11.11.12

Контроль по имени пользователя или группе

Если вам нужно защитить сайт или часть сервера паролем, используйте следующие директивы.

Настройка web-сервера

1. Устанавливаем модуль radius для apache2:

sudo apt install libapache2-mod-auth-radius
sudo a2enmod auth_radius

2. Выбираем нужный сайт и в его конфигурации делаем изменения:

Настройка сервера jas


В консоли управления JAS добавляем любой из указанных выше OTP-аутентификаторов.

В свойствах указываем имя пользователя:

image

Более подробно о настройке сервера JAS написано в документации по продукту, а также в

Настройка сервера radius (nps)


Запускаем консоль управления NPS.

1. Добавим наш Web-сервер в качестве клиента:
image
image

Примеры паролирования

Файл .htaccess

Configuring access control within the virtual host definition

Begin by opening up the virtual host file that you wish to add a restriction to. For our example, we’ll be using the 000-default.conf file that holds the default virtual host installed through Ubuntu’s apache package:

  1. sudonano /etc/apache2/sites-enabled/000-default.conf

Inside, with the comments stripped, the file should look similar to this:

/etc/apache2/sites-enabled/000-default.conf

Conclusion

You should now have everything you need to set up basic authentication for your site. Keep in mind that password protection should be combined with SSL encryption so that your credentials are not sent to the server in plain text. To learn how to create a self-signed SSL certificate to use with Apache, follow this guide. To learn how to install a commercial certificate, follow this guide.

Заключение

На этом я закончу свое описание здесь средств защиты данных web-сервером Apache. Все пожелания или вопросы можете оставлять по нижеследующим координатам

На данное время (Июль 2006 года) я пишу Content Managing System(CMS) под PHP 4 , MySQL 3.23.xx и Apache 1.3 , всем желающим посмотреть или присоединиться – пишите мне сюда же

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *