Z.S.K.'s Records

Nginx Ingress Authentication

Kubernetes中经常使用ingress做为从外界访问kubernetes集群内服务的入口, 而nginx ingress则做为最常用的方式, 有时候会遇到暴露出来的页面是需要受限访问的, 在nginx ingress中同样提供了nginx原生的认证方式,项目中用到了白名单用户密码认证,一定程度上加强了安全性.

Nginx Ingress

定义一个最常用的ingress

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "false"
name: ingress-withno-auth
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /
backend:
serviceName: http-svc
servicePort: 80

上述是个最简单的ingress, 当访问foo.bar.com时就会转到http-svc所指向的服务

Nginx ingress中支持使用annotations来使用各种功能,可参考这里

如果我需要限定IP段才能访问这个网页, 那就需要使用到whitelist-source-range

whitelist-source-range

在metadata.annotations中使用whitelist-source-range来对访问的ip做限定,只有指定的ip才能够访问,多个ip之间用逗号分隔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 125.200.2.2,183.60.236.90
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "false"
name: ingress-with-whitelist
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /
backend:
serviceName: http-svc
servicePort: 80

这样,不在指定ip列表中的访问会提示403, access forbiden

如果需要用户名密码访问呢

Basic Authentication

可使用baisc authentication来进行难,这也是nginx本身提供的一种难方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
# type of authentication
nginx.ingress.kubernetes.io/auth-type: basic
# name of the secret that contains the user/password definitions
nginx.ingress.kubernetes.io/auth-secret: basic-auth
# message to display with an appropriate context why the authentication is required
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo'
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "false"
name: ingress-with-whitelist
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /
backend:
serviceName: http-svc
servicePort: 80

其中basic-auth是以secret的形式存在

先安装httpd工具

yum install -y httpd

使用htpasswd生成密码

htpasswd -c pass.wd foo

根据提示输入用户foo的密码

生成的密码文件会存在于pass.wd文件中,使用该文件生成secret

kubectl create secret generic basic-auth --from-file=pass.wd

或者, 也可以直接使用openssl来生成密码文件:
printf "admin:$(openssl passwd -crypt 12345678)\n" >/tmp/auth
注意: 使用openssl, 密码只能最长8位, 超过8位的会被截断
如果想使用kubernetes的secret来保存密码, 则生成的密码文件名一定要是auth, 否则的话访问会提示503错误.
kubectl create secret generic basic-auth --from-file=/tmp/auth

这样, 在访问时就会弹出需要输入用户密码的界面了, 如果密码错误,则会提示401 Unauthorized

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)

 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?