自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊聊APISIX Ingress 認(rèn)證使用

運(yùn)維 網(wǎng)絡(luò)運(yùn)維
Apache APISIX 作為一個(gè) API 網(wǎng)關(guān),目前已開啟與各種插件功能的適配合作,插件庫(kù)也比較豐富,目前已經(jīng)可與大量身份認(rèn)證相關(guān)的插件進(jìn)行搭配處理。

身份認(rèn)證在日常生活當(dāng)中是非常常見的一項(xiàng)功能,大家平時(shí)基本都會(huì)接觸到,Apache APISIX 作為一個(gè) API 網(wǎng)關(guān),目前已開啟與各種插件功能的適配合作,插件庫(kù)也比較豐富,目前已經(jīng)可與大量身份認(rèn)證相關(guān)的插件進(jìn)行搭配處理,如下圖所示。

基礎(chǔ)認(rèn)證插件比如 Key-Auth、Basic-Auth,他們是通過賬號(hào)密碼的方式進(jìn)行認(rèn)證。復(fù)雜一些的認(rèn)證插件如 Hmac-Auth、JWT-Auth,如 Hmac-Auth 通過對(duì)請(qǐng)求信息做一些加密,生成一個(gè)簽名,當(dāng) API 調(diào)用方將這個(gè)簽名攜帶到 APISIX,APISIX 會(huì)以相同的算法計(jì)算簽名,只有當(dāng)簽名方和應(yīng)用調(diào)用方認(rèn)證相同時(shí)才予以通過。其他則是一些通用認(rèn)證協(xié)議和聯(lián)合第三方組件進(jìn)行合作的認(rèn)證協(xié)議,例如 OpenID-Connect 身份認(rèn)證機(jī)制,以及 LDAP 認(rèn)證等。

APISIX 還可以針對(duì)每一個(gè) Consumer (即調(diào)用方應(yīng)用)去做不同級(jí)別的插件配置。如下圖所示,我們創(chuàng)建了兩個(gè)消費(fèi)者 Consumer A、Consumer B,我們將 Consumer A 應(yīng)用到應(yīng)用1,則后續(xù)應(yīng)用1的訪問將會(huì)開啟 Consumer A 的這部分插件,例如 IP 黑白名單,限制并發(fā)數(shù)量等。將 Consumer B 應(yīng)用到應(yīng)用2 ,由于開啟了 http-log 插件,則應(yīng)用2的訪問日志將會(huì)通過 HTTP 的方式發(fā)送到日志系統(tǒng)進(jìn)行收集。

basic-auth

首先我們來了解下最簡(jiǎn)單的基本認(rèn)證在 APISIX 中是如何使用的。basic-auth 是一個(gè)認(rèn)證插件,它需要與 Consumer 一起配合才能工作。添加 Basic Auth 到一個(gè) Service 或 Route,然后 Consumer 將其用戶名和密碼添加到請(qǐng)求頭中以驗(yàn)證其請(qǐng)求。

首先我們需要在 APISIX Consumer 消費(fèi)者中增加 basic auth 認(rèn)證配置,為其指定用戶名和密碼,我們這里在 APISIX Ingress 中,可以通過 ApisixConsumer 資源對(duì)象進(jìn)行配置,比如這里我們?yōu)榍懊娴?nexus 實(shí)例應(yīng)用添加一個(gè)基本認(rèn)證,如下所示:

# nexus-basic-auth.yaml
apiVersion: apisix.apache.org/v2alpha1
kind: ApisixConsumer
metadata:
name: nexusBauth
spec:
authParameter:
basicAuth:
value:
username: admin
password: admin321

ApisixConsumer 資源對(duì)象中只需要配置 authParameter 認(rèn)證參數(shù)即可,目前只支持 BasicAuth 與 KeyAuth 兩種認(rèn)證類型,在 basicAuth 下面可以通過 value 可直接去配置相關(guān)的 username 和 password,也可以直接使用 Secret 資源對(duì)象進(jìn)行配置,比起明文配置會(huì)更安全一些。

然后在 ApisixRoute 中添加 authentication,將其開啟并指定認(rèn)證類型即可,就可以實(shí)現(xiàn)使用 Consumer 去完成相關(guān)配置認(rèn)證,如下所示:

apiVersion: apisix.apache.org/v2beta2
kind: ApisixRoute
metadata:
name: nexus
namespace: default
spec:
http:
- name: root
match:
hosts:
- ops.qikqiak.com
paths:
- "/nexus*"
- "/static/*"
- "/service/*"
plugins:
- name: proxy-rewrite
enable: true
config:
regex_uri: ["^/nexus(/|$)(.*)", "/$2"]
- name: redirect
enable: true
config:
regex_uri: ["^(/nexus)$", "$1/"]
- name: redirect
enable: true
config:
http_to_https: true
backends:
- serviceName: nexus
servicePort: 8081
authentication: # 開啟 basic auth 認(rèn)證
enable: true
type: basicAuth

直接更新上面的資源即可開啟 basic auth 認(rèn)證了,在 Dashboard 上也可以看到創(chuàng)建了一個(gè) Consumer:

