Retira una clave antigua de forma segura

AnsibleBeginner
Practicar Ahora

Introducción

Ava sustituyó un portátil antiguo del estudio. Ambos hosts preparados todavía aceptan su clave, además de las claves actual y de respaldo. Retira únicamente la autorización del dispositivo antiguo y conserva su cuenta y notas originales.

Esta unidad independiente presupone la práctica de usuarios, claves públicas, lookup y bucles de Da acceso a un compañero. Sus claves de formación y cuentas existentes están preparadas; no hereda archivos ni conexiones de la VM anterior.

Retira la clave de un dispositivo antiguo

En este paso revocarás la clave del dispositivo antiguo de Ava en ambos hosts del estudio, demostrarás el rechazo de conexiones nuevas y conservarás su clave actual, la de respaldo y su trabajo original.

Esta unidad tiene su propio entorno nuevo. Ava ya dispone de cuenta y trabajo en ambos destinos. Cada cuenta acepta ahora tres claves de formación: actual, de respaldo y de dispositivo antiguo. Solo retirarás la autorización antigua. Eliminar una clave impide nuevas autenticaciones con ella; no termina conexiones ya autenticadas. Este laboratorio prueba conexiones nuevas y no afirma terminar sesiones.

Abre Controller y entra en el directorio del proyecto. Este comando también recupera una navegación accidental:

cd /home/labex/project

Lee las entradas preparadas y los alias del cliente:

cat approved-staff.json
cat clients.conf

La cuenta aprobada es studio_ava. La clave que debes revocar es training-keys/ava-old.pub; training-keys/ava.pub y training-keys/ava-backup.pub siguen autorizadas. Las claves terminadas en .pub son públicas; sus privadas correspondientes permanecen en el cliente de formación. Los alias eligen host, usuario y clave exacta. -F clients.conf selecciona esta configuración fijada del proyecto; cada llamada ssh crea una conexión nueva. Mantén intactos inventario, ajustes del cliente, confianza de host y claves de formación.

Observa el comportamiento normal antes de modificar el acceso. Entre las comillas simples, el shell remoto ejecuta id y después cat, separados por un punto y coma:

ssh -F clients.conf web1-ava 'id -un; cat work/briefing.txt'
ssh -F clients.conf web2-ava 'id -un; cat work/briefing.txt'

La identidad es studio_ava en ambos, pero las notas Riverside y Hill son diferentes. Verifica también la clave de respaldo:

ssh -F clients.conf web1-ava-backup 'id -un'
ssh -F clients.conf web2-ava-backup 'id -un'

En este momento el dispositivo antiguo todavía es aceptado:

ssh -F clients.conf web1-ava-old 'id -un'
ssh -F clients.conf web2-ava-old 'id -un'

Eliminar una clave de una lista de claves que añadir no solicita retirarla. Observa la diferencia de forma segura con una lista de adiciones vacía. El here-document escribe un archivo completo del controlador: > lo sustituye y YAML entre comillas evita la expansión del shell. Termina el delimitador solo al comienzo de una línea. Si falta el delimitador final y el shell sigue esperando, pulsa Ctrl+C para cancelar la entrada incompleta y ejecuta el bloque completo desde el prompt normal. Un bucle sobre [], una lista YAML vacía, no tiene elementos sobre los que actuar.

cat > additions.yml <<'YAML'
- name: Add listed keys without removing other grants
  hosts: all
  become: true
  gather_facts: false
  vars:
    keys_to_add: []
  tasks:
    - name: Add a listed key
      ansible.posix.authorized_key:
        user: studio_ava
        key: "{{ lookup('file', item) }}"
        state: present
      loop: "{{ keys_to_add }}"
YAML
ansible-playbook additions.yml

La tarea de claves se omite en ambos hosts y ninguno cambia. No inspeccionó todas las autorizaciones posibles para retirar las claves no incluidas. El dispositivo antiguo todavía puede conectar:

ssh -F clients.conf web1-ava-old 'id -un'

