IBM Security Verify Intégration

IBM Security Verify SSO pour JBoss / Wildfly utilisant IBM Application Gateway

IBM Security Verify peut être utilisé pour fournir une identité basée sur le cloud à IBM Application Gateway (IAG) via la norme OIDC. IAG est un proxy inverse léger qui assure l’authentification et l’autorisation pour les serveurs d’applications web. IAG peut également appliquer des politiques d’authentification supplémentaires basées sur le chemin (par ex. 2FA) lorsque nécessaire.

Connaissances supposées

Ce guide part du principe que vous êtes familier avec :

  • Les applications IBM Security Verify et la gestion d’un registre d’utilisateurs cloud
  • La configuration d’IBM Application Gateway (IAG) – en particulier :
    • Création d’une application Verify à partir du modèle IAG
    • Configuration d’une source d’identité IAG
    • Configuration d’un serveur de ressources IAG
    • Configuration SSL :
      • clé/certificat pour HTTPS
      • SSL mutuel pour les serveurs protégés
      • (Fortement recommandé pour le trafic JBoss ↔ IAG)

Vous devez également connaître l’infrastructure à clés publiques nécessaire aux connexions SSL entre IAG et le serveur jonctionné.

Prérequis

  • Un serveur JBoss / Wildfly configuré pour l’authentification SSO – voir ce guide
  • Un abonnement IBM Security Verify (ou compte d’essai)
  • Une PKI pour sécuriser les connexions vers/depuis IAG et le serveur JBoss/Wildfly

Configuration d’IBM Security Verify

Le scénario Verify explique comment configurer un locataire Verify pour fournir le SSO à IAG. Créez (ou mettez à jour) une application IAG et ajoutez le bon redirect_uri correspondant au domaine/nom d’hôte protégé par l’instance IAG.

Configurez également votre registre d’utilisateurs (Cloud Directory ou source fédérée).


Déploiement d’IBM Application Gateway

Les clés resource_servers et identity dans config.yaml permettent à IAG de transmettre l’identité Verify à JBoss.

Serveurs de ressources

resource_servers:
  - path: "/wildflysso"
    connection_type: ssl
    transparent_path: false
    sni: "demo.integration.server"
    mutual_auth:
      certificate_auth:
        certificate:
          - "@iag.pem"
          - "@iag.key"
    servers:
      - host: "wildfly.integration.server"
        port: 8443
        ssl:
          certificate:
            - "@integration.target.pem"
    identity_headers:
      jwt:
        hdr_name: "Authorization"
        certificate:
          - "@iag.pem"
          - "@iag.key"
        claims:
          - text: "www.ibm.com"
            name: iss
            type: string
          - attr: AZN_CRED_PRINCIPAL_NAME
            name: sub
            type: string
          - text: "demo.websphere.server"
            name: aud
            type: string

Le service (Kubernetes) pour Wildfly doit correspondre au host ci-dessus. Importez la PKI de signature dans le keystore de Wildfly.

Identité

identity:
  oidc:
    client_id: secret:ibm-verify-oidc-integration/client_id
    client_secret: secret:ibm-verify-oidc-integration/client_secret
    discovery_endpoint: https://your.tenant.ibmcloudsecurity.com/oidc/endpoint/default/.well-known/openid-configuration
    redirect_uri_host: ibm.security.integration.demo:30443
    mapped_identity: "{preferred_username}"
    ssl:
      certificate:
        - "@verify_tenant_ca.pem"
    response_type: code
    response_mode: query

Remarque : JBoss/Wildfly utilisent le champ kid du JWT pour localiser la clé publique. Assurez-vous que la valeur kid (DN du certificat X.509 utilisé pour signer le JWT) correspond à la configuration Elytron.

Configuration avancée

advanced:
  configuration:
    - stanza: "jwt:/wildflysso"
      entry: "hdr-format"
      operation: set
      value: "Bearer %TOKEN%"

Retour au guide d’intégration JBoss/Wildfly


Démonstration Wildfly : « Hello World »

La démo déploie :

  1. Un conteneur IAG (RP OIDC) authentifiant via Verify
  2. Un conteneur Wildfly avec une application Java de test

Ressources : https://github.com/IBM-Security/ibm-security-integrations/tree/dev/jboss

