Каталоги и права доступа


Защита с помощью пароля и Apache

Ограничить доступ к страницам веб-сайта на основании имен пользователей и паролей — вполне обычное желание. Сервер Apache может выполнять аутентификацию пользователей с применением любых схем, начиная от интеграции с LDAP и Kerberos и заканчивая базами данных в виде простых текстовых файлов. Мы рассмотрим два стандартных способа аутентификации: файлы паролей Apache и аутентификация средствами Radius.

Файлы паролей

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

Для начала создайте пустой файл паролей с помощью утилиты touch(1), а затем используйте программу htpasswd(1), чтобы добавлять имена пользователей и изменять их пароли. Синтаксис этой команды очень прост:

# htpasswd файл_паролей имя_пользователя

Например, добавить пользователя с именем mwlucas в файл паролей webpasswords можно с помощью команды htpasswd webpasswords mwlucas. Изменить пароль пользователя можно той же самой командой. Все записи в этом файле хранятся в виде отдельных строк, по одной на каждого пользователя, где указаны имя пользователя и хеш пароля:

mwlucas: iJf2e7KIgS5i6

Чтобы удалить пользователя из базы данных, достаточно удалить соответствующую строку из файла паролей. Можно также использовать команду htpasswd(1) с ключом -D, но, думаю, гораздо проще удалить строку с помощью редактора vi(1), чем запоминать все это.

Теперь нужно сообщить веб-серверу Apache о необходимости применить защиту паролями к каталогу. В принципе, можно настроить защиту паролем прямо в файле httpd.conf, но наиболее часто настройка аутентификации производится с помощью файла .htaccess. Такой способ настройки аутентификации не требует полной перезагрузки всего вебсервера. Обычно конечным пользователям изредка требуется изменить свои настройки аутентификации, а файл паролей обеспечивает простой способ это сделать. Определите параметр AllowOverride AuthConfig для каталога, защищенного паролем (или для всего сайта), затем создайте в защищенном каталоге файл .htaccess, содержимое которого должно выглядеть примерно так:

AuthName "Employees Only"
AuthType basic
AuthUserFile /home/mwlucas/sitepasswords
require valid-user

AuthName — это текст, который появится в диалоге ввода пароля. Вы можете поместить сюда любой текст в кавычках, и веб-броузер отобразит его.

AuthType определяет тип аутентификации клиента. В случае обычного имени пользователя и пароля используйте тип basic.

AuthUserFile сообщает серверу Apache местоположение базы данных с информацией о пользователях и тип этой базы данных. В данном случае указан файл паролей, созданный с помощью htpasswd(1).

Инструкция require valid-user сообщает серверу Apache, что он должен потребовать ввод имени пользователя и пароля и разрешить доступ только тем пользователям, которые ввели верную аутентификационную информацию.

Аутентификация пользователей средствами сервера Radius

Сервер Radius обеспечивает очень неплохой способ аутентификации, по сравнению со службами каталогов сторонних производителей, такими как Active Directory и LDAP. Есть много разнообразных серверов Radius, от свободно распространяемого сервера OpenRADIUS и до сервера Internet Authentication Service, связанного с серверами Windows. Вся прелесть применения Radius в том, что вам не придется мучаться с LDAP или Kerberos, так как группы управления каталогами предприятия могут отказать в разрешении на использование нестандартных систем обеспечения доступа к каталогам. В большинстве случаев вы можете просто собрать сервер Radius и позволить выполнять аутентификацию ему, а не службе каталогов предприятия или чему-то еще. В Интернете можно найти несколько различных серверов Radius для Apache, я предпочитаю mod_auth_xradius (/usr/ports/www/mod_auth_xradius). Он прекрасно работает с современными версиями Apache и довольно прост в настройке.

В первую очередь нужно сконфигурировать сервер Radius. Если вы работаете на предприятии или в компании-провайдере, возможно, у вас уже имеется сервер Radius. Есть много различных версий сервера Radius от разных производителей, у каждой из них есть свои достоинства и недостатки. Несколько серверов входят в состав коллекции «портов» операционной системы FreeBSD. Самое замечательное, что Apache не нуждается в каких-то необычных возможностях Radius; подойдет любой имеющийся сервер. Если у вас используется Microsoft Active Directory, приобретите Internet Authentication Services. Это очень небольшой сервер, и, вполне возможно, вам удастся убедить администратора AD установить его для вас. Ваши коллеги будут счастливы, что ваше веб-приложение обеспечивает способ аутентификации, интегрированный с их учетными записями на настольных компьютерах, ведь так делается далеко не везде.

