共用方式為


安全框架︰組態管理 | 緩和措施

產品/服務 發行項
Web 應用程式
Database
Web API
IoT 裝置
IoT 現場閘道
IoT 雲端閘道
電腦信任邊界
Azure 儲存體
WCF

實作內容安全性原則 (CSP),並停用內嵌 JavaScript

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 內容安全性原則簡介 (機器翻譯)、內容安全性原則參考 (英文)、內容安全性原則簡介 (英文)、我可以使用 CSP 嗎? (英文)
步驟

內容安全性原則 (CSP) 是深度防禦安全性機制、W3C 標準,可讓 Web 應用程式擁有者能控制其網站中內嵌的內容。 CSP 會新增為 Web 伺服器上的 HTTP 回應標頭,並由瀏覽器在用戶端上強制執行。 這是以允許清單為基礎的原則 - 網站可以宣告一組可從中載入主動式內容 (例如 JavaScript) 的受信任網域。

CSP 具有以下安全性優勢:

  • 防禦 XSS︰如果頁面遭受 XSS 威脅,攻擊者入侵它的方式有兩種:
    • 插入 <script>malicious code</script>。 此入侵將因為 CSP 的基礎限制 1 而無法運作
    • 插入 <script src="http://attacker.com/maliciousCode.js"/>。 此入侵無法運作,因為攻擊者所控制的網域不在網域的 CSP 允許清單中
  • 控制資料外洩︰如果網頁上的任何惡意內容嘗試連線至外部網站並竊取資料,CSP 將會中止連線。 這是因為目標網域不在 CSP 允許清單中
  • 防禦點擊劫持:點擊劫持 (Clickjacking) 是一種攻擊技巧,敵人可用來建構真正的網站並強制使用者點按 UI 項目。 目前可藉由設定回應標頭- X-Frame-Options 來防禦點擊劫持。 並非所有瀏覽器都遵守此標頭,而轉寄 CSP 會是防禦點擊劫持的標準方法
  • 即時攻擊報告︰如果已啟用 CSP 的網站上有資料隱碼攻擊,則瀏覽器會自動對 Web 伺服器上設定的端點觸發通知。 如此一來,CSP 可當作即時警告系統。

範例

範例原則︰

Content-Security-Policy: default-src 'self'; script-src 'self' www.google-analytics.com 

此原則只允許從 Web 應用程式的伺服器和 google 分析伺服器載入指令碼。 將會拒絕從任何其他網站載入的指令碼。 在網站上啟用 CSP 後,下列功能會自動停用以緩和 XSS 攻擊。

範例

將不會執行內嵌指令碼。 以下是內嵌指令碼的範例

