Nginx

防止 Kubernetes 中 nginx 入口中的目錄遍歷

  • October 12, 2020

我定義了以下入口:

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: someName
 namespace: test
 annotations:
   kubernetes.io/ingress.class: "ingress-public"
   nginx.ingress.kubernetes.io/affinity: "cookie"
   nginx.ingress.kubernetes.io/session-cookie-name: "JSESSIONID"
   nginx.ingress.kubernetes.io/connection-proxy-header: "keep-alive"
   nginx.ingress.kubernetes.io/server-snippet: |
     # block if not / or /test or /something
     if ($request_uri !~* "(^\/(?:(?:test|something)(?:\/|$)|$))") {
       return 404 ;
       break;
     }
     # redirect if proto_http
     if ($http_x_forwarded_proto = 'http') {
       return 301 https://$host$request_uri;
       break;
     }

     # hsts required header
     add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

spec:
 rules:
 - host: myhost.example.com
   http:
     paths:
     - path: /
       backend:
         serviceName: someservice
         servicePort: 80

正則表達式涵蓋了請求類似的大多數情況/config- 因為這與正則表達式不匹配,所以它返回 404。

我目前有兩個問題。

  1. 請求/test%2F..%2Fconfig不會返回 404,即使這與正則表達式不匹配。
  2. 請求/test/..%2Fconfig允許您到達/config

那麼是否有更好的正則表達式可以涵蓋這些情況,或者有沒有辦法轉換$request_uri為絕對 uri,以便正則表達式可以處理它而不是編碼的 uri?

正則表達式在這裡有一些測試案例:https ://regex101.com/r/Msu402/1

您可能想嘗試使用location( doc ) 或$uri( doc ),因為兩者都匹配規範化的 URI。因為如果是邪惡的,我會建議一個位置(未經測試):

location ~* ^/(?!test|something) {
 return 404;
}

編輯:我重讀了你的問題,它應該阻止訪問正則表達式中提到的位置。所以我加了“不”…

引用自:https://serverfault.com/questions/1037099