【问题标题】:Prevent NGINX-ingress from responding to public IP防止 NGINX-ingress 响应公共 IP
【发布时间】:2021-04-15 13:38:51
【问题描述】:

阻止 NGINX 响应公共 IP 或让它重定向到其他地方的过程是什么 - 比如另一个 URL。

我有点难过,因为在这种情况下,我似乎在任何地方都找不到太多的文档方式。我们也在使用 cert-manager。

本质上,PEN 测试失败了,因为公共 IP 正在响应 NGINX/k8s 自签名证书。我们不想要也不需要那个!

【问题讨论】:

  • 只需将 cert-manager 配置为使用lets-encrypt ????

标签: nginx kubernetes nginx-ingress


【解决方案1】:

有可能解决这个问题; HTTP容易,HTTPS难。主要问题是为 IP 地址颁发证书,而不是任何颁发者都会这样做(例如,letsencrypt 不会),因此您必须找到一个或尝试您现在使用的任何一个。

要处理未知主机(如 IP 地址),您可以在规则中创建一个没有 host 字段的入口对象。这将使创建的入口作为“默认”或“后备”规则工作,因此当Host 标头没有更好的匹配时将使用它(任何入口 host 在规则中) .

要创建入口对象,您需要一个服务,以下是创建没有端点的虚拟服务的方法:

apiVersion: v1
kind: Service
metadata:
  name: dummy-service
spec:
  clusterIP: None

接下来,它的入口:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: default-ingress
  annotations:
    kubernetes.io/ingress_class: nginx
    nginx.ingress.kubernetes.io/configuration-snippet: |
      # Nginx will place this in server block

      # You can redirect all requests somewhere:
      return 301 https://example.com/;
      # or just:
      #return 403;
spec:
  rules:
    # This rule has no 'host' field and because of that
    # NGINX won't include 'server_name' directive in
    # vhost configuration. What this means is that this
    # ingress rule will be used only if the request
    # comes with 'Host' header for which there is no
    # specific rule (IP-address for example).
    - http:
        paths:
          - backend:
              servicePort: 80
              serviceName: dummy-service

此时,您已经获得了适用于 HTTP 和 HTTPS 的重定向(或 403),尽管后者使用的是虚拟证书。如果您设法为您的 IP 地址颁发了证书并将其保存为机密,那么接下来就是让 NGINX 使用它而不是使用其默认的虚拟证书。为此,您需要通过添加 --default-ssl-certificate 参数来修改入口控制器部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ingress-nginx-controller
spec:
  template:
    spec:
      containers:
        - name: controller
          args:
            - /nginx-ingress-controller
            # use 'namespace/secret_name' as the value for the argument
            - --default-ssl-certificate=default/ip-cert-secret

现在 NGINX 将使用有效证书响应 IP 地址。

奖励:如果您有证书管理器 IssuerClusterIssuer 可以为 IP 地址颁发证书(如自签名证书),您可以请求具有以下内容的证书清单:

#apiVersion: cert-manager.io/v1
apiVersion: cert-manager.io/v1beta1
kind: Certificate
metadata:
  name: ip-cert
spec:
  secretName: ip-cert-secret
  duration: 2160h # 90d
  renewBefore: 360h # 15d
  isCA: false
  privateKey:
    algorithm: RSA
    encoding: PKCS1
    size: 2048
  usages:
    - server auth
    - client auth
  commonName: Dummy
  ipAddresses:
  - 10.1.1.13 # fill the list
  issuerRef:
    name: # insert issuer name
    kind: # Issuer or ClusterIssuer 
    group: cert-manager.io

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 2018-09-11
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多