Ravindra BagaleCourses & study guides English

CloudFront Security: OAC vs OAI, Signed URLs आणि Signed Cookies

CloudFront Cache Behaviors, TTL आणि Invalidation मध्ये काय cache होतं ते ठरवलं. आता ते कोणाला मिळतं ते ठरवू. हा chapter OAC vs जुना OAI (bucket policies सह), signed URLs vs signed cookies, key groups आणि expiry, geo restriction, आणि AWS WAF ची ओळख शिकवतो. Lab मध्ये private video फक्त 5 minutes मध्ये expire होणाऱ्या signed URL ने चालतो, Node.js, Python आणि PHP code सह. S3 pre-signed URLs साठी S3 Bucket Policy Examples बघा; CloudFront signed URLs वेगळी गोष्ट आहे.

या chapter मध्ये तुम्ही काय शिकाल

  • OAC vs OAI आणि प्रत्येकाची bucket policy
  • Signed URLs vs signed cookies, canned vs custom policy
  • Key groups, public आणि private keys, expiry
  • Geo restriction आणि AWS WAF ओळख
  • Lab: तीन languages मध्ये 5-minute signed video link

1. गोष्ट: cinema ticket

Cinema ला एक दरवाजा (CloudFront) आणि projection room (S3). दोन नियम. एक: projection room फक्त cinema staff साठी उघडते, रस्त्यावरच्यांसाठी कधीच नाही. दोन: दरवाजा फक्त या show च्या ticket ने आत सोडतो, आणि show सुरू झाल्यावर ticket निरुपयोगी.

पहिला नियम OAC. दुसरा signed URL किंवा signed cookie.

2. OAC vs OAI

हे का लागतं?

Bucket public असेल तर कोणीही CloudFront, त्याचे signed URLs आणि WAF टाळून थेट S3 मधून download करू शकतो.

हे काय आहे?

मुद्दाOAC (Origin Access Control)OAI (Origin Access Identity)
StatusCurrent, recommendedLegacy; अजून चालतो, जमेल तेव्हा migrate
SSE-KMS encrypted objectsSupportedSupported नाही
PUT/POST/DELETE to S3Supportedमर्यादित
नवीन Regions (opt-in, Dec 2022 नंतर)SupportedSupported नाही
Bucket policy PrincipalService cloudfront.amazonaws.com + distribution चा AWS:SourceArnएक खास CloudFront OAI user

OAC bucket policy

{"Version":"2012-10-17","Statement":[{"Sid":"AllowCloudFrontOAC","Effect":"Allow",
 "Principal":{"Service":"cloudfront.amazonaws.com"},
 "Action":"s3:GetObject","Resource":"arn:aws:s3:::course-videos/*",
 "Condition":{"StringEquals":{"AWS:SourceArn":"arn:aws:cloudfront::111122223333:distribution/E1ABCDEF2GHIJ"}}}]}

Condition का: त्याशिवाय कोणत्याही account चं कोणतंही CloudFront distribution तुमचा bucket वाचू शकेल. Objects SSE-KMS वापरत असतील तर key policy मध्ये त्याच SourceArn condition सह cloudfront.amazonaws.com ला kms:Decrypt पण allow करा.

OAI bucket policy (legacy, जुने setups वाचण्यासाठी)

{"Version":"2012-10-17","Statement":[{"Effect":"Allow",
 "Principal":{"AWS":"arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E2QWRUHAPOMQZL"},
 "Action":"s3:GetObject","Resource":"arn:aws:s3:::course-videos/*"}]}

Migrate: OAC बनवा, bucket policy मध्ये OAC statement जोडा, origin OAC वर switch करा, test करा, मग OAI statement काढा.

3. Signed URLs आणि signed cookies

हे का लागतं?

OAC bucket लपवतो, पण CloudFront URL स्वतः उघडा. Paid किंवा private content साठी प्रत्येक viewer ला वैयक्तिक, expire होणारी permission हवी.

हे काय आहे?

Cache behavior वर Restrict viewer access: Yes करा आणि key group जोडा. App जुळणाऱ्या private key ने URLs किंवा cookies sign करतं. CloudFront public key ने signature आणि expiry तपासतो. Valid signature नाही = 403.

