{"id":638,"date":"2024-04-15T22:01:47","date_gmt":"2024-04-15T20:01:47","guid":{"rendered":"https:\/\/sparrow365.de\/?p=638"},"modified":"2024-12-24T19:33:16","modified_gmt":"2024-12-24T18:33:16","slug":"grenzerkundung-kleine-vorschau-von-entra-id-administrative-units-fuer-enterprise-apps","status":"publish","type":"post","link":"https:\/\/sparrow365.de\/index.php\/2024\/04\/15\/grenzerkundung-kleine-vorschau-von-entra-id-administrative-units-fuer-enterprise-apps\/","title":{"rendered":"Grenzerkundung: Kleine Vorschau von Entra ID Administrative Units f\u00fcr Enterprise Apps"},"content":{"rendered":"<blockquote>\n<p><strong><em>Zum Zeitpunkt des Verfassens (April 2024) unterst\u00fctzt Microsoft noch nicht, dass Enterprise Apps in Administrativen Units hinzugef\u00fcgt werden<\/em><\/strong><br \/>\n<strong><em>Tats\u00e4chlich kenne ich keine offizielle Previews. Dieser Artikel ist rein spielerisch von mir erstellt; wenn Sie hieraus etwas in Produktion verwenden, liegt die Verantwortung bei Ihnen.<\/em><\/strong><\/p>\n<\/blockquote>\n<p>Ich habe schon einige Artikel geschrieben, die zumindest <em>am Rande<\/em> das Prinzip der geringsten Privilegs behandeln, daher sollte es nicht \u00fcberraschen, dass ich Administrativen Units mag. Tats\u00e4chlich mag ich sie sehr \u2013 wer mag es nicht, Berechtigungen zu entziehen, die Menschen nicht ben\u00f6tigen &#8211; aus Sicherheitsgr\u00fcnden. <em>Nun, ich glaube nicht, dass es \u00fcberhaupt vielen in den Sinn kommt, aber darum geht es nicht.<\/em> \ud83d\ude24<\/p>\n<p>In meinem Artikel, in dem ich die <a href=\"https:\/\/sparrow365.de\/index.php\/2024\/03\/04\/du-brauchst-wahrscheinlich-kein-application-readwrite-all\/#toc-7\">Verwendung von Application.ReadWrite.All Applikationsrechten anprangere<\/a>, f\u00fchre ich als m\u00f6gliche L\u00f6sung ausdr\u00fccklich Administrativen Units (<strong>AUs<\/strong>) auf, die Enterprise Apps und deren App Registrations enthalten. Aber das ist nicht der einzige Ort, an dem sie sehr hilfreich w\u00e4ren. Wenn Sie Cloud App Administrator nicht bereits als Globalen Administrator behandeln, sollten Sie einen <a href=\"https:\/\/www.michev.info\/blog\/post\/5922\/reporting-on-entra-id-integrated-applications-service-principals-and-their-permissions\">Bericht \u00fcber Ihre Enterprise Apps<\/a> erstellen und sich an folgendes erinnern: Ein Cloud App Administrator kann all diese saftigen Anwendungsberechtigungen nutzen, indem er neue App-Anmeldeinformationen erstellt.<\/p>\n<p>Es w\u00e4re gro\u00dfartig, wenn wir eine Gruppe aller weniger kritischen Anwendungen f\u00fcr unsere Administratoren im Tagesgesch\u00e4ft erstellen k\u00f6nnten und die Verwaltung <em>aller<\/em> Anwendungen auf unsere vertrauensw\u00fcrdigsten Personen beschr\u00e4nken k\u00f6nnten &#8211; ohne ein l\u00e4stiges Netzwerk von Ownern oder Rollenzuweisungen zu kn\u00fcpfen&#8230;<\/p>\n<blockquote>\n<p><em>Ich sage, wir sollten keine IAM-Connectoren oder Schnittstellen marke Eigenbau ben\u00f6tigen. Ich sehe euch, Mitsch\u00f6pfer von Apps, die in 2-5 Jahren legacy sein werden.<\/em> \ud83d\udc41\ufe0f <\/p>\n<\/blockquote>\n<p>Wie nah sind wir also dran, Zugriff auf diese Funktions\u00aderweiterung zu erhalten?<\/p>\n<p><br class=\"\"><\/p>\n<h2>Die offizielle Ansicht<\/h2>\n<p>Werfen wir doch zun\u00e4chst einen Blick in die <a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/role-based-access-control\/administrative-units#currently-supported-scenarios\">offizielle Dokumentation<\/a>, um zu sehen, was wir tun k\u00f6nnen <strong>sollen<\/strong>:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/documentedSupportedScenarios.png\" alt=\"supportedAdminUnitScenarios\" \/><\/p>\n<p><br class=\"\"><\/p>\n<p>Also k\u00f6nnen wir Benutzer, Gruppen und Ger\u00e4te einbeziehen, sonst nichts. Diese Einschr\u00e4nkung spiegelt sich im GUI wider, wo auch nur diese Kategorien aufgef\u00fchrt sind:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/OfferedObjectType.png\" alt=\"OfferedObjectType\" \/><\/p>\n<p>Wenn wir versuchen, ein Mitglied hinzuzuf\u00fcgen, werden die verf\u00fcgbaren Objekte immer entsprechend der Kategorie gefiltert. Da Enterprise Apps also im GUI nicht verf\u00fcgbar sind und nicht explizit dokumentiert sind, ist das <em>Aufnehmen von Apps in Admin Units <strong>unm\u00f6glich<\/strong><\/em>, richtig?<\/p>\n<p><br class=\"\"><\/p>\n<h2>Aufnehmen von Apps in Admin Units<\/h2>\n<p>Ich glaube nicht an GUIs.<\/p>\n<p>Ich nutze sie und erkenne ihren Nutzen an. Um jedoch bei etwas sicher zu sein oder seltsames Verhalten zu verstehen, wende ich mich immer der Befehlszeile, Konfigurationsdateien oder in diesem Fall der API zu. Dies gilt insbesondere, da Microsoft einem API-First-Paradigma folgt, was generell bedeutet, dass robustere und aktuellere Optionen \u00fcber die Graph-API verf\u00fcgbar sind. <em>Es sei denn, die Anwendung oder Funktion ist \u00e4lter als das, was sich wie ein Cut-Off-Datum von 2020 anf\u00fchlt. Aber ich schweife ab.<\/em><\/p>\n<p>Also &#8211; da wir wissen, dass uns die Benutzeroberfl\u00e4che nicht spielen l\u00e4sst, sehen wir uns an, was uns Graph an die Hand gibt:<\/p>\n<blockquote>\n<p><em>Voraussetzungen: Ein Benutzer mit Privileged Role Administrator und eine bereits erstellte AU. Die AU-ID kann aus &quot;Overview&quot; abgerufen werden.<\/em><\/p>\n<\/blockquote>\n<pre><code class=\"language-powershell\"># Ersetzen Sie die Platzhalter durch Ihre Werte\n$enterpriseAppObjectID   = &quot;&lt;Enterprise App Object ID&gt;&quot;\n$appRegistrationObjectID = &quot;&lt;App Registration Object ID&gt;&quot;\n$adminUnitID             = &quot;&lt;Admin Unit Object ID&gt;&quot;\n\n# Enterprise App und App Registration zu der Admin Unit hinzu f\u00fcgen:\n$params = @{\n    &quot;@odata.id&quot; = &quot;https:\/\/graph.microsoft.com\/v1.0\/servicePrincipals\/$enterpriseAppObjectID&quot;\n}\nInvoke-MgGraphRequest POST &quot;https:\/\/graph.microsoft.com\/v1.0\/directory\/administrativeUnits\/$adminUnitID\/members\/`$ref&quot; -Body $params\n\n$params = @{\n    &quot;@odata.id&quot; = &quot;https:\/\/graph.microsoft.com\/v1.0\/applications\/$appRegistrationObjectID&quot;\n}\nInvoke-MgGraphRequest POST &quot;https:\/\/graph.microsoft.com\/v1.0\/directory\/administrativeUnits\/$adminUnitID\/members\/`$ref&quot; -Body $params\n\n# Ergebnis anzeigen:\n$res = Invoke-MgGraphRequest GET &quot;https:\/\/graph.microsoft.com\/v1.0\/directory\/administrativeUnits\/$adminUnitID\/members\/&quot;\n$res.value.&#039;@odata.type&#039;<\/code><\/pre>\n<p>Et voil\u00e0: Wir haben erfolgreich die Regeln gebogen. Normalerweise gibt es Sicherheitsvorkehrungen, um sicherzustellen, dass wir nur autorisierte Elemente hinzuf\u00fcgen k\u00f6nnen. Vielleicht ist diese Funktion bald f\u00fcr eine offizielle Vorschau bereit, was uns etwas Spielraum erm\u00f6glicht?<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/APIAddResult.png\" alt=\"addedMembers\" \/><\/p>\n<blockquote>\n<p>Anwendungen sind immer noch nicht in der GUI sichtbar &#8211; es gibt keine &quot;Alle Mitglieder&quot; Schaltfl\u00e4che \ud83d\ude09<\/p>\n<\/blockquote>\n<p><br class=\"\"><\/p>\n<h2>Application Rollen auf Admin Units beschr\u00e4nken<\/h2>\n<p>Anwendungsobjekte zu AUs hinzuf\u00fcgen ist allein nicht besonders n\u00fctzlich. Ohne die M\u00f6glichkeit, einfach App-Mitgliedschaften innerhalb von AUs anzuzeigen, werden Apps nicht leichter kategorisiert (<em>daf\u00fcr haben wir <a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/fundamentals\/custom-security-attributes-overview\">custom security attributes<\/a><\/em>). Der eigentliche Wert von AUs liegt darin, gezieltere Rollenzuweisungen zu erm\u00f6glichen und das Prinzip des geringsten Privilegs zu unterst\u00fctzen, indem eingeschr\u00e4nkte Zuweisungen von &quot;Cloud App Administrator&quot; erm\u00f6glicht werden.<\/p>\n<p>Pr\u00fcfen wir zuerst, ob wir \u00fcber die GUI &quot;Cloud App Administrator&quot; hinzuf\u00fcgen k\u00f6nnen:<\/p>\n<table>\n<thead>\n<tr>\n<th>Admin Unit Rollenverwaltungsdialog<\/th>\n<th>&quot;Role Hinzuf\u00fcgen&quot; Dialog<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/AdminUnitRolesOffered.png\" alt=\"AdminUnitRolesOffered\" \/><\/td>\n<td><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/RoleScopesOffered.png\" alt=\"RoleScopesOffered\" \/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<p>Nun, es stellt sich heraus, dass weder Hinzuf\u00fcgen der Rolle \u00fcber Privileged Identity Management (PIM) noch der AU-spezifische Rollendialog die ben\u00f6tigten Optionen bietet. Also wenden wir uns wieder unserem zuverl\u00e4ssigen Freund, der Graph-API, zu:<\/p>\n<pre><code class=\"language-powershell\"># Hier k\u00f6nnte auch eine Enterprise-App-ID verwendet werden\n$userID = &quot;&lt;ID meines noch nicht privilegierten Benutzers&gt;&quot;\n# Wir m\u00fcssen UPNs aufl\u00f6sen, da sie nicht in Rollenzuweisungen erlaubt sind\n$userID = (Invoke-MgGraphRequest GET &quot;https:\/\/graph.microsoft.com\/v1.0\/users\/$userID&quot;).id\n\n$params = @{\n    &quot;@odata.type&quot; = &quot;#microsoft.graph.unifiedRoleAssignment&quot;\n    roleDefinitionId = &quot;158c047a-c907-4556-b7ef-446551a6b5f7&quot; # Cloud Application Administrator\n    principalId = &quot;$userID&quot;\n    directoryScopeId = &quot;\/administrativeUnits\/$adminUnitID&quot;\n}\nInvoke-MgGraphRequest POST &quot;https:\/\/graph.microsoft.com\/v1.0\/roleManagement\/directory\/roleAssignments&quot; -Body $params<\/code><\/pre>\n<blockquote>\n<p>Notiz am Rande: Die PIM-Benutzeroberfl\u00e4che ist flexibel genug, um diese Rollenzuweisung anzuzeigen &#8211; was das Tracking im Vergleich zum Ausf\u00fchren eines Skripts zum Abrufen aller &quot;Owner&quot; Zuweisungen vereinfacht.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/RoleAssignmentInUI.png\" alt=\"RoleASsignmentInUI\" \/><\/p>\n<\/blockquote>\n<hr \/>\n<p>Jetzt, da wir einen Benutzer mit auf die AU beschr\u00e4nkten Berechtigungen haben, \u00fcberpr\u00fcfen wir, ob alles wie erwartet funktioniert. Ich werde mich sowohl in der GUI als auch in PowerShell als BiancaP, dem neu zugewiesenen Cloud App Administrator, in frischen Sitzungen anmelden. Anschlie\u00dfend f\u00fchren wir g\u00e4ngige administrative Aufgaben durch, um zu sehen, wo der Zugriff verweigert &#8211; oder f\u00e4lschlicherweise gew\u00e4hrt wird:<\/p>\n<p><br class=\"\"><\/p>\n<h2>Verwaltung von App-Eigenschaften<\/h2>\n<blockquote>\n<p>Zur Wiederholung, wir handeln nun als <strong>AU beschr\u00e4nkter Cloud App Admin<\/strong> BiancaP f\u00fcr App Registrations und Enterprise Applications, die unserer <strong>AU hinzugef\u00fcgt wurden<\/strong>, es sei denn, es wird ausdr\u00fccklich etwas anderes angegeben!<\/p>\n<\/blockquote>\n<p>Die Tests auf unseren AU Apps waren in der GUI \u00fcberraschend erfolgreich. Daher macht es mehr Sinn, die aktuellen Einschr\u00e4nkungen <em>(Stand April 2024)<\/em> zu listen:<\/p>\n<ol>\n<li>Hinzuf\u00fcgen von Ownern zu Enterprise App und App Registration\n<ul>\n<li>Begegnete Inkonsistenz: Anfangs konnte ich den Benutzer selbst und dann andere hinzuf\u00fcgen, aber ich erhielt <strong>unregelm\u00e4\u00dfig<\/strong> &quot;permission denied&quot; Fehlermeldungen<\/li>\n<li>Diese Einschr\u00e4nkung gilt nicht f\u00fcr direkte API-Aufrufe, bei denen ich keine Probleme festgestellt habe<\/li>\n<\/ul>\n<\/li>\n<li>Aktualisieren des Manifests\n<ul>\n<li>Ich fand keine M\u00f6glichkeit, die Manifestdatei als BiancaP zu bearbeiten<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<blockquote>\n<p>SAML-Konfiguration: Denken Sie daran, dass Administratorrechte sowohl f\u00fcr die App Registration als auch f\u00fcr die Enterprise Application erforderlich sind, um Anpassungen vorzunehmen (z.B. Weiterleitungs-URI und Bezeichner, die Eigenschaften der App Registration sind)<\/p>\n<\/blockquote>\n<p><br class=\"\">  <\/p>\n<p>F\u00fcr die API-Verifizierung f\u00fchrte ich schnelle Stichproben durch. Da die GUI mit der Graph-API interagiert kann man erwarten, dass die API \u00e4hnlich reagiert, wenn sie nicht sogar mehr M\u00f6glichkeiten bietet, wo die GUI an ihre Grenzen st\u00f6\u00dft.<\/p>\n<pre><code class=\"language-powershell\"># Deaktivieren der Enterprise App ( = Enabled for users to sign-in )\n$params = @{\n    accountEnabled = $false\n}\nInvoke-MgGraphRequest PATCH &quot;https:\/\/graph.microsoft.com\/v1.0\/servicePrincipals\/$enterpriseAppObjectID&quot; -Body $params\n\n# Public Client aktivieren, Redirect URI hinzuf\u00fcgen ( die prim\u00e4re Redirect-URI kann nicht entfernt werden)\n$params = @{\n    isFallbackPublicClient = $true\n    web = @{\n        redirectUris = @(&quot;https:\/\/jwt.ms\/saml&quot;, &quot;https:\/\/jwt.ms\/demo&quot;)\n    }\n}\nInvoke-MgGraphRequest PATCH &quot;https:\/\/graph.microsoft.com\/v1.0\/applications\/$appRegistrationObjectID&quot; -Body $params<\/code><\/pre>\n<p>Beide werden erfolgreich ausgef\u00fchrt und haben das erwartete Ergebnis:<\/p>\n<table>\n<thead>\n<tr>\n<th>Aktualisierte App Registration<\/th>\n<th>Aktualisierte Enterprise App<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/UpdatedAppRegistration.png\" alt=\"UpdatedAppRegistration\" \/><\/td>\n<td><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/UpdatedEnterpriseApp.png\" alt=\"UpdatedEnterpriseApp\" \/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><br class=\"\"><\/p>\n<hr \/>\n<p>Wenn wir versuchen die Eigenschaften einer Applikation zu editieren, die nicht in der AU enhalten ist, werden wir wie erwartet blockiert:<\/p>\n<blockquote>\n<p>App Registration<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/AttemptToEditRegOutsideOU.png\" alt=\"AttemptToEditRegOutsideOU\" \/><\/p>\n<p>Enterprise App<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/AttemptingtoEditAppOutsideOu.png\" alt=\"AttemptingtoEditAppOutsideOu\" \/><\/p>\n<p>API Aufrufe (<em>die vorhin funktioniert haben<\/em> \ud83d\ude09)<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/RequestDeniedPATCH.png\" alt=\"RequestDeniedPATCH\" \/><\/p>\n<\/blockquote>\n<p><br class=\"\"><\/p>\n<h2>Owner verwalten<\/h2>\n<p>Wie bereits erw\u00e4hnt, um das seltsame Verhalten in der GUI zu umgehen habe ich getestet, einen Besitzer \u00fcber die Graph-API hinzuzuf\u00fcgen. Diese Methode umgeht auch Einschr\u00e4nkungen beim Bearbeiten des Manifests und erm\u00f6glicht es uns, Enterprise Apps und App Registrations zu l\u00f6schen. Obwohl dies n\u00fctzlich f\u00fcr Tests ist, w\u00fcrde ich es nicht als angemessen f\u00fcr regelm\u00e4\u00dfige administrative Nutzung bezeichnen.<\/p>\n<pre><code class=\"language-powershell\">$userID = $GraphConfig.AUUser\n$userID = (Invoke-MgGraphRequest GET &quot;https:\/\/graph.microsoft.com\/v1.0\/users\/$userID&quot;).id\n\n$params = @{\n    &quot;@odata.id&quot; = &quot;https:\/\/graph.microsoft.com\/v1.0\/directoryObjects\/$userID&quot;\n}\nInvoke-MgGraphRequest POST &quot;https:\/\/graph.microsoft.com\/v1.0\/applications\/$appRegistrationObjectID\/owners\/`$ref&quot; -Body $params\n\n$params = @{\n    &quot;@odata.id&quot; = &quot;https:\/\/graph.microsoft.com\/v1.0\/directoryObjects\/$userID&quot;\n}\nInvoke-MgGraphRequest POST &quot;https:\/\/graph.microsoft.com\/v1.0\/servicePrincipals\/$enterpriseAppObjectID\/owners\/`$ref&quot; -Body $params<\/code><\/pre>\n<p>Ergebnisse sind wieder wie erwartet:<\/p>\n<table>\n<thead>\n<tr>\n<th>App Registration Owner<\/th>\n<th>Enterprise App Owner<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/OwnerToAppReg.png\" alt=\"OwnerToAppReg\" \/><\/td>\n<td><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/OwnerToEnterpriseApp.png\" alt=\"OwnerToEnterpriseApp\" \/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><br class=\"\"><\/p>\n<h2>Erstellen und L\u00f6schen von Apps<\/h2>\n<p>Ich werde nicht zur GUI zur\u00fcckkehren, da es keinen Anwendungsreiter innerhalb der AU gibt \u2014 Definition des Wahnsinn, stimmts? \ud83e\udd2a Zus\u00e4tzlich ist das Erstellen von Apps au\u00dferhalb der AU vorhersehbarerweise deaktiviert:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/GUISaysNoToAddingNewApps.png\" alt=\"GUISaysNoToAddingNewApps\" \/><\/p>\n<p>Leider sto\u00dfen wir nun auf <a href=\"https:\/\/learn.microsoft.com\/en-us\/graph\/api\/administrativeunit-post-members?view=graph-rest-1.0&amp;tabs=http#example-2-create-a-new-group\">explizitere Einschr\u00e4nkungen<\/a> des API-Endpunkts. <strong>Erstellen<\/strong> kann man Gruppen, <strong><em>und nur Gruppen<\/em><\/strong>, innerhalb von AUs:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/NewEntitesEndpoint.png\" alt=\"createObjectDocumentation\" \/><\/p>\n<p>Wenn wir es trotzdem versuchen, erhalten wir den dokumentierten Fehler:<\/p>\n<pre><code class=\"language-powershell\">#Neues Mitglied erstellen:\n$params = @{\n    &quot;@odata.type&quot; = &quot;#Microsoft.Graph.Application&quot;\n    &quot;displayName&quot; = &quot;New Member&quot;\n}\n$res = Invoke-MgGraphRequest POST &quot;https:\/\/graph.microsoft.com\/v1.0\/directory\/administrativeUnits\/$adminUnitID\/members\/&quot; -Body $params -OutputType PSObject<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/APISaysNoToAddingNewApps.png\" alt=\"APISaysNoToAddingNewApps\" \/><\/p>\n<blockquote>\n<p>F\u00fcr diejenigen, die sich fragen, ob es einfach ein Tippfehler war, das w\u00fcrde einen ganz anderen Fehler ausl\u00f6sen \u2014 den ich, nat\u00fcrlich absichtlich, getestet habe. \ud83d\ude07 <br \/>\n<img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/AddingWrongType.png\" alt=\"AddingWrongType\" \/><\/p>\n<\/blockquote>\n<hr \/>\n<p>Weiter geht&#8217;s. Berechtigungen, die auf die AU beschr\u00e4nkt sind, erlauben nicht das Entfernen von Apps, wie hier demonstriert:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/deleteApplicationGUI.png\" alt=\"deleteApplicationGUI\" \/><\/p>\n<p>Ein Versuch, \u00fcber die Graph-API zu l\u00f6schen, f\u00fchrt ebenfalls zur Ablehnung:<\/p>\n<p><code>Invoke-MgGraphRequest DELETE &quot;https:\/\/graph.microsoft.com\/v1.0\/directory\/administrativeUnits\/$adminUnitID\/members\/$appRegistrationObjectID&quot;<\/code><br \/>\n<img decoding=\"async\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2024\/04\/RequestDeniedPATCHShort.png\" alt=\"requestDenied\" \/><\/p>\n<blockquote>\n<p>Wenn wir uns selbst als Besitzer hinzuf\u00fcgen, k\u00f6nnen wir die Anwendung auf herk\u00f6mmliche Weise l\u00f6schen: <br \/>\n<code>Invoke-MgGraphRequest DELETE &quot;https:\/\/graph.microsoft.com\/v1.0\/applications(appId=&#039;$appID&#039;)&quot;<\/code><\/p>\n<\/blockquote>\n<p>Alles in allem kein besonders zufriedenstellendes Ergebnis.<\/p>\n<p><br class=\"\"><\/p>\n<h2>Wie <em>Ich<\/em> hier gelandet bin<\/h2>\n<p>Der Hauptgrund, warum ich mit diesen Tests angefangen habe? Ich konnte einfach nicht glauben, dass es keinen <strong>effizienten Weg gibt, die Erstellung von Apps zu erm\u00f6glichen<\/strong>, ohne mir und meinen Entra-Admin Kollegen <strong>weitreichende Berechtigungen<\/strong> anzulegen. Das ganze Problem dreht sich wirklich um Eigenheiten der Rolle &quot;Application Developer&quot;.<\/p>\n<p>Mein erster Kopfschmerz ist die Nachvervolgung, <strong>wem was geh\u00f6rt<\/strong>. Wenn ein &quot;Application Developer&quot; eine App erstellt, wird er <em>automatisch als Owner hinzugef\u00fcgt<\/em>, da er sie sonst nicht verwalten k\u00f6nnte. Aber wenn Sie darauf abzielen, Apps <strong>gemeinsam zu verwalten<\/strong>, muss der erste Owner <strong>manuell<\/strong> alle weiteren erforderlichen Benutzer hinzuf\u00fcgen &#8211; <a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/enterprise-apps\/overview-assign-app-owners\">Gruppen sind keine Option<\/a>. Entweder das, oder wir m\u00fcssten eine Automatisierung einrichten, wahrscheinlich unter Verwendung benutzerdefinierter Sicherheitsattribute, um die Dinge zu vereinfachen. Es f\u00fchlt sich so an, als ob es einen <strong>besseren Weg geben sollte<\/strong>, oder?<\/p>\n<p>Wichtiger ist, dass ein Application Developer <strong>keine SAML-Anwendungen erstellen kann<\/strong>, da dies <a href=\"https:\/\/learn.microsoft.com\/en-us\/graph\/api\/applicationtemplate-instantiate?view=graph-rest-1.0&amp;tabs=http\">&quot;Instantiieren&quot; einer Anwendungsvorlage erfordert<\/a>, eine Aufgabe, die au\u00dferhalb der Berechtigungen der Rolle liegt. Konkret braucht es <em><code>microsoft.directory\/applicationTemplates\/instantiate<\/code><\/em>, was <a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/role-based-access-control\/permissions-reference#application-developer\">nicht im Application Developer enthalten ist<\/a>. Selbst wenn diese Berechtigung \u00fcber eine benutzerdefinierte Rolle gew\u00e4hrt wird, <em>der Ersteller wird nicht automatisch zum Besitzer<\/em>, was bedeutet, dass der Application Developer aus der gerade erstellten Anwendung <strong>ausgesperrt ist<\/strong>.<\/p>\n<blockquote>\n<p>Dank geht an <a href=\"https:\/\/merill.net\/\">Merill Fernando&#8217;s<\/a> Browser-Plugin <a href=\"https:\/\/graphxray.merill.net\/\">Graph X-Ray<\/a> f\u00fcr Zeitersparnis bei der Recherche &#8211; ich musste nur den Knopf in der Entra-GUI dr\u00fccken und konnte den richtigen Endpunkt und die zugeh\u00f6rige Dokumentation zu finden<\/p>\n<\/blockquote>\n<p>Microsoft L\u00f6sungsvorschlag w\u00e4re es, eine App Registration mit &#8218;Application.ReadWrite.OwnedBy&#8216; Berechtigungen zu erstellen und die Anmeldeinformationen an Administratoren zu verteilen. Meiner Meinung nach ist dieser Ansatz f\u00fcr den t\u00e4glichen Gebrauch nicht praktikabel &#8211; nicht jeder ist mit der Verwendung von PowerShell vertraut.<\/p>\n<blockquote>\n<p>Referenz: Kommentare in meiner <a href=\"https:\/\/learn.microsoft.com\/en-gb\/answers\/questions\/1581859\/is-there-a-way-to-create-a-saml-enterprise-applica\">Q&amp;A akzeptierten Antwort<\/a> als ich dieses Problem zum ersten Mal angegangen bin<\/p>\n<\/blockquote>\n<p><br class=\"\"><\/p>\n<h2>Was wir gelernt haben<\/h2>\n<p>Da dies eine ziemliche Reise war, halte ich es kurz:<\/p>\n<ul>\n<li><strong>Das Feature ist noch nicht f\u00fcr Produktion geeignet<\/strong>, wenn nicht offensichtlich genug durch Mangel an offiziellem Support durch Microsoft<\/li>\n<li>F\u00fcr Szenarien, die nur einmalige Einrichtung erfordern, ist die administrative Erfahrung bereits <em>akzeptabel<\/em><\/li>\n<li>Sobald wir Mitglieder h\u00e4ufig aktualisieren m\u00fcssen, macht fehlende GUI das Management zu umst\u00e4ndlich<\/li>\n<li>Die Unf\u00e4higkeit, Apps zu erstellen, verringert signifikant die Vorteile der im Vergleich zu Alternativen<\/li>\n<\/ul>\n<p><br class=\"\"><\/p>\n<p><u><strong>Unterst\u00fctzte Alternativen und Workarounds:<\/strong><\/u><\/p>\n<ol>\n<li>App Owner\n<ul>\n<li>Verfolgung durch regelm\u00e4\u00dfige \u00dcberpr\u00fcfungen oder Automatisierung<\/li>\n<\/ul>\n<\/li>\n<li>PIM Groups Scoped to Specific Application Objects\n<ul>\n<li>Kombination mit &quot;Application Developer&quot;, um App-Erstellungen zu erm\u00f6glichen<\/li>\n<li>Deckt alles au\u00dfer der Erstellung von SAML-Anwendungen ab<\/li>\n<\/ul>\n<\/li>\n<li>Automatisierung \/ App Registrierung basierend auf Application.ReadWrite.OwnedBy<\/li>\n<\/ol>\n<p><br class=\"\"><\/p>\n<p>Die Notwendigkeit von feiner granulierten Berechtigungen ist zumindest mir klar. In der Zwischenzeit werde ich PIM-Gruppen verwenden und automatisierte App-Erstellungs-Endpunkte entwickeln. Alternativ empfehle ich, dass besonders privilegierte Admins Anwendungen f\u00fcr ihre weniger privilegierten Kollegen erstellen. (Cloud-) App Administrator sollte nicht frei verteilt werden.<\/p>\n<p><br class=\"\"><\/p>\n<p>Haben Sie Gedanken zu diesen Ergebnissen oder sehen Sie etwas, das ich \u00fcbersehen habe? Ich w\u00fcrde gerne von Ihnen h\u00f6ren \ud83d\ude0a. Nehmen Sie an der Diskussion auf meinem <a href=\"https:\/\/www.linkedin.com\/posts\/julian-sperling-4bba72228_grenzerkundung-kleine-vorschau-von-entra-activity-7185924758239109121-UjMP?utm_source=share&amp;utm_medium=member_desktop\">zugeh\u00f6rigen LinkedIn-Beitrag<\/a>.<\/p>\n<p>Wenn Sie an den Dingen interessiert sind, die ich tue, <a href=\"https:\/\/www.linkedin.com\/comm\/mynetwork\/discovery-see-all?usecase=PEOPLE_FOLLOWS&amp;followMember=julian-sperling-4bba72228\">folgen Sie mir auf LinkedIn<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zum Zeitpunkt des Verfassens (April 2024) unterst\u00fctzt Microsoft noch nicht, dass Enterprise Apps in Administrativen Units hinzugef\u00fcgt werden Tats\u00e4chlich kenne ich keine offizielle Previews. Dieser Artikel ist rein spielerisch von mir erstellt; wenn Sie hieraus etwas in Produktion verwenden, liegt die Verantwortung bei Ihnen. Ich habe schon einige Artikel geschrieben, die zumindest am Rande das&#8230; &raquo; <a class=\"read-more-link\" href=\"https:\/\/sparrow365.de\/index.php\/2024\/04\/15\/grenzerkundung-kleine-vorschau-von-entra-id-administrative-units-fuer-enterprise-apps\/\">weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":632,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,48],"tags":[72,243,70,64,52,60,56,253,58],"class_list":["post-638","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-me-id","category-powershell","tag-aad","tag-administrative-units-de","tag-azure-ad","tag-entra","tag-entra-id","tag-graph","tag-graph-api","tag-least-privilege-de","tag-microsoft-graph"],"_links":{"self":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts\/638","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/comments?post=638"}],"version-history":[{"count":5,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts\/638\/revisions"}],"predecessor-version":[{"id":894,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts\/638\/revisions\/894"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/media\/632"}],"wp:attachment":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/media?parent=638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/categories?post=638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/tags?post=638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}