Ahora expresa la revocación real. group_vars/all.yml proporciona esta lista a los dos hosts del inventario; no cambia el archivo preparado de aprobación. Cada objeto indica un usuario del curso y una ruta de clave pública del controlador. Repetir un bloque de archivo incorrecto sustituye ese archivo del controlador; no requiere reiniciar la VM.

cat > group_vars/all.yml <<'YAML'
revoked_keys:
  - name: studio_ava
    key_file: training-keys/ava-old.pub
YAML

Usa el módulo de claves aprendido con state: absent, que retira esta clave y conserva la cuenta y las demás autorizaciones. Un bucle procesa cada retirada indicada. Las llaves dobles resuelven la entrada actual; lookup lee la clave pública del controlador. La colección está instalada sin conexión para este proyecto. No uses sustitución exclusiva ni elimines directorios personales, bloquees contraseñas o modifiques el servicio SSH de la plataforma.

cat > revoke.yml <<'YAML'
- name: Revoke only the approved old device keys
  hosts: all
  become: true
  gather_facts: false
  tasks:
    - name: Remove each listed old public key
      ansible.posix.authorized_key:
        user: "{{ item.name }}"
        key: "{{ lookup('file', item.key_file) }}"
        state: absent
      loop: "{{ revoked_keys }}"
YAML

Comprueba la sintaxis. Ante un error YAML, lee la línea indicada, compara sangría/comillas con el bloque completo y reescribe solo ese archivo del controlador.

ansible-playbook revoke.yml --syntax-check

Estas cuentas ya existen, por lo que el check mode compatible puede predecir la retirada. --diff mostraría líneas de claves públicas que no necesitamos para esta vista previa. Usa --check:

ansible-playbook revoke.yml --check

Ambos hosts deben predecir un cambio. Check mode todavía no revocó la autorización real. Aplícala:

ansible-playbook revoke.yml

Ambos hosts deben terminar sin destinos inaccesibles ni tareas fallidas. Se espera que las dos conexiones siguientes fallen con Permission denied (publickey) y estado de salida 255:

ssh -F clients.conf web1-ava-old 'id -un'
ssh -F clients.conf web2-ava-old 'id -un'

Un tiempo de espera, rechazo de conexión o advertencia de clave de host no demuestra revocación. El servidor debe seguir disponible y las claves permitidas deben funcionar. Crea conexiones nuevas actuales y de respaldo para leer ambos archivos originales:

ssh -F clients.conf web1-ava 'id -un; cat work/briefing.txt'
ssh -F clients.conf web2-ava 'id -un; cat work/briefing.txt'
ssh -F clients.conf web1-ava-backup 'id -un; cat work/briefing.txt'
ssh -F clients.conf web2-ava-backup 'id -un; cat work/briefing.txt'

Las cuatro deben funcionar como studio_ava y mostrar las notas originales correspondientes. Conserva bytes, propietario y modo 0640; mantén los directorios personal/de trabajo en 0750, .ssh en 0700 y authorized_keys en 0600. Los archivos pertenecen a studio_ava y su grupo principal. El módulo de claves existente conserva estos permisos seguros preparados.

Repite la declaración real y después su predicción:

ansible-playbook revoke.yml
ansible-playbook revoke.yml --check

Ambos resúmenes deben mostrar changed=0, unreachable=0 y failed=0. Una revocación correcta es un cambio selectivo en la autorización real, no solo un resumen correcto o una lista vacía en el controlador. Si elegiste una ruta de clave equivocada, corrige los datos del controlador; restaura una clave permitida retirada por error con state: present, ya aprendido, y reaplica la retirada selectiva correcta. No recuperes el acceso vaciando todo el archivo de claves ni permitiendo que todos escriban en él.

Resumen

Distinguiste una adición omitida de una revocación explícita, retiraste una autorización de clave pública con state absent, verificaste el rechazo real de nuevas conexiones y conservaste los accesos actuales/de respaldo y ambos archivos originales. Una declaración sin modificar convergió sin cambios innecesarios.