然后我們可以進(jìn)行如下的測(cè)試來進(jìn)行驗(yàn)證:

# 缺少 Authorization header
? curl -i http://ops.qikqiak.com/nexus/
HTTP/1.1 401 Unauthorized
Date: Tue, 11 Jan 2022 07:44:49 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
WWW-Authenticate: Basic realm='.'
Server: APISIX/2.10.0

{"message":"Missing authorization in request"}
# 用戶名不存在
? curl -i -ubar:bar http://ops.qikqiak.com/nexus/
HTTP/1.1 401 Unauthorized
Date: Tue, 11 Jan 2022 07:45:07 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/2.10.0

{"message":"Invalid user key in authorization"}
# 成功請(qǐng)求
? curl -uadmin:admin321 http://ops.qikqiak.com/nexus/
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>openresty</center>
</body>
</html>

consumer-restriction

不過這里大家可能會(huì)有一個(gè)疑問,在 Route 上面我們并沒有去指定具體的一個(gè) Consumer,然后就可以進(jìn)行 Basic Auth 認(rèn)證了,那如果我們有多個(gè) Consumer 都定義了 Basic Auth 豈不是都會(huì)生效的?確實(shí)是這樣的,這就是 APISIX 的實(shí)現(xiàn)方式,所有的 Consumer 對(duì)啟用對(duì)應(yīng)插件的 Route 都會(huì)生效的,如果我們只想 Consumer A 應(yīng)用在 Route A、Consumer B 應(yīng)用在 Route B 上面的話呢?要實(shí)現(xiàn)這個(gè)功能就需要用到另外一個(gè)插件:consumer-restriction。

consumer-restriction 插件可以根據(jù)選擇的不同對(duì)象做相應(yīng)的訪問限制,該插件可配置的屬性如下表所示:

其中的 type 字段是個(gè)枚舉類型,它可以是 consumer_name 或 service_id,分別代表以下含義:

  • consumer_name:把 consumer 的 username 列入白名單或黑名單(支持單個(gè)或多個(gè) consumer)來限制對(duì)服務(wù)或路由的訪問。
  • service_id:把 service 的 id 列入白名單或黑名單(支持一個(gè)或多個(gè) service)來限制 service 的訪問,需要結(jié)合授權(quán)插件一起使用。

比如現(xiàn)在我們有兩個(gè) Consumer:jack1 和 jack2,這兩個(gè) Consumer 都配置了 Basic Auth 認(rèn)證,配置如下所示:

Conumer jack1 的認(rèn)證配置:

? curl http://192.168.31.46/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{
"username": "jack1",
"plugins": {
"basic-auth": {
"username":"jack2019",
"password": "123456"
}
}
}'

Conumer jack2 的認(rèn)證配置:


? curl http://192.168.31.46/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{
"username": "jack2",
"plugins": {
"basic-auth": {
"username":"jack2020",
"password": "123456"
}
}
}'

現(xiàn)在我們只想給一個(gè) Route 路由對(duì)象啟用 jack1 這個(gè) Consumer 的認(rèn)證配置,則除了啟用 basic-auth 插件之外,還需要在 consumer-restriction 插件中配置一個(gè) whitelist 白名單(當(dāng)然配置黑名單也是可以的),如下所示:

? curl http://192.168.31.46/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/index.html",
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
},
"plugins": {
"basic-auth": {},
"consumer-restriction": {
"whitelist": [
"jack1"
]
}
}
}'

然后我們使用 jack1 去訪問我們的路由進(jìn)行驗(yàn)證:

? curl -u jack2019:123456 http://127.0.0.1:9080/index.html -i
HTTP/1.1 200 OK
...

正常使用 jack2 訪問就會(huì)認(rèn)證失敗了:

? curl -u jack2020:123456 http://127.0.0.1:9080/index.html -i
HTTP/1.1 403 Forbidden
...
{"message":"The consumer_name is forbidden."}

所以當(dāng)你只想讓一個(gè) Route 對(duì)象關(guān)聯(lián)指定的 Consumer 的時(shí)候,記得使用 consumer-restriction 插件。

jwt-auth

在平時(shí)的應(yīng)用中可能使用 jwt 認(rèn)證的場(chǎng)景是最多的,同樣在 APISIX 中也有提供 jwt-auth 的插件,它同樣需要與 Consumer 一起配合才能工作,我們只需要添加 JWT Auth 到一個(gè) Service 或 Route,然后 Consumer 將其密鑰添加到查詢字符串參數(shù)、請(qǐng)求頭或 cookie 中以驗(yàn)證其請(qǐng)求即可。

由于目前 ApisixConsumer 還不支持 jwt-auth 配置,所以需要我們?nèi)?APISIX 手動(dòng)創(chuàng)建一個(gè) Consumer,可以通過 APISIX 的 API 進(jìn)行創(chuàng)建,當(dāng)然也可以直接通過 Dashboard 頁(yè)面操作。在 Dashboard 消費(fèi)者頁(yè)面點(diǎn)擊創(chuàng)建消費(fèi)者:

點(diǎn)擊下一步進(jìn)入插件配置頁(yè)面,這里我們需要啟用 jwt-auth 這個(gè)插件:

