Sdílet prostřednictvím


Pokyny pro zabezpečení služby ACS

Aktualizováno: 19. června 2015

Platí pro: Azure

Platí pro

  • Microsoft Azure Active Directory Access Control (označované také jako Služba řízení přístupu nebo ACS)

  • Windows Identity Foundation (WIF)

Shrnutí

Toto téma konsoliduje pokyny zabezpečení pro službu ACS. Pomocí těchto pokynů můžete zlepšit kvalitu implementace z hlediska zabezpečení. Tyto pokyny můžete použít při kontrole architektury aplikace, kontrole chyb zabezpečení kódu a protokolování a kontrole produkčního nasazení. Tyto pokyny vás seznámí s dalšími informacemi o tom, jak postupovat s preskriptivními kroky pro provedení konkrétního úkolu a koncepčními tématy, abyste se dozvěděli více o konkrétní funkci nebo funkci služby ACS.

Cíle

  • Vyřešte problémy se zabezpečením související s kódem a konfigurací aplikace v kontextu služby ACS.

  • Řešení problémů se zabezpečením souvisejících s konfiguracemi služby ACS

  • Vyřešte problémy se zabezpečením související s nasazeními Azure v kontextu služby ACS.

Následují bezpečnostní pokyny související s kódem a konfigurací vaší aplikace.

  • Zvažte nastavení funkce detekce přehrávání (DetectReplayedTokens) na hodnotu true.

  • Nastavte requireHttps atribut wsFederation true.

  • Nastavte vyžaduje atribut atribut cookieHandler true.

  • Nastavte agresivní hodnotu atributu životnosti sessionTokenRequirement.

  • Seznam důvěryhodných vystavitelů tokenů tokenů (tokenů) v issuerNameRegistry.

  • Tokeny oboru, které by měla vaše aplikace přijmout pomocí audienceUri.

Zvažte nastavení funkce detekce přehrání (DetectReplayedTokens) na true.

TECHNOLOGIE WIF má mezipaměť detekce přehrání speciálně pro nosné tokeny služby tokenů zabezpečení (STS), což je jen mezipaměť dříve používaných tokenů tokenů zabezpečení. Když se klient poprvé ověří u předávající strany pomocí tokenu tokenu STS, obdrží token zabezpečení relace, který používá k ověření předávající strany pro všechny další požadavky. Provede to přes protokol SSL (Secure Sockets Layer), aby token zabezpečení relace nemohl být odcizen. Pokud se klient nebo útočník pokusí ověřit předávající straně pomocí tokenu tokenu tokenu pro přehrání a odmítnout požadavek.

Tato mezipaměť nezaručuje, že token nelze nikdy přehrát. Provádí detekci co nejlepšího úsilí na základě velikosti mezipaměti, času vypršení platnosti tokenu tokenu zabezpečení a rychlosti jedinečných žádostí o ověření přijatých předávající stranou. Důrazně doporučujeme nastavit velikost mezipaměti a čas vypršení platnosti tokenu TOKENŮ tokenů tokenu, který vám umožní zajistit správnou rovnováhu

Příklad:

<securityTokenHandlers>
  <securityTokenHandlerConfiguration>
    <tokenReplayDetection enabled="true" capacity="1000" expirationPeriod="500"/>
  </securityTokenHandlerConfiguration>
</securityTokenHandlers>

Poznámka

Tato funkce zavádí spřažení serverů, které můžou vést k problémům se škálovatelností v prostředích s vyrovnáváním zatížení, včetně Azure. Abyste to vyřešili, můžete zvážit implementaci detekce přehrání vlastního tokenu pomocí základní abstraktní třídy Microsoft.IdentityModel.Tokens.TokenReplayCache a následným odkazováním do konfiguračního souboru s kódem podobným následujícímu.

<system.identityModel>
  <identityConfiguration>
    <tokenReplayDetection>
      <replayCache type='FQTN of your type' />
    </tokenReplayDetection>
  </identityConfiguration>
</system.identityModel>

Nastavte atribut requireHttps wsFederation na hodnotu true.

vyžadují, aby službaHttps atributu určuje, jestli modul přesměruje pouze zabezpečenou adresu URL služby STS. Výchozí hodnota je true. Tím se zajistí zabezpečená komunikace se službou STS přes jasný provoz HTTPS/SSL, což zmírní přihlašovací údaje a zašifrování tokenů přes drát.

Příklad:

<federatedAuthentication>
  <wsFederation
        passiveRedirectEnabled="true"
        issuer="http://STS URL GOES HERE/"
        realm="http://RP REALM GOES HERE/"
        requireHttps="ture" />
  <cookieHandler requireSsl="true" />
</federatedAuthentication>

