OID C обратный прокси-коляска в Куберне - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь защитить java приложения в kubernetes.

Для простого приложения Springboot с разрешением Все, я выбираю openresty (nginx) с lua -resty-openid c как обратный прокси.

Один пример, который иллюстрирует в основном то, что я пытаюсь сделать: https://medium.com/@lukas.eichler / secure-pods-with-sidecar-proxies-d84f8d34be3e

It «работает» в localhost, но не в kubernetes.

Вот мой nginx .conf:

worker_processes  1;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  debug;

events {
    worker_connections  1024;
}

http {
    lua_package_path '~/lua/?.lua;;';

    resolver ${dns.ip};

    lua_ssl_trusted_certificate /ssl/certs/chain.pem;
    lua_ssl_verify_depth 5;

    lua_shared_dict discovery 1m;
    lua_shared_dict jwks 1m;
    lua_shared_dict introspection 10m;

    lua_shared_dict sessions 10m;

    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        server_name  localhost;
        listen       80;

        location /OAuth2Client {
            access_by_lua_block {
                local opts = {
                    discovery = "${openam-provider}/.well-known/openid-configuration",
                    redirect_uri = "http://localhost:8080/OAuth2Client/authorization-code/callback",
                    client_id = "myClientId",
                    client_secret = "myClientSecret",
                    scope = "openid profile email",
                }

                local res, err = require("resty.openidc").authenticate(opts)

                if err then
                    ngx.status = 500
                    ngx.say(err)
                    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
                end

                ngx.req.set_header("Authorization", "Bearer " .. res.access_token)
                ngx.req.set_header("X-USER", res.id_token.sub)
            }

            proxy_pass  http://localhost:8080/OAuth2Client;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

Так что в локальном режиме мои nginx и мое приложение Springboot работают на localhost, перенаправления работают.

Теперь, когда я развертываю его на kubernetes с этим, браузер не сопоставляет localhost с ip внутреннего контейнера.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: oauth2-client-deployment
spec:
  selector:
    matchLabels:
      app: OAuth2Client
  replicas: 2
  template:
    metadata:
      labels:
        app: OAuth2Client
    spec:
      #hostAliases:
      #- ip: "127.0.0.1"
      #  hostnames:
      #  - "oauth2-client.local"
      containers:
      - name: oauth2-client-container
        image: repo/oauth2-client-springboot:latest
        env:
          - name: SPRING_PROFILES_ACTIVE
            value: dev
        envFrom:
          - secretRef: 
              name: openam-client-secret
          - secretRef: 
              name: keystore-java-opts
        volumeMounts:
          - name: oauth2-client-keystore
            mountPath: "/projected"
            readOnly: true
        ports:
          - containerPort: 8080
      - name: oauth2-sidecar
        image: repo/oauth2-sidecar:latest
        ports:
          - containerPort: 80
      volumes:
        - name: oauth2-client-keystore
          projected:
            sources:
              - secret:
                   name: keystore-secret
                   items:
                    - key: keystore.jks
                      path: keystore.jks
              - secret:
                   name: truststore-secret
                   items:
                    - key: truststore.jks
                      path: truststore.jks
      imagePullSecrets:
      - name: regcred

---

apiVersion: v1
kind: Service
metadata:
  name: oauth2-client-service-sidecar
spec:
  selector:
    app: OAuth2Client
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

Так как я мог отобразить этот локальный хост? Я не хочу, чтобы контейнер приложения отображался, так как на нем нет защиты, поэтому я использовал nginx в качестве коляски, и сервис нацелен только на него. Как указать nginx, чтобы он перенаправлял_uri и передавал прокси-сервер в ip контейнера приложения?

И дополнительный вопрос: как nginx не принимает переменные env, как мне сделать, чтобы сделать его обобщенным c, так приложения могут предоставить свой собственный redirect_uri, который следует использовать в nginx .conf?

Еще один вспомогательный вопрос: команда ngx.req.set_header ("Авторизация", "Носитель" .. res.access_token) didn ' Это не работает, так как я не вижу заголовка авторизации в моем запросе в моем приложении ...

1 Ответ

1 голос
/ 30 марта 2020

Сконфигурируйте свой сервис с типом ClusterIP, чтобы он был доступным только внутри, а затем используйте fqdn в ваших сервисах для доступа к сервису без зависимости от IP.

apiVersion: v1
kind: Service
metadata:
  name: oauth2-client-service-sidecar
spec:
  selector:
    app: OAuth2Client
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

Затем используйте oauth2-client-service-sidecar.<namespacen>.cluster.local в вашей конфигурации nginx для доступа к услуге:

proxy_pass  http://oauth2-client-service-sidecar.<namespacen>.cluster.local/OAuth2Client;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...