<script> some JavaScript code </script>
Event handling attributes of HTML tags (for example, <button onclick="function(){}">
javascript:alert(1);

範例

字串不會評估為程式碼。

Example: var str="alert(1)"; eval(str);

啟用瀏覽器的 XSS 篩選器

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 XSS 防護篩選器
步驟

X-XSS-Protection 回應標頭設定可控制瀏覽器的跨網站指令碼篩選器。 此回應標頭可以有下列值︰

  • 0: 這會停用篩選器
  • 1: Filter enabled 如果偵測到跨網站指令碼攻擊,為了停止攻擊,瀏覽器將會淨化頁面
  • 1: mode=block : Filter enabled. 偵測到 XSS 攻擊時,瀏覽器會阻止網頁呈現,而非清理頁面
  • 1: report=http://[YOURDOMAIN]/your_report_URI : Filter enabled. 瀏覽器將會淨化頁面並報告違規情形。

這是一項 Chromium 功能,其利用 CSP 違規報告將詳細資料傳送至您所選的 URI。 最後兩個選項會被視為安全值。

ASP.NET 應用程式必須在部署前停用追蹤和偵錯

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 ASP.NET 偵錯概觀ASP.NET 追蹤概觀作法:對 ASP.NET 應用程式啟用追蹤作法:對 ASP.NET 應用程式啟用偵錯
步驟 啟用頁面的追蹤後,每個要求該頁面的瀏覽器也會取得包含內部伺服器狀態和工作流程相關資料的追蹤資訊。 這項資訊可能是安全性相關資訊。 啟用頁面偵錯後,在伺服器上發生的錯誤會導致對瀏覽器呈現完整堆疊追蹤資料。 該資料可能會公開有關伺服器工作流程的安全性相關資訊。

僅從信任的來源存取第三方 JavaScript

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 僅能從信任的來源參考第三方 JavaScript。 參考端點應一律位於 TLS。

確保已驗證的 ASP.NET 頁面納入 UI 偽裝或點擊劫持防禦功能

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 OWASP 點選防禦速查表Internet Explorer 內部功能 - 使用 X-Frame-Options 對抗點擊插孔
步驟

點擊劫持 (Clickjacking) 也稱為「UI 偽裝攻擊」,當使用者打算按一下最上層頁面時,攻擊者會使用多重透明或不透明層級,誘騙使用者按一下另一個頁面上的按鈕或連結。

使用 iframe 製作惡意頁面,以載入受害者的頁面,即可達成此分層處理。 因此,攻擊者會「劫持」頁面所需的點擊,並將其路由傳送至另一個頁面,該頁面最可能由另一個應用程式、網域或兩者所擁有。 若要避免點擊劫持攻擊,請設定適當的 X-Frame-Options HTTP 回應標頭,以指示瀏覽器不允許從其他網域進行框架處理

範例

可以透過 IIS web.config 設定 X-FRAME-OPTIONS 標頭。決不能進行框架處理之網站的 Web.config 程式碼片段︰

    <system.webServer>
        <httpProtocol>
            <customHeader>
                <add name="X-FRAME-OPTIONS" value="DENY"/>
            </customHeaders>
        </httpProtocol>
    </system.webServer>

範例

只能由相同網域中的網頁進行框架處理之網站的 Web.config 程式碼︰

    <system.webServer>
        <httpProtocol>
            <customHeader>
                <add name="X-FRAME-OPTIONS" value="SAMEORIGIN"/>
            </customHeaders>
        </httpProtocol>
    </system.webServer>

確保在 ASP.NET Web 應用程式上啟用 CORS 的情況下只允許信任的原始來源

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 Web Form、MVC5
屬性 N/A
參考 N/A
步驟

瀏覽器安全性可防止網頁對另一個網域提出 AJAX 要求。 這項限制也稱為同源原則,可防止惡意網站從另一個網站讀取敏感性資料。 不過,有時候可能需要安全地公開其他網站可以取用的 API。 跨原點資源共用 (CORS) 是 W3C 標準,可讓伺服器放寬 same-origin 原則。 使用 CORS,伺服器可以明確允許某些跨源要求,然而拒絕其他要求。

相較於早期技術 (例如 JSONP),CORS 較為安全且更具彈性。 基本上,啟用 CORS 會轉變成將一些 HTTP 回應標頭 (Access-Control-*) 新增到 Web 應用程式,而其完成方式有好幾種。

範例

如果可以存取 Web.config,即可透過下列程式碼新增 CORS︰

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <clear />
        <add name="Access-Control-Allow-Origin" value="https://example.com" />
      </customHeaders>
    </httpProtocol>

範例

如果無法存取 web.config,則可藉由新增下列 C# 程式碼來設定 CORS:

HttpContext.Response.AppendHeader("Access-Control-Allow-Origin", "https://example.com")

請注意,務必要確保 "Access-Control-Allow-Origin" 屬性中的原始來源清單設定為一組有限且受信任的原始來源。 無法適當地進行此設定 (例如將值設定為 '*') 會讓惡意網站在沒有任何限制的情況下,觸發對 Web 應用程式 > 的跨源要求,而使應用程式容易遭受 CSRF 攻擊。

在 ASP.NET 頁面上啟用 ValidateRequest 屬性

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 Web Form、MVC5
屬性 N/A
參考 要求驗證 - 防止指令碼攻擊
步驟

要求驗證是 a feature of ASP.NET 在 1.1 版之後推出的功能,可防止伺服器接受包含未編碼 HTML 的內容。 此功能旨在協助防止一些指令碼插入式攻擊,用戶端指令碼程式碼或 HTML 可能會因此不知不覺地送出至某個伺服器、儲存下來,然後提供給其他使用者。 仍強烈建議您驗證所有的輸入資料和 HTML,並在適當時進行編碼。

藉由比較所有輸入資料與有潛在危險的值清單來執行要求驗證。 如果相符,ASP.NET 會引發 HttpRequestValidationException。 預設會啟用要求驗證功能。

範例

不過,這項功能可以在頁面層級停用︰

<%@ Page validateRequest="false" %> 

或在應用程式層級停用

<configuration>
   <system.web>
      <pages validateRequest="false" />
   </system.web>
</configuration>

請注意,要求驗證功能不受支援,而且不是 MVC6 管線的一部分。

使用在本機裝載的最新 JavaScript 程式庫版本

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 N/A
步驟

使用 JQuery 之類標準 JavaScript 程式庫的開發人員必須使用已核准且不包含已知安全性缺陷的通用 JavaScript 程式庫版本。 最好是使用最新版的程式庫,因為其包含舊版中已知弱點的安全性問題修正。

如果因為相容性理由而無法使用最新版本,則應該使用低於最小版本的版本。

可接受的最小版本︰

  • JQuery
    • JQuery 1.7.1
    • JQueryUI 1.10.0
    • JQuery Validate 1.9
    • JQuery Mobile 1.0.1
    • JQuery Cycle 2.99
    • JQuery DataTables 1.9.0
  • Ajax Control Toolkit
    • Ajax Control Toolkit 40412
  • ASP.NET Web Form 和 Ajax
    • ASP.NET Web Forms 與 Ajax 4
    • ASP.NET Ajax 3.5
  • ASP.NET MVC
    • ASP.NET MVC 3.0

決不會從外部網站 (例如 public CDN) 載入任何 JavaScript 程式庫

停用自動 MIME 探查

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 IE8 Security Part V:完善的保護MIME 類型
步驟 X-Content-Type-Options 標頭是可讓開發人員指定不應對其內容探查 MIME 的 HTTP 標頭。 此標頭是設計用來降低 MIME 探查攻擊的風險。 對於可能包含使用者可控制內容的每個頁面,您必須使用 HTTP 標頭 Header X-Content-Type-Options:nosniff。 若要為應用程式中的所有頁面全域啟用必要標頭,您可以執行下列其中一項︰

範例

如果應用程式是由 Internet Information Services (IIS) 7 或更新版本所裝載,請在 web.config 檔案中新增標頭

<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-Content-Type-Options" value="nosniff"/>
</customHeaders>
</httpProtocol>
</system.webServer>

範例

透過全域 Application_BeginRequest 新增標頭

void Application_BeginRequest(object sender, EventArgs e)
{
this.Response.Headers["X-Content-Type-Options"] = "nosniff";
}

範例

實作自訂 HTTP 模組

public class XContentTypeOptionsModule : IHttpModule
{
#region IHttpModule Members
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += newEventHandler(context_PreSendRequestHeaders);
}
#endregion
void context_PreSendRequestHeaders(object sender, EventArgs e)
{
HttpApplication application = sender as HttpApplication;
if (application == null)
  return;
if (application.Response.Headers["X-Content-Type-Options "] != null)
  return;
application.Response.Headers.Add("X-Content-Type-Options ", "nosniff");
}
}

