
वितरित, उच्च-गति परिनियोजन के लिए AWS न्यूनतम विशेषाधिकार
Repokid ======= []() [](https://travis-ci.com/Netflix/repokid) [](https://badge.fury.io/py/repokid) [](https://coveralls.io/github/Netflix/repokid?branch=master) [](https://discord.gg/9kwMWa6) <img align="center" alt="Repokid Logo" src="https://raw.githubusercontent.com/Netflix/repokid/master/docs/images/Repokid.png?raw=true" width="25%" display="block"> Repokid, AWS खाते में IAM भूमिकाओं की इनलाइन नीतियों से अप्रयुक्त सेवाओं तक पहुँच प्रदान करने वाली अनुमतियों को हटाने के लिए [Aardvark](https://github.com/Netflix-Skunkworks/aardvark) द्वारा प्रदान किए गए Access Advisor का उपयोग करता है। ## आरंभ करना ### स्थापित करें ```bash mkvirtualenv repokid git clone [email protected]:Netflix/repokid.git cd repokid pip install -e . repokid config config.json ``` #### DynamoDB आपको `repokid_roles` नामक एक [DynamoDB](https://aws.amazon.com/dynamodb/) तालिका की आवश्यकता होगी (कॉन्फ़िग फ़ाइल में `dynamo_db` में खाता और एंडपॉइंट निर्दिष्ट करें)। तालिका में निम्नलिखित गुण होने चाहिए: - `RoleId` (स्ट्रिंग) प्राथमिक विभाजन कुंजी के रूप में, कोई प्राथमिक सॉर्ट कुंजी नहीं - `Account` नामक एक वैश्विक द्वितीयक सूचकांक जिसमें प्राथमिक विभाजन कुंजी `Account` है और `RoleId` तथा `Account` अनुमानित विशेषताओं के रूप में हैं - `RoleName` नामक एक वैश्विक द्वितीयक सूचकांक जिसमें प्राथमिक विभाजन कुंजी `RoleName` है और `RoleId` तथा `RoleName` अनुमानित विशेषताओं के रूप में हैं विकास के लिए, आप DynamoDB को [स्थानीय रूप से](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html) चला सकते हैं। स्थानीय रूप से चलाने के लिए: ```bash docker-compose up ``` DynamoDB के लिए एंडपॉइंट `http://localhost:8000` होगा। एक DynamoDB एडमिन पैनल `http://localhost:8001` पर पाया जा सकता है। यदि आप विकास संस्करण चलाते हैं तो तालिका और सूचकांक आपके लिए स्वचालित रूप से बनाए जाएँगे। #### IAM अनुमतियाँ Repokid को प्रत्येक खाते में एक IAM भूमिका की आवश्यकता होती है जिससे पूछताछ की जाएगी। इसके अतिरिक्त, Repokid को एक ऐसी भूमिका या उपयोगकर्ता के साथ लॉन्च किया जाना चाहिए जो विभिन्न खाता भूमिकाओं में `sts:AssumeRole` कॉल कर सके। RepokidInstanceProfile: - केवल एक बनाएँ। - सभी RepokidRole में `sts:AssumeRole` कॉल करने की क्षमता आवश्यक है। - `repokid_roles` तालिका और सभी सूचकांकों के लिए DynamoDB अनुमतियाँ (कॉन्फ़िग में `dynamo_db` के `assume_role` उपखंड में निर्दिष्ट) और `dynamodb:ListTables` चलाने की क्षमता। RepokidRole: - Repokid द्वारा प्रबंधित किए जाने वाले प्रत्येक खाते में मौजूद होना चाहिए। - एक विश्वास नीति होनी चाहिए जो `RepokidInstanceProfile` की अनुमति देती है। - कॉन्फ़िग फ़ाइल में `connection_iam` में नाम निर्दिष्ट होना चाहिए। - इन अनुमतियाँ हैं: ```json { "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)। #### config.json संपादित करना `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/advisors` - `connection_iam`: `assume_role` को `RepokidRole` पर सेट करें, या जो भी आपने इसे कहा है। ## वैकल्पिक कॉन्फ़िगरेशन Repokid फ़िल्टर का उपयोग यह तय करने के लिए करता है कि कौन सी भूमिकाएँ repo किए जाने के लिए उम्मीदवार हैं। फ़िल्टर को आपके वातावरण के अनुसार कॉन्फ़िगर किया जा सकता है जैसा कि नीचे वर्णित है। ### ब्लॉकलिस्ट फ़िल्टर ब्लॉकलिस्ट फ़िल्टर में जोड़कर भूमिकाओं को बाहर रखा जा सकता है। किसी भूमिका को बाहर करने का एक सामान्य कारण यह है कि संबंधित कार्यभार कभी-कभी ऐसे कार्य करता है जो देखे नहीं गए होंगे लेकिन आवश्यक माने जाते हैं। भूमिका को बाहर करने के दो तरीके हैं: - सभी खातों के लिए भूमिका का नाम बाहर करें: इसे कॉन्फ़िगरेशन `filter_config.BlocklistFilter.all` की सूची में जोड़ें। - विशिष्ट खाते के लिए भूमिका का नाम बाहर करें: इसे कॉन्फ़िगरेशन `filter_config.BlocklistFilter.<ACCOUNT_NUMBER>` की सूची में जोड़ें। ब्लॉकलिस्ट को S3 ब्लॉकलिस्ट फ़ाइल में भी बनाए रखा जा सकता है। उन्हें निम्नलिखित रूप में होना चाहिए: ```json { "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 का विस्तार करना ### हुक Repokid हुक के माध्यम से विस्तार योग्य है जो विभिन्न कार्यों से पहले, दौरान और बाद में कॉल किए जाते हैं जैसा कि नीचे सूचीबद्ध है। | हुक नाम | प्रसंग | |-----------|---------| | `AFTER_REPO` | भूमिका, त्रुटियाँ | | `AFTER_REPO_ROLES` | भूमिकाएँ, त्रुटियाँ | | `BEFORE_REPO_ROLES` | खाता_संख्या, भूमिकाएँ | | `AFTER_SCHEDULE_REPO` | भूमिकाएँ | | `DURING_REPOABLE_CALCULATION` | भूमिका_आईडी, arn, खाता_संख्या, भूमिका_नाम, संभावित_रीपो_योग्य_अनुमतियाँ, न्यूनतम_आयु | | `DURING_REPOABLE_CALCULATION_BATCH` | भूमिका_बैच, संभावित_रीपो_योग्य_अनुमतियाँ, न्यूनतम_आयु | हुक को निम्नलिखित इंटरफ़ेस का पालन करना चाहिए: ```python 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`](https://github.com/netflix/repokid/blob/master/repokid/hooks/loggers/__init__.py) में पाए जा सकते हैं। ### फ़िल्टर भूमिकाओं को repo होने से बाहर करने के लिए कस्टम फ़िल्टर लिखे जा सकते हैं। फ़िल्टर को निम्नलिखित इंटरफ़ेस का पालन करना चाहिए: ```python 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`](https://github.com/netflix/repokid/blob/master/repokid/filters/age/__init__.py) में पाया जा सकता है। एक अधिक जटिल उदाहरण [`repokid.blocklist.age`](https://github.com/netflix/repokid/blob/master/repokid/filters/blocklist/__init__.py) में है। ## उपयोग कैसे करें एक बार Repokid कॉन्फ़िगर हो जाने पर, इसे निम्नानुसार उपयोग करें: ### मानक प्रवाह - भूमिका कैश अपडेट करें: `repokid update_role_cache <ACCOUNT_NUMBER>` - भूमिका कैश प्रदर्शित करें: `repokid display_role_cache <ACCOUNT_NUMBER>` - किसी विशिष्ट भूमिका के बारे में जानकारी प्रदर्शित करें: `repokid display_role <ACCOUNT_NUMBER> <ROLE_NAME>` - किसी विशिष्ट भूमिका को repo करें: `repokid repo_role <ACCOUNT_NUMBER> <ROLE_NAME>` - किसी खाते की सभी भूमिकाओं को repo करें: `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` मॉड्यूल का उपयोग करके लाइब्रेरी के रूप में कॉल किया जा सकता है: ```python 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 एक कतार पर संदेशों को सुनने और कार्रवाई करने के लिए डिज़ाइन किया गया है। अब तक की कार्रवाइयाँ हैं: - किसी भूमिका से repo करने योग्य सेवाओं की सूची बनाएँ - ऑप्ट-आउट सेट या हटाएँ - किसी भूमिका के लिए रोलबैक सूचीबद्ध करें और करें Repokid किसी भी सफलता या विफलता के बारे में जानकारी के साथ कॉन्फ़िगर करने योग्य SNS विषय पर प्रतिक्रिया देगा। Dispatcher घटक आपके संगठन में repo जीवनचक्र के संचालन में मदद करने के लिए मौजूद है। आप कतार को सीधे डेवलपर्स के लिए खोलने का चुनाव कर सकते हैं, लेकिन अधिक संभावना है कि इसे संरक्षित किया जाना चाहिए क्योंकि रोलबैक सावधानी से न किए जाने पर एक विनाशकारी कार्रवाई हो सकती है। ## विकास ### रिलीज़ करना वर्जनिंग [setupmeta](https://github.com/zsimic/setupmeta) द्वारा संभाली जाती है। नई रिलीज़ बनाने के लिए: ```bash 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 ```