UCS als SAML Identity Provider für AWS IAM

german

#1

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


SAML Login nur für bestimmte Benutzer
#2

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


#3

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'"

#4

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.


#5

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?


#6

Ah, Dankeschön!