Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Защита сайта с помощью .htaccess и .htpasswd Basic аутентификация и авторизация

Лекция



Привет, Вы узнаете о том , что такое защита сайта с помощью htaccess, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое защита сайта с помощью htaccess, htpasswd basic аутентификация, авторизация , настоятельно рекомендую прочитать все из категории Вредоносное ПО и защита информации.

Защита сайта средствами самого сервера Apache является одним из самых простых и в тоже время достаточно надежных способов. В этом случае Вам не нужно досконально продумывать стратегию безопасности, осуществлять ее проектирование и реализацию в коде. К тому же, для того, чтобы создать хорошую систему защиты нужно обладать достаточной квалификацией в этом вопросе. Используя встроенную защиту WEB-сервера Apache, Вы значительно упрощаете себе задачу — все, что Вы должны сделать — это выполнить несложную последовательность действий и Ваш сайт будет в достаточной мере защищен. В данной статье будут подробно описаны шаги и действия, которые Вам необходимо совершить. А в конце статьи будут приведены примеры файлов .htaccess.

Базовая аутентификация

В данной статье будет рассмотрен самый простой и доступный способ защиты — базовая аутентификация.

Почему Basic? Потому что бывает еще не только basic, но и digest и другие виды. Но мы их здесь касаться не будем, а коснемся наиболее простого вида аутентификации, который можно реализовать средствами сервера Apache.

 

Замечание

Аутентификация — процесс, с помощью которого проверяется, что некто является именно тем, за кого он себя выдает. Как правило, проверка включает в себя ввод имени и пароля.

Рассмотрим, как работает базовая аутентификация. 
При обращении посетителя в защищаемую директорию, сервер Apache в ответ на запрос посылает заголовок с кодом 401 (401 authentication required header). Браузер посетителя принимает заголовок с кодом 401 и выводит окно с полями для ввода имени пользователя и пароля. После ввода имени и пароля эти данные отсылаются назад серверу, который проверяет имя пользователя на предмет нахождения в специальном списке, а пароль на правильность. Если все верно, то посетитель получает доступ к ресурсу. Вместе с заголовком браузеру посылается специальной имя, называемое областью действия. Браузер кэширует не только имя и пароль, чтобы передавать их при каждом запросе, но и область действия. Благодаря этому, ввод имени и пароля в защищаемой директории осуществляется только раз. В противном случае их необходимо было бы вводить при каждом запросе к защищаемой директории. Кэширование параметров аутентификации (имя, пароль, область действия), обычно осуществляет только в пределах одного сеанса.

Замечание

При базовой аутентификации имя пользователя и его пароль передаются в сеть в открытом виде в течении всего сеанса, когда посетитель работает с защищенной директорией. Хакер может перехватить эту информацию, используя сетевой анализатор пакетов. Данный вид аутентификации не должен использоваться там, где нужна реальная защита коммерческо-ценной информации.

Замечание

WEB-сервер Apache поддерживает еще один вид защиты — digest-аутентификацию. При digest-аутентификации пароль передается не в открытом виде, а в виде хеш-кода, вычисленному по алгоритму MD5. Поэтому пароль не может быть перехвачен при сканировании трафика. Но, к сожалению, для использования digest-аутентификации необходимо установить на сервер специальный модуль - mod_auth_digest. А это находится только в компетенции администрации сервера. Также, до недавнего времени, digest-аутентификация поддерживалась не всеми видами браузеров.

Защита сайта — это просто

Для того чтобы защитить сайт, нужно выполнить следующую последовательность действий:

создать файл с паролями,переписать его на сервер,

создать файл .htaccess и тоже переписать его на сервер.
Для организации защиты понадобится.

  1. WEB-сайт и FTP или SSH -доступ к нему.
  2. Права на создание файлов .htpaccess и организацию защиты с помощью них.
  3. Утилита генерации паролей htpasswd.exe (wimdows )  htpasswd (linux)
  

Проверка работы файла .htaccess на сервере

