Vault PKI Intermediate SETUP CAs for ALL SERVICES Kubernetes the hard way v2: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показаны 22 промежуточные версии этого же участника)
Строка 4: Строка 4:
 
[[Категория:Linux]]
 
[[Категория:Linux]]
 
[[Категория:Kubernetes the hard way v2]]
 
[[Категория:Kubernetes the hard way v2]]
[[Категория:kube-apiserver]]
 
 
=Прежде чем начать=
 
=Прежде чем начать=
  +
Для понимания ЗАЧЕМ это делается - можно просмотреть [[Vault_PKI_Intermediate_CAs_for_ALL_SERVICES_Kubernetes_the_hard_way_v2|Описание СА и сертификатов (которые будут созданы в этой секции)]]
  +
<br>
  +
Однако это не требуется - можно сначала сделать все необходимые настройки, и только после разобрать зачем они нужны
   
  +
=Terraform=
[[Vault_PKI_Intermediate_CAs_for_ALL_SERVICES_Kubernetes_the_hard_way_v2|Описание СА и сертификатов (которые будут созданы в этой секции)]]
 
  +
По-хорошему эту часть надо делать не скриптами на баше и вызовами <code>vault</code>, а с помощью <code>terraform</code>, но пока-что руки не дошли переделать.
  +
=Какие есть CA=
  +
В этой инсталляции используются следующие CA
  +
<BR>
  +
* <code>k8s_pki_root_ca/</code> k8s Root CA, Корневой СА, которым подписаны промежуточные СА и только они. Все остальные сертификаты подписаны промежуточными СА.
  +
* <code>k8s_pki_intermediate_ca_for_service_etcd/</code> Intermediate CA for ETCd service, СА которым подписываются сертификаты для <code>etcd</code>
  +
* <code>k8s_pki_intermediate_ca_for_service_kube_apiserver_client_auth/</code> Intermediate CA for K8S: kube-apiserver CLIENT_AUTH
  +
* <code>k8s_pki_intermediate_ca_for_service_kube_apiserver_tls/</code> Intermediate CA for K8S: kube-apiserver TLS
  +
* <code>k8s_pki_intermediate_ca_for_service_kube_controller_manager_tls/</code> Intermediate CA for K8S: kube-controller-manager TLS
  +
* <code>k8s_pki_intermediate_ca_for_service_kube_scheduler_tls/</code> Intermediate CA for K8S: kube-scheduler TLS
  +
* <code>k8s_pki_intermediate_ca_for_service_kubelet_client_auth/</code> Intermediate CA for K8S: kubelet CLIENT_AUTH
  +
* <code>k8s_pki_intermediate_ca_for_service_kubelet_tls/</code> Intermediate CA for K8S: kubelet TLS
  +
  +
<BR>
  +
  +
=<code>k8s_pki_intermediate_ca_for_service_etcd/=
  +
  +
k8s_pki_intermediate_ca_for_service_etcd/</code> - используется для клиентских и серверных сертификатов <code>etcd</code>.<BR>
  +
Строго говоря, не является частью k8s и настраивается отдельно ([[Vault_PKI_Intermediate_ca_etcd_Kubernetes_the_hard_way_v2|Настройка PKI для <code>etcd</code>]])
  +
* для шифрования endpoints
  +
* для авторизации клиентов
  +
  +
  +
=tls=
  +
Для всех TLS-PKI <code>k8s_pki_intermediate_ca_for_service_kube_apiserver_tls/</code>
  +
<code>k8s_pki_intermediate_ca_for_service_kube_controller_manager_tls/</code>
  +
<code>k8s_pki_intermediate_ca_for_service_kube_scheduler_tls/</code>
  +
<code>k8s_pki_intermediate_ca_for_service_kubelet_tls/</code> в целом настройка практически одинаковая, и состоит из одних и тех же шагов.
  +
  +
==Общие переменные==
  +
<PRE>
  +
#!/bin/bash
  +
  +
  +
export SERVICE_NAME='kube-apiserver'
  +
#export SERVICE_NAME="kube-controller-manager"
  +
#export SERVICE_NAME="kube-scheduler"
  +
#export SERVICE_NAME="kubelet"
  +
  +
export PKI_PATH_PREFIX="k8s_pki_intermediate_ca_for_service"
  +
export USAGE="TLS"
  +
  +
  +
export SERVICE_NAME_UNDERSCORE=$(echo ${SERVICE_NAME} | sed 's/-/_/g')
  +