範例

您可以透過將必要標頭新增至個別回應,來單獨針對特定頁面啟用此標頭︰

this.Response.Headers["X-Content-Type-Options"] = "nosniff";

移除 Windows Azure 網站上的標準伺服器標頭以避免特徵遭記錄

標題 詳細資料
元件 Web 應用程式
SDL 階段 組建
適用的技術 泛型
屬性 EnvironmentType - Azure
參考 移除 Windows Azure 網站上的標準伺服器標頭
步驟 Server、X-Powered-By、X-AspNet-Version 等標頭會揭露有關伺服器和基礎技術的資訊。 建議不要顯示這些標頭,藉此防止記錄應用程式特徵

設定用於 Database Engine 存取的 Windows 防火牆

標題 詳細資料
元件 Database
SDL 階段 組建
適用的技術 SQL Azure、OnPrem
屬性 N/A、SQL 版本 - V12
參考 如何設定 Azure SQL Database設定用於 Database Engine 存取的 Windows 防火牆
步驟 防火牆系統有助於防止未經授權存取電腦資源。 若要透過防火牆存取 SQL Server 資料庫引擎的執行個體,您必須在執行 SQL Server 的電腦上設定防火牆以允許存取

確保在 ASP.NET Web API 上啟用 CORS 的情況下只允許信任的原始來源