Для того чтобы проверить есть ли у Вас права на организацию защиты с помощью файлов .htaccess создайте текстовый файл с именем .htaccess (первым символом идет точка, расширение отсутствует).


Проверка работы .htaccess

AuthType Basic   
AuthName admin 
require valid-user 

Затем,  перепишите файл .htaccess на сайт, в ту директорию, которую вы хотите защитить.

Замечание

Действие файлов .htaccess распространяется не только на ту директорию, где лежит файл, но и на все поддиректрии, лежащие уровнем ниже.

Далее через браузер обратитесь к этой директории. Если Вы защищаете директорию admin и переписали туда файл .htaccess, то для проверки Вам следует вписать в адресную строку браузера следующий URL: http://www.site.comru/admin/.

Если после этого Вам открылся запрос на ввод логина и пароля, как на рисунке ниже, то тестирование прошло успешно и можно продолжать защиту директории.

Защита сайта с помощью .htaccess и .htpasswd Basic аутентификация и авторизация

Рис. Окно ввода логина и пароля


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

Замечание

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

Создание файла с паролями .htpasswd

Файл с паролями создается утилитой htpasswd.exe. Если у Вас на машине установлен WEB-сервер Apache, то данная утилита находится в директории с установленным Apache-ем в подкаталоге bin.

Замечание

Если у Вас не установлен Apache, то утилиту htpasswd.exe можете скачать по ссылке: http://www.softtime.ru/files/htpasswd.zip.

  


Вы перешли в директорию Apache2.

Теперь нужно дать команду на создание файла с паролем. Введите в командную строку следующее:

windows : htpasswd -cm .htpasswd adminlogin

linux : # htpasswd -c /home/var/www/.htpasswd adminlogin

 

  • -cm — это ключи для утилиты. Об этом говорит сайт https://intellect.icu . Ключ с — указывает, что необходимо создать новый файл с паролями. Если файл с таким именем уже существует, то он будет перезаписан. Ключ m — определяет шифрование по алгоритму MD5.
    .htpasswd — имя файла с паролями (можете использовать любое имя).
    adminlogin — имя посетителя, которому будет разрешен доступ в закрытую область сайта.

В ответ, должен появится запрос на ввод пароля и его повтор. Если все правильно, то в завершении появится сообщение:

Adding password for user admin.

И в текущей директории  появится файл .htpasswd, к котором будет находиться строка с именем пользователя и хеш-кодом его пароля. Для того, что бы в тот же файл .htpasswd добавить еще одного пользователя следует убрать ключ -c из команды запуска утилиты htpasswd.exe

для windows htpasswd -m .htpasswd admin

Для добавления или изменения пароля для пользователя Newadmin, введите следующую команду:
для linux # htpasswd /home/pwww/.htpasswd-users newadmin

 

Замечание

Если файл с паролями не был создан, то возможно, некоторые ключи утилиты не поддерживаются в Вашей операционной системе. Например, иногда не поддерживается ключ m. В этом случае, Вам нужно ввести htpasswd -c .htpasswd admin
Для того, чтобы посмотреть ключи и параметры работы утилиты

введите windows htpasswd.exe /?

linux htpasswd --man или htpasswd --help 

 

Вам будет выдано описание интерфейса.

Итак, файл с паролями создан. Теперь Вам необходимо переписать его на сервер. Файлы с паролями очень желательно класть выше корневой директории сайта — туда, куда не будет доступа посетителям. 
Если это невозможно, то файлы с паролями следует обязательно защитить. Это можно сделать с помощью файлов .htaccess. Чтобы защитить файлы с паролями создайте файл со строками, представленными в следующем листинге.

Защита файлов .htpasswd

<Files .htpasswd> 
   deny from all 
</Files>

И положите его в ту директорию, где находится Ваш файл с паролями. Теперь посетители сайта не смогут получить к нему доступ.
Файл с паролем создан и защищен от несанкционированного доступа. Теперь необходимо создать файл .htaccess, который будет использоваться в защищаемой директории.

Создание файла .htaccess

Для защиты директории могут использоваться следующие директивы:

  • AuthType — Тип используемой аутентификации. Для базовой аутентификации эта директива должна иметь значение: Basic
    AuthName — Имя области действия аутентификации. Текст, помогающий посетителю понять, куда он пытается получить доступ. Например, может быть написано: "Private zone. Only for administrator!"
    AuthUserFile — путь к файлу с паролями (.htpasswd).
    AuthGroupFile — путь к файлу групп, если он существует.
    Require — Одно или несколько требований, которые должны быть выполнены для получения доступа к закрытой области.

Пример файла .htaccess

AuthType Basic   
AuthName "Private zone. Only for administrator!" 
AuthGroupFile /usr/host/mysite/group 
AuthUserFile  /usr/host/mysite/.htpasswd   
require group admins

Следует более подробно описать директивы AuthUserFile и AuthGroupFile. В них прописываются абсолютные пути к соответствующим файлам от корня сервера.

Внимание!

Относительные пути работать не будут!

Путь от корня сервера, можно узнать, спросив у администрации сервера, либо можно попробовать выяснить его самим. Для этого выполните функцию phpinfo(). На экран будет выведена фиолетовая таблица. Значение абсолютного пути от корня сервера можно посмотреть в переменных: doc_root, open_basedir, DOCUMENT_ROOT.
Директива Require определяет кому разрешен доступ к закрытой области. Например,

  • require valid-user — разрешен доступ всем прошедшим проверку
  • require user admin alex mango — разрешен доступ только посетителям с именами admin, alex, mango. Естественно, они должны пройти аутентификацию.
  • require group admins — разрешен доступ всем пользователям из группы admins

Файлы групп

Если к защищаемой области сайта должна иметь доступ большая группа людей, то удобно объединить людей в группы, и разрешать доступ, определяя принадлежность посетителя к группе.
Формат файла групп очень прост. Это текстовый файл, каждая строка, которой описывает отдельную группу. Первым в строке должно идти название группы с двоеточием. А затем через пробел перечисляются посетители, входящие в группу.

Пример файла групп

Admins: admin newadmin Ira 
Users: guest user Sanya

В группу Admins входят посетители с именами admin, newadmin , Ira.

А в группу Users входят посетители с именами guest, user, Sanya.

Примеры файлов .htaccess

1. Доступ всем пользователям, прошедшим авторизацию

AuthType Basic   
AuthName "Please login.!" 
AuthUserFile  /var/www/site/.htpasswd   
require valid-user

2.Доступ только пользователям admin и root

AuthType Basic   
AuthName "Please login.!" 
AuthUserFile  /var/www/site/.htpasswd   
require user admin root

3. Доступ только пользователей из группы admins

AuthType Basic   
AuthName "Please login.!" 
AuthUserFile  /var/www/site/.htpasswd   
AuthGroupFile /var/www/site/group 
require group admins

4. Запрет доступа только к файлу private.zip

<Files private.zip> 
AuthType Basic 
AuthName "Please login.!" 
AuthUserFile  /var/www/site/.htpasswd 
require valid-user 
</Files>

5. Запрет доступа только  к определенному URL

Если изменения вносить в главный файл конфига апача т мозможно установить пароль на URL

<location /protected_url>

AuthType Basic
AuthName "Please login."
AuthUserFile "/var/www/site.com/.htpasswd"

 </location>

при этом должна быть установлена AllowOverride All. 

6. Запрет доступа ко всему кроме одного URL

Если нужно в htaccess исключить один URL из базовой аутентификации, то

Если вы используете Apache 2.4, SetEnvIf и mod_rewrite обходные пути не больше не нужны ,то:

AuthType Basic
AuthName "Please login."
AuthUserFile "/var/www/.htpasswd"

Require expr "%{REQUEST_URI} =~ m#^/protected_url/.*#"
Require valid-user

