Как настроить Tyk и Kubernetes для внутреннего TLS K8s? - PullRequest
0 голосов
/ 30 октября 2018

Проблема:

Я настраиваю Tyk Gateway и Dashboard на основе TykTechnologies / tyk-kubernetes repo:

Теперь я хочу защитить службы Gateway и Dashboard K8s сертификатами TLS.

Я приобрел сертификат для защиты внешних URL-адресов (https://api.example.com и https://dashboard.example.com), как показано ниже, но сертификат недействителен для внутренних конечных точек службы k8s, и поэтому панель управления и шлюз больше не могут говорить внутренне:

$ kubectl logs deployment/tyk-dashboard
...
time="Jan 01 00:00:00" level=error msg="Request failed with error Get https://tyk-dashboard.tyk.svc.cluster.local:443/register/node: x509: certificate is valid for *.example.com, not tyk-dashboard.tyk.svc.cluster.local; retrying in 5s"

Что я сделал до сих пор:

Изменены tyk.conf и tyk_analytics.conf для изменения порта прослушивания и ссылки на сертификаты:

{
"listen_port": 443,
"notifications_listen_port": 5000,
"tyk_api_config": {
    "Host": "https://tyk-gateway.tyk.svc.cluster.local",
    "Port": "443",
...
"http_server_options": {
    "use_ssl": true,
    "server_name": "api.example.com",
    "min_version": 771,
    "certificates": [
        {
        "domain_name": "*.example.com",
        "cert_file": "/etc/ssl/gateway-tls/tls.crt",
        "key_file": "/etc/ssl/gateway-tls/tls.key"
        }
    ]
},
...

Я монтирую сертификаты в модулях tyk с помощью секретов TLS K8s (и аналогично для панели инструментов):

kubectl create secret tls tyk-gateway --cert=example.com.crt --key=example.com.key

И соответствующее обновление развертывания K8s:

...
ports:
- containerPort: 443
- containerPort: 5000
volumeMounts:
...
    - name: tyk-gateway-tls
    readOnly: true
    mountPath: "/etc/ssl/gateway-tls"
volumes:
...
- name: tyk-gateway-tls
    secret:
    secretName: tyk-gateway

1 Ответ

0 голосов
/ 30 октября 2018

Возможное решение, которое я рассматриваю, состоит в том, чтобы использовать certificates.k8s.io API для создания действительного сертификата для внутреннего DNS-имени службы (tyk-gateway.tyk.svc.cluster.local), подписанного ЦС кластера K8s, как описано в Kubernetes. документация здесь .

Этот сертификат затем можно добавить в конфигурацию http_server_options и привязать к имени хоста службы.

Тем не менее, этот пример, по-видимому, предполагает, что мне нужно включить IP-адреса служб и пакетов в качестве SAN в CSR. Я не думаю, что в таком случае это будет действительно, когда модуль будет перенесен с другого IP-адреса.

Создайте личный ключ и запрос на подпись сертификата (или CSR), выполнив следующую команду:

cat <<EOF | cfssl genkey - | cfssljson -bare server
{
"hosts": [
    "my-svc.my-namespace.svc.cluster.local",
    "my-pod.my-namespace.pod.cluster.local",
    "172.168.0.24",
    "10.0.34.2"
],
"CN": "my-pod.my-namespace.pod.cluster.local",
"key": {
    "algo": "ecdsa",
    "size": 256
}
}
EOF

Где 172.168.0.24 - это IP-адрес кластера службы, my-svc.my-namespace.svc.cluster.local - это DNS-имя службы, 10.0.34.2 - это IP-адрес модуля и my-pod.my-namespace.pod. cluster.local - это DNS-имя модуля.

...