首頁

AWS SAA-C03 口袋筆記 - Kinesis

Amazon Kinesis 處理(近乎即時)串流資料的服務。主要分Kinesis Data Stream 和 Kinesis Video Stream。

Kinesis Data Stream

  • 是由1..n個shard組成
  • producer -> data record -> stream -> shard -> consumer
    • producer, e.g. applications, client, SDK, Kinesis Client Library (KCL), Kinesis Agent...etc
    • consumer, e.g. Apps(SDK, KCL), Lambda, Kinesis Data Firehose, Kinesis Data Analytics...etc
  • read/write時的data record都包含partition key和data blog。read的data record多一個sequence no (at shard level)
  • 資料用同個partition key會被分派到同個shard (ordering)
    • e.g. 用 user_id 當作partition key, 所以這個用戶的資料都送往同個shard, 且保有順序性
  • retention時間為1~365 days, 一但資料送到kinesis data stream, 就不能被刪除
  • Capacity Modes
    • provisioned mode
      • 需自己手動調整shard數量
      • 單個shard能吃的data record大小限制為 1MB/sec或 1000 records/sec
      • 單個shard能被consume的data record大小限制有兩種
        • 2MB/sec (shared) for all consumer
        • 2MB/sec (enhanced) per consumer
      • 每個shard以每小時為單位計費
    • on-demand mode
      • 預設單個shard的data record大小限制為 4MB/sec或 4000 records/sec
      • 根據前30天吞吐量的高峰值,自動調整shard數量
      • 每小時資料串流量計費 (per GB/hour)


Reference
  • https://www.udemy.com/course/aws-certified-solutions-architect-associate-saa-c03



AWS SAA-C03 口袋筆記 - Cognito & Amplify

Amazon Cognito 用於協助外部使用者(mobile/web app)取得AWS resource臨時用的credential。

現實生活中,拜訪客戶公司時,警衛可能透過打電話或從名片中先確認身份,確認無誤後再給予訪客證或門禁卡,訪客才得以進入大樓。

Amazon Cognito做類似的事情。外部app透過Cognito,先從Cognito User Pools (CUP)裡確認身份無誤後,再從Cognito Identity Pools (CIP)去取得AWS credentials。

Cognito User Pools: 主要作為 serverless 的 user database。提供以下功能特性:

  • 簡易帳密登入 & 密碼重設
  • Email & 電話認證
  • 可啟用MFA認證
  • 社群登入 (FB, Google, SAML...)
  • 可與API Gateway整合。 app -(authenticate)-> Cognito User Pools -(return token)-> app -(rest api with token)-> API Gateway -(evaluate token)-> Cognito User Pools -(authenticated)-> API Gateway -(access with identity)-> backend 
  • 可與Application Load Balance整合。 app -> ALB -(authenticate)-> Cognito User Pools -(authenticated)-> ALB -> backend
Cognito Identity Pools (Federated Identities): 提供用戶暫時的AWS credentials。 
  • 用戶來源於Cognito User Pools, 社群登入, SAML provider, OpenID connect provider...等。
  • 用戶於來源驗證後,再與Cognito Identity Pools換取暫時的credentials
  • 這些credentials裡有我們在Cognito裡設定的IAM policies
    • 也可以透過user_id去做細部的權限控管
  • 提供guess機制。使用Default IAM roles。

-- 分隔線 --

AWS Amplify (BaaS) 提供完整的解決方方案,讓前端開發者能更快速的開發、建置跟發佈前端(web/mobile)應用程式。可想做它像是Elastic Beanstalk (PaaS) for mobile/web application。
透過 Amplify CLI 可以快速建立一個 Amplify backend,裡面包含許多AWS serverless的服務,像S3、Cognito、Lambda、DynamoDB等。






Reference
  • https://godleon.github.io/blog/AWS/AWS-SOA-VPC/
  • https://www.udemy.com/course/aws-certified-solutions-architect-associate-saa-c03
  • https://www.tenlong.com.tw/products/9786263333123?list_name=lv

AWS SAA-C03 口袋筆記 - Networking VPC

