Kubernetes中经常使用ingress做为从外界访问kubernetes集群内服务的入口, 而nginx ingress则做为最常用的方式, 有时候会遇到暴露出来的页面是需要受限访问的, 在nginx ingress中同样提供了nginx原生的认证方式,项目中用到了白名单
跟用户密码认证
,一定程度上加强了安全性.
Nginx Ingress
定义一个最常用的ingress
1 | apiVersion: extensions/v1beta1 |
上述是个最简单的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 | apiVersion: extensions/v1beta1 |
这样,不在指定ip列表中的访问会提示403, access forbiden
如果需要用户名密码访问呢
Basic Authentication
可使用baisc authentication来进行难,这也是nginx本身提供的一种难方式
1 | apiVersion: extensions/v1beta1 |
其中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