Теперь нужно настроить загрузку модуля в Apache. Перейдите в конец списка инструкций LoadModule и добавьте следующую строку:

LoadModule auth_xradius_module libexec/apache22/mod_auth_xradius.so

Затем нужно настроить кэш сервера Radius. Сервер Apache хранит в кэше список пользователей, благополучно прошедших аутентификацию. Без этого кэша Apache будет обращаться к серверу Radius перед отправкой каждого объекта на каждой веб-странице. Единственный щелчок мыши может породить десятки запросов, что, как правило, нежелательно.

AuthXRadiusCacheTimeout 300
AuthXRadiusCache dbm "/tmp/auth_xradius_cache"

Параметр AuthXRadiusCacheTimeout определяет время хранения кэшированных объектов (в секундах). Параметр AuthXRadiusCache определяет, где будет храниться кэш. В данном случае я использую файл типа dbm (база данных хешей) в каталоге /tmp. Если пользователи, которым вы не доверяете, могут входить в вашу систему, получая при этом доступ к командной строке, перенесите кэш в каталог, недоступный пользователям, однако в случае выделенного сервера выбор каталога /tmp достаточно безопасен.

Теперь нужно настроить режим аутентификации Radius для требуемого каталога. Вы можете сделать это с помощью файла .htaccess, как в случае с именами пользователей и паролями, но на этот раз я рекомендую поместить настройки непосредственно в файл httpd.conf‘. Сайты, использующие аутентификацию Radius, обычно поддерживаются системным администратором, а не пользователями. Поместите настройки непосредственно в инструкцию Directory. Например, я использую программу мониторинга Nagios. Вот конфигурация защиты каталога nagios паролем с помощью Radius:

<Directory /usr/local/www/nagios>
AllowOverride None
...
AuthName "Nagios"
AuthBasicProvider "xradius"
AuthType basic
AuthXRadiusAddServer "radius.absolutefreebsd.com" "RadiusSecret"
AuthXRadiusTimeout 2
AuthXRadiusRetries 2
require valid-user
</Directory>

На первый взгляд, довольно непривычно, но если ознакомиться с настройками не спеша, все станет понятно. Инструкция AllowOverride запрещает переопределять параметры настройки с помощью файлов .htaccess. Это нормально, так как настройки каталога выполняются непосредственно в конфигурационном файле веб-сервера.

Параметр AuthName определяет текст, который появится в диалоге ввода пароля.

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

Ключевое слово basic в параметре типа аутентификации AuthType указывает, что используется базовая аутентификация HTTP.

Параметр AuthXRadiusAddServer указывает, где можно найти сервер Radius, и содержит ключ доступа к нему. Имя сервера и ключ должны быть указаны в кавычках.

Сервер Radius откликается быстрее чем за секунду. Параметр AuthXRadiusTimeout позволяет задать серверу Apache временную задержку перед повторной попыткой, а количество попыток определяется параметром AuthXRadiusRetries.

Наконец, необходимо указать, что для получения доступа к каталогу пользователь обязан предоставить верное имя пользователя и пароль.

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

Группы и файл .htaccess

Одна из удобных особенностей аутентификации на основе имен пользователей и паролей — возможность предоставлять доступ группам пользователей. На крупных веб-сайтах аутентифицированным пользователям предоставляется доступ к большей части информационного наполнения, но лишь немногим из них положен доступ к административной части. Реализовать такую возможность можно с помощью групп пользователей. Файл групп сервера Apache очень напоминает файл /etc/group, где вслед за двоеточием, стоящим после имени группы, перечислены имена пользователей, разделенные запятыми:

administrators: mwlucas, gedonner

Затем необходимо сообщить Apache о существовании файла групп и добавить инструкцию require-group в файл .htaccess или непосредственно в файл httpd.conf:

authgroupfile /usr/local/etc/apache22/users/webgroup
require-group administrators

Теперь ваши администраторы будут использовать единый пароль как для смешанной, так и для административной части сайта, причем доступ к административной части смогут получить только администраторы. Этот способ позволяет как угодно разделить веб-сайт, создав много групп.

Комментарии запрещены.