Connaissances supposées

  • Déploiement de conteneurs, ConfigMaps et Secrets dans Kubernetes
  • Gestion d’un locataire IBM Security Verify

Prérequis

  • Téléchargez les artefacts depuis les releases (ou construisez-les à partir du code source).
  • Configurez votre accès au cluster Kubernetes.

Création d’une PKI

# Certificats IAG
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:4096 \
  -keyout iag.key -out iag.pem \
  -subj "/C=AU/ST=QLD/L=Gold Coast/O=IBM/CN=demo.iag.server"

# Certificats Wildfly + keystore PKCS12
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:4096 \
  -keyout wildfly.key -out wildfly.pem \
  -subj "/C=AU/ST=QLD/L=Gold Coast/O=IBM/CN=demo.integration.server"

# Keystore Wildfly + import du cert. IAG
openssl pkcs12 -export -out application.keystore -inkey wildfly.key \
  -in wildfly.pem -passout pass:demokeystore -name server
keytool -importcert -keystore application.keystore -file iag.pem \
  -alias isvajwt -storepass demokeystore -noprompt

Secrets IAG

apiVersion: v1
kind: Secret
metadata:
  name: ibm-verify-oidc-integration
type: Opaque
data:
  client_id: "change_this"
  client_secret: "change_this"

ConfigMap IAG

apiVersion: v1
kind: ConfigMap
metadata:
  name: ibm-verify-wildfly-integration-config
data:
  iag.pem: |
    %%IAG_CERTIFICATE%%
  iag.key: |
    %%IAG_KEY%%
  integration.target.pem: |
    %%INTEGRATION_SERVER_CERTIFICATE%%
  verify_tenant_ca.pem: |
    %%VERIFY_TENANT_CERT%%
  config.yaml: |
    # (contenu identique à la section précédente)

Déploiement IAG

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iag-instance
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iag-instance
  template:
    metadata:
      labels:
        app: iag-instance
    spec:
      imagePullSecrets:
        - name: iag-login
      volumes:
        - name: integration-config
          configMap:
            name: ibm-verify-wildfly-integration-config
      containers:
        - name: iag-instance
          image: ibmcom/ibm-application-gateway:21.09.0
          volumeMounts:
            - name: integration-config
              mountPath: /var/iag/config
          readinessProbe:
            exec: { command: ["/sbin/health_check.sh"] }
            initialDelaySeconds: 5
          livenessProbe:
            exec: { command: ["/sbin/health_check.sh"] }
            initialDelaySeconds: 120
---
apiVersion: v1
kind: Service
metadata:
  name: iag-instance
spec:
  type: NodePort
  selector:
    app: iag-instance
  ports:
    - name: iag
      port: 8443
      nodePort: 30443

Déploiement Wildfly de démonstration

apiVersion: v1
kind: ConfigMap
metadata:
  name: wildfly-config
binaryData:
  application.keystore: %%WILDFLY_KEYSTORE%%
  SecTestWeb.war: %%DEMO_APPLICATION%%
  standalone.xml: |
    %%STANDALONE_XML%%
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wildfly-integration
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wildfly-integration
  template:
    metadata:
      labels:
        app: wildfly-integration
    spec:
      volumes:
        - name: wildfly-config
          configMap:
            name: wildfly-config
      containers:
        - name: wildfly
          image: jboss/wildfly:latest
          args: ["/opt/jboss/wildfly/bin/standalone.sh","-b","0.0.0.0","-bmanagement","0.0.0.0"]
          ports:
            - containerPort: 8443
          volumeMounts:
            - { name: wildfly-config, subPath: application.keystore, mountPath: /opt/jboss/wildfly/standalone/configuration/application.keystore }
            - { name: wildfly-config, subPath: SecTestWeb.war, mountPath: /opt/jboss/wildfly/standalone/deployments/SecTestWeb.war }
            - { name: wildfly-config, subPath: standalone.xml, mountPath: /opt/jboss/wildfly/standalone/configuration/standalone.xml }
---
apiVersion: v1
kind: Service
metadata:
  name: wildfly-integration
spec:
  type: NodePort
  selector:
    app: wildfly-integration
  ports:
    - name: wildfly
      port: 8443