export USAGE_LOWERCASE=$(echo "${USAGE,,}")
  +
  +
  +
export PKI_PATH="${PKI_PATH_PREFIX}_${SERVICE_NAME_UNDERSCORE}_${USAGE_LOWERCASE}"
  +
  +
  +
export VAULT_ADDR=http://vault.home:8200
  +
export VAULT_TOKEN="s.Yb1J2VamFyYoav3VVE2YQQ88"
  +
  +
export INTERMEDIATE_CA_DESCRIPTION="PKI Intermediate CA for K8S: ${SERVICE_NAME} ${USAGE}"
  +
  +
  +
COMMON_NAME="Intermediate CA for service ${SERVICE_NAME} ${USAGE}"
  +
COUNTRY="Ukraine"
  +
LOCALITY="Kharkov"
  +
STREET_ADDRESS="Lui Pastera st. 322 app. 131"
  +
POSTAL_CODE="61172"
  +
ORGNIZATION="K8s The Hardest Way Labs"
  +
OU="IT"
  +
TTL="175200h"
  +
  +
MAX_LEASE_TIME="175200h"
  +
  +
  +
COMMON_SETTINGS=()
  +
COMMON_SETTINGS+=( "common_name=${COMMON_NAME}")
  +
COMMON_SETTINGS+=( "country=${COUNTRY}" )
  +
COMMON_SETTINGS+=( "locality=${LOCALITY}" )
  +
COMMON_SETTINGS+=( "street_address=${STREET_ADDRESS}" )
  +
COMMON_SETTINGS+=( "postal_address=${POSTAL_CODE}" )
  +
COMMON_SETTINGS+=( "organization=${ORGNIZATION}" )
  +
COMMON_SETTINGS+=( "ou=${OU}" )
  +
COMMON_SETTINGS+=( "ttl=${TTL}" )
  +
</PRE>
  +
==01_create_intermnediate_endpoints.sh==
  +
<PRE>
  +
#!/bin/bash
  +
  +
set -eu${DEBUG:+x}
  +
  +
source 00_env.sh
  +
  +
  +
# Delete if exists or ignore error
  +
  +
vault \
  +
secrets \
  +
disable \
  +
${PKI_PATH} || true
  +
  +
vault \
  +
secrets \
  +
enable \
  +
-path=${PKI_PATH} \
  +
-description="${INTERMEDIATE_CA_DESCRIPTION}" \
  +
-max-lease-ttl="${MAX_LEASE_TIME}" \
  +
pki
  +
</PRE>
  +
==02_create_cert_request.sh==
  +
<PRE>
  +
#!/bin/bash
  +
  +
set -eu${DEBUG:+x}
  +
  +
source 00_env.sh
  +
  +
vault \
  +
write \
  +
-format=json \
  +
${PKI_PATH}/intermediate/generate/exported \
  +
"${COMMON_SETTINGS[@]}" > ${PKI_PATH}.json
  +
  +
  +
cat ${PKI_PATH}.json | jq -r '.data.csr' > ${PKI_PATH}_intermediate_ca.csr
  +
cat ${PKI_PATH}.json | jq -r '.data.private_key' > ${PKI_PATH}_intermediate_ca.key
  +
</PRE>
  +
==03_create_cert_based_on_csr.sh==
  +
<PRE>
  +
#!/bin/bash
  +
  +
set -eu${DEBUG:+x}
  +
  +
source 00_env.sh
  +
  +
vault \
  +
write \
  +
-format=json \
  +
k8s_pki_root_ca/root/sign-intermediate \
  +
csr=@${PKI_PATH}_intermediate_ca.csr \
  +
"${COMMON_SETTINGS[@]}" > ${PKI_PATH}_intermediate_ca_pem_bundle.json
  +
  +
  +
cat ${PKI_PATH}_intermediate_ca_pem_bundle.json | jq -r '.data.certificate' > ${PKI_PATH}_intermediate_ca_pem.crt
  +
cat ${PKI_PATH}_intermediate_ca_pem_bundle.json | jq -r '.data.issuing_ca' > k8s_root_certificate.pem
  +
</PRE>
  +
  +
==04_validate_intermediate_ca.sh==
  +
<PRE>
  +
#!/bin/bash
  +
  +
set -eu${DEBUG:+x}
  +
  +
source 00_env.sh
  +
  +
openssl \
  +
verify \
  +
-verbose \
  +
-CAfile k8s_root_certificate.pem \
  +
${PKI_PATH}_intermediate_ca_pem.crt
  +
</PRE>
  +
  +
