1. 限制用户访问的方式:

  1. 限制访问服务的客户端主机

  2. 需要用户名和密码

2. 行为用户验证需要两步:

  1. 创建一个包含用户名和密码的文件

  2. 服务器上的哪些资源需要保护,哪些用户可以进行访问

3. 创建用户数据库

  许多用户名和密码需要创建在一个文件中。出于安全考虑,这个文件不能放在文档目录里。在这个例子里,这个文件创建在/usr/local/etc/httpd目录里,名字叫users。

  这个文件包含许多用户名和密码。用户名和密码通过冒号分割,每个用户单独占一行。但是你不能直接在这个文件中直接输入用户名和密码,因为存储在这个文件中的密码是加密的。程序htpasswd可以用来创建该文件,添加或者修改用户。

  使用htpasswd创建该文件,添加用户名‘snow’,密码‘snow’的用户到该文件(/usr/local/httpd/user)

 htpasswd -c /usr/local/etc/httpd/users snow

-c参数告诉htpasswd创建一个新的users文件。当你运行该命令时,将提示输入该用户的密码并确认。你可以添加其它的用户到该文件中,不过必须去掉-c参数。这个命名也可以用来修改密码。当你添加一个用户后,/usr/local/etc/httpd/users文件看起来想这样:

 snow:$apr1$VmvJWi7o$diZjyiUiHkd8pSmb//gE0

第一个列是用户名,第二列是加密过后的密码。

4. 配置服务

为了让server使用在该文件中的用户名和密码,你需要配置一个realm,为了使用.htaccess文件限制一个目录的访问,你首先需要修改apache的配置文件(如何找到apache的配置文件),使目录使用.htaccess的形式限制访问,这个被AuthConfig属性控制,如果你想限制/var/www目录的访问,你修改apache的配置文件:

 <Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride AuthConfig
Require all granted
</Directory>

然后在/var/www目录中建立一个.htaccess文件,内容如下:

AuthName "restricted stuff"
AuthType Basic
AuthUserFile /usr/local/etc/httpd/users require valid-user

第一个指令AuthName,为这个资源配置一个realm名字,只要用户输入有效的用户名和密码,相同realm名字的其他资源也可以通过这个用户访问,这样做,主要是为了创建两个区域,使同一个用户可以访问这两个区域。

第二个指令AuthType告诉服务使用哪种协议进行认证,目前来说,仅有Baisc可用。但是出现了Digest,而且已经被标准化啦,只要浏览器实现了它,就可以使用它。digest认证比Basic认证更安全。

第三个指令AuthUserFile告诉服务被htpasswd创建的文件在哪里。

第四个指令require告诉服务该文件中的哪些用户可以访问该文件,valid-user参数是告诉服务该文件中的任何用户都可以访问该资源,你也可以配置特定用户可以访问该资源。例如:

require user snow john

只有snow,john两个用户可以访问该资源,其他用户都会被拒绝。

如果一个用户被允许访问不同的区域,他们仅仅需要输入一次密码,但是如果在不同的区域有不同的realm,用户需要再次输入他的密码。

5. 使用Groups

如果你想要users文件的一些用户访问一个资源,你需要在require行列出所有的用户,如果你有很多用户的话,这种方式是不太好的。有一种方式可以解决这种问题,就是用一个group文件,你可以使用require行限制到特定的group。例如:有一个叫作staff的组,它包含所有访问特定资源的用户。

 require group staff

多个group也可以使用,用户也可以同时使用,

require group staff admin
require user adminuser

它允许组staff和admin访问资源和用户adminuser访问资源。

group文件的形式:

staff: martin jane

admin: art adminuser

staff和admin是组,martin和jane属于staff组,art和adminuser属于admin组。

AuthGroupFile指令是告诉group文件在哪里。记住,在group文件中一行的最大长度是8000字符(大约8K),如果你有超过行的长度的用户数,你可以再写一行伴随着相同组。

当你添加AuthGroupFIle指令时,遇到如下错误时:/var/www/html/.htaccess: Invalid command 'AuthGroupFile', perhaps misspelled or defined by a module not included in the server configuration。请执行:

 sudo a2enmod authz_groupfile

6. 伴随着许多用户的问题

使用htpasswd创建用户和以文本的形式管理组相对来说比较简单,但是如果用户增多,服务器要做许多的处理来找响应的组和密码信息,这种处理必须在每个请求中都要做(受保护的区域,尽管用户仅仅输入一次密码,但是在每次请求中,都必须重新认证),如果伴随着很多用户,那是相当慢的,增加服务器负载。比较块的访问是使用DBM格式文件,它允许服务做比较块的搜索,但是管理DBM文件也是比较复杂的。

