
वितरित, उच्च-गति परिनियोजन के लिए AWS न्यूनतम विशेषाधिकार
Repokid, AWS खाते में IAM भूमिकाओं की इनलाइन नीतियों से अप्रयुक्त सेवाओं तक पहुँच प्रदान करने वाली अनुमतियों को हटाने के लिए Aardvark द्वारा प्रदान किए गए Access Advisor का उपयोग करता है।
mkvirtualenv repokid
git clone [email protected]:Netflix/repokid.git
cd repokid
pip install -e .
repokid config config.json
आपको repokid_roles नामक एक DynamoDB तालिका की आवश्यकता होगी (कॉन्फ़िग फ़ाइल में dynamo_db में खाता और एंडपॉइंट निर्दिष्ट करें)।
तालिका में निम्नलिखित गुण होने चाहिए:
RoleId (स्ट्रिंग) प्राथमिक विभाजन कुंजी के रूप में, कोई प्राथमिक सॉर्ट कुंजी नहींAccount नामक एक वैश्विक द्वितीयक सूचकांक जिसमें प्राथमिक विभाजन कुंजी Account है और RoleId तथा Account अनुमानित विशेषताओं के रूप में हैंRoleName नामक एक वैश्विक द्वितीयक सूचकांक जिसमें प्राथमिक विभाजन कुंजी RoleName है और RoleId तथा RoleName अनुमानित विशेषताओं के रूप में हैंविकास के लिए, आप DynamoDB को स्थानीय रूप से चला सकते हैं।
स्थानीय रूप से चलाने के लिए:
docker-compose up
DynamoDB के लिए एंडपॉइंट http://localhost:8000 होगा। एक DynamoDB एडमिन पैनल http://localhost:8001 पर पाया जा सकता है।
यदि आप विकास संस्करण चलाते हैं तो तालिका और सूचकांक आपके लिए स्वचालित रूप से बनाए जाएँगे।
Repokid को प्रत्येक खाते में एक IAM भूमिका की आवश्यकता होती है जिससे पूछताछ की जाएगी। इसके अतिरिक्त, Repokid को एक ऐसी भूमिका या उपयोगकर्ता के साथ लॉन्च किया जाना चाहिए जो विभिन्न खाता भूमिकाओं में sts:AssumeRole कॉल कर सके।
RepokidInstanceProfile:
sts:AssumeRole कॉल करने की क्षमता आवश्यक है।repokid_roles तालिका और सभी सूचकांकों के लिए DynamoDB अनुमतियाँ (कॉन्फ़िग में dynamo_db के assume_role उपखंड में निर्दिष्ट) और dynamodb:ListTables चलाने की क्षमता।RepokidRole:
RepokidInstanceProfile की अनुमति देती है।connection_iam में नाम निर्दिष्ट होना चाहिए।{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:DeleteInstanceProfile",
"iam:DeleteRole",
"iam:DeleteRolePolicy",
"iam:GetAccountAuthorizationDetails",
"iam:GetInstanceProfile",
"iam:GetRole",
"iam:GetRolePolicy",
"iam:ListInstanceProfiles",
"iam:ListInstanceProfilesForRole",
"iam:ListRolePolicies",
"iam:PutRolePolicy",
"iam:UpdateRoleDescription"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
इसलिए यदि आप n खातों की निगरानी कर रहे हैं, तो आपको हमेशा n+1 भूमिकाओं की आवश्यकता होगी। (n RepokidRole और 1 RepokidInstanceProfile)।
repokid config config.json चलाने पर एक फ़ाइल बनती है जिसे आपको संपादित करना होगा। इन फ़ील्ड को खोजें और अपडेट करें:
dynamodb: यदि DynamoDB स्थानीय रूप से उपयोग कर रहे हैं, तो एंडपॉइंट http://localhost:8010 पर सेट करें। यदि AWS होस्टेड DynamoDB का उपयोग कर रहे हैं, तो region, assume_role, और account_number सेट करें।aardvark_api_location: आपके Aardvark REST API का स्थान। जैसे https://aardvark.yourcompany.net/api/1/advisorsconnection_iam: assume_role को RepokidRole पर सेट करें, या जो भी आपने इसे कहा है।Repokid फ़िल्टर का उपयोग यह तय करने के लिए करता है कि कौन सी भूमिकाएँ repo किए जाने के लिए उम्मीदवार हैं। फ़िल्टर को आपके वातावरण के अनुसार कॉन्फ़िगर किया जा सकता है जैसा कि नीचे वर्णित है।
ब्लॉकलिस्ट फ़िल्टर में जोड़कर भूमिकाओं को बाहर रखा जा सकता है। किसी भूमिका को बाहर करने का एक सामान्य कारण यह है कि संबंधित कार्यभार कभी-कभी ऐसे कार्य करता है जो देखे नहीं गए होंगे लेकिन आवश्यक माने जाते हैं। भूमिका को बाहर करने के दो तरीके हैं:
filter_config.BlocklistFilter.all की सूची में जोड़ें।filter_config.BlocklistFilter.<ACCOUNT_NUMBER> की सूची में जोड़ें।ब्लॉकलिस्ट को S3 ब्लॉकलिस्ट फ़ाइल में भी बनाए रखा जा सकता है। उन्हें निम्नलिखित रूप में होना चाहिए:
{
"arns": ["arn1", "arn2"],
"names": {"role_name_1": ["all", "account_number_1"], "role_name_2": ["account_number_2", "account_number_3"]}
}
यदि आप केवल कुछ भूमिकाओं को repo करना पसंद करते हैं तो आप अनन्य फ़िल्टर (Exclusive Filter) का उपयोग कर सकते हैं। हो सकता है कि आप केवल उत्पादन में या कुछ टीमों द्वारा उपयोग की जाने वाली भूमिकाओं पर विचार करना चाहें। repo-ing के लिए भूमिकाओं का चयन करने के लिए आप कॉन्फ़िगरेशन फ़ाइलों में उनके नाम सूचीबद्ध कर सकते हैं। शेल शैली के ग्लोब पैटर्न भी समर्थित हैं। भूमिका चयन को प्रत्येक खाते के लिए अलग-अलग या वैश्विक रूप से निर्दिष्ट किया जा सकता है। इस फ़िल्टर को सक्रिय करने के लिए कॉन्फ़िग फ़ाइल के active_filters अनुभाग में "repokid.filters.exclusive:ExclusiveFilter" डालें। इसे कॉन्फ़िगर करने के लिए आप स्वचालित रूप से उत्पन्न कॉन्फ़िग फ़ाइल से शुरू कर सकते हैं, जिसमें "filter_config" अनुभाग में एक उदाहरण कॉन्फ़िग है:
"ExclusiveFilter": {
"all": [
"<GLOB_PATTERN>"
],
"<ACCOUNT_NUMBER>": [
"<GLOB_PATTERN>"
]
}
डिफ़ॉल्ट रूप से आयु फ़िल्टर उन भूमिकाओं को बाहर करता है जो 90 दिनों से छोटी हैं। इसे बदलने के लिए कॉन्फ़िग सेटिंग संपादित करें: filter_config.AgeFilter.minimum_age।
आंतरिक तर्क का समर्थन करने के लिए नए फ़िल्टर बनाए जा सकते हैं। Netflix पर हमारे पास कई हैं जो हमारे उपयोग के मामलों के लिए विशिष्ट हैं। उन्हें सक्रिय बनाने के लिए सुनिश्चित करें कि वे Python पथ में हैं और उन्हें कॉन्फ़िगरेशन में active_filters अनुभाग की सूची में जोड़ें।
Repokid हुक के माध्यम से विस्तार योग्य है जो विभिन्न कार्यों से पहले, दौरान और बाद में कॉल किए जाते हैं जैसा कि नीचे सूचीबद्ध है।
हुक को निम्नलिखित इंटरफ़ेस का पालन करना चाहिए:
from repokid.hooks import implements_hook
from repokid.types import RepokidHookInput, RepokidHookOutput
@implements_hook("TARGET_HOOK_NAME", 1)
def custom_hook(input_dict: RepokidHookInput) -> RepokidHookOutput:
"""हुक फ़ंक्शन को लक्ष्य हुक के आधार पर ऊपर सूचीबद्ध कुंजियों वाले एक डिक्ट के साथ कॉल किया जाता है।
इनपुट में किए गए कोई भी उत्परिवर्तन और आउटपुट में लौटाए गए, बाद के हुक फ़ंक्शन में पास कर दिए जाएँगे।
"""
...
हुक कार्यान्वयन के उदाहरण repokid.hooks.loggers में पाए जा सकते हैं।
भूमिकाओं को repo होने से बाहर करने के लिए कस्टम फ़िल्टर लिखे जा सकते हैं। फ़िल्टर को निम्नलिखित इंटरफ़ेस का पालन करना चाहिए:
from repokid.filters import Filter
from repokid.types import RepokidFilterConfig
from repokid.role import RoleList
class CustomFilterName(Filter):
def __init__(self, config: RepokidFilterConfig = None) -> None:
"""फ़िल्टर को कॉन्फ़िग फ़ाइल से `filter_config.FilterName` की सामग्री वाले डिक्ट के साथ प्रारंभ किया जाता है।
यह उदाहरण `filter_config.CustomFilterName` के साथ प्रारंभ किया जाएगा।
कॉन्फ़िगरेशन `self.config` के माध्यम से एक्सेस किया जा सकता है।
यदि आपको किसी कस्टम आरंभीकरण तर्क की आवश्यकता नहीं है, तो आप इस फ़ंक्शन को अपने फ़िल्टर वर्ग से बाहर छोड़ सकते हैं।
"""
super().__init__(config=config)
# कस्टम आरंभीकरण तर्क यहाँ जाता है
...
def apply(self, input_list: RoleList) -> RoleList:
"""बाहर की जाने वाली भूमिकाएँ निर्धारित करें और उन्हें RoleList के रूप में लौटाएँ"""
...
एक सरल फ़िल्टर कार्यान्वयन repokid.filters.age में पाया जा सकता है। एक अधिक जटिल उदाहरण repokid.blocklist.age में है।
एक बार Repokid कॉन्फ़िगर हो जाने पर, इसे निम्नानुसार उपयोग करें:
repokid update_role_cache <ACCOUNT_NUMBER>repokid display_role_cache <ACCOUNT_NUMBER>repokid display_role <ACCOUNT_NUMBER> <ROLE_NAME>repokid repo_role <ACCOUNT_NUMBER> <ROLE_NAME>repokid repo_all_roles <ACCOUNT_NUMBER> -cअभी repo चलाने के बजाय आप एक शेड्यूल कर सकते हैं (schedule_repo कमांड)। शेड्यूलिंग और पात्रता के बीच की अवधि कॉन्फ़िगर करने योग्य है, लेकिन डिफ़ॉल्ट रूप से भूमिकाएँ शेड्यूलिंग के 7 दिन बाद repo की जा सकती हैं। फिर आप केवल उन भूमिकाओं को repo करने के लिए repo_scheduled_roles कमांड चला सकते हैं जो पहले से शेड्यूल की गई हैं।
मान लें कि आपको अपने वातावरण में कोई दी गई अनुमति विशेष रूप से खतरनाक लगती है। यहाँ मैं उदाहरण के तौर पर s3:PutObjectACL का उपयोग करूँगा। आप Repokid का उपयोग करके उन सभी भूमिकाओं को ढूँढ सकते हैं जिनमें यह अनुमति है (वाइल्डकार्ड में छिपी हुई भी), और फिर केवल उस एक अनुमति को हटा सकते हैं।
खोजें और हटाएँ:
repokid find_roles_with_permissions <permission>... [--output=ROLE_FILE]repokid remove_permissions_from_roles --role-file=ROLE_FILE <permission>... [-c]उदाहरण:
$ repokid find_roles_with_permissions "s3:putobjectacl" "sts:assumerole" --output=myroles.json
...
$ repokid remove_permissions_from_roles --role-file=myroles.json "s3:putobjectacl" "sts:assumerole" -c
Repokid जिन इनलाइन नीतियों के बारे में जानता है, उनमें से प्रत्येक संस्करण की एक प्रति संग्रहीत करता है। ये तब जोड़े जाते हैं जब update_role_cache के दौरान नीति का कोई भिन्न संस्करण पाया जाता है और जब भी repo कार्रवाई होती है। पिछले संस्करण को पुनर्स्थापित करने के लिए चलाएँ:
भूमिकाओं के सभी संस्करण देखें: repokid rollback_role <ACCOUNT_NUMBER> <ROLE_NAME>
किसी विशिष्ट संस्करण को पुनर्स्थापित करें: repokid rollback_role <ACCOUNT_NUMBER> <ROLE_NAME> --selection=<NUMBER> -c
Repokid प्रत्येक भूमिका के लिए कुल अनुमतियों की गणना रखता है। जब भी update_role_cache या repo_role कार्रवाई होती है, तब आँकड़े जोड़े जाते हैं। सभी आँकड़ों को CSV फ़ाइल में आउटपुट करने के लिए चलाएँ: repokid repo_stats <OUTPUT_FILENAME>। केवल किसी विशिष्ट खाते के लिए आँकड़े आउटपुट करने के लिए एक वैकल्पिक खाता संख्या निर्दिष्ट की जा सकती है।
v0.14.2में नया
Repokid को repokid.lib मॉड्यूल का उपयोग करके लाइब्रेरी के रूप में कॉल किया जा सकता है:
from repokid.lib import display_role, repo_role, update_role_cache
account_number = "123456789012"
display_role(account_number, "superCoolRoleName")
update_role_cache(account_number)
repo_role(account_number, "superCoolRoleName", commit=True)
Repokid Dispatcher एक कतार पर संदेशों को सुनने और कार्रवाई करने के लिए डिज़ाइन किया गया है। अब तक की कार्रवाइयाँ हैं:
Repokid किसी भी सफलता या विफलता के बारे में जानकारी के साथ कॉन्फ़िगर करने योग्य SNS विषय पर प्रतिक्रिया देगा। Dispatcher घटक आपके संगठन में repo जीवनचक्र के संचालन में मदद करने के लिए मौजूद है। आप कतार को सीधे डेवलपर्स के लिए खोलने का चुनाव कर सकते हैं, लेकिन अधिक संभावना है कि इसे संरक्षित किया जाना चाहिए क्योंकि रोलबैक सावधानी से न किए जाने पर एक विनाशकारी कार्रवाई हो सकती है।
वर्जनिंग setupmeta द्वारा संभाली जाती है। नई रिलीज़ बनाने के लिए:
python setup.py version --bump patch --push
# Inspect output and make sure it's what you expect
# If all is well, commit and push the new tag:
python setup.py version --bump patch --push --commit
| हुक नाम | प्रसंग |
|---|
AFTER_REPO | भूमिका, त्रुटियाँ |
AFTER_REPO_ROLES | भूमिकाएँ, त्रुटियाँ |
BEFORE_REPO_ROLES | खाता_संख्या, भूमिकाएँ |
AFTER_SCHEDULE_REPO | भूमिकाएँ |
DURING_REPOABLE_CALCULATION | भूमिका_आईडी, arn, खाता_संख्या, भूमिका_नाम, संभावित_रीपो_योग्य_अनुमतियाँ, न्यूनतम_आयु |
DURING_REPOABLE_CALCULATION_BATCH | भूमिका_बैच, संभावित_रीपो_योग्य_अनुमतियाँ, न्यूनतम_आयु |