मुद्दाSigned URLSigned cookies
काय coverएक fileअनेक files, उदा. /course/42/*
कसं दिसतं...mp4?Expires=...&Signature=...&Key-Pair-Id=K2JC...Cookies CloudFront-Policy (किंवा CloudFront-Expires), CloudFront-Signature, CloudFront-Key-Pair-Id
कशासाठीएक download, एक MP4HLS video (शेकडो .ts segments), पूर्ण members area
लागतंदुसरं काही नाहीCookies तुमच्या CloudFront domain ला जायला हव्यात (site च्या same parent वर custom domain)
Policy typeकाय ठरवता येतंवापर
Cannedफक्त expiry, एक exact URLछोटे URLs, बहुतेक वेळा
CustomStart time, expiry, IP range, wildcard resourceFolder साठी signed cookies, IP-locked links

4. Key groups

  • RSA 2048 key pair स्वतः बनवा: openssl genrsa -out private_key.pem 2048 आणि openssl rsa -pubout -in private_key.pem -out public_key.pem.
  • फक्त public key CloudFront › Key management › Public keys मध्ये upload. K2JCJMDEHXQW5F सारखा ID मिळतो.
  • तो key group मध्ये टाका आणि group behavior ला जोडा. Rotation: group मध्ये नवीन key, app switch, जुनी key काढा.
  • Private key AWS Secrets Manager किंवा SSM Parameter Store मध्ये, Git मध्ये कधीच नाही. Key groups जुन्या root-account "CloudFront key pairs" ची जागा घेतात.
  • Expiry: video साठी कमी (5 ते 60 minutes). Signed URL request सुरू होताना तपासला जातो, म्हणून expiry आधी सुरू झालेला मोठा download पूर्ण होऊ शकतो.
Signed URL तपासणीApp: user ने पैसे भरले?होApp URL sign करतंprivate key, expires +5 minViewer URL उघडतोedge वरCloudFront तपासतोpublic key ने signature + expiryValid: cache मधूनकिंवा OAC ने आणूनInvalid किंवा expired403 Forbidden
या paths साठी S3 ला कधीच unsigned request दिसत नाही.

5. Geo restriction आणि AWS WAF

  • Geo restriction (Security tab): देशांची allow list किंवा block list. Blocked viewers ना 403. का: licensing ("फक्त India") किंवा कायदे. CloudFront GeoIP database वापरतो, म्हणून साधारण 99.8% अचूक, आणि VPNs टाळू शकतात.
  • AWS WAF: distribution ला जोडलेला web ACL. AWS managed rule groups (Core rule set, Known bad inputs, SQL database) आणि दर IP दर 5 minutes 2,000 requests सारख्या rate-based rule ने सुरू करा. का: SQL injection, bad bots आणि floods edge वरच, origin आधी थांबवतो.
  • AWS Shield Standard प्रत्येक distribution ला common network DDoS attacks पासून extra खर्चाशिवाय वाचवतो.

6. तीन languages मध्ये signing code

// Node.js  -  npm i @aws-sdk/cloudfront-signer
const { getSignedUrl } = require('@aws-sdk/cloudfront-signer');
const fs = require('fs');
const url = getSignedUrl({
  url: 'https://dXXXX.cloudfront.net/private/intro.mp4',
  keyPairId: 'K2JCJMDEHXQW5F',                     // public key ID
  privateKey: fs.readFileSync('private_key.pem', 'utf8'),
  dateLessThan: new Date(Date.now() + 5 * 60 * 1000).toISOString()  // 5 minutes
});
console.log(url);
# Python  -  pip install botocore cryptography
import datetime
from botocore.signers import CloudFrontSigner
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding

KEY = serialization.load_pem_private_key(open("private_key.pem", "rb").read(), password=None)
def rsa_signer(message):
    return KEY.sign(message, padding.PKCS1v15(), hashes.SHA1())  # CloudFront uses RSA-SHA1

signer = CloudFrontSigner("K2JCJMDEHXQW5F", rsa_signer)
expires = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(minutes=5)
print(signer.generate_presigned_url("https://dXXXX.cloudfront.net/private/intro.mp4", date_less_than=expires))
<?php // PHP  -  composer require aws/aws-sdk-php
require 'vendor/autoload.php';
$cf = new Aws\CloudFront\CloudFrontClient(['region' => 'us-east-1', 'version' => '2020-05-31']);
echo $cf->getSignedUrl([
    'url'         => 'https://dXXXX.cloudfront.net/private/intro.mp4',
    'expires'     => time() + 300,
    'private_key' => __DIR__ . '/private_key.pem',
    'key_pair_id' => 'K2JCJMDEHXQW5F',
]);

Node मध्ये signed cookies साठी getSignedCookies({url, keyPairId, privateKey, policy}), custom policy चा Resource https://dXXXX.cloudfront.net/course/42/*; मिळालेल्या तीन cookies Domain, Secure आणि HttpOnly सह set करा.

7. Lab: 5-minute signed URL सह private video

कसं करायचं (step by step)

  1. Bucket yourname-cf-secure (private). छोटा MP4 upload: aws s3 cp intro.mp4 s3://yourname-cf-secure/private/intro.mp4. free/preview.mp4 पण upload.
  2. CloudShell मध्ये: openssl genrsa -out private_key.pem 2048 && openssl rsa -pubout -in private_key.pem -out public_key.pem.
  3. CloudFront › Public keys › Create: name lab-key, public_key.pem paste. ID copy करा.
  4. Key groups › Create: name lab-kg, lab-key निवडा.
  5. Distribution बनवा: origin = नवीन OAC सह bucket REST endpoint, default behavior CachingOptimized, Redirect HTTP to HTTPS. CloudFront दाखवते ती bucket policy लावा.
  6. Behaviors › Create: path /private/*, same origin, Restrict viewer access: Yes, Trusted key groups = lab-kg. Save करा आणि deploy ची वाट बघा.
  7. Free file: curl -sI https://dXXXX.cloudfront.net/free/preview.mp4 | head -1. अपेक्षित: HTTP/2 200.
  8. Private file, signature नाही: curl -sI https://dXXXX.cloudfront.net/private/intro.mp4 | head -1. अपेक्षित: HTTP/2 403 (MissingKey).
  9. वरच्या Node, Python किंवा PHP code ने sign करा (तुमचा domain आणि key ID). curl -sI "SIGNED_URL" | head -1. अपेक्षित: 200. Browser मध्ये उघडा: video चालतो.
  10. Tamper test: Signature मधलं एक अक्षर बदला. अपेक्षित: 403 (Access denied).
  11. 6 minutes थांबा आणि मूळ signed URL परत चालवा. अपेक्षित: Expires संपल्यामुळे "Access denied" सह 403.
  12. Bypass test: curl -sI https://yourname-cf-secure.s3.ap-south-1.amazonaws.com/private/intro.mp4 | head -1. अपेक्षित: 403 (OAC bucket private ठेवतो).
  13. Optional geo test: Security › CloudFront geographic restrictions › Block list › India. Deploy नंतर Indian IP वरून free file 403 देते. नंतर block काढा.

Cleanup

  1. Distribution disable करून delete. मग key group lab-kg, public key lab-key आणि OAC delete (याच order ने; वापरात असलेलं delete होत नाही).
  2. aws s3 rb s3://yourname-cf-secure --force; shred -u private_key.pem.

8. Interview questions

प्र. नवीन distribution साठी OAC की OAI?

OAC. SSE-KMS, सगळे Regions आणि write methods support करतो; OAI legacy.

प्र. OAC bucket policy मध्ये AWS:SourceArn का?

म्हणजे फक्त तुमचं distribution, कोणतंही CloudFront distribution नाही, bucket वाचू शकतं.

प्र. HLS video साठी signed URL की signed cookies?

Signed cookies: एक permission playlist आणि सगळे segments cover करते.

प्र. CloudFront signed URL vs S3 pre-signed URL?

CloudFront key group key ने sign करतो आणि edge cache मधून देतो; S3 pre-signed IAM credentials वापरतो आणि थेट S3 ला जातो.

प्र. देश block कसा करता?

Distribution मध्ये geo restriction block list, किंवा बारीक control साठी WAF geo match rule.

घरी करून बघा

  1. Lab /private/* साठी signed cookies वर बदला आणि एका cookie set ने दोन files चालवा.
  2. स्वतःच्या IP ला locked custom-policy URL बनवा आणि दुसऱ्या network वरून test करा.

थोडक्यात सांगायचं तर

  1. OAC bucket private ठेवतो; OAI legacy.
  2. Signed URL = एक file; signed cookies = अनेक files.
  3. Key groups public keys ठेवतात; app private key गुप्त ठेवतं.
  4. Paid content साठी कमी expiry; expired किंवा tampered = 403.
  5. देशांसाठी geo restriction, attacks साठी WAF, Shield Standard free.

सराव Tasks

या scenario बद्दल

Konkan Cashews हा रत्नागिरी मधला अन्न निर्यात व्यवसाय आहे. Prakash Sawant त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे INR मध्ये मोजले जातात आणि AWS resources ap-south-1 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.

0 / 10

सोपं Distributions दाखवा

का: Distribution ID व domain नाव शोधा.

काय करायचं: सगळे CloudFront distributions दाखवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

सोपं /16 मध्ये किती addresses?

का: VPC size ठरवायला ही संख्या लागते.

काय करायचं: Konkan Cashews चा VPC 10.168.0.0/16. एकूण किती IP addresses?

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

सोपं SSH चा port

का: Security group rules ला योग्य port हवा.

काय करायचं: SSH साठी security group ने कोणता TCP port उघडावा?

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

मध्यम CloudFront cache साफ करा

का: Deploy नंतर invalidate करा म्हणजे visitors ना नव्या files लगेच मिळतात.

काय करायचं: Distribution E2QWRUHAPOMQZL वर सगळे paths (/*) invalidate करा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

अवघड Config file पासून distribution बनवा

का: पूर्ण config JSON मध्ये ठेवणं सोपं.

काय करायचं: dist.json पासून CloudFront distribution बनवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

अवघड दोन paths invalidate करा

का: फक्त बदललेलं invalidate करणं स्वस्त व जलद.

काय करायचं: E2QWRUHAPOMQZL वर /index.html व /css/site.css invalidate करा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

अवघड CloudFront OAC साठी bucket policy

का: OAC मुळे फक्त तुमचा CloudFront distribution private bucket वाचतो.

काय करायचं: cloudfront.amazonaws.com ला konkancashew-site/* वर s3:GetObject allow, फक्त aws:SourceArn = arn:aws:cloudfront::103761760951:distribution/E2QWRUHAPOMQZL असेल तेव्हा.

कसं करायचं:
  1. { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
  2. प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
  3. Task ला लागेल तेवढंच द्या (least privilege).
  4. Double quotes व commas नीट वापरा. Check answer दाबा.

अवघड Origin Access Control बनवा

का: OAC मुळे फक्त CloudFront तुमचा private S3 bucket वाचू शकतो.

काय करायचं: oac.json पासून origin access control बनवा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

अवघड CloudFront साठी free certificate मागा

का: CloudFront फक्त us-east-1 मधले ACM certificates वापरतो.

काय करायचं: konkancashews.com व www.konkancashews.com साठी DNS validation ने us-east-1 मध्ये certificate मागा.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

अवघड CloudFront signed URL बनवा

का: Signed URLs मुळे फक्त पैसे भरलेले users ठराविक वेळ video पाहू शकतात.

काय करायचं: https://d111.cloudfront.net/course/intro.mp4 ला key pair ID K2JCJMDEHXQW5F, private key private_key.pem ने sign करा, 2026-12-31 ला expire.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

उजळणी, तुलना आणि मुलाखत cards

हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.

उजळणी card: OAC bucket policy. Principal: Service cloudfront.amazonaws.com. Condition: AWS:SourceArn = तुमचा distribution ARN. OAC SSE-KMS आणि सगळे Regions support करतो; OAI legacy. Bucket private; थेट S3 URL ला 403.
उजळणी card: OAC bucket policy · PNG download करा
उजळणी card: CloudFront signed URLs. Behavior: Restrict viewer access + key group. App private key ने sign करतं; CloudFront public key ने तपासतो. Expired किंवा tampered link: 403. Node signer package.
उजळणी card: CloudFront signed URLs · PNG download करा
उजळणी card: Geo restriction आणि WAF. Geo restriction: देश allow किंवा block. AWS WAF: edge वर managed rules आणि rate limits. Shield Standard: free DDoS protection. Blocked viewers ना 403.
उजळणी card: Geo restriction आणि WAF · PNG download करा
तुलना: OAC vs OAI. OAC: Origin Access Control: CloudFront SigV4 ने S3 requests sign करतो. OAI: Origin Access Identity: एक खास CloudFront user.
तुलना: OAC vs OAI · PNG download करा
तुलना: Signed URL vs Signed cookies. Signed URL: एका URL च्या query string मध्ये signature. Signed cookies: प्रत्येक request सोबत तीन CloudFront-* cookies.
तुलना: Signed URL vs Signed cookies · PNG download करा
तुलना: CloudFront signed URL vs S3 pre-signed URL. CloudFront signed URL: Key group private key ने sign; edge वर तपासणी. S3 pre-signed URL: IAM credentials ने sign; S3 तपासतो.
तुलना: CloudFront signed URL vs S3 pre-signed URL · PNG download करा
मुलाखत card: Signed URL vs signed cookies?. Signed URL: एक file, उदा. एक MP4 download. Signed cookies: अनेक files, उदा. HLS segments. दोन्ही key group वापरतात आणि expire होतात.
मुलाखत card: Signed URL vs signed cookies? · PNG download करा

अजून cards: Ravi Sir's Cards.