caddy的訪問認證及頻次限制

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
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章