Kubernetes Ingress 配置 Basic Auth 保护内部 API 怎么操作?

文章导读
给 Kubernetes Ingress 配置 Basic Auth 最稳妥的方式是利用 Ingress Controller 自带的注解功能,配合 Kubernetes Secret 存储密码文件。重要提示:Basic Auth 凭证在 HTTP 下等同于明文传输,生产环境必须配合 HTTPS 使用,否则存在密码泄露风险。适合 Nginx Ingress Controller 0.9.0 及以上
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

给 Kubernetes Ingress 配置 Basic Auth 最稳妥的方式是利用 Ingress Controller 自带的注解功能,配合 Kubernetes Secret 存储密码文件。重要提示:Basic Auth 凭证在 HTTP 下等同于明文传输,生产环境必须配合 HTTPS 使用,否则存在密码泄露风险。适合 Nginx Ingress Controller 0.9.0 及以上版本。

先说结论:通过 Ingress 注解开启认证是轻量且标准的做法,无需修改业务代码,但必须启用 TLS且 Secret 与 Ingress 必须在同一命名空间。

  • 适合:需要快速保护内部 API、Dashboard、Prometheus 等场景,且不想引入复杂 IAM 系统。
  • 先准备:确认集群使用的 Ingress Controller 类型(如 Nginx 或 Traefik),安装 htpasswd 工具,准备 TLS 证书
  • 验收:配置完成后,未经认证的请求应返回 401 Unauthorized,且 HTTP 请求应强制跳转 HTTPS。

命令速用版

# 1. 生成密码文件(首次创建用 -c,追加用户去掉 -c)
htpasswd -c auth admin

# 2. 创建 Secret(确保文件 key 名为 auth)
kubectl create secret generic basic-auth `--from-file`=auth

# 3. 验证访问(未认证应返回 401,注意使用 https)
curl -I -k https://your-domain.com

为什么会这样

Ingress Controller 作为集群流量的入口,可以在路由规则层面拦截请求。配置 Basic Auth 后,控制器会检查请求头中的 Authorization 字段,如果缺失或密码错误,直接返回 401 状态码,请求根本不会到达后端 Service。这种方式把鉴权逻辑下沉到基础设施层,业务容器无需感知,适合保护那些本身不带登录功能的内部服务或 API。

分步处理

1. 安装生成工具
需要在操作机上安装 Apache 工具包以获取 htpasswd 命令。CentOS 系统使用 yum install httpd-tools,Ubuntu 系统使用 apt install apache2-utils。

2. 创建用户密码文件
使用 htpasswd 生成加密文件。注意第一次创建用户需加 -c 参数,后续添加用户不要加,否则会覆盖原有文件。生成的文件建议命名为 auth,部分 Ingress 控制器默认读取 key 为 auth 的数据。

htpasswd -c auth admin
# 输入两次密码后生成 auth 文件

3. 创建 Kubernetes Secret
将密码文件存入 Secret,确保 Secret 名称与后续 Ingress 配置一致。注意 Secret 必须与 Ingress 规则在同一命名空间,否则控制器无法读取。

Kubernetes Ingress 配置 Basic Auth 保护内部 API 怎么操作?
kubectl create secret generic basic-auth `--from-file`=auth -n <namespace>

4. 配置 TLS 证书(必需)
Basic Auth 必须配合 HTTPS 使用。若已有 TLS Secret 可跳过,否则需先创建:

kubectl create secret tls tls-secret `--cert`=path/to/tls.crt `--key`=path/to/tls.key

5. 配置 Ingress 规则
在 Ingress 资源的 annotations 中添加认证相关注解及 HTTPS 强制跳转。以下配置适用于 Nginx Ingress Controller:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: secured-ingress
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - api.example.com
    secretName: tls-secret
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

怎么验证是否生效

使用 curl 命令发送 HEAD 请求查看响应状态码。未提供密码时应返回 401 Unauthorized,提供正确密码后应返回 200 OK。注意:若使用自签名证书,需加 -k 参数忽略证书验证。

# 预期返回 401
curl -I -k https://api.example.com

# 预期返回 200
curl -I -k -u admin:password https://api.example.com

也可以直接在浏览器访问域名,观察是否弹出原生登录框,且地址栏应为 https 开头。

Kubernetes Ingress 配置 Basic Auth 保护内部 API 怎么操作?

常见坑

1. 未启用 HTTPS(高危)
Basic Auth 凭证仅经过 Base64 编码,在 HTTP 下等同于明文。若未配置 TLS 及强制跳转,密码极易被嗅探窃取。

2. Secret 命名空间不匹配
Secret 文件必须与 Ingress 规则在同一命名空间,否则 Ingress Controller 无法加载认证文件,可能导致配置不生效或返回 503 错误。

3. 文件 Key 名称错误
对于 Nginx Ingress Controller,Secret 中的数据 key 建议命名为 auth。如果 key 名称不符,控制器可能无法识别,部分版本会直接返回 503 服务不可用。

4. 控制器版本支持
Basic Auth 功能依赖 Ingress Controller 版本支持,Nginx Ingress Controller 通常需要 0.9.0 及以上版本。如果是 Traefik 等其他控制器,注解 key 会有所不同,需查阅对应文档。

5. 密码文件覆盖
使用 htpasswd 命令时,-c 参数会覆盖现有文件。添加新用户时务必去掉 -c,否则之前创建的用户将无法登录。

参考来源

  • kubernetes - 为 Ingress 添加 basic-auth 认证
  • Kubernetes 集群——(k8s)ingress+ 加密认证 + 地址重写
  • 配置 kubernetes 服务 basic auth - 走心的狗 - 博客园
  • Kubernetes Ingress 基础认证配置-CSDN 博客
  • 官方文档参考:https://kubernetes.github.io/ingress-nginx/examples/auth/basic/