Tutoriales

Cómo cifrar etcd y usar secretos en OpenShift

Una secreto Cualquier tipo de objeto o recurso crítico en OpenShift proporciona un mecanismo para guardar información confidencial, como contraseñas, archivos de configuración confidenciales, Transport Layer Security (TLS), credenciales de Secure Shell (SSH) o token de OAuth.

Los secretos se utilizan para conexiones internas entre diferentes recursos. Por ejemplo, las aplicaciones y los servicios pueden compartir datos secretos dentro de un espacio de nombres.

tipo secreto

Hay diferentes tipos de secretos y OpenShift verifica que los datos almacenados en el secreto coincidan con el tipo de secreto utilizado. Los tipos secretos incluyen:

  • kubernetes.io/service-account-token: token de cuenta de servicio
  • kubernetes.io/basic-auth: Credenciales para autenticación básica
  • kubernetes.io/ssh-auth: Credenciales para autenticación SSH
  • kubernetes.io/tls: datos del servidor o cliente TLS
  • opaco: cualquier dato definido por el usuario

Es probable que la mayoría de los tipos secretos que cree sean tipos opacos. El tipo de secreto opaco se usa cuando no desea verificar, lo que significa que el secreto no pretende ajustarse a ninguna convención de valor o nombre de clave.

OpenShift usa secretos por dos razones principales:

  • Almacene las credenciales utilizadas por los pods en una arquitectura de microservicios. Los secretos son útiles cuando desea conectar dos pods.
  • Almacenar certificados y claves TLS. La confidencialidad es fundamental para definir el enrutamiento seguro en una red OpenShift. Los desarrolladores pueden montar secretos como volúmenes y crear rutas de paso a las aplicaciones.Es importante tener en cuenta que el secreto TLS almacena el certificado como tls.crt y la clave del certificado es tls.keypor lo que las aplicaciones que los utilizan deben utilizar la misma convención de nomenclatura.
LEER  Estoy probando el iPad 2 después de casi 10 AÑOS ... 😱

[ Check out this guide to boosting hybrid cloud security and protecting your business. ]

Crear un objeto secreto en el nodo del controlador

Al crear una clave, debe especificar el tipo de clave (por ejemplo, genérica, TLS o docker-registry).

usar --from-literal Marcar para crear un secreto genérico:

$ oc create secret generic topsecret \
--from-literal \
user=vcirrus-consulting \
--from-literal \
password=topsecretpassword \
secret/topsecret created

El secreto después de la creación se ve así:

$ oc get secret topsecret -o yaml                                                                                                                                                                                                             
---
apiVersion: v1
data:
  password: dG9wc2VjcmV0cGFzc3dvcmQ=
  user: dmNpcnJ1cy1jb25zdWx0aW5n
kind: Secret
...

Es importante saber que el secreto no está encriptado. Es solo un ConfigMap codificado con Base64, por lo que cualquiera puede decodificarlo en texto sin formato:

$ echo dmNpcnJ1cy1jb25zdWx0aW5n | base64 --decode                                                                                                                                                                                                       
vcirrus-consulting
$ echo dG9wc2VjcmV0cGFzc3dvcmQ= | base64 --decode                                                                                                                                                                                                 
topsecretpassword

Para proteger los datos confidenciales, puede cifrar etcd. Etcd es un almacén de datos de Kubernetes que contiene información del clúster en pares clave-valor.

[ Learn Kubernetes usage basics in this cheat sheet. ]

Crear secreto común a partir de un archivo

usar --from-file Opción para crear un secreto común usando el contenido del archivo:

$ oc create secret generic top-ssh-secret \
--from-file secure_id_ecdsa \
--from-file secure_id_ecdsa.pub
secret/top-ssh-secret created

Este secure_id_ecdsa y secure_id_ecdsa.pub Los archivos contienen claves SSH privadas y públicas, respectivamente.

revelar secretos a las vainas

Para que un secreto esté disponible para un pod, puede llamar al secreto una variable o un archivo en la configuración del pod.La forma más conveniente de actualizar un pod con la información del secreto es usar oc set env Ordenar. Esto escribe las variables de entorno obtenidas del secreto para el pod o la implementación.

1. Crea un secreto

Primero, cree una clave genérica con las variables que desea usar en el pod:

$ oc create secret generic \
mysql-secret --from-literal user=janedoe \
--from-literal password=mysqlpassword \
--from-literal database=mysqlsecretdb \
--from-literal hostname=janedoe-mysql \
--from-literal root_password=janedoe-password
secret/mysql-secret created

2. Use jq para ver la clave secreta

usar jq Comando para ver la clave que creó en formato JSON:

$ oc get secret mysql-secret -o json | jq                                                                                                                                                                                                         
{
  "apiVersion": "v1",
  "data": {
    "database": "bXlzcWxzZWNyZXRkYg==",
    "hostname": "amFuZWRvZS1teXNxbA==",
    "password": "bXlzcWxwYXNzd29yZA==",
    "root_password": "amFuZWRvZS1wYXNzd29yZA==",
    "user": "amFuZWRvZQ=="
  },
  "kind": "Secret",
  "metadata": {
    "creationTimestamp": "2022-08-22T11:59:41Z",
    "name": "mysql-secret",
    "namespace": "default",
    "resourceVersion": "163733",
    "uid": "b6f43859-ad60-49dd-9be8-3d23f68cd5de"
  },
  "type": "Opaque"
}

