caddy的访问认证及频次限制

来源:互联网 发布:海贼王索隆的刀淘宝 编辑:程序博客网 时间:2024/05/17 08:02

Caddy 是一个多功能的 HTTP web服务器,并且使用Let’s Encrypt提供的免费证书,想要自动让网站升级到HTTPS,需要满足一下几个条件:
1. 主机不能为空,不能为localhost,不能是通配符,不能是一个IP地址
2. 端口不能为指定为80
3. 模式不能指定为http
4. 网站定义的TLS不能关闭
5. 不能由你来提供证书和密钥
6. caddy可以绑定到80和443(除非你用DNS挑战)

一、访问认证
1. basicauth
caddy的basicauth 实现了HTTP Basic Authentication。Basic Authentication可以通过使用用户名和密码的方式来保护文件和目录。
注意:基本的认证在http上是不安全的。在决定使用HTTP基本身份验证时要谨慎。
使用语法如下:
保护单个文件或目录:
basicauth path username password
例子:
basicauth /secret Bob hiccup
- path:受保护的文件或目录
- username:访问所需的用户名
- password:访问所需的密码

保护多个文件或目录
basicauth username password {
realm name
resources
}
例子:
basicauth “Mary Lou” milkshakes {
realm “Mary Lou’s documents”
/notes-for-mary-lou.txt
/marylou-files
/another-file.txt
}
- username:访问所需的用户名
- password:访问所需的密码
- realm:可选配置,用于标识受保护的区域,不可重复
- resources:文件或目录的列表,每行一个

2. JWT
JWT为caddy实现了一个基于JSON Web Tokens的认证层。
jwt 指令是 Caddy 的扩展功能,我们需要在官网上选择添加该功能并且获取编译后的版本。
其基本语法为:
jwt [path]
高级语法:
jwt {
path [path]
redirect [location] # 当请求被拒绝时,重定向到该位置
allow [claim] [value]
deny [claim] [value]
}
譬如我们预设了两个令牌:user: someone 与 role: member ,我们的配置项如下:
jwt {
path /protected
deny role member
allow user someone
}
该中间件会拒绝所有 role: member 的访问,除了用户名为 someone 的用户。而另一个 role: admin 或者 role: foo 的用户则可以正常访问。

我们可以通过三种方式来提交令牌:

  • 通过header
    Authorization: Bearer
  • 通过Cookie
    “jwt_token”:
  • 通过URL的请求参数
    /protected?token=

二、频次限制
ratelimit
根据客户端的ip地址来限制请求的处理速率
超出的请求会返回429错误(过多的请求),并且header中会添加X-RateLimit-RetryAfter

ratelimit并非caddy的默认特征,因此下载caddy时需要选择http.ratelimit插件

可以设置每秒、每分钟、每小时可以访问多少次

可以添加白名单

可以对某一IP范围不加限制

可以对某些文件或某些目录不加限制

针对单个资源
ratelimit path rate burst unit
例子:
ratelimit /r 2 3 second
说明:对于/r目录下的文件,限制客户端每秒发送2个请求(3个爆发)

针对多个资源
ratelimit rate burst unit {
whitelist CIDR
resources
}
例子:
ratelimit 2 2 minute {
whitelist 1.2.3.4/32
whitelist 192.168.1.0/30
/foo.html
/dir
^/dir/app.js
}
说明:
whitelist 白名单IP列表
对/foo.html和/dir有ratelimit限制
对/dir/app.js没有限制

三、IP限制
ipfilter

根据客户端的IP来判断允许还是拒绝。
根据IP或CIDR范围来过滤
ipfilter / {
rule block
ip 70.1.128.0/19 2001:db8::/122 9.12.20.16
}

根据国家ISO码过滤
ipfilter / {
rule allow
database /data/GeoLite.mmdb
country US JP
}
定义一个阻塞页(即访问被拒绝时返回的页面)
ipfilter / {
rule allow
blockpage default.html
ip 55.3.4.20 2e80::20:f8ff:fe31:77cf
}
过滤多个路径
ipfilter /notglobal /secret {
rule allow
ip 84.235.124.4
}
配置多个阻碍
ipfilter / {
rule allow
ip 32.55.3.10
}

ipfilter /webhook {
rule allow
ip 192.168.1.0/24
}

原创粉丝点击