Blog

Fein abgestufter EC2-Zugang mit SSM, IAM Identity Center und Tags

Thomas de Ruiter

Thomas de Ruiter

Aktualisiert März 17, 2026
5 Minuten

Wenn Ihr Unternehmen das IAM Identity Center (früher AWS Single Sign-On, AWS SSO) verwendet, ist die Wahrscheinlichkeit groß, dass die meisten Benutzer beim Zugriff auf AWS-Konten dieselbe IAM-Rolle annehmen.

Aber was ist, wenn Sie den Zugriff auf EC2-Instanzen dennoch für einzelne Benutzer einschränken möchten?

Wir sind auf genau dieses Szenario gestoßen und haben eine einfache Lösung gefunden, die für andere nützlich sein könnte - auch für unser zukünftiges Ich.

Annahmen

Wir gehen von den folgenden Annahmen aus:

  • Der Zugriff auf die IAM-Rolle erfolgt ausschließlich über SSO und kann auf keine andere Weise übernommen werden.
  • Der Zugriff auf EC2-Instanzen erfolgt ausschließlich über SSM Session Manager.

Wenn in Ihrer Umgebung nicht ausschließlich über SSM Session Manager auf EC2-Instanzen zugegriffen wird, ist dies eine Überlegung wert. Session Manager beseitigt die Notwendigkeit offener SSH-Ports und zentralisiert die Zugriffskontrolle in IAM, wodurch sowohl der betriebliche Aufwand als auch das Sicherheitsrisiko reduziert werden.

Lösung

Die Idee ist ganz einfach: Wir versehen jede EC2-Instanz mit einem User -Tag und stellen sicher, dass Benutzer nur auf Instanzen eine Sitzung starten können, bei denen dieses Tag mit ihrem Benutzernamen übereinstimmt.

Einem zweiten Benutzer kann der Zugriff gestattet werden, indem Sie das Tag User2 setzen. Damit diese Regel gilt, muss das Tag User jedoch noch vorhanden sein.

Um dies zu erzwingen, fügen wir eine explizite Ablehnungsanweisung zu der IAM-Richtlinie hinzu, die der gemeinsamen Rolle zugeordnet ist:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyStartSessionIfUserNotInSessionUserTags",
      "Effect": "Deny",
      "Action": "ssm:StartSession",
      "Resource": "arn:aws:ec2:*:*:instance/*",
      "Condition": {
        "Null": {
          "ssm:resourceTag/User": "false"
        },
        "StringNotLike": {
          "aws:userid": [
            "AROA*:${ssm:resourceTag/User}",
            "AROA*:${ssm:resourceTag/User2}"
          ]
        }
      }
    }
  ]
}
Wie das funktioniert

Diese Anweisung verweigert ssm:StartSession, wenn die Instanz ein User Tag hat und die Identität des Anrufers nicht mit diesem Wert übereinstimmt.

Lassen Sie uns das aufschlüsseln:

  • "Null": { "ssm:resourceTag/User": "false" }

Dadurch wird sichergestellt, dass die Anweisung nur gilt, wenn das Tag User in der Zielinstanz vorhanden ist. - Wenn User vorhanden ist → wird die Bedingung als wahr ausgewertet und der Rest der Anweisung wird ausgewertet. - Wenn User nicht vorhanden ist → wird die Anweisung nicht angewendet. Mit anderen Worten: Nicht markierte Instanzen sind von dieser Ablehnungsregel nicht betroffen.

  • "StringNotLike": { "aws:userid": [ "AROA*:${ssm:resourceTag/User}", "AROA*:${ssm:resourceTag/User2}" ] }

Wenn sich ein Benutzer über das IAM Identity Center anmeldet, sieht die Seite aws:userid in etwa so aus wie AROAABCDEFGHIJKL:username.

  • Der Teil AROA... identifiziert die Rolle.
  • Der Teil nach dem Doppelpunkt steht für den Sitzungsnamen, der im Falle von SSO in der Regel von der Identity Center-Benutzeridentität abgeleitet wird (z. B. Benutzername oder E-Mail), je nach Ihrer Konfiguration.
  • Es ist sehr wichtig, dass die Rolle nicht auf andere Weise übernommen werden kann, da sonst der letzte Teil frei gewählt werden kann.
  • Die Bedingung überprüft, dass aws:userid nicht mit dem Muster AROA*:<UserTagValue> übereinstimmt.
  • Wenn aws:userid keinem der zulässigen Muster entspricht, wird die Bedingung als wahr ausgewertet und die Ablehnung gilt, wodurch ssm:StartSession verhindert wird.