Apache 2.4 обрабатывает Require директивы, которые не сгруппированных по , <RequireAll> как если бы они были в <RequireAny>, который ведет себя как "или" объявление .

Вот более сложный пример , который демонстрирует соответствие как запрос URI и строку запроса вместе, и отключая на требования ввода логина и пароля:

AuthType Basic
AuthName "Please login."
AuthUserFile "/var/www/.htpasswd"

<RequireAny>
    <RequireAll>
        # I'm using the alternate matching form here so I don't have
        # to escape the /'s in the URL.
        Require expr "%{REQUEST_URI} =~ m#^/protected_url/.*#"

        # You can also match on the query string, which is more
        # convenient than SetEnvIf.
        #Require expr "%{QUERY_STRING} = 'secret_var=42'"
    </RequireAll>

    Require valid-user
</RequireAny>

Этот пример позволит обеспечить доступ к /protected_url/foo?secret_var=42

но требуется введ  имя пользователя и пароля для доступа /protected_url/foo.

Помните , что если вы не используете <RequireAll>, Apache будет пытаться проверятькаждое правило  ,

чтобы указать какие условия вы хотите , чтобы выполнялись в первую очередь используйте Require

Ссылка для Require директивы здесь: https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

А expr ссылка  здесь: https://httpd.apache.org/docs/2.4/expr.htm

 

 

7. Basic- авторизация через PHP при подключении к другому сайту (для клтента)

 код функции, которая авторизуется по указанному адресу с указанными логином-паролем и возвращает контент сайта, доступный после авторизации:

<?
	function do_authorize($host, $uri, $user, $pwd) {
		$out  = "GET $uri HTTP/1.1\r\n";
		$out .= "Host: ".$host."\r\n";
		$out .= "Connection: Close\r\n";
		$out .= 'Authorization: Basic '.base64_encode($user.':'.$pwd)."\r\n";
		$out .= "\r\n";

		if (!$sock = @fsockopen($host, 80, $errno, $errstr, 10)) {
			return 0;
		}
		fwrite($sock, $out);
		$data = '';
		while (!feof($sock)) {
			$data .= fgets($sock);
		}
		fclose($sock);
		return $data;
	}

	if ($source = do_authorize('localhost','/test.php', 'novice', 'novice')) {
		echo $source;
	} else {
		echo "I can't connect!";
	}
?>

 

 

8. HTTP-авторизация средствами PHP для серверной стороны

Рассмотрим создание HTTP-авторизации с помощью PHP, что позволит закрыть какой-либо раздел сайта, например административную часть.

Для установления подлинности HTTP обеспечивает простой механизм "вызов-ответ" (challenge-response), который может использоваться сервером для вызова (challenge) клиентского запроса, а клиентом для предоставления опознавательной информации (authentication information). Наиболее распространенной схемой авторизации является "Базовая схема установления подлинности" (Basic Authentication Scheme).

"Базовая" схема установления подлинности основана на том, что агент пользователя (браузер) должен подтвердить свою подлинность при помощи идентификатора пользователя (имени пользователя) и пароля для каждой защищенной области (realm). Сервер обслужит запрос, в случае если он может проверить правильность идентификатора пользователя и его пароля для данной защищенной области. Никаких дополнительных опознавательных параметров в данной схеме не предусмотрено.

После получения запроса на идентификацию, сервер отвечает вызовом (challenge), подобным следующему:

WWW-Authenticate: Basic realm="Please login" HTTP/1.1 401 Unauthorized 

Здесь "Restricted Area" -- строка, назначенная сервером, которая идентифицирует защищенную область запрашиваемого URI (Request-URI). Говоря простым языком -- имя защищенной области.

Далее, чтобы получить права доступа, агент пользователя (браузер) отправляет на сервер идентификатор пользователя (имя пользователя) и пароль, разделенные одним символом двоеточия (":"), внутри base64-кодированной строки рекомендаций (credentials):

basic-credentials = "Basic" basic-cookie

