20 мар. 2009 г.

Настройка авторизации пользователя через .htaccess в Apache2

Возникла следующая задачка: нужно отдать файл через http, но только нужному пользователю. Наиболее простое имхо решение - apache2+аутентификация доступа. То есть это будет выглядеть как линк, http://example.com/restricted, по которому пользователя спросят явки/пароли. Если он их знает - велкам, иначе - лесом. Все просто. Реализуется это, как выяснилось, тоже элементарно. Работать будем под Debian Etch. Вообще, все нижеописанное справедливо для любой ОС, под которой запущен apache, однако некоторые моменты, вроде имени пользователя, от которого работает веб-сервер, или команда перезапуска, будут различны, и это стоит иметь в виду.
Итак, пусть у нас уже есть установленный и работающий апач. Для начала создадим файл aliases, в котором опишем необходимый алиас для доступа (можно было замутить более пальцевеерно выглядящий виртуальный хост - http://restricted.example.com, но в данном случае это некритично, поэтому ограничимся более простым вариантом):
interra:/# nano /etc/apache2/aliases

<IfModule alias_module>
Alias /restricted "/srv/www/restricted/"
<Directory "/srv/www/restricted/">
Options Indexes MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</IfModule>
Далее расскажем об этом файле apache2:
echo "Include /etc/apache2/aliases" >> /etc/apache2/apache2.conf
После рестарта сервиса /etc/init.d/apache2 restart данная директория будет доступна через браузер по http://example.com/restricted.
Однако ее еще физически нет на сервере ;) Создаем, даем права доступа для www-data (пользователя, от имени которого работает www-сервер)
mkdir /srv/www/restricted; chown www-data.www-data /srv/www/restricted
Теперь ограничение доступа. Ограничивать мы будем с помощью локального .htaccess (именно для этого при описании алиаса используется AllowOverride all директива - для преимущества параметров .htaccess над глобальными настройками сервера). Создадим этот файл в корне /restricted со следующим содержанием:
interra:/# nano /srv/www/restricted/.htaccess

AuthName "Restricted Access. Authenficate yourself!"
AuthType Basic
AuthUserFile /srv/www/restricted/.htpasswd
<Limit GET>
order deny,allow
allow from all
require valid-user
</Limit>
То бишь теперь доступ к папке /restricted будет блокироваться всем, кроме списка valid-user'ов из /srv/www/restricted/.htpasswd и то только при их успешной аутентификации. Осталось создать файл .htpasswd.
Делается это одноименной утилитой, лежать файл может где угодно, ну и прав на чтение его стоит дать поменьше.. например 0600. Создаем тестового пользователя test c паролем test:
interra:/srv/www/restricted# htpasswd -c /srv/www/restricted/.htpasswd test
New password:
Re-type new password:
Adding password for user test
И если поглядеть на файл .htpasswd изнутри, то...
interra:/# more /srv/www/restricted/.htpasswd
test:IWF8pgFr9p2o.
Зайдя по вышеозначенному адресу, мы получим приглашение аутентифицировать себя. В случае успешной аутентификации увидим содержимое директории. Иначе,
This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.
что по-русски звучит как "идите в лес" =)
Данный материал навеян этой страничкой, там присутствуют также описания всех используемых в работе директив Apache. То, чего нет там, можно узнать тут.
PS: при написании заметки неоценимую помощь оказала эта страничка, автоматом декодирующая HTML'ные <> в идеологически правильные &lt и &gt".