標題 詳細資料
元件 Web API
SDL 階段 組建
適用的技術 MVC 5
屬性 N/A
參考 在 ASP.NET Web API 2 中啟用跨源要求ASP.NET Web API - ASP.NET Web API 2 中的 CORS 支援
步驟

瀏覽器安全性可防止網頁對另一個網域提出 AJAX 要求。 這項限制也稱為同源原則,可防止惡意網站從另一個網站讀取敏感性資料。 不過,有時候可能需要安全地公開其他網站可以取用的 API。 跨原點資源共用 (CORS) 是 W3C 標準,可讓伺服器放寬 same-origin 原則。

使用 CORS,伺服器可以明確允許某些跨源要求,然而拒絕其他要求。 相較於早期技術 (例如 JSONP),CORS 較為安全且更具彈性。

範例

在 App_Start/WebApiConfig.cs 中,將下列程式碼新增至 WebApiConfig.Register 方法

using System.Web.Http;
namespace WebService
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // New code
            config.EnableCors();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

範例

EnableCors 屬性可套用至控制器中的動作方法,如下所示︰

public class ResourcesController : ApiController
{
  [EnableCors("http://localhost:55912", // Origin
              null,                     // Request headers
              "GET",                    // HTTP methods
              "bar",                    // Response headers
              SupportsCredentials=true  // Allow credentials
  )]
  public HttpResponseMessage Get(int id)
  {
    var resp = Request.CreateResponse(HttpStatusCode.NoContent);
    resp.Headers.Add("bar", "a bar value");
    return resp;
  }
  [EnableCors("http://localhost:55912",       // Origin
              "Accept, Origin, Content-Type", // Request headers
              "PUT",                          // HTTP methods
              PreflightMaxAge=600             // Preflight cache duration
  )]
  public HttpResponseMessage Put(Resource data)
  {
    return Request.CreateResponse(HttpStatusCode.OK, data);
  }
  [EnableCors("http://localhost:55912",       // Origin
              "Accept, Origin, Content-Type", // Request headers
              "POST",                         // HTTP methods
              PreflightMaxAge=600             // Preflight cache duration
  )]
  public HttpResponseMessage Post(Resource data)
  {
    return Request.CreateResponse(HttpStatusCode.OK, data);
  }
}

請注意,務必要確保 EnableCors 屬性中的原始來源清單設定為一組有限且受信任的原始來源。 無法適當地進行此設定 (例如將值設定為 '*') 會讓惡意網站在沒有任何限制的情況下,觸發對 API 的跨源要求,> 而使 API 容易遭受 CSRF 攻擊。 可以在控制器層級裝飾 EnableCors。

範例

若要在類別中的特定方法上停用 CORS,可以使用 DisableCors 屬性,如下所示︰

