Apache Security-2-Basic Authentication(基本认证)简介及实战练习

来源:互联网 发布:歌词有傻瓜的网络歌曲 编辑:程序博客网 时间:2024/04/16 16:20

  • 说明
  • 准备工作
  • 需要哪些模块
  • 基本认证Basic Authentication
    • 1 basic authentication是如何工作的
    • 2 实战
  • 答疑
    • 1 如何退出登陆
    • 2 如何更改密码提示框的样式
  • 小结

1. 说明

本文系我的"Web Server & Web Technology (WSWT)系列博客之一,主要讲解Linux系统的Apache配置和使用,以及如何使用apache搭建自己的个人网站".该系列博客的总目录参见这里http://blog.csdn.net/u014303046/article/details/73694983。

2. 准备工作

为了方便大家观察效果,我写了几个简单的网页,大家可以在这里下载,不知道为什么不能设成0积分下载,所以也可以到这里免费下载,下载后把文件解压放在某个目录下,比如我放在了/home/zsc/workspace/web/apache_1,然后在下面的Docker命令里使用-v参数把这个目录作为docker容器可访问的数据卷。如果你没有使用Docker,你只需要把下文中对应的DocumentRoot目录修改成你自己的目录就好了。

如果你使用Docker,那么首先需要从你之前保存的镜像(从源码安装好apache的镜像)运行一个容器:

 sudo docker run -ti -p 80:80 -v /home/zsc/workspace/web/apache_1/:/web/doc_root --name web apache:v1.0 bash

注意:-v参数用来把Docker宿主主机上的/home/zsc/workspace/web/apache_1目录映射到容器内的/web/doc_root目录,这样就可以在容器内访问该目录及其子目录了。所以我们在下文使用Docker的时候都是用/web/doc_root作为DocumetnRoot目录。
本教程假设你已经学习了前面的教程,并在Docker里或者自己的笔记本电脑或者自己购买的服务器上从源码编译好了apache和PHP。
如果你想使用Docker进行练习但是又没有做好docker的相关镜像,你可以从docker hub 搜索我做好的镜像:leeochang/angryberry,然后直接pull下来,就可以使用了。链接.

修改documentroot:
这里写图片描述

3. 需要哪些模块

  • Authentication type (see the AuthType directive)

    • mod_auth_basic
    • mod_auth_digest
  • Authentication provider (see the AuthBasicProvider and
    AuthDigestProvider directives)
    • mod_authn_anon
    • mod_authn_dbd
    • mod_authn_dbm
    • mod_authn_file
    • mod_authnz_ldap
    • mod_authn_socache
  • Authorization (see the Require directive)
    • mod_authnz_ldap
    • mod_authz_dbd
    • mod_authz_dbm
    • mod_authz_groupfile
    • mod_authz_host
    • mod_authz_owner
    • mod_authz_user

4. 基本认证(Basic Authentication)

这是一种简单的认证方式,在很长的一段时期这种认证方式被广泛使用。当然现在这种方式已经很少使用了。

4.1 basic authentication是如何工作的

如果一个文件使用basic authentication保护,那么当有想要访问这个文件的请求到来的时候,apache服务器会返回一个“401 Authentication Required Header”,当客户端比如浏览器收到返回的401 header之后,就会要求用户输入用户名和密码.
由于HTTP协议是无状态的(stateless),因此每个请求都会要求输入用户名和密码。幸运的是,你仅仅需要填写一次用户名和密码,之后浏览器会自动填充。这在你关闭浏览器之前都是有效的,重启浏览器你需要重新填写用户名和密码。(但是有的浏览器即使你重启也依旧会自动填写)

4.2 实战

  • 创建密码文件
    在/etc/apache2/目录下创建一个password目录:
mkdir /etc/apache2/password

使用如下命令创建密码文件:

