Aardvark — это API-интерфейс AWS IAM Access Advisor для нескольких учетных записей (и уровень кэширования).
Убедитесь, что у вас установлен 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
для различных ролей учетной записи.
Профиль Муравьеда:
sts:AssumeRole
во всех AardvarkRole.ТрубкозубРоль:
AardvarkInstanceProfile
. iam:GenerateServiceLastAccessedDetails
iam:GetServiceLastAccessedDetails
iam:listrolepolicies
iam:listroles
iam:ListUsers
iam:ListPolicies
iam:ListGroups
Таким образом, если вы отслеживаете n
учетных записей, вам всегда понадобится n+1
роль. ( n
AardvarkRoles и 1
AardvarkInstanceProfile).
Примечание. При локальном запуске aardvark вам не нужно заботиться об AardvarkInstanceProfile. Вместо этого просто прикрепите политику, содержащую «sts: AssumeRole», к пользователю, которого вы используете в интерфейсе командной строки AWS, чтобы принять на себя роль Aardvark. Кроме того, тот же пользователь должен быть упомянут в политике доверия роли Aardvark для правильного назначения привилегий.
Вероятно, вам захочется регулярно обновлять данные 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 доступен для API по адресу <Aardvark_Host>/apidocs/#!
.
Aardvark отвечает на запросы получения/отправки. Все результаты разбиты на страницы, и разбивкой на страницы можно управлять, передавая аргументы 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, в противном случае требуется. Установите для этого список тегов имен учетных записей SWAG или список номеров учетных записей AWS, из которых будут собираться записи Access Advisor. |
AWS_ARN_PARTITION | collector | Требуется, если вы не используете коммерческий регион AWS. Например, aws-us-gov . По умолчанию это aws . |
AWS_DEFAULT_REGION | collector | Требуется, если он не работает на экземпляре EC2 с соответствующим профилем экземпляра. Установите для них учетные данные пользователя AWS IAM с разрешением sts:AssumeRole для роли аудита Aardvark. |
AWS_ACCESS_KEY_ID | collector | Требуется, если он не работает на экземпляре EC2 с соответствующим профилем экземпляра. Установите для них учетные данные пользователя AWS IAM с разрешением sts:AssumeRole для роли аудита Aardvark. |
AWS_SECRET_ACCESS_KEY | collector | Требуется, если он не работает на экземпляре EC2 с соответствующим профилем экземпляра. Установите для них учетные данные пользователя AWS IAM с разрешением sts:AssumeRole для роли аудита Aardvark. |
AARDVARK_DATABASE_URI | collector и apiserver | Укажите пользовательский URI базы данных, поддерживаемый SQL Alchemy. По умолчанию для создания базы данных SQLLite будет использоваться значение AARDVARK_DATA_DIR . Пример: 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 (благодаря волшебству Xion в файле sqla_regex
).
Мы рекомендуем включить TLS для любой службы. Инструкции по настройке TLS выходят за рамки этого документа.
Новое в версии 0.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 |
См. TODO