Введение
Сегодня я поделюсь своим опытом по аутентификации пользователей на уровне сервера.
Сразу скажу, это не единственный способ защиты информации. Сервер Apache предполагает три варианта разрешения вопроса, будет ли в ответ на запрос предоставлен конкретный ресурс. Критерии, которыми он пользуется, — это аутентификация, авторизация и управление доступом. И мало того, тот способ, что я опишу ниже можно расширить функционалом — в статье мы рассмотрим лишь базовый функционал, который может послужить отправной точкой и инструкцией к дальнейшим действиям. Я перепробовал множество способов защиты и сокрытия информации, в т.ч. SSL, TSL и др., сегодня расскажу вам лишь о аутентификации.
Попытаемся себе представить, для чего нам это нужно.
- Делаете работу для заказчика и нельзя пускать на сайт никого кроме вас и клиента
- Не хотите показывать сайт обществу и лишь несколько людей должны иметь доступ к нему
- Не хотите показывать недоделанную работу - сайт в процессе разработки (Under Construction)
- Пускать на сайт, кроме привелигированного пользователя, нет никакого для вас резона
- Другая причина
Как правило аутентификацией называется любой процесс, с помощью которого проверяется, что некто является именно тем, за кого себя выдаёт. Обычно, такая проверка ограничивается вводом имени пользователя (login) и пароля (password), но может включать в себя любой другой метод, определяющий т.н. тождественность.
Конфигурирование
Защита сайта может быть выполнена в 3 шага
- Создание файла паролей
- Конфигурирование Apache для работы с файлом паролей
- Создание групп пользователей (опционально)
От слов, к делу
Шаг первый.
Пишем в секции <VirtualHost> вашего сайта:
Options Includes FollowSymLinks
AllowOverride All
AuthType Basic
AuthName "Welcome to my project!"
AuthUserFile /home/Site.ru/other_files/My/.htpasswd
Require user ROOT HACKER CLIENT
</Directory>
Итак по порядку:
/home/Site.ru/www/My - реальный путь к каталогу с вашим сайтом
FollowSymlinks - наткнувшись на символическую ссылку (`man ln`) Apache её резольвит а не спотыкается
Includes - разрешает SSI
AllowOverride - Какие директивы, объявленные в файле .htaccess могут отменять ранее установленную информацию доступа. В нашем случае All, т.е. все. Эта строка не относится к нашей задаче, она просто для примера. Вы можете ее не использовать.
AuthType - Apache поддерживает 2 типа защиты содержания:
- Basic - базовая авторизация. Шифрование используется я на обеих сторонах, но клиент передает пароль не надежно зашифрованным, т. к не используется ключ шифрования. Это крупный недостаток этого метода. Применяется алгоритм шифрования Base64
- Digest - аутентификация специальным кодом (дайджестом), который использует ключ, конкретно, имя пользователя, пароль, область, требующая аутентификацию, различную информацию о запросе и уникальный код данного запроса, который Apache присваивает каждому соединению. Это однонаправленный метод, и для того, что бы расшифровать это, стороннему человеку требуется слишком много информации об обеих сторонах. Но главный недостаток этого метода в том, что на 2000 год его не поддерживал ни один пользовательский браузер
AuthName - Текст подсказки, которая отображается в браузере при входе на защищенную часть сайта.
AuthUserFile - Содержит информацию о допустимых именах пользователей и их паролях в зашифрованном виде.
Require user - Принцип аутентификации. только пользователи, указанные следующими через пробел, и указавшие верный пароль, смогут войти
Шаг второй.
Создаём пароли
[root@localhost]# htpasswd -b /home/Site.ru/other_files/My/.htpasswd HACKER HACKER_PASSWORD
[root@localhost]# htpasswd -b /home/Site.ru/other_files/My/.htpasswd CLIENT HACKER_PASSWORD
Синтаксис вызова утилиты ясен, но на всякий случай поясню:
- -с - создать новый файл. Если этот параметр не указан, и файл не существует, утилита выдаст ошибку, если файл уже существовал, он будет перезаписан
- -d - утилита будет использовать алгоритм шифрования DES (в C это функция crypt()). По умолчанию используется во всех ОС, но не в Windows
- -m - использовать алгоритм шифрования MD5, который является шифром по умолчанию в Windows
- -p - сохранить пароль в чистом виде, без шифрования. Работает только в Windows
- -s - утилита будет использовать алгоритм шифрования SHA
- -b - в нормальном режиме, без этой опции, утилита получает пароль вводом в стандартный входной поток. При использовании этой опции, после пути к файлу паролей должен идти пароль, и утилита получит пароль из этой опции. Утилита не будет ждать пользовательского ввода, она сразу возвратит управление в оболочку.
Всё.
Проверяем не напортачили ли где: apachectl -t
Перезапускаем сервер: apachectl -k graceful
С уважением.
Комментарии
Отпишитесь, кто пробовал, у кого работает/не работает.
Эээ... я пробовал... работает... Вообще в .htaccess достаточно прописать что-то вроде:
AuthType Basic
AuthName "test zone"
AuthUserFile /opt/www/lalala/.htpasswd
require valid-user
И по указанному в AuthUserFile пути положить файл с паролями, сгенерированными htpasswd.
Не достаточно.
Так или иначе нужно юзать утилиту шифрования паролей, например htpasswd.
Если вы хотите использовать эти директивы в файле .htaccess, проверьте, что бы для вашего хоста директива AllowOverride корневого файла конфигурации Apache включала опцию AuthType.
Для некоторых директив (AuthUserFile и AuthGroupFile) нужна поддержка mod_auth, от этого некуда не денешься.
Да и потом, я же писал, что мой вариант далеко не единственный.
спасибо за описание (хотя я так и понял для чего это нужно, но вдруг кому-то надо)... на сайте Друпал.орг есть ещё модуль securesite, тоже вроде для недопущения любопытных... реализуется вроде всё самим Друпалом, без влезания в работу Апача и без сложных настроек...
В моём варианте это можно сделать с любым сайтом и не обязательно на Drupal.
И вообще, много модулей - зло : )
Памяти много не бывает.
Эээ... : )
Мысля.
Подскажите, а поисковый робот индексирует сайт при таком раскладе, что я описал выше?
наверное не индексирует... хотя если доступ к нему есть, то почему нет?
а вот когда модуль securesite, то точно не индексирует...
Вот, специалист объяснил, что не может.
По тому как обращается по http
От себя добавлю, если интересно напишу статью как не отпугнуть надолго того же Googlebot подобными действиями, если конечно кому то интересно,
А то как я погляжу, все и так всё знают : )
хех... мы-то знаем, да лишняя информация не помешает...
сам знаешь... проект у нас бедненький, специалистов нанять не можем...
Не достаточно.
Так или иначе нужно юзать утилиту шифрования паролей, например htpasswd
Вообще-то я выдрал кусок из рабочего .htaccess, подобным уже лет 5, наверное, пользуюсь. Так что того что я написал вполне досточно.
А как же
LoadModule auth_module modules/mod_auth.so
?Об чем спор, горячие эстонские парни?
Один написал: И по указанному в AuthUserFile пути положить файл с паролями, сгенерированными htpasswd.
Другой написал: Не достаточно. Так или иначе нужно юзать утилиту шифрования паролей, например htpasswd.
За статью - спасибо. Http-авторизацией пользуюсь тоже давно, но собранная вместе и грамотно изложенная информация всегда полезна.
Было бы интересно узнать всякие tip&tricks на эту тему. Можно ли, к примеру, вывести сообщение AuthName кириллицей?
Кто спорит?
Мы не спорим?
Так, обычная полемика... : )
вот кстати варианты:
Модуль securesite ()
или вот HTTP authentication
Подскажите, а поисковый робот индексирует сайт при таком раскладе, что я описал выше?
если аутентификация обязательна то естественно не индексирует. но если вам надо запрятать часть пользуйтесь robots.txt (вроде в дистро есть пример, да и в hanbook более развернуто написано)
Спасибо, всю доступную информацию я уже получил.
Сегодня ездил в олимпийский за книжкой по Apache.
Облазил всё вдоль и по поперёк.
К сожалению, нашёл только 3 книги о Apache 1.3.x весьма сомнительного качества содержания.
Мнда...
Блин, в олимпийский лучше ко мне в рабочий день заехал бы А в i-nete поискать книжку толковую не проще, чем перевод?
======================================================
[url=http://wiki.drupal.ru]Документация[/url],[url=http://wiki.drupal.ru/doc/poleznye_ssylki_dlya_dizainerov]Дизайн[/url],[url=http://wiki.drupal.ru/doc/gotovye_perevody]Переводы[/url]
Дык хотелось нормальную, шуршащую бумагу - глазу приятнее.
И чтоб по 2ой версии было, и с толком, и не 100 страниц.
Вобщем не нашёл такой.
В одном месте мне сказали, мол была подобная, года два назад, но теперь нет её...
Чтож, будем искать : )
тоже искал, не нашел (вернее нашел - на английском, мне в принципе без разницы на каком языке)
почитай http://apachedev.ru
SadhooKlay, закажи английскую, с Amazon.com, они в Россию отправляют.
- - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
Переводы некоторых модулей.
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2
Спасибо, не думал о этой возможности.
Хм, а сколько будет накладной %$
======================================================
[url=http://wiki.drupal.ru]Документация[/url],[url=http://wiki.drupal.ru/doc/poleznye_ssylki_dlya_dizainerov]Дизайн[/url],[url=http://wiki.drupal.ru/doc/gotovye_perevody]Переводы[/url]
Таки нашёл на books.ru книженцию : )
Вопрос один появился. При таком запароливании сайта не работет скрипт, запускемый по крону:
/usr/local/bin/lynx -source http://сайт.ru/cron.php > /dev/null 2>&1
если пароль с папки снять, то скрипт работает нормально. Вопрос: что сделать, чтобы скрипт работал и при запароленной папке?
--
romka.eu
http://username:password@domain.tld/cron.php
прокатит?
И любой прокси его запишет в лог
======================================================
[url=http://wiki.drupal.ru]Документация[/url],[url=http://wiki.drupal.ru/doc/poleznye_ssylki_dlya_dizainerov]Дизайн[/url],[url=http://wiki.drupal.ru/doc/gotovye_perevody]Переводы[/url]
И любой прокси его запишет в лог
тогда имхо проще разрешить только свой ip
Согласен.
Иногда это единственно верное решение.