Apache Httpd服务器之认证与授权

有大概1个月的时间没有继续写关于技术的文章了,在这一个月的时间除了过年休息了2天外,其它时间我都在开发自己的个人网站,这是一个能帮助PHPer及从事运维的兄弟便捷搭建LAMP配置环境的功能性网站,稍后会详细介绍下,从今天开始,我会继续撰写关于Httpd服务器的一些配置文章。此篇文章,我们主要探讨下关于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>

时间: 2024-10-07 02:15:32

Apache Httpd服务器之认证与授权的相关文章

Apache Httpd服务器之基础

Httpd服务器是Apache产品线下的一款web服务器,常与PHP或Python等CGI脚本一起配合使用,为用户提供动态Web服务.httpd,从名字就可以看出,它提供的主要是基于http协议的Web服务.本篇为介绍Httpd服务器的第一篇,主要介绍下Httpd服务器的安装,运行模式,容器配置,以及CGI的配置,目的是使大家能通过阅读此篇文章来从零建立起一个可运行的Web服务器.    Httpd从哪下载?请访问http://httpd.apache.org/download.cgi,这里就有

Apache Httpd服务器之缓存粗解

当我们通过浏览器输入一个网址,然后服务器响应给我们内容时,服务器会有一个非常复杂的处理过程.服务器并不是每次都会根据我们请求的页面在磁盘上读取页面内容,然后将这些内容返回给浏览器供我们浏览.如果这样,那么当浏览器的并发请求特别多时,会对服务器造成很大的负载.那么服务器如何在并发请求特别大时还能保持响应水准呢?为了解决这一问题,http协议引进了缓存标准.而apache httpd服务器实现了http协议的这一标准.当然,请求和响应是双向的,所以缓存也不仅仅是在服务器这一端来实现,目前的主流浏览器

Apache Httpd服务器之虚拟机详解

其实现在网络上关于虚拟机的配置,用百度一搜会有一大把.那么为啥我还要写Apache虚拟机的配置方法呢?原因一是因为我实在看不惯那些雷同的配置方法,你抄我的,我抄你的,而且把一些跟虚拟机配置没有什么相关性的其它指令也写上去了,对读者产生了误导.原因二是因为没有几篇文章能说清楚从配置域名解析到配置虚拟机的一个完整过程的.针对这两个原因,此篇文章我会试图通过测试组合的方法将虚拟机的配置方法尽量说清楚点,而不是仅仅将一堆配置放在上面,希望您能通过我的文章,对Apache的虚拟机配置有一个更清晰的思路.

CentOS7安装apache httpd服务

虚拟机:192.168.2.21     [停止防火墙]   sudo systemctl stop firewalld.service      --停止防火墙   sudo systemctl disable firewalld.service   --开机关闭防火墙    [安装apache httpd服务]   cat /etc/yum.repos.d/CentOS-Media.repo   -----查看镜像配置   yum --disablerepo=\* --enablerepo=

Linux(CentOS)系统下安装好apache(httpd)服务后,其他电脑无法访问的原因

原文:Linux(CentOS)系统下安装好apache(httpd)服务后,其他电脑无法访问的原因 今天试了下在虚拟机上利用CentOS系统的yum命令安装好了httpd(apache2.4.6),然后在windows系统下访问此虚拟机的ip地址,却访问不了. 因为前段时间有知道过iptable的限制,所以在想是不是因为iptable限制了80端口呢! 所以在网上找了下iptable的命令,并且把tcp的80端口设置成允许任何IP都可以访问: iptables -I INPUT -p TCP

Apache httpd服务

一.Web相关概念简述 http:Hyper Text Transfer Protocol 超文本传输协议 持久连接:persistent connection 即TCP连接默认在一定时间内不关闭,可以被多个请求复用,在特点场景下可以有效降低资源消耗 管道机制:pipelining 即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率 复用的连接:交替传送请求和响应报文 头信息压缩机制:header compression 头信息使用gzip或compress压缩后

centos7 安装配置apache httpd服务

官方文档:http://httpd.apache.org/docs/2.4/install.html#comments_section 1.准备 主包: httpd-2.4.17.tar.gz  http://mirrors.cnnic.cn/apache//httpd/httpd-2.4.17.tar.gz 依赖: apr-1.5.2.tar.gz, http://apache.dataguru.cn//apr/apr-1.5.2.tar.gz apr-util-1.5.4.tar.gz, h

Linux Apache httpd服务常用命令

Linux系统Apache httpd常用命令 1.查看Apache版本: # httpd -v [[email protected] ~]# httpd -v Server version: Apache/2.4.6 (CentOS) Server built: Jun 27 2018 13:48:59 2.查看Apache服务运行状态: # service httpd status 3.查看Apache httpd进程: # ps -ef | grep httpd 4.查看Apache服务信

Apache—httpd服务创建个人用户主页功能

创建个人用户主页功能 第1步:开启个人用户主页功能  UserDir disabled前加# UserDir public_html 去掉前面# UserDir参数表示的是需要在用户家目录中创建的网站数据目录名称(public_html) 第2步:创建1个新的普通用户fireuser,并且切换到普通用户的家目录,在家目录下创建网站数据目录public_html,写入首页文件内容并给予网站目录访问权限.(注意一定是更改~家目录的权限为755才可以,不然无权限访问)  第3步:键入http://12