UCS als SAML Identity Provider für AWS IAM

Hi,

Ich habe im UCS Master den SAML Identity Provider ‘AWS’ erstellt und dann die generierte PHP Datei /etc/simplesamlphp/metadata.d/AWS.php geändert:

<?php
$metadata['AWS'] = array(
    'AssertionConsumerService'      => array('https://signin.aws.amazon.com/saml'),
    'NameIDFormat'  => 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
    'simplesaml.nameidattribute'    => 'uid',
    'simplesaml.attributes' => true,
    'authproc' => array(
        10 => array(
        'class' => 'authorize:Authorize',
        'regex' => FALSE,
        'enabledServiceProviderIdentifier' => array('SAMLServiceProviderIdentifier=AWS,cn=saml-serviceprovider,cn=univention,dc=example,dc=org'),
        ),
        10 => array(
            'class' => 'core:AttributeAdd',
            'https://aws.amazon.com/SAML/Attributes/Role' => array(
                'arn:aws:iam::<account-number>:role/<iam_role_1>,arn:aws:iam::<account-number>:saml-provider/<provider-name>'
                'arn:aws:iam::<account-number>:role/<iam_role_2>,arn:aws:iam::<account-number>:saml-provider/<provider-name>'
                )
        ),
        20 => array(
            'class' => 'core:PHP',
            'code' => '
                if (empty($attributes["uid"])) {
                    throw new Exception("Missing uid attribute.");
                }

                $uid = $attributes["uid"][0];
                $attributes["https://aws.amazon.com/SAML/Attributes/RoleSessionName"] = array($uid);
            ',
        ),
    ),
);

Wenn ich für ‘iam_role_1’ und ‘iam_role_2’ die Namen der in IAM konfigurierten Rollen angebe, funktioniert das Login.

Wie kann ich nun die diese Rollen aus dem ‘memberOf’ Attribut des Benutzers auslesen?

Danke

Clifford Sanders

Die Konfigurationsdateien der Service Provider-Einträge im LDAP werden automatisch generiert und sollten daher nicht angepasst werden. Manuelle Änderungen werden von den UCS-Listener-Modulen wieder überschrieben. Daher sollten Sie, wenn Sie mehr Funktionalität benötigen die Konfiguration selbst erstellen, und z.B. durch Anpassung des UCR-Templates /etc/univention/templates/files/etc/simplesamlphp/metadata/00header.php manuell hinzufügen.

Simplesamlphp bietet anscheinend ein Modul, dass Sie benutzen können um die Gruppenmitgliedschaften zu den Attributen hinzuzufügen:
ldap:AttributeAddUsersGroups → simplesamlphp.org/docs/stable/ldap:ldap

Ansonsten ist die Mailingliste von simplesamlphp vermutlich gut geeignet um Hilfe dabei zu bekommen: simplesamlphp.org/lists

Danke für die Hinweise. Ich habe es jetzt auch ohne das ldap:AttributeAddUsersGroups Modul geschafft:

...
15 => array(
    'class' => 'core:PHP',
    'code' => '
        if (empty($attributes["memberOf"])) {
            throw new Exception("Missing memberOf attribute.");
        }

        $memberOfArr = array();

        foreach ($attributes["memberOf"] as $memberOfDN) {
            if (substr( $memberOfDN, 0, 10 ) === "cn=aws-iam") {
                $memberOf = str_replace("cn=aws-iam-", "", explode(",", $memberOfDN)[0]);
                array_push($memberOfArr, "arn:aws:iam::<account-number>:role/".$memberOf.",arn:aws:iam::<account-number>:saml-provider/<provider-name>");
            }
        }
        
        $attributes["https://aws.amazon.com/SAML/Attributes/Role"] = $memberOfArr;
    ',
),
..

Zusätzlich muss das Property saml/idp/ldap/get_attributes um memberOf erweitert werden:

ucr set saml/idp/ldap/get_attributes="'uid', 'mailPrimaryAddress', 'enabledServiceProviderIdentifier', 'memberOf'"

Gab es noch etwas was dafür notwendig war? Ich habe die UCR-Variable erweitert und auch das Attribute ‘memberOf’ zu den gewünschten Attributen hinzugefügt aber leider werden diese nicht zum Service Provider übertragen. Ich Ende quasi in der “Missing memberOf attribute.”-Exception.

Wurde das memberOf Overlay Modul nachträglich installiert? Dann wurde das Attribut bei den Benutzern noch nicht gesetzt.

Um das Attribut zu setzen, musste ich den Benutzer im GUI einmal speichern. Das geht wahrscheinlich auch auf der Kommandozeile?

Ah, Dankeschön!

Hi
hier mal die Version die wir einsetzen:

  • Nutzer können verschiedene AWS Rollen haben
  • Nutzer können verschiedene AWS Accounts haben
  • AWS account und role wird aus per regex aus dem gruppenamen gebildet
  • alle Nutzer müssen in der gruppe aws-login sein.
  • der saml provider name in AWS ist univention
  • memberOf und uid müssen unter Domain => LDAP-Verzeichniss => univention => default-saml-idp eingetragen sein

Ist ein Nutzer in folgenden Univention Gruppen:

cn=aws_<account_id1>_<role1>,cn=groups,dc=example,dc=com
cn=aws_<account_id1>_<role2>,cn=groups,dc=example,dc=com
cn=aws_<account_id2>_<role1>,cn=groups,dc=example,dc=com

bekommt er nach der Univention maske eine auswahl über role1 und role2 in account1 und role1 in account2

/etc/simplesamlphp/metadata.d/https:__signin.aws.amazon.com_saml.php

<?php
    $metadata['https://signin.aws.amazon.com/saml'] = array(
    'AssertionConsumerService'      => array('https://signin.aws.amazon.com/saml'),
    'simplesaml.attributes' => true,
    'attributes' => array('uid','https://aws.amazon.com/SAML/Attributes/Role','https://aws.amazon.com/SAML/Attributes/RoleSessionName'),
    'authproc' => array(
        10 => array(
            'class' => 'authorize:Authorize',
            'regex' => FALSE,
            'memberOf' => array('cn=aws-login,cn=groups,dc=example,dc=com'),

        ),
        20 => array(
            'class' => 'saml:AttributeNameID',
            'attribute' => 'uid',
            'Format' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
        ),
        25 => array(
            'class' => 'core:AttributeAlter',
            'subject' => 'memberOf',
            'pattern' => '/^cn=aws_(.*)_(.*),cn=groups,dc=example,dc=com$/',
            'target' => 'https://aws.amazon.com/SAML/Attributes/Role',
            'replacement' => 'arn:aws:iam::\1:role/\2,arn:aws:iam::\1:saml-provider/univention',

        ),
        40 => array(
            'class' => 'core:AttributeMap',
            'uid' => 'https://aws.amazon.com/SAML/Attributes/RoleSessionName',

        )
    ),
);

Mastodon