==05_load_intermediate_ca_to_vault.sh==
  +
<PRE>
  +
#!/bin/bash
  +
  +
set -eu${DEBUG:+x}
  +
  +
source 00_env.sh
  +
  +
vault \
  +
write \
  +
${PKI_PATH}/intermediate/set-signed \
  +
certificate=@${PKI_PATH}_intermediate_ca_pem.crt \
  +
key=@${PKI_PATH}_intermediate_ca.key
  +
</PRE>
  +
==06_configure_intermediate_ca_urls.sh==
  +
<PRE>
  +
#!/bin/bash
  +
  +
set -eu${DEBUG:+x}
  +
source ./00_env.sh
  +
  +
  +
vault \
  +
write \
  +
${PKI_PATH}/config/urls \
  +
issuing_certificates="${VAULT_ADDR}/v1/${PKI_PATH}/ca" \
  +
crl_distribution_points="${VAULT_ADDR}/v1/${PKI_PATH}/crl"
  +
</PRE>
  +
  +
  +
==07_kube_apiserver_server_cert_role.sh==
  +
  +
==08_kube_apiserver_server_cert_policy.sh==
  +
==09_show_all.sh==
  +
  +
=client_auth=
  +
  +
==<code>k8s_pki_intermediate_ca_for_service_kube_apiserver_client_auth/</code>==
  +
  +
==<code>k8s_pki_intermediate_ca_for_service_kubelet_client_auth/</code>==

Текущая версия на 16:02, 7 января 2023

Прежде чем начать

Для понимания ЗАЧЕМ это делается - можно просмотреть Описание СА и сертификатов (которые будут созданы в этой секции)
Однако это не требуется - можно сначала сделать все необходимые настройки, и только после разобрать зачем они нужны

Terraform

По-хорошему эту часть надо делать не скриптами на баше и вызовами vault, а с помощью terraform, но пока-что руки не дошли переделать.

Какие есть CA

В этой инсталляции используются следующие CA

  • k8s_pki_root_ca/ k8s Root CA, Корневой СА, которым подписаны промежуточные СА и только они. Все остальные сертификаты подписаны промежуточными СА.
  • k8s_pki_intermediate_ca_for_service_etcd/ Intermediate CA for ETCd service, СА которым подписываются сертификаты для etcd
  • k8s_pki_intermediate_ca_for_service_kube_apiserver_client_auth/ Intermediate CA for K8S: kube-apiserver CLIENT_AUTH
  • k8s_pki_intermediate_ca_for_service_kube_apiserver_tls/ Intermediate CA for K8S: kube-apiserver TLS
  • k8s_pki_intermediate_ca_for_service_kube_controller_manager_tls/ Intermediate CA for K8S: kube-controller-manager TLS
  • k8s_pki_intermediate_ca_for_service_kube_scheduler_tls/ Intermediate CA for K8S: kube-scheduler TLS
  • k8s_pki_intermediate_ca_for_service_kubelet_client_auth/ Intermediate CA for K8S: kubelet CLIENT_AUTH
  • k8s_pki_intermediate_ca_for_service_kubelet_tls/ Intermediate CA for K8S: kubelet TLS


k8s_pki_intermediate_ca_for_service_etcd/

k8s_pki_intermediate_ca_for_service_etcd/ - используется для клиентских и серверных сертификатов etcd.
Строго говоря, не является частью k8s и настраивается отдельно (Настройка PKI для etcd)

  • для шифрования endpoints
  • для авторизации клиентов


tls

Для всех TLS-PKI k8s_pki_intermediate_ca_for_service_kube_apiserver_tls/ k8s_pki_intermediate_ca_for_service_kube_controller_manager_tls/ k8s_pki_intermediate_ca_for_service_kube_scheduler_tls/ k8s_pki_intermediate_ca_for_service_kubelet_tls/ в целом настройка практически одинаковая, и состоит из одних и тех же шагов.

Общие переменные

#!/bin/bash


export SERVICE_NAME='kube-apiserver'
#export SERVICE_NAME="kube-controller-manager"
#export SERVICE_NAME="kube-scheduler"
#export SERVICE_NAME="kubelet"

export PKI_PATH_PREFIX="k8s_pki_intermediate_ca_for_service"
export USAGE="TLS"


export SERVICE_NAME_UNDERSCORE=$(echo ${SERVICE_NAME} | sed 's/-/_/g')
export USAGE_LOWERCASE=$(echo "${USAGE,,}")


