Аутентификация на вебсервере
Posted: 26 Feb 2013 08:11
Заметил, что при включенной аутентификации на сервисе Webserver, данные о пользователях берутся из файла .websrv_htpasswd лежащего в корневой директории веб-сервера. При этом в данный файл попадают все пользователи, зарегистрированные в NAS4Free и все они могут логиниться в директорию, требующую авторизации. За формирование данного файла отвечает скрипт сервиса /etc/rc.d/websrv_htpasswd. Я немного доработал данный скрипт, теперь он выгружает для авторизации только пользователей, которые включены в группу www. Может кому и пригодится.
Code: Select all
#!/bin/sh
#
# Part of NAS4Free (http://www.nas4free.org).
# Copyright (c) 2012-2013 The NAS4Free Project <info@nas4free.org>.
# All rights reserved.
#
# Portions of freenas (http://www.freenas.org).
# Copyright (c) 2005-2011 Olivier Cochard-Labbe <olivier@freenas.org>.
# All rights reserved.
#
# PROVIDE: websrv_htpasswd
# REQUIRE: userdb DAEMON
# XQUERY: -i "count(//websrv/enable) > 0 and count(//websrv/authentication) > 0" -o "0" -b
# RCVAR: websrv_htpasswd
. /etc/rc.subr
. /etc/configxml.subr
if configxml_isset //websrv/authentication; then
# Defaults
documentroot=`configxml_get "//websrv/documentroot"`
htpasswdfile=".websrv_htpasswd"
htpasswd="${documentroot}/${htpasswdfile}"
echo "Generating ${htpasswdfile}."
# Generate the htpasswd file used by websrv.
/bin/cat /dev/null > "${htpasswd}"
# Add configured users.
/usr/local/bin/xml sel -t -m "//access/user" \
-v "concat(login,' ',password)" \
-i "position() <= last()" -n -b \
${configxml_file} | /usr/local/bin/xml unesc | \
while read _login _password; do
# select only www group
if /usr/bin/id "${_login}" | /usr/bin/grep -q "\(www\)"
then
if [ "${_password}" != "" ]; then
_password_md5=`/usr/sbin/mkpw -e md5 "${_password}"`
else
_password_md5="*"
fi
echo "${_login}:${_password_md5}" >> "${htpasswd}"
fi
done
/bin/chmod 0600 "${htpasswd}"
/usr/sbin/chown www:www "${htpasswd}"
fi