Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
repokid — 분산된 고속 배포를 위한 AWS 최소 권한 | Kitploit
도구/GitHubGitHub/netflix/repokid
Cloud Infrastructure SecurityVulnerability AnalysisConfiguration AuditingCloud SecurityDevSecOpsIdentity & Access Management (IAM)
GitHubnetflix/repokid

repokid

분산된 고속 배포를 위한 AWS 최소 권한

저장소 보기
1.1k105305년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
Repokid
=======
[![NetflixOSS Lifecycle](https://img.shields.io/osslifecycle/Netflix/osstracker.svg)]()
[![Build Status](https://travis-ci.com/Netflix/repokid.svg?branch=master)](https://travis-ci.com/Netflix/repokid)
[![PyPI version](https://badge.fury.io/py/repokid.svg)](https://badge.fury.io/py/repokid)
[![Coverage Status](https://coveralls.io/repos/github/Netflix/repokid/badge.svg?branch=master)](https://coveralls.io/github/Netflix/repokid?branch=master)
[![Discord chat](https://img.shields.io/discord/754080763070382130?logo=discord)](https://discord.gg/9kwMWa6)

<img align="center" alt="Repokid 로고" src="https://raw.githubusercontent.com/Netflix/repokid/master/docs/images/Repokid.png?raw=true" width="25%" display="block">

Repokid는 [Aardvark](https://github.com/Netflix-Skunkworks/aardvark)에서 제공하는 Access Advisor를 사용하여 AWS 계정의 IAM 역할 인라인 정책에서 사용하지 않는 서비스에 대한 액세스 권한을 제거합니다.

## 시작하기

### 설치

```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` (string)를 기본 파티션 키로 사용, 기본 정렬 키 없음
 - `Account`라는 글로벌 보조 인덱스: 기본 파티션 키가 `Account`이고, 투영 속성(projected attributes)으로 `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`을 신뢰하는 신뢰 정책(trust policy)이 있어야 합니다.
- 이름은 구성 파일의 `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할 후보를 결정합니다. 아래 설명된 대로 필터를 환경에 맞게 구성할 수 있습니다.

### 차단 목록 필터
역할은 Blocklist 필터에 추가하여 제외할 수 있습니다. 역할을 제외하는 일반적인 이유 중 하나는 해당 워크로드가 관찰되지는 않았지만 필요하다고 알려진 간헐적 작업을 수행하는 경우입니다. 역할을 제외하는 방법은 두 가지가 있습니다:

 - 모든 계정에서 역할 이름 제외: config의 `filter_config.BlocklistFilter.all` 목록에 추가
 - 특정 계정에서 역할 이름 제외: config의 `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할 역할을 선택하려면 구성 파일에 역할 이름을 나열하면 됩니다. 쉘 스타일 글로브 패턴도 지원됩니다. 역할 선택은 개별 계정별 또는 전역으로 지정할 수 있습니다. 이 필터를 활성화하려면 config 파일의 `active_filters` 섹션에 `"repokid.filters.exclusive:ExclusiveFilter"`를 추가하세요. 구성을 시작하려면 `"filter_config"` 섹션에 예제 구성이 포함된 자동 생성된 config 파일을 사용할 수 있습니다:

```
"ExclusiveFilter": {
                   "all": [
                     "<GLOB_PATTERN>"
                     ],
                   "<ACCOUNT_NUMBER>": [
                     "<GLOB_PATTERN>"
                    ]
                   }
```

### 기간 필터
기본적으로 기간 필터는 90일 미만인 역할을 제외합니다. 변경하려면 config 설정 `filter_config.AgeFilter.minimum_age`를 편집하세요.

### 활성 필터
내부 로직을 지원하기 위해 새 필터를 생성할 수 있습니다. Netflix에서는 사용 사례에 특화된 여러 필터가 있습니다. 활성화하려면 Python 경로에 있는지 확인하고 config의 `active_filters` 섹션 목록에 추가하세요.

## Repokid 확장하기

### Hooks

Repokid는 아래 나열된 다양한 작업 전, 중, 후에 호출되는 훅을 통해 확장 가능합니다.

| Hook name | Context |
|-----------|---------|
| `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 |

Hooks must adhere to the following interface:

```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:
    """Hook functions are called with a dict containing the keys listed above based on the target hook.
    Any mutations made to the input and returned in the output will be passed on to subsequent hook funtions.
    """
    ...
```

훅 구현 예제는 [`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:
        """Filters are initialized with a dict containing the contents of `filter_config.FilterName`
        from the config file. This example would be initialized with `filter_config.CustomFilterName`.
        The configuration can be accessed via `self.config`

        If you don't need any custom initialization logic, you can leave this function out of your
        filter class.
        """
        super().__init__(config=config)
        # custom initialization logic goes here
        ...

    def apply(self, input_list: RoleList) -> RoleList:
        """Determine roles to be excluded and return them as a 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_scheduled_roles` 명령을 실행하여 이미 예약된 역할만 repo할 수 있습니다.

### 특정 권한 대상 지정

환경에서 특정 권한이 특히 위험하다고 생각한다고 가정해 보겠습니다. 여기서는 `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)
```

## Dispatcher ##
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
```
도구 다운로드