[ Want to test your sysadmin skills? Take a skills assessment today. ]

3. Inicie un pod de MySQL

Ahora inicie el pod de MySQL o MariaDB con el nombre janedoe-mysql:

$ oc new-app --name janedoe-mysql --image bitnami/mysql                                                                                                                                                                                    
[…]
--> Success
    Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
     'oc expose service/janedoe-mysql'
    Run 'oc status' to view your app.

4. Esté atento a las fallas de los pods

Observe el estado del pod.Tenga en cuenta que el pod falla con CrashLoopBackOff error:

$ oc get pods -w                                                                                                                                                                                                                                  
NAME                    READY STATUS             RESTARTS    AGE
janedoe-mysql-d5dd---   0/1   ContainerCreating  0           8s
janedoe-mysql-d5dd---   0/1   Error              0           2m44s
janedoe-mysql-d5dd---   0/1   Error              1 (2s ago)  2m45s
janedoe-mysql-d5dd---   0/1   CrashLoopBackOff   1 (2s ago)  2m46s

5. Investigación

El pod falló, puede ver por qué mirando la salida oc logsEn este caso, el pod de MySQL de Bitnami falla porque la variable de entorno no está configurada. Si está ejecutando el pod de MariaDB, oc logs Indicarle qué variable debe establecerse:

$ oc logs janedoe-mysql-d5ddd6877-nqntj                                                                                                                                                                                                       
mysql 12:07:49.52
mysql 12:07:49.52 Welcome to the Bitnami mysql container
mysql 12:07:49.53 Subscribe to project updates by watching 
mysql 12:07:49.53 Submit issues and feature requests at /issues
mysql 12:07:49.54
mysql 12:07:49.54 INFO  ==> ** Starting MySQL setup **
mysql 12:07:49.59 INFO  ==> Validating settings in MYSQL_*/MARIADB_* env vars
mysql 12:07:49.60 ERROR ==> The MYSQL_ROOT_PASSWORD environment variable is empty or not set. Set the environment variable ALLOW_EMPTY_PASSWORD=yes to allow the container to be started with blank passwords. This is recommended only for development.

6. Crea un secreto

Para satisfacer los requisitos de un pod, debe establecer un contraseña raíz variable en secreto.Consulte el paso 1 anterior para crear un contenedor contraseña raíz variable, pero con prefijo MYSQL_.

cuando incluyes CONTRASEÑA_RAÍZ variable y excluir MYSQL_ prefijo, hace que su secreto sea lo suficientemente flexible para trabajar en múltiples entornos. En este caso, la clave se puede adaptar bien, por ejemplo, a un entorno MySQL o MariaDB.

Usar un prefijo es conveniente porque te permite definir una variable y usarla de una manera específica en la configuración.Este ejemplo define contraseña raíz, que no es importante en un entorno MySQL. MySQL requiere una variable con un nombre MYSQL_ROOT_PASSWORD.

7. Actualización de pods fallidos con secretos

Se requiere una imagen MySQL de Bitnami MYSQL_ROOT_PASSWORD Cambiando.El siguiente comando lee las variables de su clave, puede detectar la variable correcta porque una de ellas es contraseña raíz combinar MYSQL_ prefijo:

$ oc set env deployment/janedoe-mysql \
--from secret/mysql-secret --prefix MYSQL_                                                                                                                                                                  
deployment.apps/janedoe-mysql updated

8. Vuelva a observar el módulo y confirme que se está ejecutando.

Ahora que ha actualizado sus claves, verifique el estado del pod MySQL de prueba y verifique que se esté ejecutando:

$ oc get pods -w                                                                                                                                                                                                                                  
NAME                    READY STATUS             RESTARTS   AGE
janedoe-mysql-7c56---   1/1   Running            0          11s

[ Getting started with containers? Check out this no-cost course on deploying containerized applications. ]

9. Explora el entorno de la cápsula

Al establecer todas las variables de entorno con env Ordenar:

$ oc exec -it \
janedoe-mysql-7c567d5564-d99pp – env
[...]
MYSQL_HOSTNAME=janedoe-mysql
MYSQL_PASSWORD=mysqlpassword
MYSQL_ROOT_PASSWORD=janedoe-password
MYSQL_USER=janedoe
MYSQL_DATABASE=mysqlsecretdb
KUBERNETES_PORT_443_TCP=tcp://10.217.4.1:443
JANEDOE_MYSQL_PORT_3306_TCP_ADDR=10.217.5.245
KUBERNETES_PORT=tcp://10.217.4.1:443
JANEDOE_MYSQL_PORT_3306_TCP_PORT=3306
KUBERNETES_SERVICE_PORT_HTTPS=443
[...]

Encapsula tus datos

A pesar de su nombre, un secreto No era un secreto hasta que se encriptó etcd, pero sigue siendo una forma útil de pasar información importante a los pods.

Ahora que sabe cómo usar claves, intente aprender a montar claves como volúmenes (sugerencia: intente oc set volume Ordenar).

Recuerde, debe mantenerlo privado en el servidor de producción.leer Cifrar datos etcd Obtenga más información en la documentación de OpenShift.

LEER  Cómo recuperar archivos borrados en Linux usando TestDisk

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba