<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jorge Rodriguez Noriega</title>
    <description>The latest articles on DEV Community by Jorge Rodriguez Noriega (@jorge_rn).</description>
    <link>https://dev.to/jorge_rn</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4132343%2Fff8179a3-8808-4b02-aaa6-332665361e25.png</url>
      <title>DEV Community: Jorge Rodriguez Noriega</title>
      <link>https://dev.to/jorge_rn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jorge_rn"/>
    <language>en</language>
    <item>
      <title>OCI Workload Identity Federation: acceso sin credenciales permanentes para GitHub Actions, Kubernetes y agentes de IA</title>
      <dc:creator>Jorge Rodriguez Noriega</dc:creator>
      <pubDate>Sat, 19 Sep 2026 05:36:10 +0000</pubDate>
      <link>https://dev.to/jorge_rn/oci-workload-identity-federation-acceso-sin-credenciales-permanentes-para-github-actions-464</link>
      <guid>https://dev.to/jorge_rn/oci-workload-identity-federation-acceso-sin-credenciales-permanentes-para-github-actions-464</guid>
      <description>&lt;p&gt;En arquitecturas cloud modernas, uno de los problemas más comunes no es únicamente cómo autenticar una aplicación, sino cómo hacerlo sin terminar administrando API keys, secretos permanentes y usuarios técnicos que sobreviven mucho más tiempo que el workload que los necesita.&lt;/p&gt;

&lt;p&gt;Este problema se vuelve todavía más relevante cuando trabajamos con pipelines CI/CD, Kubernetes, arquitecturas multicloud y agentes de inteligencia artificial.&lt;/p&gt;

&lt;p&gt;Oracle Cloud Infrastructure está abordando este escenario mediante Workload Identity Federation (WIF), permitiendo que workloads externos utilicen una identidad existente para obtener acceso temporal a recursos OCI sin depender de credenciales OCI permanentes.&lt;/p&gt;

&lt;p&gt;En este artículo veremos qué problema resuelve, cómo funciona conceptualmente y por qué puede cambiar la manera en que diseñamos la autenticación machine-to-machine en OCI.&lt;/p&gt;

&lt;p&gt;El problema: credenciales que viven demasiado tiempo&lt;/p&gt;

&lt;p&gt;Imaginemos un pipeline de GitHub Actions que necesita subir un artefacto a OCI Object Storage.&lt;/p&gt;

&lt;p&gt;Una implementación tradicional podría requerir almacenar información como:&lt;/p&gt;

&lt;p&gt;OCI_USER_OCID&lt;br&gt;
OCI_TENANCY_OCID&lt;br&gt;
OCI_FINGERPRINT&lt;br&gt;
OCI_PRIVATE_KEY&lt;br&gt;
OCI_REGION&lt;/p&gt;

&lt;p&gt;El pipeline funciona.&lt;/p&gt;

&lt;p&gt;Pero ahora existe una nueva responsabilidad:&lt;/p&gt;

&lt;p&gt;proteger la private key;&lt;br&gt;
controlar quién puede leer el secret;&lt;br&gt;
rotar la credencial;&lt;br&gt;
eliminarla cuando deje de utilizarse;&lt;br&gt;
evitar que termine dentro de una imagen, repositorio o log;&lt;br&gt;
auditar qué workload utilizó realmente esa identidad.&lt;/p&gt;

&lt;p&gt;La pregunta entonces es:&lt;/p&gt;

&lt;p&gt;¿Por qué entregar una credencial permanente a un workload que solamente necesita acceso durante unos minutos?&lt;/p&gt;

&lt;p&gt;Aquí aparece Workload Identity Federation.&lt;/p&gt;

&lt;p&gt;¿Qué es OCI Workload Identity Federation?&lt;/p&gt;

&lt;p&gt;OCI Workload Identity Federation permite que una carga de trabajo presente una identidad emitida por una plataforma externa confiable y la intercambie por acceso temporal a OCI.&lt;/p&gt;

&lt;p&gt;Oracle describe este modelo utilizando ephemeral Resource Principal Session Tokens (RPST).&lt;/p&gt;

&lt;p&gt;En lugar de crear permanentemente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`Workload
    ↓
OCI User
    ↓
API Key
    ↓
OCI Resource

podemos utilizar:

Workload
    ↓
Identidad externa verificable
    ↓
OCI Workload Identity Federation
    ↓
Credencial OCI temporal
    ↓
OCI IAM Policy
    ↓
OCI Resource
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;`&lt;br&gt;
El workload mantiene su identidad original.&lt;/p&gt;

&lt;p&gt;OCI valida esa identidad y determina qué acciones puede realizar.&lt;/p&gt;

&lt;p&gt;Arquitectura conceptual&lt;/p&gt;

&lt;p&gt;Una arquitectura simplificada podría verse así:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3rjjhmnai7229a3ab099.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3rjjhmnai7229a3ab099.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La principal diferencia está en que OCI ya no necesita mantener una identidad permanente por cada workload externo.&lt;/p&gt;

&lt;p&gt;Tres conceptos importantes&lt;/p&gt;

&lt;p&gt;Oracle resume este modelo alrededor de tres resultados importantes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No Standing Users&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No es necesario mantener un usuario OCI permanente para cada workload.&lt;/p&gt;

&lt;p&gt;El workload obtiene una sesión efímera.&lt;/p&gt;

&lt;p&gt;Esto puede reducir tareas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;alta de usuarios técnicos;&lt;/li&gt;
&lt;li&gt;revisiones periódicas;&lt;/li&gt;
&lt;li&gt;deshabilitación;&lt;/li&gt;
&lt;li&gt;limpieza;&lt;/li&gt;
&lt;li&gt;offboarding.&lt;/li&gt;
&lt;li&gt;No Standing Credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una aplicación puede utilizar una credencial nativa y temporal de su plataforma.&lt;/p&gt;

&lt;p&gt;Por ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;plaintext&lt;br&gt;
GitHub Actions → OIDC Token&lt;br&gt;
Kubernetes     → Service Account Token&lt;br&gt;
Cloud workload → Platform-issued identity&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Después, OCI puede validar dicha identidad y emitir una sesión temporal.&lt;/p&gt;

&lt;p&gt;Esto evita que una API key OCI de larga duración termine almacenada en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Secrets&lt;/li&gt;
&lt;li&gt;Kubernetes Secrets&lt;/li&gt;
&lt;li&gt;Containers&lt;/li&gt;
&lt;li&gt;CI/CD configuration&lt;/li&gt;
&lt;li&gt;Notebooks&lt;/li&gt;
&lt;li&gt;Agent configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oracle destaca precisamente la eliminación de credenciales permanentes como uno de los principales beneficios del modelo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Claim-Based Authorization&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aquí encontramos uno de los puntos más interesantes.&lt;/p&gt;

&lt;p&gt;Una identidad externa normalmente contiene claims.&lt;/p&gt;

&lt;p&gt;En GitHub podríamos tener información relacionada con:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;organization&lt;/li&gt;
&lt;li&gt;repository&lt;/li&gt;
&lt;li&gt;workflow&lt;/li&gt;
&lt;li&gt;branch&lt;/li&gt;
&lt;li&gt;environment&lt;/li&gt;
&lt;li&gt;issuer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En Kubernetes podríamos identificar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cluster&lt;/li&gt;
&lt;li&gt;namespace&lt;/li&gt;
&lt;li&gt;service account&lt;/li&gt;
&lt;li&gt;issuer&lt;/li&gt;
&lt;li&gt;subject&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estos atributos pueden convertirse en contexto utilizado por OCI IAM para tomar decisiones de autorización.&lt;/p&gt;

&lt;p&gt;Ya no solamente preguntamos:&lt;/p&gt;

&lt;p&gt;¿Quién eres?&lt;/p&gt;

&lt;p&gt;También podemos preguntar:&lt;/p&gt;

&lt;p&gt;¿Desde qué repositorio vienes?&lt;br&gt;
¿Desde qué workflow?&lt;br&gt;
¿Desde qué namespace?&lt;br&gt;
¿Qué ServiceAccount estás utilizando?&lt;br&gt;
¿En qué ambiente estás ejecutándote?&lt;/p&gt;

&lt;p&gt;Esto permite construir controles mucho más específicos.&lt;/p&gt;

&lt;p&gt;Caso 1: GitHub Actions → OCI&lt;/p&gt;

&lt;p&gt;Uno de los escenarios más interesantes es GitHub Actions.&lt;/p&gt;

&lt;p&gt;Supongamos que tenemos:&lt;/p&gt;

&lt;p&gt;Repository:&lt;br&gt;
company/payment-api&lt;/p&gt;

&lt;p&gt;Workflow:&lt;br&gt;
deploy-production.yml&lt;/p&gt;

&lt;p&gt;Branch:&lt;br&gt;
main&lt;/p&gt;

&lt;p&gt;El objetivo es permitir que únicamente ese workflow pueda acceder a determinados recursos de OCI.&lt;/p&gt;

&lt;p&gt;El flujo conceptual sería:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`plaintext&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Developer&lt;br&gt;
    │&lt;br&gt;
    ▼&lt;br&gt;
GitHub Repository&lt;br&gt;
    │&lt;br&gt;
    ▼&lt;br&gt;
GitHub Actions&lt;br&gt;
    │&lt;br&gt;
    │ OIDC token&lt;br&gt;
    ▼&lt;br&gt;
OCI Workload Identity Federation&lt;br&gt;
    │&lt;br&gt;
    │ temporary OCI identity&lt;br&gt;
    ▼&lt;br&gt;
OCI IAM&lt;br&gt;
    │&lt;br&gt;
    ▼&lt;br&gt;
Object Storage / Functions / Other OCI services&lt;/code&gt;&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;GitHub puede emitir un token OIDC firmado que representa el workflow.&lt;/p&gt;

&lt;p&gt;OCI puede validar elementos como:&lt;/p&gt;

&lt;p&gt;Issuer&lt;br&gt;
Repository&lt;br&gt;
Workflow&lt;br&gt;
Branch&lt;br&gt;
Environment&lt;/p&gt;

&lt;p&gt;y posteriormente otorgar una identidad temporal.&lt;/p&gt;

&lt;p&gt;¿Qué cambia desde el punto de vista de seguridad?&lt;/p&gt;

&lt;p&gt;Modelo tradicional:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;plaintext&lt;br&gt;
GitHub Actions&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
GitHub Secret&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
OCI Private API Key&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
OCI User&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
OCI Resource&lt;/code&gt;&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Modelo federado:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`plaintext&lt;/p&gt;

&lt;p&gt;GitHub Actions&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
GitHub OIDC Token&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
OCI WIF&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
Temporary RPST&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
OCI IAM&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
OCI Resource&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;La diferencia parece pequeña visualmente.&lt;/p&gt;

&lt;p&gt;Arquitectónicamente es enorme.&lt;/p&gt;

&lt;p&gt;Comparación&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modelo con credenciales permanentes   Workload Identity Federation&lt;/li&gt;
&lt;li&gt;API Key almacenada    Token temporal&lt;/li&gt;
&lt;li&gt;Usuario técnico OCI  Identidad del workload&lt;/li&gt;
&lt;li&gt;Rotación necesaria   Sesión efímera&lt;/li&gt;
&lt;li&gt;Secrets permanentes   Identidad emitida por plataforma&lt;/li&gt;
&lt;li&gt;Mayor superficie operacional  Menor administración de credenciales&lt;/li&gt;
&lt;li&gt;Identidad generalmente estática  Contexto mediante claims&lt;/li&gt;
&lt;li&gt;Difícil identificar cada ejecución  Mayor granularidad potencial
Caso 2: Kubernetes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kubernetes presenta otro escenario ideal.&lt;/p&gt;

&lt;p&gt;Normalmente nuestras aplicaciones utilizan ServiceAccounts.&lt;/p&gt;

&lt;p&gt;Por ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apiVersion: v1&lt;br&gt;
kind: ServiceAccount&lt;br&gt;
metadata:&lt;br&gt;
  name: payment-api&lt;br&gt;
  namespace: production&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Tenemos entonces una identidad lógica:&lt;/p&gt;

&lt;p&gt;Cluster:&lt;br&gt;
prod-cluster&lt;/p&gt;

&lt;p&gt;Namespace:&lt;br&gt;
production&lt;/p&gt;

&lt;p&gt;ServiceAccount:&lt;br&gt;
payment-api&lt;/p&gt;

&lt;p&gt;En lugar de entregar una API key OCI al pod:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`plaintext&lt;br&gt;
Pod&lt;br&gt;
 ↓&lt;br&gt;
Kubernetes Secret&lt;br&gt;
 ↓&lt;br&gt;
OCI API Key&lt;br&gt;
 ↓&lt;br&gt;
OCI&lt;/p&gt;

&lt;p&gt;podemos construir:&lt;/p&gt;

&lt;p&gt;Pod&lt;br&gt;
 ↓&lt;br&gt;
ServiceAccount Token&lt;br&gt;
 ↓&lt;br&gt;
OCI Identity Federation&lt;br&gt;
 ↓&lt;br&gt;
Temporary Identity&lt;br&gt;
 ↓&lt;br&gt;
OCI IAM&lt;br&gt;
 ↓&lt;br&gt;
OCI Resource&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Esto permite vincular autorización con el contexto real del workload.&lt;/p&gt;

&lt;p&gt;Oracle también soporta identidades de workload directamente en OKE para proporcionar acceso detallado desde workloads Kubernetes a otros recursos OCI. En esos escenarios, la identidad está determinada por la combinación de cluster, namespace y ServiceAccount.&lt;/p&gt;

&lt;p&gt;Ejemplo: aplicación Kubernetes accediendo a Object Storage&lt;/p&gt;

&lt;p&gt;Imaginemos:&lt;/p&gt;

&lt;p&gt;Application:&lt;br&gt;
invoice-service&lt;/p&gt;

&lt;p&gt;Namespace:&lt;br&gt;
finance&lt;/p&gt;

&lt;p&gt;ServiceAccount:&lt;br&gt;
invoice-reader&lt;/p&gt;

&lt;p&gt;Su único requerimiento es consultar archivos de un bucket:&lt;/p&gt;

&lt;p&gt;finance-invoices&lt;/p&gt;

&lt;p&gt;El principio de mínimo privilegio nos dice que deberíamos evitar:&lt;/p&gt;

&lt;p&gt;Allow everything everywhere&lt;/p&gt;

&lt;p&gt;y diseñar una autorización limitada exclusivamente al workload y recurso requerido.&lt;/p&gt;

&lt;p&gt;Conceptualmente:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;plaintext&lt;br&gt;
&lt;/code&gt;invoice-service&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
ServiceAccount&lt;br&gt;
invoice-reader&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
Workload Identity&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
OCI IAM Policy&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
finance-invoices bucket&lt;code&gt;&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;La identidad queda relacionada con la aplicación y no con el worker node completo.&lt;/p&gt;

&lt;p&gt;Esto mejora significativamente la granularidad.&lt;/p&gt;

&lt;p&gt;GitHub Actions también puede utilizar OIDC con OKE&lt;/p&gt;

&lt;p&gt;Oracle dispone además de un patrón específico para permitir que GitHub Actions acceda a clusters OKE mediante OpenID Connect.&lt;/p&gt;

&lt;p&gt;El objetivo es eliminar la necesidad de credenciales de larga duración dentro del pipeline CI/CD.&lt;/p&gt;

&lt;p&gt;En este escenario:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;plaintext&lt;br&gt;
GitHub Actions&lt;br&gt;
      │&lt;br&gt;
      │ OIDC&lt;br&gt;
      ▼&lt;br&gt;
OKE&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
Kubernetes RBAC&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Oracle documenta la posibilidad de habilitar GitHub como issuer OIDC y utilizar RBAC para limitar las operaciones permitidas dentro del cluster.&lt;/p&gt;

&lt;p&gt;Esto es especialmente interesante porque podemos aplicar controles tanto en:&lt;/p&gt;

&lt;p&gt;Cloud IAM&lt;/p&gt;

&lt;p&gt;como en:&lt;/p&gt;

&lt;p&gt;Kubernetes RBAC&lt;br&gt;
Caso 3: agentes de Inteligencia Artificial&lt;/p&gt;

&lt;p&gt;Aquí comienza una discusión todavía más interesante.&lt;/p&gt;

&lt;p&gt;Los agentes de IA están dejando de ser solamente interfaces conversacionales.&lt;/p&gt;

&lt;p&gt;Actualmente pueden ejecutar acciones como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consultar datos&lt;/li&gt;
&lt;li&gt;Leer archivos&lt;/li&gt;
&lt;li&gt;Invocar APIs&lt;/li&gt;
&lt;li&gt;Ejecutar funciones&lt;/li&gt;
&lt;li&gt;Analizar logs&lt;/li&gt;
&lt;li&gt;Crear tickets&lt;/li&gt;
&lt;li&gt;Desplegar aplicaciones&lt;/li&gt;
&lt;li&gt;Modificar infraestructura&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En otras palabras:&lt;/p&gt;

&lt;p&gt;Un agente también es un workload.&lt;/p&gt;

&lt;p&gt;Supongamos que tenemos un agente que debe analizar archivos guardados en OCI Object Storage.&lt;/p&gt;

&lt;p&gt;Una implementación rápida podría ser:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`plaintext&lt;/p&gt;

&lt;p&gt;AI Agent&lt;br&gt;
    │&lt;br&gt;
    ▼&lt;br&gt;
API Key guardada como secret&lt;br&gt;
    │&lt;br&gt;
    ▼&lt;br&gt;
Object Storage&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Funciona.&lt;/p&gt;

&lt;p&gt;Pero ahora el agente posee una credencial permanente.&lt;/p&gt;

&lt;p&gt;Una arquitectura más interesante sería:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8gizfchjjq7rpddtmlf4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8gizfchjjq7rpddtmlf4.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oracle incluye explícitamente AI agents entre los workloads que pueden beneficiarse de este patrón cuando la plataforma de origen puede emitir una identidad verificable.&lt;/p&gt;

&lt;p&gt;Por qué esto es especialmente importante para agentes autónomos&lt;/p&gt;

&lt;p&gt;Un agente autónomo puede ejecutarse:&lt;/p&gt;

&lt;p&gt;24x7&lt;/p&gt;

&lt;p&gt;Puede iniciar cientos de tareas.&lt;/p&gt;

&lt;p&gt;Puede interactuar con múltiples sistemas.&lt;/p&gt;

&lt;p&gt;Por eso deberíamos evitar diseñar algo así:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`plaintext&lt;/p&gt;

&lt;p&gt;AI Agent&lt;br&gt;
  +&lt;br&gt;
Powerful permanent credential&lt;br&gt;
  +&lt;br&gt;
Broad permissions&lt;/p&gt;

&lt;p&gt;La alternativa debería acercarse a:&lt;/p&gt;

&lt;p&gt;Verified workload identity&lt;br&gt;
        +&lt;br&gt;
Short-lived session&lt;br&gt;
        +&lt;br&gt;
Least privilege&lt;br&gt;
        +&lt;br&gt;
Context-based authorization&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;La diferencia fundamental es que estamos desplazando el modelo desde:&lt;/p&gt;

&lt;p&gt;administrar secretos&lt;/p&gt;

&lt;p&gt;hacia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;administrar confianza e identidad.&lt;/li&gt;
&lt;li&gt;Autenticación y autorización no son lo mismo&lt;/li&gt;
&lt;li&gt;Este punto es fundamental.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Workload Identity Federation responde principalmente a:&lt;/p&gt;

&lt;p&gt;¿Quién está realizando la solicitud?&lt;/p&gt;

&lt;p&gt;Pero después necesitamos responder:&lt;/p&gt;

&lt;p&gt;¿Qué puede hacer?&lt;/p&gt;

&lt;p&gt;La respuesta sigue siendo IAM.&lt;/p&gt;

&lt;p&gt;Un workload autenticado correctamente no debería recibir automáticamente acceso total.&lt;/p&gt;

&lt;p&gt;El flujo correcto es:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;plaintext&lt;br&gt;
Authentication&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
Identity verified&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
Authorization&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
IAM Policy evaluation&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
Resource access&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;br&gt;
Claims + IAM = autorización contextual&lt;/p&gt;

&lt;p&gt;Supongamos que un token contiene:&lt;/p&gt;

&lt;p&gt;repository = company/payment-api&lt;br&gt;
branch     = main&lt;br&gt;
environment = production&lt;/p&gt;

&lt;p&gt;Podemos imaginar una política donde solamente determinadas combinaciones sean aceptadas.&lt;/p&gt;

&lt;p&gt;Por ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;plaintext&lt;br&gt;
Repositorio correcto&lt;br&gt;
        +&lt;br&gt;
Workflow correcto&lt;br&gt;
        +&lt;br&gt;
Environment production&lt;br&gt;
        +&lt;br&gt;
Recurso específico&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;El objetivo es evitar un patrón como:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;plaintext&lt;br&gt;
Any repository&lt;br&gt;
      ↓&lt;br&gt;
Any workflow&lt;br&gt;
      ↓&lt;br&gt;
Production resources&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;La identidad por sí sola no proporciona seguridad.&lt;/p&gt;

&lt;p&gt;La seguridad aparece cuando diseñamos correctamente la relación entre:&lt;/p&gt;

&lt;p&gt;Issuer&lt;br&gt;
Claims&lt;br&gt;
Trust&lt;br&gt;
IAM Policies&lt;br&gt;
Resource Scope&lt;br&gt;
ABAC: Attribute-Based Access Control&lt;/p&gt;

&lt;p&gt;Este modelo también abre una puerta interesante hacia Attribute-Based Access Control (ABAC).&lt;/p&gt;

&lt;p&gt;En lugar de mantener cientos de usuarios técnicos:&lt;/p&gt;

&lt;p&gt;service-user-001&lt;br&gt;
service-user-002&lt;br&gt;
service-user-003&lt;br&gt;
service-user-004&lt;br&gt;
...&lt;/p&gt;

&lt;p&gt;podemos utilizar atributos provenientes de la identidad.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;/p&gt;

&lt;p&gt;Repository&lt;br&gt;
Namespace&lt;br&gt;
ServiceAccount&lt;br&gt;
Environment&lt;br&gt;
Issuer&lt;br&gt;
Workflow&lt;/p&gt;

&lt;p&gt;y combinarlos con atributos del recurso.&lt;/p&gt;

&lt;p&gt;Conceptualmente:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;plaintext&lt;br&gt;
Principal Attributes&lt;br&gt;
        +&lt;br&gt;
Resource Attributes&lt;br&gt;
        +&lt;br&gt;
IAM Policy&lt;br&gt;
        =&lt;br&gt;
Authorization Decision&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Oracle señala que ciertos claims provenientes del workload pueden propagarse y utilizarse en decisiones de IAM basadas en atributos.&lt;/p&gt;

&lt;p&gt;Una arquitectura multicloud&lt;/p&gt;

&lt;p&gt;Workload Identity Federation resulta particularmente interesante cuando OCI forma parte de una arquitectura multicloud.&lt;/p&gt;

&lt;p&gt;Por ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvfo754eja2edko0frljh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvfo754eja2edko0frljh.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El mismo principio puede aplicarse a workloads provenientes de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS&lt;/li&gt;
&lt;li&gt;Azure&lt;/li&gt;
&lt;li&gt;Google Cloud&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oracle describe precisamente este modelo de confianza para workloads procedentes de otras plataformas cloud.&lt;/p&gt;

&lt;p&gt;Beneficios arquitectónicos&lt;br&gt;
Menos secretos&lt;/p&gt;

&lt;p&gt;Menos API keys almacenadas implica menos elementos que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proteger;&lt;/li&gt;
&lt;li&gt;rotar;&lt;/li&gt;
&lt;li&gt;distribuir;&lt;/li&gt;
&lt;li&gt;revocar;&lt;/li&gt;
&lt;li&gt;auditar.&lt;/li&gt;
&lt;li&gt;Sesiones temporales
Las credenciales efímeras reducen la ventana de exposición frente a una credencial permanente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Identidad del workload&lt;/p&gt;

&lt;p&gt;Podemos autorizar a:&lt;/p&gt;

&lt;p&gt;payment-api&lt;/p&gt;

&lt;p&gt;en lugar de autorizar genéricamente al:&lt;/p&gt;

&lt;p&gt;worker-node-01&lt;br&gt;
Mejor separación de responsabilidades&lt;/p&gt;

&lt;p&gt;Un workload puede tener únicamente los permisos que necesita.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`plaintext&lt;br&gt;
CI/CD workflow&lt;br&gt;
    → Deploy Function&lt;/p&gt;

&lt;p&gt;Application&lt;br&gt;
    → Read Object Storage&lt;/p&gt;

&lt;p&gt;AI Agent&lt;br&gt;
    → Read specific bucket&lt;/p&gt;

&lt;p&gt;Monitoring Agent&lt;br&gt;
    → Read metrics&lt;/p&gt;

&lt;p&gt;Cada identidad tiene un propósito.&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Consideraciones de seguridad&lt;/p&gt;

&lt;p&gt;Workload Identity Federation elimina algunas responsabilidades, pero no elimina la necesidad de diseñar seguridad.&lt;/p&gt;

&lt;p&gt;Hay varios puntos que considero esenciales.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Validar cuidadosamente el issuer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;OCI debe confiar solamente en proveedores de identidad conocidos y controlados.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Restringir los claims&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No sería suficiente confiar únicamente en:&lt;/p&gt;

&lt;p&gt;issuer = GitHub&lt;/p&gt;

&lt;p&gt;Eso sería demasiado amplio.&lt;/p&gt;

&lt;p&gt;Tiene más sentido evaluar:&lt;/p&gt;

&lt;p&gt;organization&lt;br&gt;
repository&lt;br&gt;
workflow&lt;br&gt;
branch&lt;br&gt;
environment&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Aplicar mínimo privilegio&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La federación no justifica políticas como:&lt;/p&gt;

