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) |
|---|---|---|
| Status | Current, recommended | Legacy; अजून चालतो, जमेल तेव्हा migrate |
| SSE-KMS encrypted objects | Supported | Supported नाही |
| PUT/POST/DELETE to S3 | Supported | मर्यादित |
| नवीन Regions (opt-in, Dec 2022 नंतर) | Supported | Supported नाही |
| Bucket policy Principal | Service 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 URL | Signed 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, एक MP4 | HLS video (शेकडो .ts segments), पूर्ण members area |
| लागतं | दुसरं काही नाही | Cookies तुमच्या CloudFront domain ला जायला हव्यात (site च्या same parent वर custom domain) |
| Policy type | काय ठरवता येतं | वापर |
|---|---|---|
| Canned | फक्त expiry, एक exact URL | छोटे URLs, बहुतेक वेळा |
| Custom | Start time, expiry, IP range, wildcard resource | Folder साठी 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 पूर्ण होऊ शकतो.
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)
- Bucket
yourname-cf-secure(private). छोटा MP4 upload:aws s3 cp intro.mp4 s3://yourname-cf-secure/private/intro.mp4.free/preview.mp4पण upload. - CloudShell मध्ये:
openssl genrsa -out private_key.pem 2048 && openssl rsa -pubout -in private_key.pem -out public_key.pem. - CloudFront › Public keys › Create: name
lab-key, public_key.pem paste. ID copy करा. - Key groups › Create: name
lab-kg, lab-key निवडा. - Distribution बनवा: origin = नवीन OAC सह bucket REST endpoint, default behavior CachingOptimized, Redirect HTTP to HTTPS. CloudFront दाखवते ती bucket policy लावा.
- Behaviors › Create: path
/private/*, same origin, Restrict viewer access: Yes, Trusted key groups = lab-kg. Save करा आणि deploy ची वाट बघा. - Free file:
curl -sI https://dXXXX.cloudfront.net/free/preview.mp4 | head -1. अपेक्षित:HTTP/2 200. - Private file, signature नाही:
curl -sI https://dXXXX.cloudfront.net/private/intro.mp4 | head -1. अपेक्षित:HTTP/2 403(MissingKey). - वरच्या Node, Python किंवा PHP code ने sign करा (तुमचा domain आणि key ID).
curl -sI "SIGNED_URL" | head -1. अपेक्षित: 200. Browser मध्ये उघडा: video चालतो. - Tamper test: Signature मधलं एक अक्षर बदला. अपेक्षित: 403 (Access denied).
- 6 minutes थांबा आणि मूळ signed URL परत चालवा. अपेक्षित: Expires संपल्यामुळे "Access denied" सह 403.
- Bypass test:
curl -sI https://yourname-cf-secure.s3.ap-south-1.amazonaws.com/private/intro.mp4 | head -1. अपेक्षित: 403 (OAC bucket private ठेवतो). - Optional geo test: Security › CloudFront geographic restrictions › Block list › India. Deploy नंतर Indian IP वरून free file 403 देते. नंतर block काढा.
Cleanup
- Distribution disable करून delete. मग key group lab-kg, public key lab-key आणि OAC delete (याच order ने; वापरात असलेलं delete होत नाही).
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.
घरी करून बघा
- Lab /private/* साठी signed cookies वर बदला आणि एका cookie set ने दोन files चालवा.
- स्वतःच्या IP ला locked custom-policy URL बनवा आणि दुसऱ्या network वरून test करा.
थोडक्यात सांगायचं तर
- OAC bucket private ठेवतो; OAI legacy.
- Signed URL = एक file; signed cookies = अनेक files.
- Key groups public keys ठेवतात; app private key गुप्त ठेवतं.
- Paid content साठी कमी expiry; expired किंवा tampered = 403.
- देशांसाठी geo restriction, attacks साठी WAF, Shield Standard free.
सराव Tasks
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 दाखवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
सोपं /16 मध्ये किती addresses?
का: VPC size ठरवायला ही संख्या लागते.
काय करायचं: Konkan Cashews चा VPC 10.168.0.0/16. एकूण किती IP addresses?
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
सोपं SSH चा port
का: Security group rules ला योग्य port हवा.
काय करायचं: SSH साठी security group ने कोणता TCP port उघडावा?
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
मध्यम CloudFront cache साफ करा
का: Deploy नंतर invalidate करा म्हणजे visitors ना नव्या files लगेच मिळतात.
काय करायचं: Distribution E2QWRUHAPOMQZL वर सगळे paths (/*) invalidate करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड Config file पासून distribution बनवा
का: पूर्ण config JSON मध्ये ठेवणं सोपं.
काय करायचं: dist.json पासून CloudFront distribution बनवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड दोन paths invalidate करा
का: फक्त बदललेलं invalidate करणं स्वस्त व जलद.
काय करायचं: E2QWRUHAPOMQZL वर /index.html व /css/site.css invalidate करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- 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 असेल तेव्हा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
अवघड Origin Access Control बनवा
का: OAC मुळे फक्त CloudFront तुमचा private S3 bucket वाचू शकतो.
काय करायचं: oac.json पासून origin access control बनवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड CloudFront साठी free certificate मागा
का: CloudFront फक्त us-east-1 मधले ACM certificates वापरतो.
काय करायचं: konkancashews.com व www.konkancashews.com साठी DNS validation ने us-east-1 मध्ये certificate मागा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- 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.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
उजळणी, तुलना आणि मुलाखत cards
हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.







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