• <dd id="IzGhJ"><bdo id="IzGhJ"><ol id="IzGhJ"><abbr id="IzGhJ"><caption id="IzGhJ"><map id="IzGhJ"><p id="IzGhJ"></p></map><select id="IzGhJ"></select></caption></abbr></ol></bdo></dd>
      1. <var id="IzGhJ"></var>
        <-
        Apache > HTTP Server > 文档 > 版本2.2 > 如何.../指南
           致谢 | 本篇译者:金步国(其他作品) | 本页最后更新:2020年02月21日[查看最新版本]

        认证、授权、访问控制

        认证(Authentication)是指任何识别用户身份的过程。授权(Authorization)是允许特定用户访问特定区域或信息的过程。

        top

        相关模块和指令

        认证和授权涉及到三组模块。通常,你需要从每一组中选择至少一个模块。

        mod_authnz_ldap模块既包含认证功能也包含授权功能。mod_authn_alias模块自身并不实现认证功能,但是允许其它认证支持模块以更灵活的方式进行配置。

        mod_authz_host模块提供基于主机名、IP地址、请求特征的访问控制,但并不属于认证支持系统。

        top

        简介

        如果网站上有些敏感信息或只希望为一个小群体所访问,本文阐述的方法能确保用户只能访问被允许的资源。

        本文涵盖了;ふ镜阕试吹"标准"方法,大多数管理员将要用到这些方法。

        top

        先决条件

        本文中讨论的指令应该被放进主配置文件(通常在<Directory>段中)或者针对单个目录的配置文件(.htaccess文件)中。

        如果你打算使用.htaccess文件,则必须设置服务器以允许在这些文件中使用认证指令,即用AllowOverride指令指定哪些指令在针对单个目录的配置文件中有效。

        既然本文讨论认证,就应该对AllowOverride这样设置:

        AllowOverride AuthConfig

        如果你希望把这些指令直接写入主配置文件,当然就需要具有对主配置文件的写权限。

        而且,你需要对服务器的目录结构有所了解,以确定某些文件的位置。这个并不难,需要时我们会做适当的说明。

        top

        启用认证

        先介绍用密码来;し衿魃系哪柯。

        首先需要建立一个密码文件。这个文件应该放在不能被网络访问的位置,以避免被下载。例如,如果/usr/local/apache/htdocs以外的空间不能被网络访问,那么可以考虑把密码文件放在/usr/local/apache/passwd目录中。

        Apache在其安装目录的bin子目录中提供了htpasswd工具,用于建立密码文件,可以这样使用:

        htpasswd -c /usr/local/apache/passwd/passwords rbowen

        htpasswd会要你输入密码,并要求重新输入以进行确认:

        # htpasswd -c /usr/local/apache/passwd/passwords rbowen
        New password: mypassword
        Re-type new password: mypassword
        Adding password for user rbowen

        如果htpasswd不在搜索路径中,则必须使用完整路径,如:/usr/local/apache/bin/htpasswd

        然后修改httpd.conf.htaccess文件,指示服务器允许哪些用户访问并向用户索取密码。若要;/usr/local/apache/htdocs/secret目录,则可以将下列指令写入/usr/local/apache/htdocs/secret/.htaccess或者httpd.conf的<Directory /usr/local/apache/apache/htdocs/secret>段。

        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /usr/local/apache/passwd/passwords
        Require user rbowen

        让我们逐个解释这些指令。AuthType指令选择对用户实施认证的方法,最常用的是由mod_auth_basic提供的Basic 。必须认识到的很重要的一点是,Basic认证方法并不加密来自用户浏览器的密码,因此,不应该用于高度敏感的数据。Apache中还有另一种更安全的认证方法"AuthType Digest",即由mod_auth_digest供的摘要认证。目前,只有最新的浏览器版本才支持摘要认证。

        AuthName指令设置了使用认证的域(Realm),它起两个作用,首先,此域会出现在显示给用户的密码提问对话框中,其次,也帮助客户端程序确定应该发送哪个密码。

        所以,如果一个用户已经在"Restricted Files"域通过了认证,则客户端就可以尝试使用同样的密码来访问同一个服务器上任何名为"Restricted Files"域的其他部分,从而使多个受限区域使用同一个密码,以避免用户重复输入。当然,出于安全考虑,如果服务器变了,客户端始终会要求重新输入密码。

        AuthUserFile指令设置了密码文件的位置,也就是刚才我们用htpasswd建立的文件。如果用户很多则认证速度会很慢,因为对每个请求都必须搜索这个纯文本文件,对此,Apache还支持把用户信息存入快速的数据库文件,mod_authn_dbm模块提供了AuthDBMUserFile指令,并可以用dbmmanage程序建立和操作这些数据库。Apache模块数据库中还提供了许多其他第三方模块提供的认证选项。

        最后,Require指令设置了允许访问受;で虻挠没,下一节将对Require指令作详细说明。

        top

        允许多人访问

        上述指令只允许一个人(一个叫rbowen的用户)访问这个目录,但是多数情况下,都需要允许多人访问,所以就要用到AuthGroupFile指令。

        如果想允许多人访问,那么就必须建立一个组文件以确定组中的用户。其格式很简单,可以用你喜欢的编辑器建立,例如:

        GroupName: rbowen dpitts sungo rshersey

        它只是每组一行的一个用空格分隔的组成员列表。

        向已有的密码文件中增加一个用户,可以输入:

        htpasswd /usr/local/apache/passwd/passwords dpitts

        程序的提示和上面的一样,但是它会追加到已有的文件中,而不是建一个新文件(参数 -c 可以强制建立新的密码文件)。

        现在,需要将.htaccess文件修改成这样:

        AuthType Basic
        AuthName "By Invitation Only"
        AuthUserFile /usr/local/apache/passwd/passwords
        AuthGroupFile /usr/local/apache/passwd/groups
        Require group GroupName

        现在,GroupName组中的成员都在password文件中有一个相应的记录,从而允许他们输入正确的密码进行访问。

        除了建立组文件,还有另一种途径允许多人访问,就是使用如下指令:

        Require valid-user

        使用上述指令,而不是 Require user rbowen ,可以允许密码文件中的所有用户使用正确的密码进行访问。通过为每个组建立一个密码文件,这里甚至允许列举各个组,其优点是Apache只需要检查一个文件(而不是两个),其缺点是,必须维护众多密码文件,而且要确保AuthUserFile指定了一个正确的密码文件。

        top

        可能存在的问题

        由于采用了Basic认证的方法,每次向服务器请求甚至刷新一个受;さ囊趁婊蛲计倍急匦胄Q橛没兔苈,为此,必须打开密码文件并逐行搜索用户名,因此,服务器响应速度会受一些影响,受影响的程度与密码文件的大小成正比。

        所以,对密码文件中的用户总数存在一个实际上的上限,此上限取决于特定的服务器机器的性能,但是一般有几百个用户就会对响应速度有非常明显的影响,在这种情况下,可以考虑用其他认证方法。

        top

        其他认证方法

        基于用户名和密码的认证只是方法之一,时;嵊胁恍枰览捶谜呤撬,只需要知道来自哪里的情况。

        AllowDeny指令可以允许或拒绝来自特定主机名或主机地址的访问,同时,Order指令告诉Apache处理这两个指令的顺序,以改变过滤器。

        这些指令的用法:

        Allow from address

        address可以是一个IP地址(或者IP地址的一部分),也可以是一个完整的域名(或者域名的一部分),还可以同时指定多个IP地址和域名。

        比如,要拒绝不受欢迎的兜售垃圾的站点:

        Deny from 205.252.46.165

        这样,这个指令所管辖的区域将拒绝所有来自该地址的访问。除了指定IP地址,也可以指定域名,如:

        Deny from host.example.com

        另外,还可以指定地址或域名的一部分来阻止一个群体:

        Deny from 192.101.205
        Deny from cyberthugs.com moreidiots.com
        Deny from ke

        Order可以组合DenyAllow指令,以保证在允许一个群体访问的同时,对其中的一些又加以限制:

        Order deny,allow
        Deny from all
        Allow from dev.example.com

        只列出Allow指令不会得到你想要的结果,因为它在允许指定对象访问的同时并不禁止其他未列出的对象的访问。所以上例使用的方法是:首先拒绝任何人,然后允许来自特定主机的访问。

        top

        更多信息

        mod_auth_basicmod_authz_host文档中有更多的有关资料。mod_authn_alias同样有助于简化认证配置。