&lt;p&gt;manage all-resources in tenancy&lt;/p&gt;

&lt;p&gt;Cada workload debería recibir únicamente las acciones que realmente necesita.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Separar DEV, QA y PROD&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Una estrategia saludable sería:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`plaintext&lt;br&gt;
DEV identity&lt;br&gt;
     ↓&lt;br&gt;
DEV resources&lt;/p&gt;

&lt;p&gt;QA identity&lt;br&gt;
     ↓&lt;br&gt;
QA resources&lt;/p&gt;

&lt;p&gt;PROD identity&lt;br&gt;
     ↓&lt;br&gt;
PROD resources&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;No utilizar la misma autorización para todos los ambientes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Auditar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La autenticación machine-to-machine también debe formar parte de nuestra estrategia de observabilidad y auditoría.&lt;/p&gt;

&lt;p&gt;Deberíamos ser capaces de responder preguntas como:&lt;/p&gt;

&lt;p&gt;¿Qué workload accedió?&lt;br&gt;
¿Cuándo?&lt;br&gt;
¿Qué recurso utilizó?&lt;br&gt;
¿Qué operación ejecutó?&lt;br&gt;
¿Qué política permitió la operación?&lt;/p&gt;

&lt;p&gt;En OKE, Oracle indica que las solicitudes realizadas mediante workload identities pueden rastrearse mediante OCI Audit.&lt;/p&gt;

&lt;p&gt;¿Reemplaza completamente las API Keys?&lt;/p&gt;

&lt;p&gt;No necesariamente.&lt;/p&gt;

&lt;p&gt;Existen aplicaciones legacy, integraciones antiguas y escenarios particulares donde todavía pueden utilizarse credenciales tradicionales.&lt;/p&gt;

&lt;p&gt;Pero para nuevos diseños de:&lt;/p&gt;

&lt;p&gt;CI/CD&lt;br&gt;
Kubernetes&lt;br&gt;
Multicloud&lt;br&gt;
Automation&lt;br&gt;
AI Agents&lt;br&gt;
Cloud-native workloads&lt;/p&gt;

&lt;p&gt;vale la pena preguntarnos primero:&lt;/p&gt;

&lt;p&gt;¿Realmente necesito crear otra credencial permanente?&lt;/p&gt;

&lt;p&gt;Muchas veces la respuesta será no.&lt;/p&gt;

&lt;p&gt;Mi regla de diseño&lt;/p&gt;

&lt;p&gt;Cuando diseño acceso machine-to-machine intento seguir este orden:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;¿Existe una identidad nativa del workload?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;¿Podemos establecer confianza con esa identidad?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;¿Podemos utilizar una credencial temporal?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;¿Podemos limitar permisos mediante claims?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;¿Podemos auditar completamente el acceso?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solo si lo anterior no es posible:&lt;br&gt;
considerar una credencial permanente.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este pequeño cambio de mentalidad reduce considerablemente la dependencia de secretos.&lt;/p&gt;

&lt;p&gt;Conclusión&lt;/p&gt;

&lt;p&gt;Durante años, muchas arquitecturas cloud han utilizado el mismo patrón:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F25p5k34ssmwarbapt0qt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F25p5k34ssmwarbapt0qt.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para mí, la parte más interesante no es solamente eliminar API keys.&lt;/p&gt;

&lt;p&gt;Es cambiar la unidad de confianza.&lt;/p&gt;

&lt;p&gt;Ya no confiamos simplemente en una credencial que alguien posee.&lt;/p&gt;

&lt;p&gt;Podemos confiar en la identidad verificable del workload que está ejecutando la operación.&lt;/p&gt;

&lt;p&gt;En arquitecturas donde cada vez tenemos más pipelines, contenedores, automatizaciones y agentes de IA interactuando entre sí, ese cambio puede convertirse en una pieza importante para construir plataformas cloud más seguras y operables.&lt;/p&gt;

&lt;p&gt;Autor: Jorge Luis Rodriguez Noriega&lt;br&gt;
Tema: Oracle Cloud Infrastructure, IAM, DevOps, Kubernetes, AI Security&lt;/p&gt;

&lt;h1&gt;
  
  
  oracle #oci #cloud #devops #kubernetes #githubactions #iam #security #ai #cloudsecurity
&lt;/h1&gt;

</description>
      <category>oracle</category>
      <category>oci</category>
      <category>agents</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
