[AZ-204]: Implement secure cloud solutions

Implement Azure Key Vault

  • Explore Azure Key Vault - เป็น Tools ที่รองรับการจัดการข้อมูลลับที่สำคัญ โดยรองรับทั้งส่วนของ SW และ HW - hardware security module(HSM) หน้าที่ของ Key Vault มี ดังนี้
    • Secrets Management - พวก tokens, passwords, API Key
    • Key Management -  พวก encryption keys
    • Certificate Management - public and private SSL/TLS certificates
  • Key benefits of using Azure Key Vault
    • Centralized application secrets
    • Securely store secrets and keys - ผ่าน Azure AD และ Azure RBAC รวมถึงมี HSM ในแบบ Premium
    • Monitor access and use - ตัว Azure Key Vault มีส่วน Access อยู่แล้ว ถ้าจะเอาไปใช้งานอาจจะทำ
      • เอา Log เก็บใน Storage หรือ ส่งให้ Event Hub
      • Send the logs to Log Analytics
    • Simplified administration of application secrets - Scaling / Replicating / Automating (eg. certificates enrollment and renewal.) / ลด Learning Curve/Effort ของ Admin
    • Integrate with other Azure services
  • Discover Azure Key Vault best practices
    • Authentication
      • Managed identities for Azure resources - Azure จัดการให้ ทั้งเรื่อง Key และการ Rotate (best practice)
      • Service principal and certificate - ต้อง Rotate Key/Secret เอง
      • Service principal and secret - ทำเองหมด
    • Encryption of data in transit - Transport Layer Security (TLS) + RSA-based 2,048-bit. This combination makes it difficult for someone to intercept and access data that is in transit.
    • Azure Key Vault best practices
      • Use separate key vaults - แยก Dev / Test / Production ไม่ใช่ Key ร่วมระหว่างหลายระบบ
      • Control access to your vault
      • Backup
      • Logging - สำหรับ Audit และอย่าลืมตั้งการแจ้งเตือนด้วย
      • Recovery options: Turn on soft-delete and purge protection (น่าจะคล้ายกับ Recycle Bin)
  • Authenticate to Azure Key Vault - มี 2 วิธี
    • [Recommend] Enable a system-assigned managed identity for the application
    • register the application with your Azure AD tenant - มันจะสร้าง second application object มาจัดการแทนใน tenant
  • Authentication to Key Vault in application code
  • Set and retrieve a secret from Azure Key Vault by using Azure CLI
myKeyVault=az204vault-$RANDOM
myLocation=southeastasia

#สร้าง Resoucee Group
az group create --name az204-vault-rg --location $myLocation

#ขั้นตอนนี้จะนานหน่อย ถ้ามีไม่ Microsoft.KeyValut มันจะสร้างให้เลย
az keyvault create --name $myKeyVault --resource-group az204-vault-rg --location $myLocation

#ลองยัด Secret
az keyvault secret set --vault-name $myKeyVault --name "ExamplePassword" --value "hVFkk965BuUv"
#ลองให้แสดง
az keyvault secret show --name "ExamplePassword" --vault-name $myKeyVault
  • หลัง az keyvault secret show มันแสดง response ในแบบ json บอกข้อมูล Key Vault ที่สร้างเลย
{
  "attributes": {
    "created": "2022-02-19T03:39:27+00:00",
    "enabled": true,
    "expires": null,
    "notBefore": null,
    "recoveryLevel": "Recoverable+Purgeable",
    "updated": "2022-02-19T03:39:27+00:00"
  },
  "contentType": null,
  "id": "https://az204vault-20538.vault.azure.net/secrets/ExamplePassword/389a316e7e104967bb3d841830f4fe29",
  "kid": null,
  "managed": null,
  "name": "ExamplePassword",
  "tags": {
    "file-encoding": "utf-8"
  },
  "value": "hVFkk965BuUv"
}

Knowledge check - Implement Azure Key Vault(Knowledge check)

Implement managed identities

  • Managed identities เป็นตัวที่ช่วยระบุตัวตน (Identity) สำหรับเข้าถึง Resource ต่างๆใน Azure เช่น เข้า Azure VM / Azure Key Vault โดย Managed identities มี 2 แบบ
    • system-assigned managed identity
    • user-assigned managed identity 
    • NOTE ถ้า Managed identity ถูกลบ service principal จะถูกเอาออกไปด้วย
  • Characteristics of managed identities
  • When to use managed identities
    Example you want to build an app using Azure App Services that accesses Azure Storage without having to manage any credentials.
  • Discover the managed identities authentication flow - เหมือนขยายความจาก Characteristics of managed identities Flow มันจะคล้ายๆกัน แต่ต่างกันตรง Life Cycle และการนำไปใช้ต่อ
    • system-assigned ผูกกับ Resource
    • user-assigned แยกขาดกับ resource ใช้กับ resource อื่นๆได้ แต่ต้องจัดการเอง
  • Configure managed identities
    • system-assigned สร้างพร้อมกับ Resource
    • user-assigned สร้าง Identity ก่อน แล้วถึงนำมาผูก
    • NOTE นอกจาก CLI มี SDK เตรียมไว้ด้วย
##System-assigned managed
#Create
az vm create --resource-group myResourceGroup \ 
    --name myVM --image win2016datacenter \ 
    --generate-ssh-keys \ 
    --assign-identity \ 
    --admin-username azureuser \ 
    --admin-password myPassword12
