CWSito समूह की भूमिकाओं का उपयोग करते समय AWS IAM SDK को एक विशिष्ट भूमिका के लिए सभी नीति दस्तावेज़ मिलते हैं
मैं एपीआई गेटवे एपीआई के लिए अनुमतियों का प्रबंधन करने के लिए एडब्ल्यूएस कॉग्निटो उपयोगकर्ता पूल समूहों का उपयोग कर रहा हूं। मेरा मानना है कि यह समूहों के लिए एक वैध उपयोग है क्योंकि प्रलेखन यहाँ कहता है:https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-user-groups.html#using-groups-to-control-permission-with-amazon-api-gateway।
दुर्भाग्य से, प्रलेखन इस उपयोग के मामले के लिए मूल रूप से अस्तित्वहीन है जहां तक मैं बता सकता हूं (उस छोटे पैराग्राफ के अलावा)। मैं यह जानने की कोशिश कर रहा हूं कि यह कस्टम एपीआई गेटवे ऑथराइजर लैंबडा फ़ंक्शन के साथ कैसे काम करता है। मैंने एक परीक्षण भूमिका बनाई है और इसे Cognito में एक परीक्षण समूह को सौंपा है। भूमिका में एक ही नीति जुड़ी है, लेकिन भविष्य में भूमिकाओं में कई नीतियां होंगी।
अब, मेरे कस्टम ऑथराइज़र में मैं पहले से ही एक्सेस टोकन आदि को मान्य कर रहा हूँ और यह सब ठीक काम कर रहा है। अब मैं समूहों / भूमिकाओं / नीतियों का उपयोग करते हुए इस महीन दाने वाले अभिगम नियंत्रण को जोड़ने का प्रयास कर रहा हूं। मैंने IAM SDK स्थापित किया है और यह देखने के लिए आसपास खुदाई कर रहा हूं कि मुझे कौन सी कॉल करने की आवश्यकता है। ऐसा लगता है कि एक भूमिका पाने का कोई आसान तरीका नहीं है और यह सभी नीतियां हैं। सबसे अच्छा मैं निम्नलिखित के साथ आया हूँ:
public async Task<IEnumerable<string>> GetGroupPermissionsForUserAsync(Models.User user)
{
if (!user.UserAttributes.TryGetValue(UserAttributeName.UserPoolId, out var userPoolId))
{
return null;
}
var groups = await GetUserGroups(user.Username, userPoolId);
var groupRoleArn = groups.FirstOrDefault()?.RoleArn;
var policies = new List<string>();
if (!string.IsNullOrWhiteSpace(groupRoleArn))
{
var roleName = groupRoleArn.Substring(groupRoleArn.IndexOf('/') + 1);
var rolePoliciesResponse = await _iamClient.ListAttachedRolePoliciesAsync(new ListAttachedRolePoliciesRequest { RoleName = roleName });
foreach (var rolePolicy in rolePoliciesResponse.AttachedPolicies)
{
var policyVersionsResponse = await _iamClient.ListPolicyVersionsAsync(new ListPolicyVersionsRequest
{
PolicyArn = rolePolicy.PolicyArn
});
var latestPolicyVerson = policyVersionsResponse.Versions.OrderByDescending(x => x.CreateDate).LastOrDefault();
var policyVersionResponse = await _iamClient.GetPolicyVersionAsync(new GetPolicyVersionRequest
{
PolicyArn = rolePolicy.PolicyArn,
VersionId = latestPolicyVerson.VersionId
});
if (!string.IsNullOrWhiteSpace(policyVersionResponse?.PolicyVersion.Document))
{
policies.Add(HttpUtility.UrlDecode(policyVersionResponse.PolicyVersion.Document));
}
}
}
return policies;
}
private async Task<IEnumerable<GroupType>> GetUserGroups(string username, string userPoolId)
{
string nextToken = null;
var groups = new List<GroupType>();
do
{
var response = await _cognitoClient.AdminListGroupsForUserAsync(new AdminListGroupsForUserRequest
{
Username = username,
UserPoolId = userPoolId
});
groups.AddRange(response.Groups);
nextToken = response.NextToken;
} while (!string.IsNullOrWhiteSpace(nextToken));
return groups.OrderBy(x => x.Precedence);
}
जैसा कि आप देख सकते हैं, मुझे केवल भूमिका के लिए नीतियां प्राप्त करने के लिए कॉल का एक गुच्छा बनाना होगा।
_cognitoClient.AdminListGroupsForUserAsync
Cognito से उपयोगकर्ता के समूह प्राप्त करने के लिए।_iamClient.ListAttachedRolePoliciesAsync
भूमिकाओं से जुड़ी नीतियों को प्राप्त करना।_iamClient.ListPolicyVersionsAsync
प्रत्येक नीति के लिए संस्करण प्राप्त करना।_iamClient.GetPolicyVersionAsync
व्यक्तिगत नीति संस्करण प्राप्त करने के लिए जिसके पास अंत में नीति दस्तावेज है।
ListPolicyVersionsAsync
दस्तावेज़ संपत्ति के साथ प्रतिक्रिया देता है, लेकिन यह किसी कारण से हमेशा अशक्त रहता है, इसलिए अतिरिक्त GetPolicyVersionAsync
कॉल की आवश्यकता होती है ।
न केवल यह सब विलंबता को जोड़ता है (जो एक लेखक फ़ंक्शन पर एक मुद्दा है जहां एपीआई के लिए हर कॉल इस कोड के माध्यम से चल रहा है) लेकिन यह मुझे व्यक्तिगत नीतियों के एक समूह के साथ छोड़ देता है जिसे मुझे किसी तरह डी-ड्यू करने की आवश्यकता होती है एपीआई गेटवे पर लौटने से पहले।
यह वास्तव में ऐसा करने का कोई आसान / तेज़ तरीका नहीं है? क्या कम कॉल के साथ यह सब जानकारी प्राप्त करने का एक तरीका है और क्या उनके नियमों को ओवरलैप करने की स्थिति में नीतियों को समतल करने का एक तरीका है?
जवाब
कॉग्नीटो और एपीआई गेटवे के साथ प्राधिकरण स्थापित करने के लिए कई अलग-अलग तरीके हैं जो यह कहना मुश्किल है कि आपके एडब्ल्यू संसाधनों को आप अपने एपीआई गेटवे तरीकों के माध्यम से एक्सेस करने की कोशिश कर रहे हैं, बिना यह जानने के लिए कि आपके लिए सबसे अच्छा क्या होगा। उदाहरण के लिए, क्या आपके एपीआई गेटवे तरीके लैंबडा विधियों से एकीकृत हैं जो डेटाबेस जानकारी तक पहुंचते हैं, या वे सीधे सेवाओं को बुला रहे हैं?
यदि मैं सही तरीके से समझता हूं, तो आप उस (संभावित) कई समूहों के लिए अनुमतियों को संयोजित करना चाहते हैं जो उपयोगकर्ता उस विशेष अनुरोध के लिए उपयोग करने के लिए अनुमतियों के एक सेट के साथ आने के लिए हो सकता है। तो, user
भूमिका उपयोगकर्ता डेटा तक पहुंच की अनुमति दे सकती है, और admin
भूमिका अन्य व्यवस्थापक एंडपॉइंट तक पहुंच को आगे बढ़ा सकती है?
यह मानते हुए कि आपके पास एक सुंदर मानक परिदृश्य है जहाँ आपके API गेटवे तरीके एक लैम्ब्डा विधि के साथ एकीकृत हो रहे हैं जो तब अंतर्निहित AWS संसाधनों जैसे डेटाबेस तक पहुँच रहा है, तो आप निम्न प्रकार से कस्टम प्राधिकरण का उपयोग कर सकते हैं:
यदि कस्टम प्राधिकारी अनुरोधित एपीआई पद्धति को निष्पादित करने के लिए आवश्यक अनुमतियों को वापस करते हैं, तो यह बहुत बड़ी बात को आसान बनाता है:
{
"principalId": "sub-from-ID-token",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": [
"arn:aws:execute-api:eu-west-1:1234567890:qwerty:prod:GET/user/address"
]
}
]
}
}
एक मानक परिदृश्य में, एक सफलतापूर्वक अधिकृत अनुरोध फिर लैंब को निष्पादित करेगा जिसमें एपीआई तर्क शामिल है। इस बैकिंग लैम्ब्डा में एक निष्पादन भूमिका होगी जो सभी संरक्षित संसाधनों जैसे डायनामो डीबी टेबल में डेटा को एक्सेस करने की सभी अनुमतियों को परिभाषित करती है, इसलिए कभी भी आपके बैकिंग लैम्ब्डा द्वारा एक अलग एडब्ल्यूएस संसाधन का उपयोग किया जाता है, तो आपको इन अनुमतियों को अपडेट करने की आवश्यकता नहीं है। कई समूह भूमिकाएँ, लेकिन आप अपने सिस्टम में एक ही स्थान पर उन अनुमतियों का प्रबंधन करते हैं।
इस सेटअप के साथ, आपके पास अपने एपीआई के प्रत्येक क्षेत्र के लिए एक बहुत ही सरल कस्टम ऑथराइज़र हो सकता है जिसे सुरक्षा की आवश्यकता है।
उदाहरण के लिए, अपने /user/*
एंडपॉइंट्स की सुरक्षा के लिए, आपके पास एक कस्टम ऑथराइज़र हो सकता है, जो यह देखने के लिए जाँच करता है कि क्या ऑथर टोकन आईडी ऑथराइज़र में पास किया गया user
है या नहीं cognito:groups
। यदि ऐसा होता है, तो आप अनुरोधित एपीआई पद्धति ( execute-api:Invoke
) को निष्पादित करने के लिए आवश्यक अनुमतियों को वापस करते हैं । फिर आपके पास एक और कस्टम ऑथराइज़र हो सकता है जो यह /admin/*
देखने के लिए जाँच कर सकता है कि admin
ग्रुप आईडी टोकन के cognito:groups
दावे आदि में है या नहीं।
कस्टम प्राधिकरण प्रतिक्रियाओं का कैशिंग
प्रत्येक कस्टम ऑथराइज़र के पास एक वैकल्पिक टीटीएल सेटिंग होती है, जो यह निर्धारित करती है कि इसकी प्रतिक्रिया (किसी विशेष जेडब्ल्यूटी टोकन के लिए) कितनी देर तक रखी जाएगी। यह किसी भी लैम्ब्डा वार्म-अप समय या लेखक के अतिरिक्त कॉलआउट द्वारा लिए गए समय में कटौती करने में मदद करता है।
यदि कोई लेखक कई तरीकों का पालन करता है, जैसे:
- GET / उपयोगकर्ता / पता
- POST / उपयोगकर्ता / पता
- GET / उपयोगकर्ता / मोबाइल
फिर यह नोट करना महत्वपूर्ण है कि इन सभी तरीकों के लिए एक सफलतापूर्वक अधिकृत प्रतिक्रिया कैश की जाएगी जब तक कि कैशिंग आउट नहीं हो जाता। इसलिए कस्टम ऑथराइज़र द्वारा दी गई पॉलिसी को या तो संसाधनों की एक सूची वापस करनी चाहिए जो उन सभी तरीकों को परिभाषित करती है जो उपयोगकर्ता निष्पादित कर सकते हैं या वाइल्डकार्ड का उपयोग कर सकते हैं।
एक लेखक के लिए उदाहरण प्रतिक्रिया जो सभी /user/*
मार्गों को कवर करती है
{
"principalId": "sub-from-ID-token",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": [
"arn:aws:execute-api:eu-west-1:1234567890:qwerty:prod:GET/user/address",
"arn:aws:execute-api:eu-west-1:1234567890:qwerty:prod:POST/user/address",
"arn:aws:execute-api:eu-west-1:1234567890:qwerty:prod:GET/user/mobile"
]
}
]
}
}
उदाहरण लेखक (वाइल्डकार्ड का उपयोग करके) सभी /user/*
मार्गों को कवर करता है
{
"principalId": "sub-from-ID-token",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": [
"arn:aws:execute-api:eu-west-1:1234567890:qwerty:prod:*/user/*"
]
}
]
}
}