✂️ धडा 11 — Least privilege: वापरले जाते तेवढेच ठेवा
📍 तुम्ही इथे आहात: 12 पैकी धडा 11 · मागील: lesson-10-people-at-scale · पुढील: lesson-12-audit-incidents
📦 या ब्रँचमध्ये काय आहे
धडे 01–10, आणि पुराव्यासह permissions कमी करणारे चक्र: काय दिले होते (teachers-wide.json) आणि 90 दिवसांत प्रत्यक्ष काय वापरले (iam/data/last-accessed.json) यांची तुलना करा, अरुंद policy तयार करा, आणि खरे काम अजूनही चालते हे सिद्ध करा.
🧒 5 वर्षांच्या मुलाला समजावल्यासारखे
शिक्षिकांचे कार्ड बनवताना कोणीतरी लिहिले "प्रत्येक खोली वापरू शकतात: ग्रंथालय, lab, स्वयंपाकघर, boiler room" — ते जलद होते. कार्यालय एक अभ्यागत नोंदवही सुद्धा ठेवते. तीन महिन्यांनंतर ती दाखवते की शिक्षिकांनी ग्रंथालय वापरले आणि lab मध्ये डोकावल्या. Boiler room मध्ये कधीच कोणी गेले नाही.
म्हणून कार्यालय नोंदवहीत दिसते तेवढेच ठेवून कार्ड कापते ✂️, मग दुसऱ्या दिवशी सकाळी तपासते की प्रत्येक शिक्षिका अजूनही तिचे खरे काम करू शकते. आता boiler room त्यांच्यासाठी बंद आहे — आणि एखाद्या शिक्षिकेचे कार्ड कधी चोरीला गेले तरी चोरही तिथे पोहोचू शकत नाही.
🗺️ आकृती
flowchart LR
wide["📝 granted<br/>s3:* · ec2:* · dynamodb:*"]
log["📊 last accessed · 90 days<br/>s3:GetObject · s3:ListBucket<br/>s3:PutObject · ec2:DescribeInstances"]
gen["✂️ generated policy<br/>4 actions"]
narrow["🎯 + real Resource ARNs<br/>school-reports only"]
test["✅ used actions still ALLOW<br/>🚫 dynamodb:DeleteTable"]
wide --> log -->|"1 compare"| gen -->|"2 narrow resources"| narrow -->|"3 prove"| test
🗺️ काढलेली आकृती + एक lab: https://school-edh.pages.dev/iam/lesson-diagrams.html#l11
❓ काय
- Least privilege — कामाला लागतील तेवढ्याच actions, तेवढ्याच resources वर, तेवढ्याच conditions खाली. हे एकदाच करायचे काम नाही, तर चक्र आहे: योग्य सुरुवात करा, मोजा, कमी करा, पुन्हा करा.
- Last accessed information — प्रत्येक service (आणि S3, EC2, IAM आणि Lambda सारख्या काही
services साठी प्रत्येक action) user, group, role किंवा policy ने शेवटचे कधी वापरले ते IAM
नोंदवते. आधी
generate-service-last-accessed-details, मगget-service-last-accessed-details. - IAM Access Analyzer:
- policy generation — role च्या CloudTrail activity वरून policy बनवते;
- unused access findings — न वापरलेले roles, keys, passwords आणि permissions;
- policy validation (
validate-policy) आणि custom policy checks (check-no-new-access) — CI मध्ये policies lint करणे आणि त्यांच्यावर फाटक ठेवणे.
- कमी करण्याचा क्रम — आधी न वापरलेल्या services काढा, मग न वापरलेल्या actions, मग
"Resource": "*"ऐवजी खरे ARNs, मग conditions जोडा. - सुरक्षिततेसाठी थोडी जागा ठेवा — 90 दिवसांत तिमाहीचे एखादे काम सुटू शकते; कमी केल्यानंतर नवे
AccessDeniedevents येतात का ते पाहत राहा.
🤔 का
कारण प्रत्येक न वापरलेली permission म्हणजे फक्त धोका: ती कोणालाच मदत करत नाही आणि credentials मिळवणाऱ्या प्रत्येक attacker ला मदत करते. आणि काय काढायचे याचा अंदाज बांधला की गोष्टी बिघडतात — म्हणूनच teams कमी करणे थांबवतात. पुराव्यामुळे कमी करणे सुरक्षित होते.
🔧 कसे (या repo मध्ये)
iam/demo.py मधील leastpriv() last-accessed.json वाचते, दिलेल्या पण
कधीच न वापरलेल्या services छापते, actions_used वरून अरुंद policy बनवते, आणि
decide() ला एक वापरलेली आणि एक न वापरलेली action विचारते.
🧪 करून पाहा
python3 iam/demo.py leastpriv
python3 - <<'EOF'
import json, sys; sys.path.insert(0, "iam"); from evaluate import decide
used = json.load(open("iam/data/last-accessed.json"))["actions_used"]
narrow = {"Version": "2012-10-17", "Statement": [
{"Sid": "ReportsOnly", "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket", "s3:PutObject"],
"Resource": ["arn:aws:s3:::school-reports", "arn:aws:s3:::school-reports/*"]},
{"Sid": "SeeInstances", "Effect": "Allow", "Action": "ec2:DescribeInstances", "Resource": "*"}]}
teachers = "arn:aws:iam::111122223333:role/teachers"
def res(a): return "*" if a.startswith("ec2") else ("arn:aws:s3:::school-reports" if a == "s3:ListBucket" else "arn:aws:s3:::school-reports/term1.pdf")
print("everything used still works:", all(decide(teachers, a, res(a), identity=[("narrow", narrow)])[0] == "ALLOW" for a in used))
for a, r in [("s3:GetObject", "arn:aws:s3:::payroll/salaries.csv"), ("ec2:TerminateInstances", "*"), ("dynamodb:DeleteTable", "*")]:
print(a.ljust(24), r.ljust(36), decide(teachers, a, r, identity=[("narrow", narrow)])[0])
EOF
खऱ्या account वर (AWS CLI आणि credentials लागतात; narrow.json म्हणजे file म्हणून save
केलेली अरुंद policy):
aws iam generate-service-last-accessed-details --arn arn:aws:iam::111122223333:role/teachers --granularity ACTION_LEVEL
aws iam get-service-last-accessed-details --job-id <JobId from the previous command>
aws accessanalyzer check-no-new-access --policy-type IDENTITY_POLICY --existing-policy-document file://iam/policies/teachers-wide.json --new-policy-document file://narrow.json
✅ तपासा — तुम्हाला काय दिसायला हवे
leastpriv दिलेले ['s3:*', 'ec2:*', 'dynamodb:*'] आणि 90 दिवसांत वापरलेल्या चार
actions समोरासमोर छापते, 💤 services granted but never used: ['dynamodb:*'], तयार केलेली
actions ची यादी, मग ✅ narrowed policy → s3:GetObject ALLOW आणि
🚫 narrowed policy → dynamodb:DeleteTable IMPLICIT DENY. तुमचा snippet छापतो
everything used still works: True आणि payroll/salaries.csv वाचण्यासाठी,
ec2:TerminateInstances आणि dynamodb:DeleteTable साठी IMPLICIT DENY. खऱ्या
account वर check-no-new-access "result": "PASS" परत देते — जुन्या policy ने न दिलेले
काहीही नवी policy देत नाही.
🏁 तुम्ही आत्ताच काय सिद्ध केले
तुम्ही एक रुंद policy प्रत्यक्ष वापरल्या जाणाऱ्यापुरती कापू शकता, तिचे resources अरुंद करू शकता, आणि ship करण्याआधी सिद्ध करू शकता — की खरे काम अजूनही चालते आणि बाकी सगळे बंद आहे.
⚠️ नेहमीच्या चुका
- खूप कमी कालावधीच्या आधारे कमी करणे आणि महिन्याचे किंवा तिमाहीचे काम बिघडवणे
- actions कमी करणे पण
"Resource": "*"तसेच ठेवणे ReadOnlyAccessला "सुरक्षित" समजणे — secrets असलेली प्रत्येक bucket आणि table वाचणे निरुपद्रवी नाही- एकदा कमी करून पुन्हा कधीच न करणे — प्रत्येक "quick fix" सोबत permissions परत वाढत जातात
🏭 प्रत्यक्ष वापरात हे का महत्त्वाचे: least privilege हे प्रत्येक framework मधील (SOC 2, ISO 27001, PCI DSS) नाव असलेले control आहे. Auditors नेमका हाच पुरावा स्वीकारतात: last-accessed data, तयार केलेल्या policies, आणि नवा access रोखणारा CI check.
⏭️ पुढे
एक ना एक दिवस काहीतरी नक्की चुकेल. Audit आणि incident response — नोंदवही वाचणे, आणि पहिल्या तासात काय करायचे.
git checkout lesson-12-audit-incidents