S3 Bucket Policy Examples: Block Public Access, ACLs, Pre-Signed URLs आणि Encryption
Private EC2 मधून S3 कसं वापरायचं मध्ये server ला S3 कडे private रस्ता दिला. आता data सोबत कोण काय करू शकतो ते ठरवायचं. हा chapter Block Public Access, IAM policies vs bucket policies, Object Ownership आणि ACLs, copy करता येणारी सात bucket policy examples, तात्पुरत्या sharing साठी pre-signed URLs, आणि SSE-S3 व SSE-KMS encryption शिकवतो. शेवटी lab.
या chapter मध्ये तुम्ही काय शिकाल
- S3 data leaks का होतात, आणि Block Public Access ते कसं थांबवतं
- IAM policy vs bucket policy: कोण कुठे तपासला जातो
- Object Ownership: ACLs disabled vs enabled
- सात bucket policy JSON examples
- सहा languages मध्ये pre-signed URLs
- SSE-S3 vs SSE-KMS encryption
1. Data leak ची गोष्ट
एक company customer ID cards एका bucket मध्ये ठेवते. एक developer "फक्त test साठी" bucket public करतो आणि विसरतो. काही आठवड्यांनी security researcher ला 50,000 ID cards पूर्ण internet साठी उघडे सापडतात. बातम्यांमध्ये breach म्हणतात.
S3 hack झालं नव्हतं. एक setting चुकीचं होतं. या chapter मधलं सगळं म्हणजे योग्य setting सोपं करणं.
2. Block Public Access
हे का लागतं?
एक चुकीची policy किंवा ACL data public करू शकते. सगळ्या policies वरचा safety switch ती चूक थांबवतो.
हे काय आहे?
Block Public Access (BPA) म्हणजे account किंवा bucket level वरचे चार switches. चालू असतील तर data public करणारी कोणतीही policy किंवा ACL S3 नाकारतं. नवीन buckets मध्ये चारही default ने चालू.
| Switch | काय block करतो |
|---|---|
| BlockPublicAcls | नवीन public ACLs |
| IgnorePublicAcls | आधीच्या public ACLs (ignore) |
| BlockPublicPolicy | Public access देणाऱ्या नवीन bucket policies |
| RestrictPublicBuckets | आधीच्या public policy मधून public आणि cross-account access |
Ravindra Bagale's Tip
Account level वर BPA चालू ठेवा. खरंच public असायलाच हवा अशा एकाच bucket वर बंद करा, उदा. CloudFront नसलेला website bucket.
3. IAM policy vs bucket policy
हे का लागतं?
S3 permissions दोन ठिकाणी तपासतं. दोन्ही माहीत नसतील तर जास्त permission द्याल किंवा तासन्तास debug कराल.
हे काय आहे?
| मुद्दा | IAM policy | Bucket policy |
|---|---|---|
| कशाला attach | User, group किंवा role | Bucket |
| उत्तर | ही identity काय करू शकते? | हा bucket कोण वापरू शकतं? |
| Principal असतो | नाही | हो |
| Cross-account / public | नाही | हो |
| उदाहरण | Role app-role ला reels-app-media/* वर PutObject | HTTPS नसलेली प्रत्येक request deny |
नियम: एकाच account मध्ये, कुठेही Allow पुरेसा, जोपर्यंत काही Deny म्हणत नाही. कुठलाही explicit Deny नेहमी जिंकतो.
4. Object Ownership आणि ACLs
हे का लागतं?
ACLs ही जुनी, दर-object permission system. दुसरं account तुमच्या bucket मध्ये upload करतं तेव्हा ACLs मुळे ते account object चं owner होऊ शकतं, आणि तुम्ही तुमच्याच bucket च्या files वाचू शकत नाही.
हे काय आहे?
| Setting | अर्थ | कधी |
|---|---|---|
| ACLs disabled: Bucket owner enforced (default) | प्रत्येक object तुमच्या account चा. ACLs ignore. फक्त policies access ठरवतात. | जवळजवळ नेहमी |
| ACLs enabled: Bucket owner preferred | bucket-owner-full-control ACL असलेले uploads तुमचे. | अजूनही ACLs पाठवणारे legacy cross-account writers |
| ACLs enabled: Object writer | Upload करणारं account object चं owner. | क्वचित: writer ला ownership ठेवायची असेल |
उदाहरण: partner account मधलं जुनं log-shipping tool --acl bucket-owner-full-control सह upload करतं. "Bucket owner preferred" सोबत ते logs तुमचेच. Default "Bucket owner enforced" सोबत ACL ignore होतो आणि logs तसेही तुमचेच, म्हणून बहुतेक teams default ठेवतात.
5. सात bucket policy examples
हे का लागतं?
बहुतेक S3 security bucket policy JSON मध्ये लिहिली जाते. Shape एकदा शिका, मग ही examples copy करून बदला.
हे काय आहे?
प्रत्येक statement मध्ये Effect (Allow/Deny), Principal (कोण), Action (काय), Resource (कोणता bucket किंवा objects) आणि optional Condition (कधी). arn:aws:s3:::bucket म्हणजे bucket; arn:aws:s3:::bucket/* म्हणजे प्रत्येक object.
1. Website साठी public read (या bucket वर BPA बंद हवा)
{"Version":"2012-10-17","Statement":[{"Sid":"PublicRead","Effect":"Allow","Principal":"*",
"Action":"s3:GetObject","Resource":"arn:aws:s3:::my-site-bucket/*"}]}
2. एका IAM role ला read आणि write
{"Version":"2012-10-17","Statement":[{"Sid":"AppRole","Effect":"Allow",
"Principal":{"AWS":"arn:aws:iam::111122223333:role/reels-ec2-role"},
"Action":["s3:GetObject","s3:PutObject"],"Resource":"arn:aws:s3:::reels-app-media/*"}]}
3. HTTPS नसलेली प्रत्येक request deny
{"Version":"2012-10-17","Statement":[{"Sid":"HttpsOnly","Effect":"Deny","Principal":"*","Action":"s3:*",
"Resource":["arn:aws:s3:::reels-app-media","arn:aws:s3:::reels-app-media/*"],
"Condition":{"Bool":{"aws:SecureTransport":"false"}}}]}
4. फक्त आपल्या VPC endpoint मधून
{"Version":"2012-10-17","Statement":[{"Sid":"OnlyFromVpce","Effect":"Deny","Principal":"*","Action":"s3:*",
"Resource":["arn:aws:s3:::reels-app-media","arn:aws:s3:::reels-app-media/*"],
"Condition":{"StringNotEquals":{"aws:SourceVpce":"vpce-0abc12345def67890"}}}]}
काळजी: हे console मधून तुम्हालाही block करतं. Save करण्याआधी aws:PrincipalArn ने admin role ला exception द्या.
5. फक्त office IP range मधून
{"Version":"2012-10-17","Statement":[{"Sid":"OfficeOnly","Effect":"Deny","Principal":"*","Action":"s3:*",
"Resource":["arn:aws:s3:::finance-reports","arn:aws:s3:::finance-reports/*"],
"Condition":{"NotIpAddress":{"aws:SourceIp":"203.0.113.0/24"}}}]}
aws:SourceIp फक्त public IPs बघतो. VPC endpoint मधून येणाऱ्या traffic ला public source IP नसतो, म्हणून तिथे aws:SourceVpce वापरा.
6. Partner account ला cross-account read
{"Version":"2012-10-17","Statement":[{"Sid":"PartnerRead","Effect":"Allow",
"Principal":{"AWS":"arn:aws:iam::444455556666:root"},
"Action":["s3:ListBucket","s3:GetObject"],
"Resource":["arn:aws:s3:::shared-reports","arn:aws:s3:::shared-reports/*"]}]}
Partner ने स्वतःच्या users ना पण या actions साठी IAM policy द्यावी. दोन्ही बाजूंनी allow हवं.
7. KMS ने encrypt न केलेले uploads deny
{"Version":"2012-10-17","Statement":[{"Sid":"KmsOnly","Effect":"Deny","Principal":"*","Action":"s3:PutObject",
"Resource":"arn:aws:s3:::secure-docs/*",
"Condition":{"StringNotEquals":{"s3:x-amz-server-side-encryption":"aws:kms"}}}]}
January 2023 पासून प्रत्येक नवीन object default ने SSE-S3 ने encrypt होतो. नियम "KMS च हवं" असा असेल तेव्हा ही policy वापरा, फक्त "encrypted हवं" साठी नाही. Bucket वर default encryption SSE-KMS ठेवणं हा सोपा मार्ग.
6. Pre-signed URLs
हे का लागतं?
User ने स्वतःची invoice download करावी किंवा video upload करावा, पण bucket private राहायला हवा आणि user ला कधीच AWS keys मिळू नयेत.
हे काय आहे?
Pre-signed URL म्हणजे app च्या credentials ने बनवलेल्या signature सह साधा S3 URL. Link असलेला कोणीही expire होईपर्यंत त्या एका key वर ती एकच action (GET किंवा PUT) करू शकतो. IAM user सोबत 7 दिवसांपर्यंत; role (EC2) सोबत role चे temporary credentials संपले की संपतो, बहुतेक काही तासांत.
| Stack | 15 minutes चालणारी GET link |
|---|---|
| AWS CLI | aws s3 presign s3://reels-app-media/v/42.mp4 --expires-in 900 |
| Node.js | await getSignedUrl(s3, new GetObjectCommand({Bucket:b,Key:k}), {expiresIn:900}) |
| Python boto3 | s3.generate_presigned_url("get_object", Params={"Bucket":b,"Key":k}, ExpiresIn=900) |
| Java | presigner.presignGetObject(r -> r.signatureDuration(Duration.ofMinutes(15)).getObjectRequest(g -> g.bucket(b).key(k))) |
| PHP | $s3->createPresignedRequest($s3->getCommand('GetObject',['Bucket'=>$b,'Key'=>$k]),'+15 minutes') |
| .NET | s3.GetPreSignedURL(new GetPreSignedUrlRequest{BucketName=b,Key=k,Expires=DateTime.UtcNow.AddMinutes(15)}) |
| Go | presign.PresignGetObject(ctx,&s3.GetObjectInput{Bucket:&b,Key:&k},s3.WithPresignExpires(15*time.Minute)) |
Signer ला ती action करायची परवानगी असेल तरच link चालते. Role चं s3:GetObject गेलं तर त्याने बनवलेल्या सगळ्या links बंद.
7. Encryption: SSE-S3 vs SSE-KMS
हे का लागतं?
कोणाला physical disks मिळाल्या तरी encrypted data त्यांच्या कामाचा नाही. काही कायदे key control आणि audit करायला पण सांगतात.
हे काय आहे?
| मुद्दा | SSE-S3 | SSE-KMS |
|---|---|---|
| Key कोण सांभाळतं | पूर्ण S3 | AWS KMS (AWS managed किंवा तुमची customer managed key) |
| खर्च | Free | KMS request charges (Bucket Key ने कमी) |
| Decrypt कोण | s3:GetObject असलेला कोणीही | s3:GetObject आणि kms:Decrypt दोन्ही |
| Audit | Key log नाही | प्रत्येक key वापर CloudTrail मध्ये |
| कशासाठी | बहुतेक data (default) | Regulated किंवा sensitive data |
तसंच: DSSE-KMS कडक नियमांसाठी दोन layers देतो, आणि SSE-C म्हणजे प्रत्येक request सोबत तुमची स्वतःची key. Transit मध्ये HTTPS वापरा (example 3 ते enforce करतो).
8. Lab: private bucket, HTTPS-only policy, role access, pre-signed link आणि KMS
हे का लागतं?
Private object साधी link नाकारतो, pre-signed link ने उघडतो, साधा HTTP नाकारतो, आणि KMS key वापरतो हे तुम्ही बघाल.
कसं करायचं (step by step)
- Region ap-south-1. Bucket
yourname-sec-labबनवा: ACLs disabled, Block all public access on, default encryption SSE-S3. - CloudShell मध्ये:
echo "invoice 1001" > inv.txt && aws s3 cp inv.txt s3://yourname-sec-lab/invoices/. - साधा URL:
curl -s https://yourname-sec-lab.s3.ap-south-1.amazonaws.com/invoices/inv.txt. अपेक्षित:<Code>AccessDenied</Code>. - Pre-signed link:
U=$(aws s3 presign s3://yourname-sec-lab/invoices/inv.txt --expires-in 300 --region ap-south-1)मगcurl -s "$U". अपेक्षित:invoice 1001. - Bucket › Permissions › Bucket policy › Edit. Example 3 (HTTPS only) तुमच्या bucket नावासह paste. Save. का: आता साधा HTTP सगळ्यांसाठी नाकारला जातो.
- HTTP test:
curl -s "${U/https/http}". अपेक्षित: AccessDenied. HTTPS link चालतेच. - KMS › Customer managed keys › Create key: Symmetric, Encrypt and decrypt, alias
sec-lab-key, key admin आणि user = तुमचा admin role. - KMS सह upload:
aws s3 cp inv.txt s3://yourname-sec-lab/kms/inv.txt --sse aws:kms --sse-kms-key-id alias/sec-lab-key. - तपासा:
aws s3api head-object --bucket yourname-sec-lab --key kms/inv.txt. अपेक्षित:"ServerSideEncryption": "aws:kms"आणि key ARN. - CloudTrail › Event history, Event source
kms.amazonaws.comfilter. अपेक्षित:GenerateDataKeyevent. का: KMS वापर audit होतो.
Cleanup
aws s3 rb s3://yourname-sec-lab --force.- KMS › key › Key actions › Schedule key deletion, 7 days. का: keys ला साधारण $1 दर महिना लागतो आणि लगेच delete होत नाहीत.
9. Interview questions
प्र. Block Public Access काय करतं?
Account किंवा bucket level वर public ACLs आणि public bucket policies नाकारायला लावणारे चार switches. नवीन buckets साठी default ने चालू.
प्र. Cross-account access साठी IAM policy की bucket policy?
Bucket policy, कारण त्यात Principal असतो. दुसऱ्या account ने पण IAM ने त्यांच्या users ना allow करायला हवं.
प्र. ACLs default ने disabled का?
म्हणजे प्रत्येक object bucket owner चा आणि access फक्त policies मधून, audit करायला सोपं.
प्र. Bucket वर HTTPS कसं force करता?
Condition aws:SecureTransport = false असलेलं Deny statement.
प्र. Pre-signed URL किती काळ चालू शकतो?
IAM user credentials सोबत 7 दिवसांपर्यंत; role credentials सोबत ते temporary credentials संपेपर्यंतच.
प्र. SSE-S3 vs SSE-KMS?
SSE-S3 free आणि पूर्ण S3 managed. SSE-KMS KMS key वापरतं, वाचायला kms:Decrypt लागतं, आणि प्रत्येक वापर CloudTrail मध्ये.
घरी करून बघा
- फक्त public/ prefix वर GetObject allow करणारी bucket policy लिहा आणि curl ने test करा.
- boto3 ने pre-signed PUT URL बनवा आणि curl -X PUT --upload-file ने त्यावर file upload करा.
- Test role मधून kms:Decrypt काढा आणि read fail होताना बघा.
थोडक्यात सांगायचं तर
- Block Public Access हा safety switch; चालू ठेवा.
- IAM = identity काय करू शकते; bucket policy = bucket कोण वापरू शकतं.
- Explicit Deny नेहमी जिंकतो.
- ACLs disabled (bucket owner enforced) default आणि best.
- Pre-signed URLs keys शिवाय थोड्या काळासाठी एक object share करतात.
- Default SSE-S3; key control आणि audit हवा तेव्हा SSE-KMS.
सराव Tasks
Jakarta Batik हा जकार्ता मधला हस्तकला व्यवसाय आहे. Siti Rahmawati त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे IDR मध्ये मोजले जातात आणि AWS resources ap-southeast-3 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.
0 / 12
सोपं एका bucket ला read-only access
का: Least privilege: कामाला लागणारे actions व bucket च द्या.
काय करायचं: User ला फक्त jakartabatik-data bucket मधले objects वाचू (s3:GetObject) देणारी identity policy लिहा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
सोपं CloudFormation: versioned bucket
का: IaC मुळे setup पुन्हा करता येतं.
काय करायचं: jakartabatik-docs नावाचा, versioning Enabled असलेला एक S3 bucket CloudFormation YAML मध्ये लिहा.
- Task मधल्या top-level keys पासून सुरू करा.
- Child keys 2 spaces ने indent करा (tabs नकोत).
- प्रत्येक property मध्ये task मधली value भरा.
- Check answer दाबा. Keys चा क्रम महत्त्वाचा नाही.
मध्यम Temporary download link बनवा
का: Pre-signed URL ने bucket public न करता एक private file थोड्या वेळासाठी share होते.
काय करायचं: s3://jakartabatik-invoices-2026/inv-101.pdf साठी 3600 seconds मध्ये expire होणारा pre-signed URL बनवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम Public website साठी bucket policy
का: Static website bucket ने सगळ्यांना files वाचू द्याव्या.
काय करायचं: jakartabatik-site मधल्या प्रत्येक object वर कोणालाही (*) s3:GetObject करू देणारी bucket policy लिहा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
मध्यम एका folder मध्ये फक्त upload
का: Field staff files टाकू शकतात पण वाचू/delete करू शकत नाहीत.
काय करायचं: jakartabatik-data मध्ये फक्त uploads/ prefix खाली s3:PutObject allow करा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
मध्यम File मधून bucket policy लावा
का: मोठा JSON file मध्ये ठेवणं सोपं; file:// ने CLI ती file वाचतो.
काय करायचं: policy.json मधली bucket policy jakartabatik-web bucket ला लावा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम एक bucket list व read
का: ListBucket bucket ARN वर; GetObject object ARNs वर चालतो.
काय करायचं: jakartabatik-data bucket वर s3:ListBucket व सगळ्या objects वर s3:GetObject allow करा. बाकी काही नाही.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
मध्यम Storage खर्च
का: Storage per GB-month.
काय करायचं: S3 Standard मध्ये 500 GB, USD 0.023 per GB-month. Monthly खर्च USD?
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
अवघड HTTPS शिवाय requests deny
का: aws:SecureTransport false म्हणजे साधं HTTP; ते deny करा.
काय करायचं: Bucket policy: aws:SecureTransport false असेल तेव्हा jakartabatik-data व objects वर (*) ला s3:* deny.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
अवघड CloudFront OAC साठी bucket policy
का: OAC मुळे फक्त तुमचा CloudFront distribution private bucket वाचतो.
काय करायचं: cloudfront.amazonaws.com ला jakartabatik-site/* वर s3:GetObject allow, फक्त aws:SourceArn = arn:aws:cloudfront::129471578432:distribution/E2QWRUHAPOMQZL असेल तेव्हा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
अवघड KMS ने default encryption
का: Default encryption मुळे प्रत्येक नवा object encrypt होतो.
काय करायचं: enc.json मधल्या encryption settings jakartabatik-hr-docs bucket ला लावा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड सगळा public access block करा
का: Block Public Access चुकून public bucket होणं थांबवणारा safety switch.
काय करायचं: jakartabatik-hr-docs bucket साठी चारही Block Public Access settings सुरू करा.
- 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.