共计 5945 个字符,预计需要花费 15 分钟才能阅读完成。
此篇文章,我们主要探讨下关于 Httpd 服务器的认证及授权。
所谓认证,在我的理解就是用户通过一个凭证进入服务器的过程,而授权是用户是否有权限获取服务器中的某个资源。认证负责的是整体,授权负责的是局部。
Httpd 提供浏览器认证功能,也就是用户在浏览器输入想进入的网址后,浏览器弹出一个要求用户输入用户名及密码的认证框,当用户输入正确的用户名及密码后,即能进入到网站内获取资源。此功能可以脱离应用逻辑达到认证的功能,无需应用层编写专门的认证程序。如果你懒得编写专门的认证代码,又想实现认证功能的话,可以利用此项功能来偷个懒 =。=
Httpd 提供的授权功能,可以在认证的基础上继续对服务器资源加以保护,它能根据 IP、子网、指定用户或环境变量来判断用户是否对某一目录具有读取权限。当然,授权与认证没有必然的联系,即使不用认证,也可以单独设置授权。下面,我们就一起来看看 Httpd 的认证与授权是如何进行配置的。
首先谈谈认证,Httpd 的认证有明文认证与摘要认证两种,明文认证是以明文的方式将用户名与密码发送至服务器,服务器接收到用户名及密码后在认证文件或数据库中进行比对,以此判断是否成功。由于使用明文发送,所以在非 SSL 链接的情况下具有一定的风险。摘要认证,是将用户输入的密码进行散列算法后发送给服务器,一定程度上提高了用户密码的安全性,但是摘要认证不是每个浏览器都支持,所以在使用摘要算法时需在多个浏览器下测试。
具体的认证过程,Httpd 提供了文本、数据库两种方式。也就是我们可以把合法的用户名密码存在文本文件或数据库中。下面我们分别介绍这几种认证的配置方法。
方案 1:明文认证 + 文本认证
首选,我们需要创建我们的“密码本”,由 htpasswd 脚本创建。它位于你 Httpd 的安装目录下 /bin 目录下,与 httpd 命令在一起。通过./htpasswd -c “ 密码本路径 ” “ 用户名 ” 方法创建。如我想将密码本创建为 /usr/local/httpd/users/auth_basic,设置用户名为 wangwei,那么该命令格式如下:./htpasswd -c /usr/local/httpd/users/u_basic wangwei。此时会弹出命令提示符要求你输入密码,设置你想要的密码后即可。
假如我们想在服务器文档根目录下设置认证,那么将进行如下配置:
LoadModule unixd_module modules/mod_unixd.so
LoadModule alias_module modules/mod_alias.so
LoadModule mime_module modules/mod_mime.so
LoadModule cgid_module modules/mod_cgid.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule dbd_module modules/mod_dbd.so
LoadModule authn_dbd_module modules/mod_authn_dbd.so
#mod_unixd.so mod_mime.so 为 Httpd 的核心模块,必须加载。以 mod_authz,mod_authn 为前缀的即是认证模块。
# 使用文本认证,我们只需进行一般编译工作即可,但如果使用数据库认证,
# 则需要重新编译 apr-util,是它生成一个名为 apr_dbd_mysql.so 的动态链接库。
Listen 80
ServerName localhost
DocumentRoot “/usr/local/httpd/htdocs”
<Directory “/usr/local/httpd/htdocs”> #要在文档根目录下设置认证,那么就在根目录容器下进行认证设置
AuthName auth #认证名,可以随便起一个英文字符,在浏览器弹出的认证框上将会显示此名字
AuthType Basic #设置认证类型为基本认证
AuthBasicProvider file #设置为文本认证
AuthUserFile /usr/local/httpd/users/u_basic #密码本的位置
Require valid-user #指定只有正确的用户才能进入此目录
</Directory>
我的服务器地址为 192.168.1.11,进行配置后,在浏览器输入 http://192.168.1.11/index.html 后即弹出认证框:
是不是很简单?输入刚才设置的用户名密码后即进入了页面。
方案 2:明文认证 +SDBM 认证
SDBM 是 Linux 提供的一种文件型数据库,如果你不想安装 MySQL,又有较多的用户需要部署。那么使用 SDBM 是一个好的选择。SDBM 的密码本不能用 htpasswd 脚本生成,Httpd 也提供了它的密码本生成器,名为 htdbm。在 htpasswd 同级目录下即可找到。使用./htdbm-c “ 密码本路径 ” “ 用户名 ” 方法创建。如我想将密码本创建为 /usr/local/httpd/users/auth_sdbm,设置用户名为 wangwei,那么该命令格式如下:./htdbm-c /usr/local/httpd/users/auth_sdbm wangwei。此时会弹出命令提示符要求你输入密码,设置你想要的密码后即可。
如果想达到方案 1 的目的,并使用 SDBM 认证,则只需改动 Directory 容器下的配置即可:
<Directory “/usr/local/httpd/htdocs”>
AuthName auth
AuthType Basic
AuthBasicProvider dbm #使用 dbm 认证
AuthDBMUserFile /usr/local/httpd/users/auth_sdbm #密码本位置
Require valid-user
</Directory>
再次提醒下,如果你要使用数据库认证,必须通过 apr 编译出 apr_dbd_mysql.so 动态链接库,并把它放在 linux 能自动搜索到的 lib 目录下。
方案 3:明文认证 +MySQL 认证
要使用 MySQL 认证,必须先安装 MySQL 服务器。那么 MySQL 的“密码本”该如何设置呢?那就是建立数据库和表咯。下面提供一下基本步骤。首先创建一个数据库,名为 auth,在 auth 库内建立一个表,名为 users,users 内有 3 个字段,一个 id 为自增长数字,一个 user 列,用于存放用户名。一个 password 列,用来存放密码。然后将你想要设置的用户名密码存放在表内。密码必须是经过 CRYPT 函数加密过的,可以通过 htpasswd 脚本获取,如通过 /usr/local/httpd/bin/htpasswd -c /usr/local/httpd/users/auth_mysql wangwei 创建一个用户名为 wangwei 的密码本,输入密码 123456 后,生成了名为 auth_mysql 的文件,查看 auth_mysql 后发现里面有一条记录为 wangwei:$apr1$FXx0wpMP$zr4ot39Ef0qK1TdoVMNjR0,那么 wangwei: 后面的即为加密后的密码,把该字符串存入 password 列即可。
Httpd 配置文件内的配置如下:
# 方案 1 中的 LoadModule 指令先加载进来
DBDriver mysql #DB 驱动为 mysql
DBDParams “host=192.168.1.11 port=3306 dbname=auth user=root pass=123456” #连接字符串,懂 mysql 的应该都认识
DBDMin 1
DBDKeep 2
DBDMax 10
DBDExptime 60
Listen 80
ServerName localhost
DocumentRoot “/usr/local/httpd/htdocs”
<Directory “/usr/local/httpd/htdocs”>
AuthName auth
AuthType Basic
AuthBasicProvider dbd 设置使用 dbd 认证
AuthDBDUserPWQuery “SELECT `password` FROM users WHERE `user`=%s” #设置查询 SQL
Require valid-user
</Directory>
方案 4:摘要认证 + 文本认证
摘要认证的配置与基本认证几乎一样,只有两点不同,一是摘要认证需用 htdigest 创建密码本,二是摘要认证需配置一个认证域。htdigest 脚本与 htpasswd 脚本在同一目录层次。创建方法如下:./htdigest -c “ 密码本路径 ” “ 域名称 ” “ 用户名 ”。如./htdigest -c /usr/local/httpd/users/auth_digest auth wangwei。域名称必须与配置内的 AuthName 指令设置的一致。而认证域是一个 URI,按照方案 1 的目的,我们将它设置为 /。
配置方法如下:
<Directory “/usr/local/httpd/htdocs”>
AuthName auth
AuthType Digest #设置为摘要认证
AuthDigestProvider file
AuthDigestDomain / #摘要认证域为 /
AuthUserFile /usr/local/httpd/users/auth_digest
Require valid-user
</Directory>
Httpd 的授权
除了使用用户名及密码的方式进行浏览器认证外,我们还可以通过 IP、子网的方式进一步对用户进行访问限制。这就需要用到 Httpd 的授权。为了说明用户,我们设计以下几种情景。
情景 1,对用户进行 IP 限制,让处于 192.168.1.0 网段的用户访问,但不让 192.168.1.254 的用户访问。配置方案如下:
LoadModule unixd_module modules/mod_unixd.so
LoadModule alias_module modules/mod_alias.so
LoadModule mime_module modules/mod_mime.so
LoadModule cgid_module modules/mod_cgid.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule access_compat_module modules/mod_access_compat.so #使用授权时必须加载的库
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule dbd_module modules/mod_dbd.so
LoadModule authn_dbd_module modules/mod_authn_dbd.so
Listen 80
ServerName localhost
DocumentRoot “/usr/local/httpd/htdocs”
<Directory “/usr/local/httpd/htdocs”>
Allow from 192.168.1.0
Deny from 192.168.1.254
Order Allow,Deny #验证顺序,先允许,后拒绝。
</Directory>
情景 2,在认证的基础上进行授权,既需要浏览器验证,又进行 IP 限制。配置方案如下:
<Directory “/usr/local/httpd/htdocs”>
Allow from 192.168.1.0
Deny from 192.168.1.254
Order Allow,Deny
AuthName auth
AuthType Digest
AuthDigestProvider file
AuthDigestDomain /
AuthUserFile /usr/local/httpd/users/auth_digest
Require valid-user
Satisfy All #认证与授权需同时满足条件才能通过
</Directory>
CentOS 6.5 编译安装 httpd-2.4.7 http://www.linuxidc.com/Linux/2014-02/97265.htm
httpd 中工作模型的比较 http://www.linuxidc.com/Linux/2014-03/99093.htm
源码编译安装 httpd2.4 及虚拟主机 http://www.linuxidc.com/Linux/2014-08/105384.htm
编译安装最新版 httpd-2.4 http://www.linuxidc.com/Linux/2014-03/98761.htm
httpd2.4 基本功能的实现 … http://www.linuxidc.com/Linux/2014-03/98762.htm