Verhinderung von Manipulationen

Dieses Modell funktioniert natürlich nur, wenn der Benutzer das Tag User nicht selbst ändern kann. Um Manipulationen zu verhindern, fügen wir eine ergänzende Deny-Anweisung hinzu:

    {
      "Sid": "PreventTamperingWithSessionUserTags",
      "Effect": "Deny",
      "Action": [
        "ec2:CreateTags",
        "ec2:DeleteTags"
      ],
      "Resource": "arn:aws:ec2:*:*:instance/*",
      "Condition": {
        "ForAnyValue:StringEquals": {
          "aws:TagKeys": [
            "User",
            "User2"
          ]
        }
      }
    }
Wie das funktioniert

Diese Anweisung verweigert jeden Versuch, das Benutzer-Tag auf EC2-Instanzen zu erstellen oder zu löschen.

  • ec2:CreateTags und ec2:DeleteTags sind die API-Aufrufe, mit denen Sie Tags verwalten können.
  • aws:TagKeys enthält die Liste der in der Anfrage enthaltenen Tag-Schlüssel.
  • ForAnyValue:StringEquals bedeutet, dass diese Verweigerung gilt, wenn ein Tag-Schlüssel in der Anfrage User oder User2 ist.

In der Praxis bedeutet dies, dass jede Anfrage, die User oder User2 enthält, abgelehnt wird.

  • Dies blockiert das Hinzufügen, Entfernen oder Ändern von Benutzer/Benutzer2, selbst bei gemischten Tag-Operationen.

Dadurch wird sichergestellt, dass die Eigentümerschaft konsequent durchgesetzt wird und nicht durch Änderung des Tags umgangen werden kann. Diese Anweisungen können erweitert werden, um weitere Tags abzudecken.

Sicherer Weg

Ein robusterer und zukunftssichererer Ansatz wäre die Verwendung von Principal Tags anstelle der Analyse von Identitätsinformationen aus aws:userid.

Wenn eine Rolle übernommen wird, können Sie mit AWS Sitzungs-Tags (auch als Principal Tags bezeichnet) anhängen. Diese Tags werden Teil des Identitätskontexts und können in IAM-Richtlinien referenziert werden: ${aws:PrincipalTag/<TagKey>}

Als Teil des SSO-Prozesses könnten wir eine Markierung hinzufügen wie: User: alice

Die Politik würde viel einfacher werden:

"StringNotEquals": {
  "ssm:resourceTag/User": "${aws:PrincipalTag/User}"
}

Dies hat mehrere Vorteile:

  • keine Abhängigkeit von der internen Struktur von aws:userid
  • weniger anfällig, wenn AWS jemals die Formatierung der Rollensitzung ändert
  • dieses Tag wird durch die Föderation/Session-Tag-Konfiguration kontrolliert und ist schwer zu fälschen

Warum wir es nicht verwendet haben

In unserem Fall haben wir nicht die Möglichkeit, benutzerdefinierte Principal Tags an IAM Identity Center Rollensitzungen anzuhängen.

Damit dies funktioniert, benötigen Sie:

  • Attribut-Zuordnungen im IAM Identity Center
  • Berechtigungskonfiguration, die Attribute als Session-Tags weitergibt
  • Die Möglichkeit, diese Zuordnungen kontenübergreifend zu kontrollieren oder zu standardisieren

Da dies in unserer Einrichtung nicht verfügbar war, haben wir uns für einen Abgleich mit aws:userid entschieden, der für Sitzungen mit angenommener Rolle vorhanden ist. Wenn Sie die Kontrolle über die Attributzuordnungen im Identity Center haben, ist die Verwendung von Principal Tags die sauberere und sicherere Methode.

Fazit

Mit zwei kleinen politischen Erklärungen haben wir unsere Ressourcen geschützt.

Dieser Ansatz lässt sich noch weiter ausbauen - zum Beispiel, um zu verhindern, dass Benutzer Instanzen, die ihnen nicht gehören, beenden, stoppen oder ändern.

Das Ergebnis ist ein Zugriffsmodell, das sich mit Ihrem Unternehmen skalieren lässt, keine Schlüsselrotation oder Verwaltung von autorisierten Schlüsseln erfordert und alle Zugriffsentscheidungen in IAM

Verfasst von

Thomas de Ruiter

Cloud Consultant with a passion for everything Cloud. Likes to automate all the things. Believes security is everyone's responsibility!

Contact

Let’s discuss how we can support your journey.