[EnableCors("https://example.com", "Accept, Origin, Content-Type", "POST")]
public class ResourcesController : ApiController
{
  public HttpResponseMessage Put(Resource data)
  {
    return Request.CreateResponse(HttpStatusCode.OK, data);
  }
  public HttpResponseMessage Post(Resource data)
  {
    return Request.CreateResponse(HttpStatusCode.OK, data);
  }
  // CORS not allowed because of the [DisableCors] attribute
  [DisableCors]
  public HttpResponseMessage Delete(int id)
  {
    return Request.CreateResponse(HttpStatusCode.NoContent);
  }
}
標題 詳細資料
元件 Web API
SDL 階段 組建
適用的技術 MVC 6
屬性 N/A
參考 在 ASP.NET Core 1.0 中啟用跨源要求
步驟

在 ASP.NET Core 1.0 中,可以使用中介軟體或使用 MVC 啟用 CORS。 使用 MVC 來啟用 CORS 時,會使用相同的 CORS 服務,但不會使用 CORS 中介軟體。

方法 1 使用中介軟體啟用 CORS︰若要針對整個應用程式啟用 CORS,請使用 UseCors 擴充方法,將 CORS 中介軟體新增至要求管線。 使用 CorsPolicyBuilder 類別新增 CORS 中介軟體時,可以指定跨源原則。 作法有二:

範例

第一種方法是使用 Lambda 呼叫 UseCors。 Lambda 會採用 CorsPolicyBuilder 物件︰

public void Configure(IApplicationBuilder app)
{
    app.UseCors(builder =>
        builder.WithOrigins("https://example.com")
        .WithMethods("GET", "POST", "HEAD")
        .WithHeaders("accept", "content-type", "origin", "x-custom-header"));
}

範例

第二種方法是定義一或多個具名 CORS 原則,然後在執行階段依名稱選取原則。

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("AllowSpecificOrigin",
            builder => builder.WithOrigins("https://example.com"));
    });
}
public void Configure(IApplicationBuilder app)
{
    app.UseCors("AllowSpecificOrigin");
    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World!");
    });
}

方法 2 在 MVC 中啟用 CORS︰開發人員也可以使用 MVC 來套件每個動作、每個控制站或適用於所有控制站的特定 CORS。

範例

每個動作︰若要指定特定動作的 CORS 原則,請將 [EnableCors] 屬性套用至該動作。 指定原則名稱。

public class HomeController : Controller
{
    [EnableCors("AllowSpecificOrigin")] 
    public IActionResult Index()
    {
        return View();
    }

範例

每個控制站︰

[EnableCors("AllowSpecificOrigin")]
public class HomeController : Controller
{

範例

全域︰

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new CorsAuthorizationFilterFactory("AllowSpecificOrigin"));
    });
}

請注意,務必要確保 EnableCors 屬性中的原始來源清單設定為一組有限且受信任的原始來源。 無法適當地進行此設定 (例如將值設定為 '*') 會讓惡意網站在沒有任何限制的情況下,觸發對 API 的跨源要求,> 而使 API 容易遭受 CSRF 攻擊。

範例

若要停用某個控制器或動作的 CORS,請使用 [DisableCors] 屬性。

[DisableCors]
    public IActionResult About()
    {
        return View();
    }

加密包含敏感性資料的 Web API 組態檔區段

標題 詳細資料
元件 Web API
SDL 階段 部署
適用的技術 泛型
屬性 N/A
參考 作法:在 ASP.NET 2.0 中使用 DPAPI 加密組態區段指定受保護的組態提供者使用 Azure Key Vault 來保護應用程式的機密資訊
步驟 組態檔 (例如 Web.config、appsettings.json) 常會用來敏感性資訊,包括使用者名稱、密碼、資料庫連接字串和加密金鑰。 如果您不保護這項資訊,您的應用程式會很容易受到攻擊者或惡意使用者攻擊,而被其取得敏感性資訊,例如帳戶使用者名稱和密碼、資料庫名稱和伺服器名稱。 請根據部署類型 (Azure/內部部署),使用 DPAPI 或服務 (例如 Azure Key Vault) 加密組態檔的敏感性區段。

確保使用強式認證保護所有系統管理介面