Nastavte atribut requireSsl atributu cookieHandler na hodnotu true.

Tato hodnota je logická hodnota; výchozí hodnota je false. vyžaduje, aby atribut Ssl kontrolovala, jestli je příznak "Secure" generován pro všechny soubory cookie napsané. Pokud je tato hodnota nastavená, soubory cookie relace přihlašování budou k dispozici pouze přes PROTOKOL HTTPS. Tím se zabrání odesílání souborů cookie relace přes jasný provoz, což zmírní hrozbu při zašifrování tokenu přes drát.

Příklad:

<federatedAuthentication>
  <wsFederation
        passiveRedirectEnabled="true"
        issuer="http://STS URL GOES HERE/"
        realm="http://RP REALM GOES HERE/"
        requireHttps="ture" />
  <cookieHandler requireSsl="true" />
</federatedAuthentication>

Nastavení agresivní hodnoty atributu životnosti sessionTokenRequirement

Zvažte, jestli se tokeny nevystavují s agresivními limity životnosti. Tím by se omezil časový rámec útočníka pro přehrání tokenu v případě jeho odcizení.

Příklad:

<add type="Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler, Microsoft.IdentityModel">
  <sessionTokenRequirement securityTokenCacheType="Microsoft.IdentityModel.MruSecurityTokenCache, Microsoft.IdentityModel"
                           saveBootstrapTokens="true"
                           securityTokenCacheSize="500"
                           useWindowsTokenService="false"
                           lifetime="10:00" />
</add>

Výpis důvěryhodných tokenů tokenů (vystavitelů tokenů) v issuerNameRegistry

Všechny tokeny vystavitele se ověřují pomocí IssuerNameRegistry. Účelem IssuerNameRegistry je namapovat token vystavitele na název řetězce. Pokud ověření selže, token se nepřijme. Tím se zmírní hrozba přijetí tokenů, které nejsou důvěryhodné. Libovolný vlastní typ lze zaregistrovat pomocí typu atributu <issuerNameRegistry> elementu. <issuerNameRegistry> může mít jeden podřízený prvek, který bude sloužit jako vlastní konfigurace pro IssuerNameRegistry. Jeden typ IssuerNameRegistry je k dispozici mimo pole ConfigurationBasedIssuerNameRegistry, který lze použít ke konfiguraci sady certifikátů důvěryhodných vystavitelů v konfiguraci. Tento typ vyžaduje podřízený element konfigurace <důvěryhodných rozhraní Issuers>, kde jsou nakonfigurované certifikáty důvěryhodných vystavitelů. <trustedIssuers> konfigurace přidává důvěryhodné certifikáty pomocí formátu ASN.1 s kódováním kryptografického otisku certifikátu.

Příklad:

<issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel">
  <trustedIssuers>
    <add thumbprint="97249e1a5fa6bee5e515b82111ef524a4c9158de" name="contoso.com" />
    <remove thumbprint="97249e1a5fa6bee5e515b82111ef524a4c9158de" />
    <clear/>
  </trustedIssuers>
</issuerNameRegistry>

Určení rozsahu tokenů pro vaši aplikaci pouze pomocí identifikátoru AUDIENCEURI

<identifikátory URI cílové skupiny> určuje sadu identifikátorů URI, které jsou přijatelné při identifikaci této předávající strany. Tokeny nebudou přijaty, pokud nejsou vymezeny na některé z povolených identifikátorů URI cílové skupiny. Tím se zmírní hrozba přehrání platných tokenů vydaných pro jiné předávající strany. Ve výchozím nastavení nebudou do kolekce přidány žádné identifikátory URI. SecurityTokenHandler pro typy tokenů SAML 1.1 a SAML 2.0 používají hodnoty v této kolekci ke konfiguraci všech povolených omezení URI cílové skupiny v objektech SamlSecurityTokenRequirement.

Příklad:

<audienceUris>
  <clear/>
  <add value="http://www.example.com/myapp/" />
  <remove value="http://www.example.com/myapp/" />
</audienceUris>

Následují pokyny zabezpečení související s konfigurací portálu pro správu služby ACS.

  • Nastavení agresivního vypršení platnosti tokenů tokenů zabezpečení

  • Zajištění odpovídajícího ověření dat při použití funkce Adresa URL chyby

  • Zvažte šifrování tokenů pro vysoce citlivé scénáře.

Nastavení agresivního vypršení platnosti tokenů tokenů zabezpečení

Atribut životnosti tokenu řídí životnost tokenu. Zadává se při vytváření nebo konfiguraci předávající strany pomocí portálu ACS nebo služby pro správu. Vlastnost Životnost tokenu můžete použít k určení doby platnosti tokenu zabezpečení vydaného službou ACS pro aplikaci předávající strany, která zůstane platná. Ve výchozím nastavení je tato hodnota v ACS nastavená na 10 minut (600 sekund). V ACS musí být tato hodnota větší než nula, ale menší než nebo rovna 24 hodin (86400 sekund).