7. 存储用户信息的其他方式

apache仅能访问在文本文件中的用户信息,但是有各种各样的模块允许用户信息存储到数据库中。除了有DBM格式(mod_auth_dbm module),用户信息和组信息也可以存储以DB的格式文件(mod_auth_db),或者各种各样的数据库也可以使用。例如mSQL(mod_auth_msql),Postgres95(mod_auth_95),或者兼容DBI的数据库(mod_auth_dbi),也可以有一个额外的程序检测用户和密码是否有效(主要是用接口来检测数据库或者认证服务)。modules也可以用来检测系统密码文件或者使用Kerberos系统。

8. 限制不同的方法

在上面的例子中,require指令并没有包含在<Limit>指令中,这样意味着它应用到所有的请求方法,但是在一些应用中,需要将其放入<Limit>部分,例如:

 <Limit GET POST PUT>
require valid-user
</Limit>

在Apache中,最好忽略<Limit>标签,是为了确保保护应用到所有的方法中。但是,这种格式主要用来限制特定的方法。例如:仅仅限制POST方法。

AuthName "restrict posting"
AuthType Basic
AuthUserFile /usr/local/etc/httpd/users <Limit POST>
require group staff
</Limit>

仅仅组staff的成员可以访问POST方法,其他的用户(未认证的)可以使用其它的方法。例如:GET方法。这样做,主要是为了CGI程序让任何人可以访问。但是仅仅授权的用户可以请求POST方法。

9. 被主机或者用户限制

apache很有可能同时使用用户和主机限制,正常情况下,apache需要两个条件同时满足,那即是,来自允许的主机或者域名的用户必须输入有效的用户名和密码才能进行资源访问。但是Satisfy any指令被使用在.htaccess文件或者<Directory>,<Location>,<Files>部分,当这个指令被使用的时候,来自允许的主机或者域名不需要输入用户名和密码就能进行访问,来自不允许的主机或者域名必须输入有效的用户名和密码。

10. WWW认证如何进行工作?

在HTTP中用户认证的方法相当简单,因为HTTP是无状态的协议。只要一个请求完成,服务器并不会记得关于那个请求的任何信息。浏览器需要在每次请求中重新发送用户名和密码。这就是他的工作原理。

当第一次访问需要认证的资源时,服务器返回401状态(未授权)和包含一个WWW-Authenticate响应头,这个包含认证策略(目前仅有Basic允许)和realm名字。浏览器然后询问用户名和密码。然后再次请求相同的资源。这一次包含Authorization头,它包含策略名字(Basic)和用户名和密码。

服务器检测用户名和密码,如果他们有效,就返回页面,如果密码无效或者用户并不允许,服务器返回401状态,浏览器将会继续询问用户名和密码。

假如用户名和密码有效,用户将会继续请求另一个保护的资源,在这种情况下,服务器继续返回401状态,浏览器伴随着用户名和密码继续请求该资源,但是,这种将会很慢的。所以浏览器在接下来的请求中发送Authorization头,浏览器必须保证发送用户名和密码到相同的服务器上。(如果用户信息发送到不同的服务器,将会不安全的)

浏览器需要记住用户名和密码。所以它可以发送用户名和密码信息在接下来的请求中。但是在测试认证的时候,将会引起问题,因为浏览器第一次已经记住用户名和密码信息,强制浏览器再次询问用户名和密码将会很困难的。

11. 安全和数字认证

认证允许资源被访问,是针对特定的用户。但是存在着一些潜在的安全问题。

  • 确保资源被限制在所有的方法中,例如:如果使用<Limit GET>,将会使其他的请求方法不被保护。
  • 用户名和密码放在文本文件中,虽然密码是加密的,但是并不是绝对安全的。该文件不能被系统中的其他用户访问,更不能放在文档目录。(该目录可以被来自于网络的用户访问)
  • 用户名和密码应该要绝对安全。用户不应该告诉其他人他们的密码。
  • Basic认证策略在网络中传递密码是以非加密的方式传递的。所以他们可以被拦截。数字认证主要用来解决这个问题。

数字认证的方式将会使在网络中密码的方式更安全,在发送之前,密码会被加密,然后服务器会解密它。数字认证工作的方式和Basic认证的方式一样,数字认证的使用主要依赖于浏览器提供商是否写入他们的产品。Apache已经做了数字认证,被mod_digest模块所编译。