在地端,網路封包會先通過Gateway進到公司網路,再經過防火牆和路由來到公司公有網段裡的伺服器,從這裡再進到公司私有網段裡的伺服器。

在雲端(AWS),網路封包會先通過Internet Gateway進到Virtual Private Cloud (VPC),再經過Route table及Network Access Control List (NACL)來到Public Subnet的Instances,從這裡再進到Private Subnet的Instances。

Internet -> IGW -> VPC & Router -> NACL ->  Route table -> Public/Private subnet -> Security Group -> Instances

幾個關鍵名詞:

  • Internet Gateway
  • VPC
  • Route table
  • NACL
  • Subnet
  • CIDR
公司的AWS VPC裡的內網如何連到外網?
一般Private subnet不具有對外連網能力,需透過NAT Gateway將流量導到外部。 Private Subnet -> NACL -> Route table -> NAT Gateway -> Router & VPC -> IGW -> Internet

公司的AWS VPC如何跟其他的VPC串接?
預設兩個VPC溝通會走外網。 VPC1 -> IGW -> Internet -> IGW -> VPC2
可以用VPC Peering讓兩個VPC在AWS Cloud裡對連。 VPC1 -> VPC Peering -> VPC2

同個AWS Regin裡,內網裡的Instance,如何繼續用內網的方式與AWS其他服務溝通?
預設存取AWS的其他服務都會先繞到外網去。 Private Subnet -> ... -> VPC -> IGW -> Internet -> AWS DynamoDB
可以用VPC Endpoint (AWS PrivateLink)讓Instance直接與AWS的服務溝通。Instance -> VPC Endpoint -> S3

公司的AWS VPC如何跟公司地端網路環境串接?
可以透過Site-to-Site VPN Connection (Virtual Private Gateway)溝通。Instance -> ... -> Virtual Private Gateway (VGW) -> Customer Gateway (CGW) -> ... -> On-Promises Servers
  • 還是透過外網連線,但有多一層VPN加密連線。
  • CGW 可透過軟體安裝或是有支援的硬體設備。用 public internet-routable IP address.
  • 如果CGW在前面有台NAT,則需要啟用NAT traversal (NAT-T), 然後用NAT上的 public IP address。
  • VGW 這邊subnet的route table要記得啟用Route Propagation。
  • NACL和Security Group也要設定正確才會通。
  • 如果想用ping指令測試連線,記得security group inbound的ICMP protocol要打開。
  • 一個VGW跟多個CGW溝通,且CGW也想要彼此也能溝通,可以利用AWS VPN Cloud Hub (hub-and-spoke model)這個服務。每個地端的Site連到同一個VGW設定dynamic routing即可互通。

公司的AWS VPC如何跟公司地端網路環境串接,但不走外網?
可以申請AWS的專線 AWS Direct Connect (DX Connect),確保所有資料都是在專線裡溝通,而不會經過外網(Internet)。 VPC -> Virtual Private Gateway -> AWS Direct Connect Location(AWS Direct Connect Endpoint | Partner Router) -> Customer Network(Customer Router)。
  • 至少需要一個月以上的時間建置專線。
  • Direct Connect Location (通常與當地ISP業者合作,又稱合作夥伴),在裡頭會有AWS Cage和Customer/Partner Cage。
  • AWS Cage有 DX Router, 有專線回到AWS自己的Data Center中。 
  • Customer/Partner Cage有使用者自己或合作夥伴的Router連到地端的網路服務。
  • High Resiliency -> 有多個DX Locations, 每個location底下只有一個DX Connect。
  • Max Resiliency -> 有多個DX Locations, 每個location底下有一個以上DX Connect。

VPC Flow Logs 用來查看VPC裡的網路流量。
  • NACL (stateless),預設都是允許。
    • inbound如果允許進來,outbound如果拒絕,則response會被擋下來。
  • Security Group (stateful),預設都是不允許。
    • inbound如果允許,outbound即使沒特別開起,也會自動允許。request / response會順利執行。



Reference
  • https://godleon.github.io/blog/AWS/AWS-SOA-VPC/
  • https://www.udemy.com/course/aws-certified-solutions-architect-associate-saa-c03
  • https://www.tenlong.com.tw/products/9786263333123?list_name=lv