Zajištění odpovídajícího ověření dat při použití funkce Adresa URL chyby

Pomocí adresy URL chyby můžete zadat adresu URL, na kterou služba ACS přesměruje uživatele, pokud dojde k chybě během procesu přihlášení. Může to být vlastní stránka hostovaná v aplikaci předávající strany, například http://www.fabrikam.com/billing/error.aspx. V rámci přesměrování služba ACS poskytuje podrobné informace o chybě do aplikace předávající strany jako parametr ADRESY URL kódovaný ve formátu JSON. Vlastní chybovou stránku lze vytvořit tak, aby spotřebovala informace o chybách zakódovaných ve formátu JSON, aby se zobrazila skutečná chybová zpráva, která se zobrazila nebo zobrazila statický text nápovědy. Pokud stránka vyžaduje autorizaci, výsledkem bude smyčka nekonečného přesměrování v případě, že se K ní služba ACS pokusí získat přístup a odešle chybu zakódovanou ve formátu JSON. Proto by měla být nakonfigurovaná pro anonymní přístup. Vzhledem k tomu, že ke stránce lze přistupovat anonymně a protože může obsahovat kód, který vrací kód HTML nebo zapisuje data do databáze, měli byste podniknout kroky, abyste zabránili skriptování mezi weby a útokům prostřednictvím injektáže SQL.

Zvažte šifrování tokenů pro vysoce citlivé scénáře.

U vysoce citlivých scénářů pro pasivní federaci zvažte šifrování tokenů. Další informace o šifrování a dešifrování tokenu najdete v tématu Certifikáty a klíče.

Následují aspekty zabezpečení související s aplikacemi, které používají službu ACS a které jsou nasazené v Azure.

  • Šifrování souborů cookie pomocí RSA

Šifrování souborů cookie pomocí RSA

V Azure není výchozí mechanismus šifrování souborů cookie (který používá aplikační programovací rozhraní ochrany dat (DPAPI)), protože každá instance má jiný klíč. To by znamenalo, že soubor cookie vytvořený jednou instancí webové role by nebyl čitelný jinou instancí webové role. To může vést k selháním služby, což efektivně způsobí odepření služby. Následující chybová zpráva se zobrazí, pokud použijete výchozí mechanismus šifrování souborů cookie:

[CryptographicException: Key not valid for use in specified state.
]
System.Security.Cryptography.ProtectedData.Unprotect(Byte[] encryptedData, Byte[] optionalEntropy, DataProtectionScope scope) +577
Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(Byte[] encoded) +80
[InvalidOperationException: ID1073: A CryptographicException occurred when attempting to decrypt the cookie using the ProtectedData API (see inner exception for details). If you are using IIS 7.5, this could be due to the loadUserProfile setting on the Application Pool being set to false. ]
Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(Byte[] encoded) +433
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(Byte[] cookie, Boolean outbound) +189
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(XmlReader reader, SecurityTokenResolver tokenResolver) +862
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(Byte[] token, SecurityTokenResolver tokenResolver) +109
Microsoft.IdentityModel.Web.SessionAuthenticationModule.ReadSessionTokenFromCookie(Byte[] sessionCookie) +356
Microsoft.IdentityModel.Web.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken& sessionToken) +123
Microsoft.IdentityModel.Web.SessionAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs eventArgs) +61
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +270

K vyřešení tohoto problému použijte mechanismus šifrování souborů cookie, který používá klíč sdílený všemi instancemi webových rolí. Následující kód ukazuje, jak nahradit výchozí SessionSecurityHandler objekt a nakonfigurovat jej pro použití RsaEncryptionCookieTransform třídy.

private void OnServiceConfigurationCreated(object sender, 
    ServiceConfigurationCreatedEventArgs e)
{
    List<CookieTransform> sessionTransforms =
        new List<CookieTransform>(
            new CookieTransform[] 
            {
                new DeflateCookieTransform(), 
                new RsaEncryptionCookieTransform(
                    e.ServiceConfiguration.ServiceCertificate),
                new RsaSignatureCookieTransform(
                    e.ServiceConfiguration.ServiceCertificate)  
            });
   SessionSecurityTokenHandler sessionHandler = 
    new
     SessionSecurityTokenHandler(sessionTransforms.AsReadOnly());

    e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(
        sessionHandler);
}

void Application_Start(object sender, EventArgs e)
{
    FederatedAuthentication.ServiceConfigurationCreated += OnServiceConfigurationCreated;
}

Další zdroje informací