AWS SDK STS: Assume Role, Cross-Account Access आणि Temporary Credentials (Python, PHP, Node.js)
STS कमी वेळ टिकणाऱ्या keys देतं. GetCallerIdentity ने आपण कोण ते तपासू, दुसऱ्या account मध्ये role assume करू, temporary keys ने SDK clients बनवू, external ID आणि MFA जोडू, आणि SDK ला role credentials स्वतः refresh करू देऊ — Python, PHP आणि Node.js मध्ये. Example: Sydney मधला Noah client accounts सांभाळतो आणि दिल्लीची Aditi त्यांचं audit करते.
या chapter मध्ये तुम्ही काय शिकाल
- GetCallerIdentity ने identity
- Role assume करा
- Clients मध्ये temporary credentials
- External ID व MFA
- Auto-refresh providers
1. मोठं चित्र: visitor badge
हे का लागतं?
Client office मध्ये reception ला ID दाखवून visitor badge मिळतो जो फक्त काही floors उघडतो आणि संध्याकाळी 6 ला expire होतो. AssumeRole = reception; temporary credentials = badge.
हे काय आहे?
AssumeRole AccessKeyId, SecretAccessKey, SessionToken आणि Expiration (15 min ते 12 h) देतो. Role ची trust policy कोण assume करू शकतो ते सांगते; permissions badge काय करू शकतो ते.
कसं करायचं (step by step)
2. मी कोण?
हे का लागतं?
Auckland च्या client वर काही चालवण्याआधी Noah script कोणतं account व role वापरतो ते तपासतो.
हे काय आहे?
GetCallerIdentity ला permission लागत नाही आणि Account, UserId, Arn देतो.
कसं करायचं (step by step)
- Python.
import boto3
sts = boto3.client("sts")
me = sts.get_caller_identity()
print(me["Account"], me["Arn"])
अपेक्षित output:
111111111111 arn:aws:iam::111111111111:user/noah
- Node.js.
import { STSClient, GetCallerIdentityCommand } from "@aws-sdk/client-sts";
const sts = new STSClient({ region: "ap-southeast-2" });
const me = await sts.send(new GetCallerIdentityCommand({}));
console.log(me.Account, me.Arn);
अपेक्षित output:
111111111111 arn:aws:iam::111111111111:user/noah
- PHP.
<?php
require "vendor/autoload.php";
$sts = new Aws\Sts\StsClient(["region" => "ap-southeast-2"]);
$me = $sts->getCallerIdentity();
echo $me["Account"], " ", $me["Arn"], PHP_EOL;
अपेक्षित output:
111111111111 arn:aws:iam::111111111111:user/noah
- CLI ने verify.
aws sts get-caller-identity --query Arn --output text
अपेक्षित output:
arn:aws:iam::111111111111:user/noah
3. दुसऱ्या account मध्ये role assume
हे का लागतं?
Auckland client (account 222222222222) ने agency ला S3 व EC2 read access असलेला AgencyOps role दिला.
हे काय आहे?
RoleArn आणि RoleSessionName (CloudTrail मध्ये दिसतं) सह AssumeRole. मग तिन्ही keys नवीन client ला द्या.
कसं करायचं (step by step)
- Python: assume करून S3 client.
c = sts.assume_role(RoleArn="arn:aws:iam::222222222222:role/AgencyOps",
RoleSessionName="noah-audit", DurationSeconds=3600)["Credentials"]
s3 = boto3.client("s3", aws_access_key_id=c["AccessKeyId"],
aws_secret_access_key=c["SecretAccessKey"], aws_session_token=c["SessionToken"])
print(c["Expiration"], [b["Name"] for b in s3.list_buckets()["Buckets"]][:2])
अपेक्षित output:
2026-10-24 08:40:00+00:00 ['kiwi-shop-assets', 'kiwi-shop-logs']
- Node.js: assume करून EC2 client.
import { AssumeRoleCommand } from "@aws-sdk/client-sts";
import { EC2Client, DescribeInstancesCommand } from "@aws-sdk/client-ec2";
const { Credentials: c } = await sts.send(new AssumeRoleCommand({
RoleArn: "arn:aws:iam::222222222222:role/AgencyOps", RoleSessionName: "noah-ec2" }));
const ec2 = new EC2Client({ region: "ap-southeast-2", credentials: {
accessKeyId: c.AccessKeyId, secretAccessKey: c.SecretAccessKey, sessionToken: c.SessionToken } });
const r = await ec2.send(new DescribeInstancesCommand({}));
console.log(r.Reservations.length, "reservations");
अपेक्षित output:
3 reservations
- PHP: assume करून credentials द्या.
<?php
$c = $sts->assumeRole(["RoleArn" => "arn:aws:iam::222222222222:role/AgencyOps",
"RoleSessionName" => "noah-php"])["Credentials"];
$s3 = new Aws\S3\S3Client(["region" => "ap-southeast-2", "credentials" => [
"key" => $c["AccessKeyId"], "secret" => $c["SecretAccessKey"], "token" => $c["SessionToken"]]]);
echo count($s3->listBuckets()["Buckets"]), " buckets", PHP_EOL;
अपेक्षित output:
2 buckets
- Verify: role keys ने आता मी कोण.
AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... AWS_SESSION_TOKEN=... aws sts get-caller-identity --query Arn --output text
अपेक्षित output:
arn:aws:sts::222222222222:assumed-role/AgencyOps/noah-audit
4. External ID आणि MFA
हे का लागतं?
दिल्लीतलं Aditi चं audit tool 40 companies ना सेवा देतं; external ID एक customer ला दुसऱ्याच्या account मध्ये tool वापरू देत नाही. Admin roles ला MFA पण लागतं.
हे काय आहे?
Trust policy sts:ExternalId तपासते; AssumeRole मध्ये ExternalId द्या. MFA साठी SerialNumber आणि TokenCode.
कसं करायचं (step by step)
- Client च्या role ची trust policy (JSON).
{"Version": "2012-10-17", "Statement": [{
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::333333333333:role/AuditTool"},
"Action": "sts:AssumeRole",
"Condition": {"StringEquals": {"sts:ExternalId": "acme-7f3a91"}}}]}
अपेक्षित output:
(saved in role AuditReadOnly)
- Python: ExternalId सह assume.
c = sts.assume_role(RoleArn="arn:aws:iam::444444444444:role/AuditReadOnly",
RoleSessionName="aditi-audit", ExternalId="acme-7f3a91")["Credentials"]
print("ok until", c["Expiration"])
अपेक्षित output:
ok until 2026-10-24 07:55:00+00:00
- Node.js: MFA सह assume.
const r = await sts.send(new AssumeRoleCommand({
RoleArn: "arn:aws:iam::222222222222:role/AgencyAdmin", RoleSessionName: "noah-admin",
SerialNumber: "arn:aws:iam::111111111111:mfa/noah", TokenCode: "492817" }));
console.log("admin until", r.Credentials.Expiration.toISOString());
अपेक्षित output:
admin until 2026-10-24T07:55:00.000Z
- PHP: चुकीचा external ID fail.
<?php
try { $sts->assumeRole(["RoleArn" => "arn:aws:iam::444444444444:role/AuditReadOnly",
"RoleSessionName" => "x", "ExternalId" => "wrong"]); }
catch (Aws\Exception\AwsException $e) { echo $e->getAwsErrorCode(), PHP_EOL; }
अपेक्षित output:
AccessDenied
5. SDK ला refresh करू द्या
हे का लागतं?
Frankfurt मधला nightly job 3 तास चालतो; एक तासाच्या keys मध्येच expire होतील.
हे काय आहे?
Role profiles (role_arn + source_profile) किंवा SDK चा assume-role provider वापरा. Expiration आधी keys आपोआप renew होतात.
कसं करायचं (step by step)
- तिन्ही SDKs साठी ~/.aws/config profile.
[profile kiwi]
role_arn = arn:aws:iam::222222222222:role/AgencyOps
source_profile = default
role_session_name = nightly
region = ap-southeast-2
अपेक्षित output:
(saved)
- Python: profile वापरा; boto3 refresh करतं.
s = boto3.Session(profile_name="kiwi")
print(s.client("sts").get_caller_identity()["Arn"])
अपेक्षित output:
arn:aws:sts::222222222222:assumed-role/AgencyOps/nightly
- Node.js: fromTemporaryCredentials provider.
import { fromTemporaryCredentials } from "@aws-sdk/credential-providers";
import { S3Client, ListBucketsCommand } from "@aws-sdk/client-s3";
const s3 = new S3Client({ region: "ap-southeast-2", credentials: fromTemporaryCredentials({
params: { RoleArn: "arn:aws:iam::222222222222:role/AgencyOps", RoleSessionName: "nightly" } }) });
console.log((await s3.send(new ListBucketsCommand({}))).Buckets.length);
अपेक्षित output:
2
- PHP: memoize सह AssumeRoleCredentialProvider.
<?php
use Aws\Credentials\{AssumeRoleCredentialProvider, CredentialProvider};
$p = new AssumeRoleCredentialProvider(["client" => $sts, "assume_role_params" => [
"RoleArn" => "arn:aws:iam::222222222222:role/AgencyOps", "RoleSessionName" => "nightly"]]);
$s3 = new Aws\S3\S3Client(["region" => "ap-southeast-2", "credentials" => CredentialProvider::memoize($p)]);
echo count($s3->listBuckets()["Buckets"]), PHP_EOL;
अपेक्षित output:
2
6. हाच call Java, Go, .NET आणि CLI मध्ये
हे का लागतं?
Teams अनेकदा भाषा मिसळतात. Python, PHP आणि Node.js मध्ये call समजला की बाकीचे SDKs म्हणजे तोच API, फक्त syntax वेगळा.
हे काय आहे?
सगळे AssumeRole API call करतात. Terminal मधून पटकन test करायला CLI ओळ वापरा.
कसं करायचं (step by step)
| Stack | Code |
|---|---|
| AWS CLI | aws sts assume-role --role-arn arn:aws:iam::222222222222:role/AgencyOps --role-session-name noah |
| Java v2 | StsAssumeRoleCredentialsProvider p = StsAssumeRoleCredentialsProvider.builder().stsClient(sts).refreshRequest(r -> r.roleArn(arn).roleSessionName("noah")).build(); |
| Go v2 | cfg.Credentials = aws.NewCredentialsCache(stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), arn)) |
| .NET | var creds = new AssumeRoleAWSCredentials(new BasicAWSCredentials(k, s), arn, "noah"); |
7. काहीही खर्च चालू राहू नये म्हणून cleanup
हे का लागतं?
चालू ठेवलेले lab resources पैसे खातात आणि security risk बनतात.
हे काय आहे?
उलट्या क्रमाने delete करा: आधी children, मग parents.
कसं करायचं (step by step)
- Delete करायला काही नाही: temporary credentials स्वतः expire होतात. Test roles बनवले असतील तर काढा.
aws iam delete-role --role-name AuditReadOnly
अपेक्षित output:
(no output means success)
Ravindra Bagale's Tip
प्रत्येक RoleSessionName ला व्यक्ती किंवा job चं नाव द्या; CloudTrail मध्ये कोणी काय केलं ते असंच कळतं.
8. मुलाखत प्रश्न आणि उत्तरं
प्र. AssumeRole काय देतो?
तीन keys + Expiration.
प्र. Role कोण assume करू शकतो?
Trust policy.
प्र. External ID का?
Confused deputy टाळणं.
प्र. Session किती वेळ?
15 min ते 12 h; default 1 h.
प्र. Long jobs मध्ये expiry कशी टाळायची?
Refreshing provider/profile.
घरी करून बघा
- तीन client accounts मध्ये AgencyOps assume करून S3 buckets मोजणारी Python script लिहा.
- फक्त s3:ListBucket देणाऱ्या session policy सह AssumeRole वापरा.
थोडक्यात सांगायचं तर
- आधी GetCallerIdentity.
- AssumeRole → 3 keys.
- SessionToken पण द्या.
- ExternalId / MFA conditions.
- Refreshing providers.
सराव Tasks
Sydney Surf School हा सिडनी मधला क्रीडा प्रशिक्षण व्यवसाय आहे. Liam O'Brien त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे AUD मध्ये मोजले जातात आणि AWS resources ap-southeast-2 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.
0 / 10
सोपं तुम्ही कोण म्हणून login आहात ते पाहा
का: बदल करण्याआधी account व identity नेहमी तपासा.
काय करायचं: तुमचा CLI वापरत असलेल्या identity चा account ID व ARN दाखवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
सोपं /16 मध्ये किती addresses?
का: VPC size ठरवायला ही संख्या लागते.
काय करायचं: Sydney Surf School चा VPC 10.153.0.0/16. एकूण किती IP addresses?
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
मध्यम Role assume करा
का: AssumeRole दुसऱ्या role च्या, बहुदा दुसऱ्या account मधल्या, अल्पकालीन keys देतो.
काय करायचं: Role arn:aws:iam::107908505706:role/Auditor session नाव liam-audit ने assume करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम "Access denied" message decode करा
का: काही errors encoded येतात; decode केल्यावर कोणत्या policy ने अडवलं ते कळतं.
काय करायचं: Shell variable $MSG मधला authorization message decode करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम EC2 role साठी trust policy
का: Trust policy role कोण घेऊ शकतो ते सांगते.
काय करायचं: ec2.amazonaws.com ला role assume करू देणारी trust policy लिहा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
मध्यम ECS task role साठी trust policy
का: Trust policy role कोण घेऊ शकतो ते सांगते.
काय करायचं: ecs-tasks.amazonaws.com ला role assume करू देणारी trust policy लिहा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
मध्यम Lambda role साठी trust policy
का: Trust policy role कोण घेऊ शकतो ते सांगते.
काय करायचं: lambda.amazonaws.com ला role assume करू देणारी trust policy लिहा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
अवघड दुसऱ्या account ला role assume करू द्या
का: Access keys share करण्यापेक्षा cross-account roles सुरक्षित.
काय करायचं: Account 111122223333 ला हा role assume करू देणारी trust policy लिहा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
अवघड 15 मिनिटांसाठी role assume करा
का: Keys leak झाल्यास छोटे sessions धोका कमी करतात.
काय करायचं: arn:aws:iam::107908505706:role/Deployer ला session नाव deploy-job ने 900 seconds साठी assume करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड MFA सह session token घ्या
का: काही actions ना MFA लागतो. get-session-token MFA proof असलेल्या keys देतो.
काय करायचं: MFA device arn:aws:iam::107908505706:mfa/liam व code 123456 वापरून session token घ्या.
- 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.