基于HTTP 协议认证介绍与实现2013-06-15 10:27 by youxiachai, 443 阅读, 0 评论, 收藏, 编辑
导言
一直对http 的头认证有兴趣,就是路由器的那种弹出对话框输入账号密码怎么实现一直不明白,最近,翻了一下http 协议,发现这是一个RFC 2617的实现,所以写篇文章介绍一下吧.
Http基本认证
这是一个用于web浏览器或其他客户端在请求时提供用户名和密码的登录认证,要实现这个认证很简单:
我们先来看下协议里面怎么定义这个认证的. 1. 编码: 将用户名 追加一个 冒号(':')接上密码,把得出的结果字符串在用Base64算法编码.
- 请求头: Authorization: 认证类型 编码字符串
来看一下客户端如何发起请求例如,有一个用户名为:tom, 密码为:123456 怎么认证呢?
步骤如下 1. 编码
Base64('tom:123456') == dG9tOjEyMzQ1Ng==;
- 把编码结果放到请求头当中
Authorization: Basic dG9tOjEyMzQ1Ng==
请求样例客户端
1 2 3 |
GET / HTTP/1.1 Host: localhost Authorization: Basic dG9tOjEyMzQ1Ng |
服务端应答
1 2 3 4 |
HTTP/1.1 200 OK Date: Thu, 13 Jun 2013 20:25:37 GMT Content-Type: application/json; charset=utf-8 Content-Length: 53 |
如果没有认证信息
1 2 3 |
HTTP/1.1 401 Authorization Required Date: Thu, 13 Jun 2013 20:25:37 GMT WWW-Authenticate: Basic realm="Users" |
验证失败的时候,响应头加上WWW-Authenticate: Basic realm="请求域".
这种http 基本实现,几乎目前所有浏览器都支持.不过,大家可以发现,直接把用户名和密码只是进行一次base64 编码实际上是很不安全的,因为对base64进行反编码十分容易,所以这种验证虽然简便,但是很少会在公开访问的互联网使用,一般多用在小的私有系统,例如,你们家里头的路由器,多用这种认证方式.
Http 摘要认证
这个认证可以看做是基本认证的增强版本,使用随机数+密码进行md5,防止通过直接的分析密码MD5防止破解. 摘要访问认证最初由 RFC 2069 (HTTP的一个扩展:摘要访问认证)中被定义加密步骤:
后来发现,就算这样还是不安全(md5 可以用彩虹表进行攻击),所以在RFC 2617入了一系列安全增强的选项;“保护质量”(qop)、随机数计数器由客户端增加、以及客户生成的随机数。这些增强为了防止如选择明文攻击的密码分析。
-
如果 qop 值为“auth”或未指定,那么 HA2 为
-
如果 qop 值为“auth-int”,那么 HA2 为
-
如果 qop 值为“auth”或“auth-int”,那么如下计算 response:
-
如果 qop 未指定,那么如下计算 response:
好了,知道加密步骤,下面我们用文字来描述一下;
最后,我们的response 由三步计算所得. 1. 对用户名、认证域(realm)以及密码的合并值计算 MD5 哈希值,结果称为 HA1。
HA1 = MD5( "tom:Hi!:123456" ) = d8ae91c6c50fabdac442ef8d6a68ae8c
-
对HTTP方法以及URI的摘要的合并值计算 MD5 哈希值,例如,"GET" 和 "/index.html",结果称为 HA2。
HA2 = MD5( "GET:/" ) = 71998c64aea37ae77020c49c00f73fa8
-
最后生成的响应码
Response = MD5("d8ae91c6c50fabdac442ef8d6a68ae8c:L4qfzASytyQJAC2B1Lvy2llPpj9R8Jd3:00000001:c2dc5b32ad69187a
:auth:71998c64aea37ae77020c49c00f73fa8") = 2f22e6d56dabb168702b8bb2d4e72453;
RFC2617 的安全增强的主要方式:
发起请求的时候,服务器会生成一个密码随机数(nonce)(而这个随机数只有每次"401"相应后才会更新),为了防止攻击者可以简单的使用同样的认证信息发起老的请求,于是,在后续的请求中就有一个随机数计数器(cnonce),而且每次请求必须必前一次使用的打.这样,服务器每次生成新的随机数都会记录下来,计数器增加.在RESPONSE 码中我们可以看出计数器的值会导致不同的值,这样就可以拒绝掉任何错误的请求.
请求样例(服务端 qop 设置为"auth")
客户端 无认证
1 2 |
GET / HTTP/1.1 Host: localhost |
服务器响应(qop 为 'auth')
1 2 3 |
HTTP/1.1 401 Authorization Required Date: Thu, 13 Jun 2013 20:25:37 GMT WWW-Authenticate: Digest realm="Hi!", nonce="HSfb5dy15hKejXAbZ2VXjVbgNC8sC1Gq", qop="auth" |
客户端请求(用户名: "tom", 密码 "123456")
1 2 3 4 5 6 7 8 9 |
GET / HTTP/1.1 Host: localhost Authorization: Digest username="tom", realm="Hi!", nonce="L4qfzASytyQJAC2B1Lvy2llPpj9R8Jd3", uri="/", qop=auth, nc=00000001, cnonce="c2dc5b32ad69187a", response="2f22e6d56dabb168702b8bb2d4e72453" |
服务端应答
1 2 3 4 |
HTTP/1.1 200 OK Date: Thu, 13 Jun 2013 20:25:37 GMT Content-Type: application/json; charset=utf-8 Content-Length: 53 |
注意qop 设置的时候慎用:auth-int,因为一些常用浏览器和服务端并没有实现这个协议.
NFS服务基本配置及使用
CENTOS或RHL默认就已安装,如果没有安装的话,通过yum安装即可:
yum install nfs-utils
yum install portmap
二、配置
1、配置文件定义
<共享目录> 客户端1(选项) [客户端2(选项) ...]
选项:设置目录的访问权限、用户映射等,多个选项以逗号分隔。
指定ip地址的主机:192.168.0.100
指定子网中的所有主机:192.168.0.0/24 或 192.168.0.0/255.255.255.0
指定域名的主机:nfs.test.com
指定域中的所有主机:*.test.com
ro:共享目录只读;
all_squash:所有访问用户都映射为匿名用户或用户组;
no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组;
anongid=<GID>:指定匿名访问用户的本地用户组GID,默认为nfsnobody(65534);
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率;
subtree_check(默认) :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限;
三、NFS相关命令
不重启nfs服务应用更新,相关选项如下:
-r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
-u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
-v 在export的时候,将详细的信息输出到屏幕上。
2、nfsstat
查看NFS的运行状态。
3、showmount
-e IP或者hostname 显示此IP地址分享出来的目录
四、linux客户端挂载共享目录
1、临时挂载
通过mount挂载,例如:
2、启动挂载
6、确保windows系统中的guest帐号可用
1、普通用户
来访root映射为指定服务器上的root用户;
else
if ( 设置了all_squash ) then
访问用户映射为指定nfs匿名用户;
else
rw 以可读写模式加载。
defaults 使用默认的选项。默认选项为rw、suid、dev、exec、anto nouser与async。
dev 可读文件系统上的字符或块设备,取消选项为nodev。
exec 可执行二进制文件,取消选项为noexec。
noauto 无法使用-a参数来加载。
nouser 普通用户无法执行加载操作,默认设置。
remount 重新加载设备。通常用于改变设备的设置状态。
soft 软式挂载。如果服务器通讯失败,让试图访问它的操作失败,返回一条出错消息。这项功能对于避免进程“挂”在无关紧要的安装操作上来说非常有用。
timeo=n 设置请求的超时时间(以十分之一秒为单位)。
fstype= 用于指定一个文件系统的类型(如果要挂载的文件系统不是NFS的话),mount是不能用的。
八、注意事项
1、NFS服务器关机时要确保NFS没有客户端连接,否则无法正常关机 。可以先强制停止或杀死nfs服务。