標題 詳細資料
元件 IoT 裝置
SDL 階段 部署
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 您應使用強式認證來保護裝置或現場閘道公開的任何系統管理介面。 此外,對於任何公開的介面 (如 WiFi、SSH、檔案共用),應使用強式認證保護 FTP。 不得使用預設弱式密碼。

確保無法在裝置上執行未知的程式碼

標題 詳細資料
元件 IoT 裝置
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 在 Windows 10 IoT Core 上啟用安全開機和 BitLocker 裝置加密
步驟 「UEFI 安全開機」會將系統限制為只允許執行指定的授權單位所簽署的二進位檔。 這項功能可防止不明程式碼在平台上執行並可能使其安全性狀態變弱。 啟用「UEFI 安全開機」並限制受託簽署程式碼的憑證授權單位清單。 使用其中一個受信任的授權單位簽署在裝置上部署的所有程式碼。

使用 BitLocker 將 IoT 裝置的 OS 和其他分割區加密

標題 詳細資料
元件 IoT 裝置
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 Windows 10 IoT Core 會實作 BitLocker 裝置加密的輕量型版本,其高度相依於平台上的 TPM 目前狀態,包括 UEFI 中可採取必要措施的必要 preOS 通訊協定。 這些 preOS 措施可確保 OS 稍後有 OS 啟動方式的明確記錄。使用 BitLocker 加密 OS 分割區以及任何其他分割區,以防這些分割區儲存任何敏感性資料。

確保在裝置上只啟用最少的服務/功能

標題 詳細資料
元件 IoT 裝置
SDL 階段 部署
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 請勿在並非解決方案運作所需的 OS 中啟用或關閉任何功能或服務。 例如︰如果裝置不需要部署 UI,請在無周邊模式下安裝 Windows IoT Core。

使用 BitLocker 將 IoT 現場閘道的 OS 和其他分割區加密

標題 詳細資料
元件 IoT 現場閘道
SDL 階段 部署
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 Windows 10 IoT Core 會實作 BitLocker 裝置加密的輕量型版本,其高度相依於平台上的 TPM 目前狀態,包括 UEFI 中可採取必要措施的必要 preOS 通訊協定。 這些 preOS 措施可確保 OS 稍後有 OS 啟動方式的明確記錄。使用 BitLocker 加密 OS 分割區以及任何其他分割區,以防這些分割區儲存任何敏感性資料。

確保在安裝期間變更現場閘道的預設登入認證

標題 詳細資料
元件 IoT 現場閘道
SDL 階段 部署
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 確保在安裝期間變更現場閘道的預設登入認證

確保雲端閘道實作相關程序讓連接的裝置韌體保持最新狀態

標題 詳細資料
元件 IoT 雲端閘道
SDL 階段 組建
適用的技術 泛型
屬性 閘道選擇 - Azure IoT 中樞
參考 IoT 中樞裝置管理概觀使用 Raspberry Pi 3 B+ 參考映像,進行 Azure IoT 中樞教學課程的裝置更新
步驟 LWM2M 是來自 Open Mobile Alliance 且適用於 IoT 裝置管理的通訊協定。 Azure IoT 裝置管理可讓您使用裝置工作來與實體裝置進行互動。 確保雲端閘道會實作相關程序,以使用 Azure IoT 中樞裝置管理讓裝置和其他組態資料常保最新狀態。

確保裝置已根據組織原則設定端點安全性控制措施

標題 詳細資料
元件 機器信任界限
SDL 階段 部署
適用的技術 泛型
屬性 N/A
參考 N/A
步驟 確保裝置有根據組織安全性原則設定的端點安全性控制項,例如適用於磁碟層級加密的 BitLocker、採用更新後簽章的防毒軟體、主機型防火牆、OS 升級、群組原則等。

確保 Azure 儲存體存取金鑰的安全管理

標題 詳細資料
元件 Azure 儲存體
SDL 階段 部署
適用的技術 泛型
屬性 N/A
參考 Azure 儲存體安全性指南 - 管理儲存體帳戶金鑰
步驟