#Existing
az vm identity assign -g myResourceGroup -n myVm

#############################################
##User-assigned managed
##Step 1 Create Idenitity ต่างกับ VM นะ 
az identity create -g myResourceGroup -n myUserAssignedIdentity

##Step 2 Assign Identity
##Step 2.1 New 
az vm create \
--resource-group <RESOURCE GROUP> \
--name <VM NAME> \
--image UbuntuLTS \
--admin-username <USER NAME> \
--admin-password <PASSWORD> \
--assign-identity <USER ASSIGNED IDENTITY NAME>   ##จาก Step 1
##Step 2.2 Existing
az vm identity assign \
    -g <RESOURCE GROUP> \
    -n <VM NAME> \
    --identities <USER ASSIGNED IDENTITY>			##จาก Step 1
- Acquire an access token (DEV NOTE)
  • มี Manage Identity แล้ว ขา App ที่จะเอาไปใช้งาน จะต้องมาขอ Access Token ด้วย ในรูปแบบ JWT
    • service principal - The token is based on the managed identities for Azure resources service principal.
  • Code ใช้ REST / Code อันนี้ใช้ Lib ปกติเลย
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Web.Script.Serialization; 

// Build request to acquire managed identities for Azure resources token
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/");
request.Headers["Metadata"] = "true";
request.Method = "GET";

try
{
    // Call /token endpoint
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    // Pipe response Stream to a StreamReader, and extract access token
    StreamReader streamResponse = new StreamReader(response.GetResponseStream()); 
    string stringResponse = streamResponse.ReadToEnd();
    JavaScriptSerializer j = new JavaScriptSerializer();
    Dictionary<string, string> list = (Dictionary<string, string>) j.Deserialize(stringResponse, typeof(Dictionary<string, string>));
    string accessToken = list["access_token"];
}
catch (Exception e)
{
    string errorText = String.Format("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
}
  • Token caching - managed identities ไม่ทำ caching Dev ต้องทำเอง
  • Flow การ Get Token กรณีที่มัน Expire
  • Retry guidance - 404, 429, 5xx error code. App ควรมีการ retry ขอ token ไม่ อาจจะเกิดจากปัญหาใน Azure เองได้

Knowledge check - Implement managed identities (Knowledge check)

Implement Azure App Configuration

มี Manage Identity > ขอ Access Token เข้าใจ Azure Key Vault แล้ว รอบนี้มาลองปรับ App ตัว Code ให้รองรับด้วยครับ

- Azure App Configuration service
  • App Configuration - ตัวชื่อที่ทำให้ App ของเราจัดด้าน Config / Feature / Security ได้ง่ายขึ้น
  • App Configuration benefits
    • A fully managed service that can be set up in minutes
    • Flexible key representations and mappings
    • Tagging with labels
    • Point-in-time replay of settings
    • Dedicated UI for feature flag management
    • Comparison of two sets of configurations on custom-defined dimensions
    • Enhanced security through Azure-managed identities
    • Complete data encryptions, at rest or in transit
    • Native integration with popular frameworks - .NET Core / .NET FRAMEWORK / SPRING (JAVA) / REST API เป็นต้น
- ส่วนประกอบของ App Configuration เป็น Key & Value
  • Key - มี Pattern 2 แบบ flat / hierarchical (มีข้อดีจัดหมวดหมู่ได้) ตัว Key สามารถ Query ได้
    • Version Key - ไม่มี แต่อาจจะ Apply เป็น Key ใหม่ และเอาเลข commit git มาใช้ได้
    • Label Key - ใช้กับ key ที่ซ้ำกัน เอาไว้แยก Environment
#component
AppName:Service1:ApiEndpoint
AppName:Service2:ApiEndpoint

#region
AppName:Region1:DbEndpoint
AppName:Region2:DbEndpoint

#Label Key
Key = AppName:DbEndpoint & Label = Test
Key = AppName:DbEndpoint & Label = Staging
Key = AppName:DbEndpoint & Label = Production
  • Value - UTF-8 String
- Manage application features

Feature Flag เอาไว้คุม Feature มีส่วนประกอบ 3 ส่วน

  • Feature flag - Flag บอกเปิดปิด Feature
  • Feature manager - จัดการ Feature และการทำ Caching
  • Filter - Rule ตรวจสอบว่าควรจะเปิด ปิด Feature ตาม Condition ที่กำหนดไหม
- Secure app configuration data
  • Customer-managed keys
    • จาก Flow พบว่า wrapped encryption key is then stored and the unwrapped encryption key is cached within App Configuration for one hour. (พอครบแล้ว Refresh ใหม่
    • Requirement ของการทำ
      • Standard tier Azure App Configuration instance
      • Azure Key Vault - soft-delete and purge-protection features enabled
      • RSA or RSA-HSM key - Key ไม่ต้อง Expired ต้องทำ wrap and unwrap
    • ตอนใช้งาน
      • กำหนด managed identity ให้ Azure App Configuration
      • Grant identity GETWRAP, and UNWRAP permissions ของ Key ใน Azure Key/Vault
  • Private endpoints
    • Securely connect to the App Configuration store from on-premises networks
    • Must separate private endpoint for each App Configuration store (Get Connection String App Configuration Settings > Access Keys.)
  • Managed identities
    • system-assigned identity - สร้างผูกกับ Resource
    • user-assigned identity - สร้าง และดูแลเอง

Knowledge check - Implement Azure App Configuration (Knowledge check)

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.