Aardvark는 다중 계정 AWS IAM Access Advisor API(및 캐싱 계층)입니다.
Python 3.6 이상이 있는지 확인하십시오. Python 2는 더 이상 지원되지 않습니다.
git clone https://github.com/Netflix-Skunkworks/aardvark.git
cd aardvark
python3 -m venv env
. env/bin/activate
python setup.py develop
Aardvark 구성 마법사가 설정 과정을 안내합니다.
% aardvark config
Aardvark can use SWAG to look up accounts. https://github.com/Netflix-Skunkworks/swag-client
Do you use SWAG to track accounts? [yN]: no
ROLENAME: Aardvark
DATABASE [sqlite:////home/github/aardvark/aardvark.db]:
# Threads [5]:
>> Writing to config.py
aardvark create_db
Aardvark에는 쿼리할 각 계정에 IAM 역할이 필요합니다. 또한 Aardvark는 다른 계정 역할에 sts:AssumeRole
적용할 수 있는 역할 또는 사용자로 시작되어야 합니다.
Aardvark인스턴스 프로필:
sts:AssumeRole
호출하는 기능이 필요합니다.Aardvark역할:
AardvarkInstanceProfile
허용하는 신뢰 정책이 있어야 합니다. iam:GenerateServiceLastAccessedDetails
iam:GetServiceLastAccessedDetails
iam:listrolepolicies
iam:listroles
iam:ListUsers
iam:ListPolicies
iam:ListGroups
따라서 n
계정을 모니터링하는 경우 항상 n+1
역할이 필요합니다. ( n
AardvarkRoles 및 1
AardvarkInstanceProfile).
참고: 로컬로 실행되는 aardvark의 경우 AardvarkInstanceProfile을 관리할 필요가 없습니다. 대신 Aardvark 역할을 위임하기 위해 AWS CLI에서 사용 중인 사용자에게 "sts:AssumeRole"이 포함된 정책을 연결하기만 하면 됩니다. 또한, 적절한 권한 할당을 위해서는 Aardvark Role의 신뢰 정책에 동일한 사용자가 언급되어야 합니다.
정기적으로 Access Advisor 데이터를 새로 고치고 싶을 것입니다. 하루에 한 번씩 update
명령을 실행하는 것이 좋습니다. Cron은 이를 위해 훌륭하게 작동합니다.
SWAG가 없으면 쉼표로 구분된 계좌 번호를 전달할 수 있습니다.
aardvark update -a 123456789012,210987654321
Aardvark는 SWAG를 사용하여 계정을 조회할 수 있으므로 다음을 통해 모두 실행할 수 있습니다.
aardvark update
또는 다음을 사용하여 계정 이름/태그로:
aardvark update -a dev,test,prod
aardvark start_api -b 0.0.0.0:5000
프로덕션에서는 감독자와 같은 사람이 API를 시작하도록 하고 싶을 것입니다.
Swagger는 <Aardvark_Host>/apidocs/#!
.
Aardvark는 get/post 요청에 응답합니다. 모든 결과에는 페이지가 매겨져 있으며, count
및/또는 page
인수를 전달하여 페이지 매김을 제어할 수 있습니다. 다음은 몇 가지 쿼리 예시입니다.
curl localhost:5000/api/1/advisors
curl localhost:5000/api/1/advisors ? phrase=SecurityMonkey
curl localhost:5000/api/1/advisors ? arn=arn:aws:iam::000000000000:role/SecurityMonkey & arn=arn:aws:iam::111111111111:role/SecurityMonkey
curl localhost:5000/api/1/advisors ? regex=^. * Monkey$
Aardvark는 Docker 및 Docker Compose와 함께 배포할 수도 있습니다. Aardvark 서비스는 공유 컨테이너를 기반으로 구축되었습니다. 이 작업을 수행하려면 Docker와 Docker Compose가 설치되어 있어야 합니다.
계정 집합에 대한 컨테이너를 구성하려면 이 디렉터리의 루트에 .env
파일을 만듭니다. 이 파일 내에서 환경 변수를 정의합니다. 이 예에서는 AWS 액세스 키를 사용합니다. 프로덕션에서는 인스턴스 역할을 사용하는 것이 좋습니다.
AARDVARK_ROLE=Aardvark
AARDVARK_ACCOUNTS=<account id>
AWS_DEFAULT_REGION=<aws region>
AWS_ACCESS_KEY_ID=<your access key>
AWS_SECRET_ACCESS_KEY=<you secret key>
이름 | 서비스 | 설명 |
---|---|---|
AARDVARK_ROLE | collector | Aardvark가 데이터를 수집할 수 있도록 가정하는 역할의 이름입니다. |
AARDVARK_ACCOUNTS | collector | SWAG를 사용하는 경우 선택 사항이고, 그렇지 않으면 필수입니다. 이를 Access Advisor 레코드를 수집할 SWAG 계정 이름 태그 목록 또는 AWS 계정 번호 목록으로 설정합니다. |
AWS_ARN_PARTITION | collector | AWS 상업용 지역을 사용하지 않는 경우 필수입니다. 예를 들어 aws-us-gov 입니다. 기본적으로 이는 aws 입니다. |
AWS_DEFAULT_REGION | collector | 적절한 인스턴스 프로필을 사용하여 EC2 인스턴스에서 실행되지 않는 경우 필요합니다. 이를 Aardvark 감사 역할에 대한 sts:AssumeRole 권한이 있는 AWS IAM 사용자의 자격 증명으로 설정합니다. |
AWS_ACCESS_KEY_ID | collector | 적절한 인스턴스 프로필을 사용하여 EC2 인스턴스에서 실행되지 않는 경우 필요합니다. 이를 Aardvark 감사 역할에 대한 sts:AssumeRole 권한이 있는 AWS IAM 사용자의 자격 증명으로 설정합니다. |
AWS_SECRET_ACCESS_KEY | collector | 적절한 인스턴스 프로필을 사용하여 EC2 인스턴스에서 실행되지 않는 경우 필요합니다. 이를 Aardvark 감사 역할에 대한 sts:AssumeRole 권한이 있는 AWS IAM 사용자의 자격 증명으로 설정합니다. |
AARDVARK_DATABASE_URI | collector 와 apiserver | SQL Alchemy에서 지원하는 사용자 지정 데이터베이스 URI를 지정합니다. 기본적으로 AARDVARK_DATA_DIR 값을 사용하여 SQLLite 데이터베이스를 생성합니다. 예: sqlite:///$AARDVARK_DATA_DIR/aardvark.db |
이 파일이 생성되면 컨테이너를 빌드하고 서비스를 시작합니다. Aardvark는 세 가지 서비스로 구성됩니다.
# build the containers
docker-compose build
# start up the containers
docker-compose up
마지막으로 환경정화를 위해
# bring down the containers
docker-compose down
# remove the containers
docker-compoes rm
Aardvark는 구성에 지정된 수의 스레드를 시작합니다. 이러한 각 스레드는 계정에 대한 Access Advisor 데이터를 검색한 다음 데이터를 유지합니다.
regex
쿼리는 Postgres(기본적으로) 및 SQLite( sqla_regex
파일에서 Xion의 일부 마법 제공을 통해)에서만 지원됩니다.
모든 서비스에 대해 TLS를 활성화하는 것이 좋습니다. TLS 설정 지침은 이 문서의 범위를 벗어납니다.
v0.3.1의 새로운 기능
Aardvark는 업데이트 프로세스에서 신호로 Blinker를 사용합니다. 이러한 신호는 지표 내보내기, 추가 로깅 또는 계정에 대한 추가 작업 수행과 같은 작업에 사용될 수 있습니다. 핸들러를 정의하고 aardvark.manage.main()
호출하는 스크립트를 작성하여 이를 사용할 수 있습니다. 예를 들어 다음 내용으로 signals_example.py
라는 파일을 만듭니다.
import logging
from aardvark . manage import main
from aardvark . updater import AccountToUpdate
logger = logging . getLogger ( 'aardvark_signals' )
@ AccountToUpdate . on_ready . connect
def handle_on_ready ( sender ):
logger . info ( f"got on_ready from { sender } " )
@ AccountToUpdate . on_complete . connect
def handle_on_complete ( sender ):
logger . info ( f"got on_complete from { sender } " )
if __name__ == "__main__" :
main ()
이제 이 파일을 manage.py
와 동일한 방식으로 호출할 수 있습니다.
python signals_example.py update -a cool_account
로그 출력은 다음과 유사합니다.
INFO: getting bucket swag-bucket
INFO: Thread #1 updating account 123456789012 with all arns
INFO: got on_ready from <aardvark.updater.AccountToUpdate object at 0x10c379b50>
INFO: got on_complete from <aardvark.updater.AccountToUpdate object at 0x10c379b50>
INFO: Thread #1 persisting data for account 123456789012
INFO: Thread #1 FINISHED persisting data for account 123456789012
수업 | 신호 |
---|---|
manage.UpdateAccountThread | on_ready , on_complete , on_failure |
updater.AccountToUpdate | on_ready , on_complete , on_error , on_failure |
할 일 보기