金鑰儲存體︰建議將 Azure Key Vault 中的 Azure 儲存體存取金鑰儲存為密碼,並且讓應用程式從 Key Vault 擷取金鑰。 此建議的原因如下︰

  • 應用程式永遠都不需要將儲存體金鑰硬式編碼於組態檔中,這樣會移除某人不需特定權限即可存取金鑰的途徑
  • 可以使用 Microsoft Entra ID 控制對金鑰的存取。 這表示帳戶擁有者可以將存取權授予少數需要從 Azure Key Vault 擷取金鑰的應用程式。 若未特別授與權限,其他應用程式將無法存取金鑰
  • 重新產生金鑰︰基於安全性考量,建議施行相關程序來重新產生 Azure 儲存體存取金鑰。 Azure 儲存體安全性指南參考文章會記載有關為何及如何規劃重新產生金鑰的詳細資訊

確保在 Azure 儲存體上啟用 CORS 的情況下只允許信任的原始來源

標題 詳細資料
元件 Azure 儲存體
SDL 階段 組建
適用的技術 泛型
屬性 N/A
參考 Azure 儲存體服務的 CORS 支援 \(英文\)
步驟 Azure 儲存體可讓您啟用 CORS – 跨原始來源資源共用。 對於每個儲存體帳戶,您可以指定可存取該儲存體帳戶中之資源的網域。 根據預設,所有服務上都會停用 CORS。 您可以使用 REST API 或儲存體用戶端程式庫,呼叫其中一個方法來設定服務原則,藉以啟用 CORS。

啟用 WCF 的服務節流功能

標題 詳細資料
元件 WCF
SDL 階段 組建
適用的技術 .NET Framework 3
屬性 N/A
參考 MSDNFortify Kingdom
步驟

未設定系統資源的使用限制,可能會導致資源耗盡,而最後導致拒絕服務。

  • 說明︰Windows Communication Foundation (WCF) 提供服務要求節流的功能。 允許太多的用戶端要求可能會淹沒系統及耗盡其資源。 另一方面,只允許服務有少數要求可防止合法使用者使用此服務。 每項服務應個別調整並設定為允許適當的資源數量。
  • 建議 啟用 WCF 的服務節流功能以及為應用程式設定適當的限制。

範例

下列是已啟用節流的範例組態︰

<system.serviceModel> 
  <behaviors>
    <serviceBehaviors>
    <behavior name="Throttled">
    <serviceThrottling maxConcurrentCalls="[YOUR SERVICE VALUE]" maxConcurrentSessions="[YOUR SERVICE VALUE]" maxConcurrentInstances="[YOUR SERVICE VALUE]" /> 
  ...
</system.serviceModel> 

WCF - 透過中繼資料的資訊洩漏

標題 詳細資料
元件 WCF
SDL 階段 組建
適用的技術 .NET Framework 3
屬性 N/A
參考 MSDNFortify Kingdom
步驟 中繼資料可協助攻擊者了解系統及規劃攻擊形式。 可以將 WCF 服務設定為公開中繼資料。 中繼資料可提供詳細的服務描述資訊,且不得在生產環境中廣播。 ServiceMetaData 類別的 HttpGetEnabled / HttpsGetEnabled 屬性會定義服務是否會公開中繼資料

範例

下列程式碼會指示 WCF 廣播服務的中繼資料

ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true; 
smb.HttpGetUrl = new Uri(EndPointAddress); 
Host.Description.Behaviors.Add(smb); 

不要在生產環境中廣播服務中繼資料。 將 ServiceMetaData 類別的 HttpGetEnabled / HttpsGetEnabled 屬性設定為 false。

範例

下列程式碼會指示 WCF 不要廣播服務的中繼資料。

ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
smb.HttpGetEnabled = false; 
smb.HttpGetUrl = new Uri(EndPointAddress); 
Host.Description.Behaviors.Add(smb);