在插件配置頁(yè)面配置 jwt-auth 相關(guān)屬性,可參考插件文檔 https://apisix.apache.org/zh/docs/apisix/plugins/jwt-auth/:

可配置的屬性如下表所示:

然后提交即可創(chuàng)建完成 Consumer,然后我們只需要在需要的 Service 或者 Route 上開啟 jwt-auth 即可,比如同樣還是針對(duì)上面的 nexus 應(yīng)用,我們只需要在 ApisixRoute 對(duì)象中啟用一個(gè) jwt-auth 插件即可:


apiVersion: apisix.apache.org/v2beta2
kind: ApisixRoute
metadata:
name: nexus
namespace: default
spec:
http:
- name: root
match:
hosts:
- ops.qikqiak.com
paths:
- "/nexus*"
- "/static/*"
- "/service/*"
plugins:
- name: jwt-auth
enable: true
- name: redirect
enable: true
config:
http_to_https: true
- name: redirect
enable: true
config:
regex_uri: ["^(/nexus)$", "$1/"]
- name: proxy-rewrite
enable: true
config:
regex_uri: ["^/nexus(/|$)(.*)", "/$2"]
backends:
- serviceName: nexus
servicePort: 8081

需要注意的是 authentication 屬性也不支持 jwt-auth,所以這里我們通過 plugins 進(jìn)行啟用,重新更新上面的對(duì)象后我們同樣來測(cè)試驗(yàn)證下:

? curl -i http://ops.qikqiak.com/nexus/
HTTP/1.1 401 Unauthorized
Date: Tue, 11 Jan 2022 08:54:30 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/2.10.0

{"message":"Missing JWT token in request"}

要正常訪問我們的服務(wù)就需要先進(jìn)行登錄獲取 jwt-auth 的 token,通過 APISIX 的 apisix/plugin/jwt/sign 可以獲取:

? curl -i http://192.168.31.46/apisix/plugin/jwt/sign\?key\=user-key
HTTP/1.1 200 OK
Date: Tue, 11 Jan 2022 09:01:29 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/2.10.0

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1c2VyLWtleSIsImV4cCI6MTY0MTk3ODA4OX0.rdzMxM4QAKI444c3SC3u3ZqfW9rKnsqrdorLHCGqrQg

要注意上面我們?cè)讷@取 token 的時(shí)候需要傳遞創(chuàng)建消費(fèi)者的標(biāo)識(shí) key,因?yàn)榭赡苡卸鄠€(gè)不同的 Consumer 消費(fèi)者,然后我們將上面獲得的 token 放入到 Header 頭中進(jìn)行訪問:

? curl -i http://ops.qikqiak.com/nexus/ -H 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1c2VyLWtleSIsImV4cCI6MTY0MTk3ODA4OX0.rdzMxM4QAKI444c3SC3u3ZqfW9rKnsqrdorLHCGqrQg'
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 8802
Connection: keep-alive
......
Expires: 0
Server: APISIX/2.10.0


<!DOCTYPE html>
<html lang="en">
......

可以看到可以正常訪問。同樣也可以放到請(qǐng)求參數(shù)中驗(yàn)證:

? curl -i http://ops.qikqiak.com/nexus/?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1c2VyLWtleSIsImV4cCI6MTY0MTk3ODA4OX0.rdzMxM4QAKI444c3SC3u3ZqfW9rKnsqrdorLHCGqrQg
HTTP/1.1 200 OK
......

此外還可以放到 cookie 中進(jìn)行驗(yàn)證:

? curl -i http://ops.qikqiak.com/nexus/ --cookie jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1c2VyLWtleSIsImV4cCI6MTY0MTk3ODA4OX0.rdzMxM4QAKI444c3SC3u3ZqfW9rKnsqrdorLHCGqrQg
HTTP/1.1 200 OK
......
責(zé)任編輯:姜華 來源: k8s技術(shù)圈
相關(guān)推薦

2022-01-12 08:10:40

APISIXIngress Url Rewrite

2021-01-29 09:58:10

ACKKubernetes模塊

2023-03-31 07:17:16

2023-03-01 07:35:05

APISIX源碼Docker

2021-03-16 06:55:49

Server4認(rèn)證網(wǎng)關(guān)

2022-01-14 09:17:13

PythonAPISIX插件

2021-08-10 07:57:57

k8s Nginx IngrNginx

2021-09-26 07:43:08

KongKongaK8s

2023-03-01 08:57:32

2024-05-28 08:24:18

2024-07-31 09:09:20

2021-06-07 08:04:39

Restorecon命令安全

2022-02-22 08:00:48

JavaNIOBuffer

2021-12-22 07:47:42

Kubernetes 運(yùn)維開源

2021-11-29 10:24:56

WasmEnvoy 負(fù)載均衡

2024-03-06 11:38:12

Appwrite方式Supabase

2025-03-25 13:56:17

2021-02-07 23:58:10

單例模式對(duì)象

2020-05-06 22:07:53

UbuntuLinux操作系統(tǒng)

2022-04-11 07:50:58

top 命令Java 系統(tǒng)JVM 進(jìn)程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)