
repokid v0.19.8
الامتياز الأقل في AWS للنشر الموزع عالي السرعة
Repokid
يستخدم Repokid Access Advisor المقدم من Aardvark لإزالة الصلاحيات التي تمنح الوصول إلى الخدمات غير المستخدمة من السياسات المضمنة لدور IAM في حساب AWS.
بدء الاستخدام
التثبيت
mkvirtualenv repokid
git clone [email protected]:Netflix/repokid.git
cd repokid
pip install -e .
repokid config config.json
DynamoDB
ستحتاج إلى جدول DynamoDB يُسمى repokid_roles (حدد الحساب ونقطة النهاية في dynamo_db في ملف الإعدادات).
يجب أن يحتوي الجدول على الخصائص التالية:
RoleId(سلسلة) كمفتاح قسم أساسي، بدون مفتاح فرز أساسي- فهرس ثانوي عمومي يُسمى
Accountبمفتاح قسم أساسيAccountوخصائص مسقطةRoleIdوAccount - فهرس ثانوي عمومي يُسمى
RoleNameبمفتاح قسم أساسيRoleNameوخصائص مسقطةRoleIdوRoleName
للتطوير، يمكنك تشغيل Dynamo محلياً.
للتشغيل محلياً:
docker-compose up
ستكون نقطة نهاية DynamoDB هي http://localhost:8000. يمكن العثور على لوحة إدارة DynamoDB على http://localhost:8001.
إذا قمت بتشغيل الإصدار التطويري، فسيتم إنشاء الجدول والفهرس تلقائياً نيابةً عنك.
أذونات IAM
يحتاج Repokid إلى دور IAM في كل حساب سيتم الاستعلام عنه. بالإضافة إلى ذلك، يحتاج Repokid إلى التشغيل بدور أو مستخدم يمكنه استدعاء sts:AssumeRole إلى أدوار الحسابات المختلفة.
RepokidInstanceProfile:
- أنشئ واحداً فقط.
- يحتاج إلى القدرة على استدعاء
sts:AssumeRoleإلى جميع أدوار RepokidRole. - أذونات DynamoDB لجدول
repokid_rolesوجميع الفهارس (المحددة في القسم الفرعيassume_roleمنdynamo_dbفي الإعدادات) والقدرة على تشغيلdynamodb:ListTables
RepokidRole:
- يجب أن يكون موجوداً في كل حساب ستتم إدارته بواسطة Repokid.
- يجب أن يحتوي على سياسة ثقة تسمح بـ
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 من RepokidRoles و 1 من RepokidInstanceProfile).
تحرير config.json
تشغيل repokid config config.json ينشئ ملفاً ستحتاج إلى تحريره. ابحث عن هذه الحقول وقم بتحديثها:
dynamodb: إذا كنت تستخدم Dynamo محلياً، فاضبط نقطة النهاية علىhttp://localhost:8010. إذا كنت تستخدم Dynamo المستضاف على AWS، فاضبطregionوassume_roleوaccount_number.aardvark_api_location: موقع واجهة Aardvark REST API الخاصة بك. شيء مثلhttps://aardvark.yourcompany.net/api/1/advisorsconnection_iam: عيّنassume_roleإلىRepokidRole، أو أي اسم أطلقت عليه.
إعدادات اختيارية
يستخدم Repokid عوامل تصفية لتحديد الأدوار المرشحة للإزالة. يمكن تكوين عوامل التصفية لتناسب بيئتك كما هو موضح أدناه.
عامل تصفية القائمة المحظورة (Blocklist Filter)
يمكن استبعاد الأدوار عن طريق إضافتها إلى عامل تصفية القائمة المحظورة. أحد الأسباب الشائعة لاستبعاد دور هو أن عبء العمل المقابل يقوم بإجراءات عرضية قد لا تكون قد لوحظت ولكن من المعروف أنها مطلوبة. هناك طريقتان لاستبعاد دور:
- استبعاد اسم الدور لجميع الحسابات: أضفه إلى قائمة في الإعدادات
filter_config.BlocklistFilter.all - استبعاد اسم الدور لحساب محدد: أضفه إلى قائمة في الإعدادات
filter_config.BlocklistFilter.<ACCOUNT_NUMBER>
يمكن أيضاً صيانة القوائم المحظورة في ملف S3 blocklist. يجب أن تكون بالشكل التالي:
{
"arns": ["arn1", "arn2"],
"names": {"role_name_1": ["all", "account_number_1"], "role_name_2": ["account_number_2", "account_number_3"]}
}
عامل التصفية الحصري (Exclusive Filter)
إذا كنت تفضل إزالة أدوار معينة فقط، يمكنك استخدام عامل التصفية الحصري. ربما تريد النظر فقط في الأدوار المستخدمة في الإنتاج أو من قبل فرق معينة.
لتحديد الأدوار للإزالة، يمكنك إدراج أسمائها في ملفات الإعدادات. كما أن أنماط glob بنمط Shell مدعومة أيضاً.
يمكن تحديد اختيار الدور لكل حساب على حدة أو بشكل عام.
لتفعيل هذا الفلتر، ضع "repokid.filters.exclusive:ExclusiveFilter" في القسم active_filters من ملف الإعدادات.
لتكوينه، يمكنك البدء بملف الإعدادات الذي تم إنشاؤه تلقائياً، والذي يحتوي على إعدادات مثال في القسم "filter_config":
"ExclusiveFilter": {
"all": [
"<GLOB_PATTERN>"
],
"<ACCOUNT_NUMBER>": [
"<GLOB_PATTERN>"
]
}
عامل تصفية العمر (Age Filter)
بشكل افتراضي، يستبعد عامل تصفية العمر الأدوار التي يكون عمرها أقل من 90 يوماً. لتغيير هذا، قم بتحرير إعداد الإعدادات:
filter_config.AgeFilter.minimum_age.
عوامل التصفية النشطة (Active Filters)
يمكن إنشاء عوامل تصفية جديدة لدعم المنطق الداخلي. في Netflix، لدينا العديد منها خاصة
باستخداماتنا. لجعلها نشطة، تأكد من أنها في مسار Python وأضفها في الإعدادات إلى القائمة في
القسم active_filters.
توسيع Repokid
الخطافات (Hooks)
يمكن توسيع Repokid عبر خطافات يتم استدعاؤها قبل وأثناء وبعد عمليات متنوعة كما هو مدرج أدناه.
| اسم الخطاف | السياق |
|---|---|
AFTER_REPO | role, errors |
AFTER_REPO_ROLES | roles, errors |
BEFORE_REPO_ROLES | account_number, roles |
AFTER_SCHEDULE_REPO | roles |
DURING_REPOABLE_CALCULATION | role_id, arn, account_number, role_name, potentially_repoable_permissions, minimum_age |
DURING_REPOABLE_CALCULATION_BATCH | role_batch, potentially_repoable_permissions, minimum_age |
يجب أن تلتزم الخطافات بالواجهة التالية:
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.
عوامل التصفية (Filters)
يمكن كتابة عوامل تصفية مخصصة لاستبعاد الأدوار من الإزالة. يجب أن تلتزم عوامل التصفية بالواجهة التالية:
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)
# ضع منطق التهيئة المخصص هنا
...