kubernetes舵图

时间:2018-10-10 12:08:48

标签: kubernetes kubernetes-helm

我正在尝试使用头盔图表阻止用户代理名称wordpress用于nginx入口。为此,我在values.yml文件中给出了键值,并在configmap.yml中调用了键,如下所示。

 - values.yml file
   configmap:
     block_user_agents: "^.*wordpress.*$"

 - configmap.yml file
   data:
     block-user-agents: "{{ .Values.configmap.block_user_agents }}"

 - command to check
   curl -A "wordpress-blah" http://my_minikube_ip:32144(serviceport)

 - output

 <html>
 <head><title>404 Not Found</title></head>
 <body>
 <center><h1>404 Not Found</h1></center>
 <hr><center>nginx/1.15.5</center>
 </body>
 </html>

在使用helm install成功部署了helm图表之后,我尝试使用curl命令对其进行测试,以检查其是否阻止了用户代理。我得到的404未找到,因为我需要获得403。请问有人可以在这里帮助我,正则表达式可以在这里工作吗?我想念什么吗?

1 个答案:

答案 0 :(得分:0)

这是如何nginx.conf中阻止用户代理的example

### make sure your 'if' statement is in the server block.
### case sensitive http user agent blocking  ###
if ($http_user_agent ~ (Catall Spider|AcoiRobot) ) {
    return 403;
}
### case insensitive http user agent blocking  ###
if ($http_user_agent ~* (foo|bar) ) {
    return 403;
}

您可以使用以下example在入口控制器的nginx.conf中添加一些配置部分。它将自定义标头添加到Nginx配置中,该标头仅适用于特定的Ingress:

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-configuration-snippet
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      more_set_headers "Request-Id: $req_id";
spec:
  rules:
  - host: custom.configuration.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /

如果您需要向入口控制器添加一些全局设置,请参见以下examples

---
apiVersion: v1
data:
  proxy-set-headers: "ingress-nginx/custom-headers"
kind: ConfigMap
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
apiVersion: v1
data:
  X-Different-Name: "true"
  X-Request-Start: t=${msec}
  X-Using-Nginx-Controller: "true"
kind: ConfigMap
metadata:
  name: custom-headers
  namespace: ingress-nginx

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
data:
  proxy-connect-timeout: "10"
  proxy-read-timeout: "120"
  proxy-send-timeout: "120"

使用前面的示例创建一个YAML文件,并将其应用于您的集群:

kubectl apply -f nginx-ingress-config.yaml

您可以使用以下命令检查设置是否已应用于入口控制器中的nginx.conf:

# Replace name of the ingress controller with the real name of the pod in the right namespace
$ kubectl exec nginx-ingress-controller-6bdddddb-6dmnw -n kube-system cat /etc/nginx/nginx.conf

# You can find the real name of your ingress controller and namespace using the next command
$ kubectl get pods --all-namespaces | grep nginx-ingress-controller

没有关于图表的信息,很难猜测应该设置哪个参数。

如果您正在使用掌舵库中的图表,则可以通过运行来获取其内容

$ helm fetch <chart/name>

之后,您将在当前目录中获得一个压缩的图表文件。 您可能需要通过阅读图表模板目录中的模板文件来找到适合您的代码段的值。

如果您使用自己编写的图表,则可以使用stable/nginx-ingress图表作为参考。它有很多配置选项。

更新:

从0.20.0版开始,新功能为introduced

  

#2997提供了阻止IP,用户代理和引荐来源的可能性   全球

参数的使用在Map section of the manual中进行了说明。

如果需要使用示例,可​​以在test-case中找到它。

It("should block User-Agents defined in the ConfigMap", func() {
    err := f.UpdateNginxConfigMapData("block-user-agents", "~*chrome\\/68\\.0\\.3440\\.106\\ safari\\/537\\.36,AlphaBot")
    Expect(err).NotTo(HaveOccurred())

...

    // Should be blocked
    resp, _, errs := gorequest.New().
        Get(f.IngressController.HTTPURL).
        Set("Host", host).
        Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36").
        End()
    Expect(errs).To(BeNil())
    Expect(resp.StatusCode).Should(Equal(http.StatusForbidden))

    resp, _, errs = gorequest.New().
        Get(f.IngressController.HTTPURL).
        Set("Host", host).
        Set("User-Agent", "AlphaBot").
        End()
    Expect(errs).To(BeNil())
    Expect(resp.StatusCode).Should(Equal(http.StatusForbidden))

    // Shouldn't be blocked
    resp, _, errs = gorequest.New().
        Get(f.IngressController.HTTPURL).
        Set("Host", host).
        Set("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1").
        End()
    Expect(errs).To(BeNil())
    Expect(resp.StatusCode).Should(Equal(http.StatusOK))
})