配置Apache Basic和Digest认证

转载:http://blog.jobbole.com/41519/

在伯乐在线看到一篇《在Nginx下对网站进行密码保护》文章, 正好和自己这两天研究的问题有些相同点。我侧重研究的是如何破解。虽然在那篇文章中注明密码是加密存储的, 但是他忽略了一点就是密码在网络中传输是明文传输的,所以那种加密方式不可取。

下面就是我对Apache用户认证的一些理解。

Apache常见的用户认证可以分为下面三种:

  • 基于IP,子网的访问控制(ACL)
  • 基本用户验证(Basic Authentication)
  • 消息摘要式身份验证(Digest Authentication)

访问控制

访问控制不属于这篇文章讨论的范围.

基本身份验证

原理:
一个页面访问请求

GET /auth/basic/ HTTP/1.1

Host: target

Web服务器要求用书输入用户凭据(服务器返回401响应头和’realm’)

HTTP/1.1 401 Authorization Required

Date: Sat, 08 Jun 2013 12:52:40 GMT

WWW-Authenticate: Basic realm="Basic auth Dir"          

Content-Length: 401

Keep-Alive: timeout=15, max=100

Connection: Keep-Alive

Content-Type: text/html; charset=iso-8859-1

浏览器弹出登录窗口(包含’realm’),要求用提供用户名/密码

GET /auth/basic/ HTTP/1.1

Host: target

Authorization: Basic TGVuZ1dhOjEyMzQ1Ng==       //Basic后面就是LengWa:123456经过Base64编码后的字符串

服务器将用户输入的凭据和服务器端的凭据进行比较。如果一直则返回所请求页面的响应。

配置: – 以保护/data/www/auth/basic为例

Step 1: 创建密码文件,并添加第一个用户。

/usr/local/apache/bin> ./htpasswd -c /data/www/auth/basic/user.txt LengWa

New password:  

Re-type new password:  

Adding password for user LengWa

-c = create file

常规添加不要使用-c选项,因为它会覆盖现有的文件。

设置文件所有权和权限(root可以进行读写,Apache Group只可以读取)

/data/www/auth/basic > ls -l

-rw-r-----   1 root     httpd    ...   user.txt

注意: 在密码文件中,密码是加密存贮的(eg: LengWa:$apr1$MBvROZKM$wP.pdlMonB0P4xGZwl.8G0)。但是在网络中是明文传输的。

Step 2: 配置httpd.conf

<Directory "/data/www/auth/basic">
    Options Indexes FollowSymLinks
    allowoverride authconfig
    order allow,deny
    allow from all
</Directory>

Step3: 编辑/data/www/auth/basic/.htaccess

AuthName "Basic Auth Dir"
AuthType Basic
AuthUserFile /data/www/auth/basic/user.txt
require valid-user

重新启动Apache服务器,访问 http://127.0.0.1/auth/basic/ 验证加密。

我前面说过这种加密在网络中传输时是明文传输 Base64 编码,我不认为这是一种加密算法)的。如果你感兴趣,可以抓包看看。

消息摘要式身份验证(Digest Authentication)

原理:

Digest Authentication在基本身份验证上面扩展了安全性. 服务器为每一连接生成一个唯一的随机数, 客户端对用这个随机数对密码进行MD5加密. 然后发送到服务器. 服务器端也用此随机数对密码加密, 然后和客户端传送过来的加密数据进行比较.

一个页面访问请求

GET /auth/basic/  HTTP/1.1

Host: target

Web服务器要求用书输入用户凭据(服务器返回401响应头和’realm’)

HTTP/1.1 401 Unauthorized

WWW-Authenticate: Digest realm="Digest Encrypt",

nonce="nmeEHKLeBAA=aa6ac7ab3cae8f1b73b04e1e3048179777a174b3",

opaque="0000000000000000", \

stale=false,

algorithm=MD5,

qop="auth"
 

浏览器弹出登录窗口(包含’realm’), 要求用提供用户名/密码

GET /auth/digest/ HTTP/1.1

    Accept: */*

    Authorization:  Digest username="LengWa",

    realm="Digest Encrypt",

    qop="auth",

    algorithm="MD5",

    uri="/auth/digest/",

    nonce="nmeEHKLeBAA=aa6ac7ab3cae8f1b73b04e1e3048179777a174b3",

    nc=00000001,

    cnonce="6092d3a53e37bb44b3a6e0159974108b",

    opaque="0000000000000000",

    response="652b2f336aeb085d8dd9d887848c3314"

服务器将用户输入加密后的凭据和服务器端加密后的的凭据进行比较.如果一致则返回所请求页面的响应.

配置:

Step 1: 创建密码文件

语法:

htdiget [-c] passwordfile realm username

 

/usr/local/apache/bin> ./htdigest -c /data/www/auth/digest/ "Digest Encrypt" LengWa

Adding password for LengWa in realm "Digest Encrypt" .

New password:

Re-type new password:

-c = create file

常规添加不要使用-c选项, 因为它会覆盖现有的文件.

设置文件所有权和权限(root可以进行读写, Apache Group只可以读取)

/data/www/auth/digest/ > ls -l

-rw-r-----   1 root     httpd    ...   user.txt

user.txt格式: LengWa:Digest Encrypt:d95ea4412b0fb517b25c4c46f32e5a2b

Step2: 配置httpd.conf

<Directory "/data/www/auth/digest">

    Options Indexes FollowSymLinks

    AuthType Digest

    AuthName "Digest Encrypt"           //注意这里的AuthName和上面的realm必须一致(而Basic验证则可以不同). 否则你输入正确的用户密码也无法通过认证

    AuthDigestProvider file

    AuthUserFile /data/www/auth/digest/user.txt

    require valid-user

</Directory>

现在基于Digest的验证环境就搭建好了.

注: 在Basic验证中. 我使用了.htaccess 而在Digest验证中我没有使用. 只是为了个人的需要. 你可以根据自己需要进行配置.

疑惑: 对于在配置Digest httpd.conf时, AuthName 必须和上面的realm还是不是很明白. 为什么必须一致. 如果有哪位大神知道. 望不吝赐教。

总结:

Basic验证方式配置相对简单,但是安全性太低,不适合一些加密要求比较高的站点。

Digest则相反,加密性是很高,但是配置起来还是有一点难度的,所以大家根据自己需要,选择不同的加密方式。

 

参考文章:

  1. Apache Basic and Digest Authentication(注: 此文配置Digest的httpd.conf有一处错误, AuthDigestFile 改为 AuthUserFile)
  2. Testing for Brute Force
  3. The WWW-Authenticate Response Header

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值