cd /etc/apache2/server_root/bin#下一条指令中的Tom是用户名,可以自行更改;mypasswd是你保存用户名和密码的文件的名字,也可以自己更改./htpasswd -c /etc/apache2/password/mypasswd Tom#按要求输入密码#第二个用户不要使用-c参数,-c是新建一个密码文件,如果第二次依旧使用-c参数,会将前面的同名文件删除,然后新建。不使用-c参数会在已有的密码文件里新添加用户和对应的密码。./htpasswd  ../../password/mypasswd Leo#按要求输入密码

完成后到密码文件目录,可以查看我们添加的信息:
这里写图片描述

  • 修改httpd.conf文件

首先,去掉httpc.conf文件中本文第3小结列出的模块的注释,以支持authentication.
这里写图片描述
然后修改httpd.conf的DIirectory部分如下:
这里写图片描述

同时,注释掉“Require all granted”

解释
AuthTyep 认证的类型,basic或者digest
AuthName 要求用户填写用户名和密码的时候显示的提示信息
AuthBasicProvider 可选参数,可以直接写成“file”
AuthUserFile 你创建的密码文件路径
AuthGroupFile 使用组(稍后会举例)
Require 设置那些用户或者和组符合条件

此时,重启服务器“apachectl restart”,在浏览器输入地址:http://172.17.0.2,会出现如下提示:

这里写图片描述
输入对应的用户名和密码后才可以访问。

注意,由于我们只允许了Leo因此输入Tom的用户名和密码依然是无法访问的。如果希望Tom可以访问,你需要:
“Require user Leo Tom”
但是当用户数量变多的时候,这样管理很繁琐,因此,有了用户组(group)的概念。先一个部分将会介绍如何使用用户组。

  • 设置组(group)
    首先,继续在mypaswd文件里添加几个用户:
./../bin/htpasswd ../../password/mypasswd Sinan./../bin/htpasswd ../../password/mypasswd Edwin 

然后创建你一个组文件:

cd /etc/apache2/passwordtouch mygroupvim mygroup

添加一个用户组:格式是 groupname: username1 username2(祖名,然后一个冒号,之后是任意多个用空格间隔的用户名),比如我的是“testgroup: Leo Edwin”:
这里写图片描述
然后修改httpd.conf文件:
添加一行:

AuthGroupFile "/etc/apache2/password/mygroup"

修改一行:

#testgroup是我们的组名Require group testgroup

这里写图片描述
重启服务器,在浏览器里测试,发现只有在用户组testgroup里的Leo和Edwin可以访问,另外两个用户即使输入了正确的用户名和密码也不能正常访问。

回忆一下上一个教程的内容,和virtualhost或者userdir结合,我们可以针对不同的端口或者主机名或者不同的userdir设置不同的组访问权限,这是一个很有意思的做法哦。

5. 答疑

5.1 如何退出登陆?

由于浏览器缓存了用户名和密码,所以你可能只有第一次被要求输入用户名和密码,后面就可以直接登陆了,这导致你无法尝试其他的用户名以至于只能换一个浏览器去测试其他用户名和密码。事实上除了关闭浏览器或者重启系统你甚至没有办法退出登陆。
为了方便大家测试,我推荐一款终端浏览器:w3m,如果你使用ubuntu系统你可以这样安装:

sudo apt-get install w3m

使用的时候,输入“w3m http://172.17.0.2”:
这里写图片描述
回车,你会在模拟终端底部发现提示:“401 Unauthorized”
这里写图片描述
之后会跳出输入用户名和密码的界面,依次输入用户名和密码,
这里写图片描述这里写图片描述
回车,就可以了:
这里写图片描述

w3m的好处是它不会缓存用户名和密码,你可以继续测试其他用户。

5.2 如何更改密码提示框的样式?

你觉得输入用户名和密码的弹出框很丑,你想自定义自己的弹出框。事实上这是由浏览器决定的,使用basic authentication你无法自定义弹出框。多么痛的领悟!(或许你可以自己弄个浏览器?谁知道呢!)

6. 小结

本文主要讲解了basic authentication的应用,digest authentication的内容请搜索后续教程。