Здесь

  • basic-cookie -- base64-кодированая строка, содержащая user-pass
  • user-pass -- строка вида "userid:password"
  • userid -- текст, не содержащий символов ":"
  • password -- текст

Обратите внимание, что и имя пользователя и пароль являются чувствительными к регистру. То есть, например, User и user -- два различных имени пользователя.

HTTP-авторизация и PHP

Возможно вам уже приходилось использовать Basic-схему авторизации совместно с PHP и вам известно, что суть метода сводится к тому, чтобы получить от веб-сервера переменные PHP_AUTH_USER и PHP_AUTH_PW, определяющие соответственно имя пользователя и пароль, и каким-либо образом обработать их внутри PHP-скрипта. Но заметим, что данный способ эффективен только тогда, когда PHP функционирует в качестве модуля веб-сервера Apache. На нашем хостинге PHP работает в режиме CGI/FastCGI и описанный выше метод работать не будет, поскольку переменные PHP_AUTH_USER и PHP_AUTH_PW не будут передаваться внутрь скрипта.

Однако существует способ, который позволяет обойти это ограничение и передать значения имени пользователя и пароля, которые вводит пользователь, внутрь PHP-скрипта. Для этих целей используются средства mod_rewrite -- модуля веб-сервера Apache. Правила, которые мы будем использовать, имеют следующий вид:

RewriteCond %{HTTP:Authorization} ^Basic.*
RewriteRule (.*) index.php?authorization=%{HTTP:Authorization} [QSA,L]

При запросе через HTTP к файлу sitename.ru/www/index.php, данное правило будет передавать GET-запросом содержимое непустого поля Authorization в параметр authorization. Если мы средствами PHP посмотрим на содержимое переменной $_GET['authorization'], то увидем как раз описываемый выше basic-credentials -- строку вида:

"Basic dXdfgdfgfzd29yZA=="

Далее нам необходимо расшифровать эту строку, для того, чтобы уже впоследствии как-то обработать введенные имя пользователя и пароль. Сделать это можно следующим образом:

preg_match('/^Basic\s+(.*)$/i', $_GET['authorization'], $user_pass);
list($user,$pass)=explode(':',base64_decode($user_pass[1]));

Таким образом мы получим две переменные -- $user и $pass, содержащие соответствено имя пользователя и пароль. Теперь, как упоминалось выше, их нужно лишь каким-либо образом обработать -- например, сравнить с аналогичными переменными из базы данных или из файла с учетными записями пользователей.

 

Рассмотренный  метод будет успешно работать везде, где PHP работает в режиме CGI/FastCGI и в качестве веб-сервера используется Apache + mod_rewrite.

 

Исходный текст файла .htaccess

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{HTTP:Authorization} ^Basic.*
    RewriteRule (.*) index.php?authorization=%{HTTP:Authorization} [QSA,L]
</IfModule>

Исходный текст PHP-скрипта

$authenticated=0;

if(isset($_GET['authorization']))
{
    if(preg_match('/^Basic\s+(.*)$/i', $_GET['authorization'], $user_pass))
    {
        list($user,$pass)=explode(':',base64_decode($user_pass[1]));
        // Проверка введенных логина и пароля
        if($user=="user" && $pass=="password")
        {
            $authenticated=1;
        }
    }
}

if($authenticated)
{
    // Авторизация успешно пройдена
    echo("user: ".$user."<br>pass: ".$pass);
}
else
{
    header('WWW-Authenticate: Basic realm="Please login"');
    header('HTTP/1.1 401 Unauthorized');
    echo("Access denied.");
}

Выводы из данной статьи про защита сайта с помощью htaccess указывают на необходимость использования современных методов для оптимизации любых систем. Надеюсь, что теперь ты понял что такое защита сайта с помощью htaccess, htpasswd basic аутентификация, авторизация и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Вредоносное ПО и защита информации

создано: 2016-09-17
обновлено: 2020-12-29
350



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Информационная безопасность, Вредоносное ПО и защита информации

Термины: Информационная безопасность, Вредоносное ПО и защита информации