LoginSignup
6
10

More than 5 years have passed since last update.

Nginx Ingress Controllerで特定パスへのアクセスを拒否する

Last updated at Posted at 2019-01-18

Nginx Ingress Controllerで特定パス、例えば/adminのアクセスを拒否する方法のメモ。

Minikube v0.32.0
Kubernetes v1.12.4
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.21.0

設定方法

以下のように、server-snipetのアノテーションを使って設定できる。ただしserver-snipetは1つのホストにつき1回しか設定できず、同じホストを指定した複数のIngressに定義した場合は古いほうが有効となる。
またはconfiguration-snippetのアノテーションでも設定できる。

(補足)
IBM Cloud Privateではアノテーションのプレフィックスがingress.kubernetes.ioとなることに注意。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: liberty
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |-
      location /sample/admin {
          deny all;
      }
spec:
  rules:
  - host: sample.example.com
    http:
      paths:
      - path: /sample
        backend:
          serviceName: liberty
          servicePort: 9080

この設定を入れると、Nginxの設定ファイルでserverの下に設定が入れ込まれる。

$ kubectl exec -it -n kube-system nginx-ingress-controller-6958898f8f-7z9dg cat /etc/nginx/nginx.conf

(省略)

    ## start server sample.example.com
    server {
        server_name sample.example.com ;

        listen 80;

        set $proxy_upstream_name "-";

        location /sample/admin {
            deny all;
        }

        location /sample {

            set $namespace      "default";
            set $ingress_name   "liberty";
            set $service_name   "liberty";
            set $service_port   "9080";
            set $location_path  "/sample";

(省略)

        }

(省略)

403でアクセス拒否される。

image.png

なお、server-snippetではなくconfiguration-snippetで指定したとするとlocation /sampleの下に設定が入る。locationを入れ子にすることはできるようなので、この設定でも機能する。この場合特に指定しない場合はエラーコードが503となったが、エラーコードを指定することも可能。

  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |-
      location /sample/admin {
          deny all;
          return 403;
      }
$ kubectl exec -it -n kube-system nginx-ingress-controller-6958898f8f-7z9dg cat /etc/nginx/nginx.conf

(省略)

    ## start server sample.example.com
    server {
        server_name sample.example.com ;

        listen 80;

        set $proxy_upstream_name "-";

        location /sample {

(省略)

            location /sample/admin {
                deny all;
                return 403;
            }

            proxy_pass http://upstream_balancer;

            proxy_redirect                          off;

        }

(省略)

rewrite-targetを指定している場合

nginx.ingress.kubernetes.io/rewrite-target: /のような設定している場合は、リライトのために正規表現で指定されているlocation設定が優先されてしまうため、上記の記載では上手くいかない。正規表現を使って記載する必要がある。

rewrite-targetを指定していない場合もこちらのような正規表現を使った書き方をしてもよい。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: liberty
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/server-snippet: |-
      location ~* "^/app1/sample/admin.*" {
          deny all;
      }
spec:
  rules:
  - host: sample.example.com
    http:
      paths:
      - path: /app1
        backend:
          serviceName: liberty
          servicePort: 9080
$ kubectl exec -it -n kube-system nginx-ingress-controller-6958898f8f-7z9dg cat /etc/nginx/nginx.conf

(省略)

    ## start server sample.example.com
    server {
        server_name sample.example.com ;

        listen 80;

        set $proxy_upstream_name "-";

        location ~* "^/app1/sample/admin.*" {
            deny all;
        }

        location ~* "^/app1\/?(?<baseuri>.*)" {

            set $namespace      "default";
            set $ingress_name   "liberty";
            set $service_name   "liberty";
            set $service_port   "9080";
            set $location_path  "/app1";

(省略)

        }

(省略)

参考リンク

6
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10