export PKI_PATH="${PKI_PATH_PREFIX}_${SERVICE_NAME_UNDERSCORE}_${USAGE_LOWERCASE}"


export VAULT_ADDR=http://vault.home:8200
export VAULT_TOKEN="s.Yb1J2VamFyYoav3VVE2YQQ88"

export INTERMEDIATE_CA_DESCRIPTION="PKI Intermediate CA for K8S: ${SERVICE_NAME} ${USAGE}"


COMMON_NAME="Intermediate CA for service ${SERVICE_NAME} ${USAGE}"
COUNTRY="Ukraine"
LOCALITY="Kharkov"
STREET_ADDRESS="Lui Pastera st. 322 app. 131"
POSTAL_CODE="61172"
ORGNIZATION="K8s The Hardest Way Labs"
OU="IT"
TTL="175200h"

MAX_LEASE_TIME="175200h"


COMMON_SETTINGS=()
COMMON_SETTINGS+=( "common_name=${COMMON_NAME}")
COMMON_SETTINGS+=( "country=${COUNTRY}" )
COMMON_SETTINGS+=( "locality=${LOCALITY}" )
COMMON_SETTINGS+=( "street_address=${STREET_ADDRESS}" )
COMMON_SETTINGS+=( "postal_address=${POSTAL_CODE}" )
COMMON_SETTINGS+=( "organization=${ORGNIZATION}" )
COMMON_SETTINGS+=( "ou=${OU}" )
COMMON_SETTINGS+=( "ttl=${TTL}" )

01_create_intermnediate_endpoints.sh

#!/bin/bash

set -eu${DEBUG:+x}

source 00_env.sh


# Delete if exists or ignore error

vault \
  secrets \
    disable \
      ${PKI_PATH} || true

vault \
  secrets \
    enable \
      -path=${PKI_PATH} \
      -description="${INTERMEDIATE_CA_DESCRIPTION}" \
      -max-lease-ttl="${MAX_LEASE_TIME}" \
    pki

02_create_cert_request.sh

#!/bin/bash

set -eu${DEBUG:+x}

source 00_env.sh

vault \
    write \
        -format=json \
        ${PKI_PATH}/intermediate/generate/exported \
        "${COMMON_SETTINGS[@]}" > ${PKI_PATH}.json


cat ${PKI_PATH}.json | jq -r '.data.csr' > ${PKI_PATH}_intermediate_ca.csr
cat ${PKI_PATH}.json | jq -r '.data.private_key' > ${PKI_PATH}_intermediate_ca.key

03_create_cert_based_on_csr.sh

#!/bin/bash

set -eu${DEBUG:+x}

source 00_env.sh

vault \
    write \
        -format=json \
        k8s_pki_root_ca/root/sign-intermediate \
        csr=@${PKI_PATH}_intermediate_ca.csr \
        "${COMMON_SETTINGS[@]}" > ${PKI_PATH}_intermediate_ca_pem_bundle.json


cat ${PKI_PATH}_intermediate_ca_pem_bundle.json | jq -r '.data.certificate' > ${PKI_PATH}_intermediate_ca_pem.crt
cat ${PKI_PATH}_intermediate_ca_pem_bundle.json | jq -r '.data.issuing_ca'  > k8s_root_certificate.pem

04_validate_intermediate_ca.sh

#!/bin/bash

set -eu${DEBUG:+x}

source 00_env.sh

openssl \
    verify \
    -verbose \
     -CAfile k8s_root_certificate.pem \
    ${PKI_PATH}_intermediate_ca_pem.crt

05_load_intermediate_ca_to_vault.sh

#!/bin/bash

set -eu${DEBUG:+x}

source 00_env.sh

vault \
    write \
    ${PKI_PATH}/intermediate/set-signed \
    certificate=@${PKI_PATH}_intermediate_ca_pem.crt \
    key=@${PKI_PATH}_intermediate_ca.key

06_configure_intermediate_ca_urls.sh

#!/bin/bash

set -eu${DEBUG:+x}
source ./00_env.sh


vault \
    write \
    ${PKI_PATH}/config/urls \
        issuing_certificates="${VAULT_ADDR}/v1/${PKI_PATH}/ca" \
        crl_distribution_points="${VAULT_ADDR}/v1/${PKI_PATH}/crl"


07_kube_apiserver_server_cert_role.sh

08_kube_apiserver_server_cert_policy.sh

09_show_all.sh

client_auth

k8s_pki_intermediate_ca_for_service_kube_apiserver_client_auth/

k8s_pki_intermediate_ca_for_service_kubelet_client_auth/