apache的用户认证的更多相关文章

  1. Linux服务器---配置apache支持用户认证

    Apache支持用户认证 为了服务器的安全,通常用户在请求访问某个文件夹的时候,Apache可以要求用户输入有效的用户名和登录密码 1.创建一个测试目录 [root@localhost cgi-bin ...

  2. SVN+Apache域用户认证配置方法_Windows(转,重新排版,部分内容更新优化)

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  3. Apache配置--用户认证(针对目录访问)-update2015-05-02

    通过Apache配置可以限制用户对目录的访问,会弹出像phpadmin一样的登陆框. ========================================================= ...

  4. apache用户认证,ssl双向认证配置

    安装环境: OS:contos 6.4 httpd:httpd-2.2.15-59.el6.centos.i686.rpm openssl:openssl-1.0.1e-57.el6.i686.rpm ...

  5. apache用户认证访问机制(转)

    Apache服务器已经内置用户验证机制,大家只要适当的加以设置,便可以控制网站的某些部分要用户验证.前期准备,必须已经安装apache,如果还没安装,或者对安装很模糊的话,第1步:我们在/var/ww ...

  6. apache用户认证、域名跳转、Apache访问日志(两种格式)

    1.apache 设置,用户访问时 目录或文件的认证: 对目录的认证: <Directory /var/www/222> //指定认证的目录AllowOverride AuthConfig ...

  7. Apahce的虚拟用户认证及server-status页

    一.Apache虚拟用户认证配置 编辑配置文件加入如下内容: <Directory "/www/htdoc/fin"> Options None AllowOverri ...

  8. apache用户认证、默认主机、301跳转

    我更正论坛一个同学帖子(今天坑我一下午):原文http://www.apelearn.com/bbs/foru ... 3%BB%A7%C8%CF%D6%A4 apache用户认证.默认主机.301跳 ...

  9. centos LAMP第二部分apache配置 下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转 配置apache的访问日志 配置静态文件缓存 配置防盗链 访问控制 apache rewrite 配置开机启动apache tcpdump 第二十节课

    centos    LAMP第二部分apache配置  下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转  配置apache的访问日志  配置静态文件缓存  配置防盗链 ...

随机推荐

  1. 【转】每一个程序员需要了解的10个Linux命令

    作为一个程序员,在软件开发职业生涯中或多或少会用到Linux系统,并且可能会使用Linux命令来检索需要的信息.本文将为各位开发者分享10个有用的Linux命令,希望对你会有所帮助. 以下就是今天我们 ...

  2. Memcached源码分析之内存管理

    先再说明一下,我本次分析的memcached版本是1.4.20,有些旧的版本关于内存管理的机制和数据结构与1.4.20有一定的差异(本文中会提到). 一)模型分析在开始解剖memcached关于内存管 ...

  3. pandas 按照列A分组,将同一组的列B求和,生成新的Dataframe

    对于pandas中的Dataframe,如果需要按照列A进行分组,将同一组的列B求和,可以通过下述操作完成: df = df.groupby(by=['column_A'])['column_B']. ...

  4. 中英文混合字符串截取java

    //截取字符串长度(中文2个字节,半个中文显示一个) public String subTextString(String str,int len){ if(str.length()<len/2 ...

  5. C# Winform窗口之间传值的多种方法浅析(转)

    摘要http://www.jb51.net/article/63837.htm 这篇文章主要介绍了C# Winform窗口之间传值的多种方法浅析,本文起讲解了通过构造器传值.通过属性传递.通过事件携带 ...

  6. Dev的关于XtraGrid的使用2

    接着说,GirdControl如何定位和查找指定列显示值的行(注意是列的实显示值,而不是关联数据源列值) 下面请看代码: using DevExpress.XtraGrid.Views.Base; u ...

  7. 破解&屏蔽防止嵌入框架代码 top.location != self.location

    <script type="text/javascript"> if (top.location != self.location) top.location = se ...

  8. AngularJS指令进阶 – ngModelController详解

    AngularJS指令进阶 – ngModelController详解 在自定义Angular指令时,其中有一个叫做require的字段,这个字段的作用是用于指令之间的相互交流.举个简单的例子,假如我 ...

  9. C++ 常量类型 const 详解

    1.什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(当然,我们可以偷梁换柱进行更新:) 2.为什么引入const? const 推出的初始目的 ...

  10. 如何让sql自动定时执行某个存储过程

    /*--创建作业--邹建 2003.10--*//*--调用示例--每月执行的作业exec p_createjob @jobname='mm',@sql='select * from syscolum ...