Tips in Set Cookie with httpOnly and Secure flag

在Cookie上面設定httpOnly和Secure Flag時的重點整理。

首先先快速介紹這兩個flag是做甚麼用的.
1. httpOnly : cookie無法被網頁的javascript讀取,只能被server端存取。
2. secure: cookie只能透過https加密傳送

簡單的說,設定這個讓cookie更安全,可以在XSS, Session hijacking之類的攻擊有多一層防護。

在Java裡,有兩個取得Cookie的地方

第一個是從request.getCookies。這裡取的Cookie是Client端當下request裡帶的所有cookies。(參考)
第二個是從request.getHeader("Cookie")。這裡取的Cookie是Server上一次設在Set-Cookie header裡的cookies。(參考)

Session Cookie是甚麼
session cookie和cookie最大的差別是session cookie是沒有expiry date的,通常是會話結束時也會一併刪除之。而有expiry date的通常我們給予他名稱persistent cookie。但不管是哪種名稱,其實至少只要知道cookie是放在client端,session是放在server端,都是拿來記錄非常小量的資料使用的。

有時候會發現在client端讀到的cookie值跟server端所看到的值不一樣,到底是怎麼一回事?
模擬一下以下情境步驟:
1. 網頁會記住一cookie其鍵為email值為test@domain.com。
2, 當傳送到server端時,從request.getCookies所拿到的email cookie值卻會是test;從header cookie拿到的值當然不意外的,是空值。
3. Server端為了安全,會將所有cookie都帶上httpOnly和secure flags
4. 網頁第二次嘗試傳送這個email cookie值依然為test@domain.com。
5. server端從request.getCookies所拿到的email cookie值還會是test;但header cookie拿到的值卻也是test。


這樣的結果跟我們一開始的預期的結果(test@domain.com)其實落差很大,主要有幾個重點需要理解。

1. Http Cookie如果version為0時,裏頭的value不能有at sign (小老鼠) (參考),這解釋為何email被截了一大半。如果set version為1時,則會有雙引號。
2. response header SET-COOKIE 改變了client端的email cookie值為test,造成第二次在header cookie拿到的結果也變成test。
3. 如果沒有server這個SET-COOKIE的步驟,則第二次在header cookie拿到的則會是完整的email值test@domain.com。
4. 設定的httpOnly會造成javascript無法讀取這個cookie。

總結以上情境,問題的癥結如下:
後端只對自己用到的session cookie (如JSSESSIONID)做httpOnly,不需含前端的cookies
前端應該對一些敏感性的cookie資料做加密或編碼,且要避免特殊符號文字

httpOnly跟secure flag設定方法有很多種
以java為例:

1. Cookie Interface
Cookie cookie = getMyCookie("myCookieName");
cookie.setHttpOnly(true);
cookie.setSecure(true);
resp.addCookie(cookie);

2. Response header
String sessionid = request.getSession().getId();
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; httpOnly; secure");

3. web.xml
<session-config>
 <cookie-config>
  <http-only>true</http-only>
  <secure>true</secure>
 </cookie-config>
</session-config>

4. Tomcat context.xml
<Context useHttpOnly="true">
...
</Context>

參考:
https://www.owasp.org/index.php/HTTPOnly
https://www.owasp.org/index.php/SecureFlag
http://docs.oracle.com/javaee/1.2.1/api/javax/servlet/http/HttpServletRequest.html#getCookies%28%29
https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/Cookie.html#setValue(java.lang.String)
http://stackoverflow.com/questions/33412/how-do-you-configure-httponly-cookies-in-tomcat-java-webapps
https://en.wikipedia.org/wiki/HTTP_cookie#Session_cookie

AWS KMS Example Using AWS Java SDK.

資料庫連線時,把明碼曝露在property裡似乎不是太安全;而用AES加密時,卻又不知道該把Key放在哪裡比較好,其實AWS Key Management Service可以幫我們解決這個困擾。

廢話不多,先自己看一下kms的相關文章:
https://aws.amazon.com/tw/kms/