跳转到主要内容

多账户AWS IAM访问顾问API

项目描述

Aardvark - 多账户AWS IAM访问顾问API

NetflixOSS Lifecycle Discord chat

Aardvark Logo

Aardvark是一个多账户AWS IAM访问顾问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

已知依赖

  • libpq-dev

配置Aardvark

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
  • 是否使用SWAG来枚举您的AWS账户。(可选,但在拥有许多账户时很有用。)
  • 每个账户中假定IAM角色的名称。
  • 数据库连接字符串。(默认为当前工作目录中的sqlite。生产环境请使用RDS Postgres。)

创建数据库表

aardvark create_db

IAM权限

Aardvark需要在每个将被查询的账户中有一个IAM角色。此外,Aardvark需要以具有sts:AssumeRole权限的角色或用户启动,以便可以假设不同账户的角色。

AardvarkInstanceProfile

  • 只创建一个。
  • 需要能够调用sts:AssumeRole到所有的AardvarkRole。

AardvarkRole

  • 必须存在于每个将被监控的账户中。
  • 必须有一个允许AardvarkInstanceProfile的信任策略。
  • 具有以下权限
iam:GenerateServiceLastAccessedDetails
iam:GetServiceLastAccessedDetails
iam:listrolepolicies
iam:listroles
iam:ListUsers
iam:ListPolicies
iam:ListGroups

所以如果你正在监控n个账户,你将始终需要n+1个角色。(n个AardvarkRole和1个AardvarkInstanceProfile)。

注意:对于本地运行aardvark,你不需要处理AardvarkInstanceProfile。相反,只需将包含“sts:AssumeRole”的策略附加到你在AWS CLI上使用的用户,以假设Aardvark角色。此外,相同的用户应提及在Aardvark角色的信任策略中,以正确分配权限。

收集访问顾问数据

你可能希望定期刷新访问顾问数据。我们建议每天运行一次update命令。Cron非常适合这个。

没有SWAG

如果没有SWAG,你可以传递以逗号分隔的账户号码

aardvark update -a 123456789012,210987654321

有SWAG

Aardvark可以使用SWAG查找账户,因此你可以运行所有操作

aardvark update

或通过账户名称/标签运行

aardvark update -a dev,test,prod

API

启动API

aardvark start_api -b 0.0.0.0:5000

在生产环境中,你可能希望有类似supervisor的东西为你启动API。

使用API

Swagger在<Aardvark_Host>/apidocs/#!处提供API文档。

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$

Docker

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 收集器 Aardvark假设以收集数据的角色的名称。
AARDVARK_ACCOUNTS 收集器 如果使用SWAG则为可选,否则为必需。将此设置为SWAG账户名称标签列表或从其中收集访问顾问记录的AWS账户号码列表。
AWS_ARN_PARTITION 收集器 如果不使用AWS商业区域则为必需。例如,aws-us-gov。默认情况下,这是aws
AWS_DEFAULT_REGION 收集器 如果不运行在具有适当实例配置文件的EC2实例上则为必需。将这些设置为具有sts:AssumeRole权限访问Aardvark审计角色的AWS IAM用户的凭证。
AWS_ACCESS_KEY_ID 收集器 如果不运行在具有适当实例配置文件的EC2实例上则为必需。将这些设置为具有sts:AssumeRole权限访问Aardvark审计角色的AWS IAM用户的凭证。
AWS_SECRET_ACCESS_KEY 收集器 如果不运行在具有适当实例配置文件的EC2实例上则为必需。将这些设置为具有sts:AssumeRole权限访问Aardvark审计角色的AWS IAM用户的凭证。
AARDVARK_DATABASE_URI collectorapiserver 指定由SQLAlchemy支持的自定义数据库URI。默认情况下,这将使用AARDVARK_DATA_DIR的值创建一个SQLite数据库。例如:sqlite:///$AARDVARK_DATA_DIR/aardvark.db

一旦创建此文件,然后构建容器并启动服务。Aardvark由三个服务组成

  • 初始化 - 初始化容器在存储卷内创建数据库。
  • API服务器 - 这是一个HTTP网络服务器,将提供数据。默认情况下,它监听https://:5000/apidocs/#!
  • 收集器 - 这是一个守护进程,它将从本地SQL数据库中获取和缓存数据。应定期运行此进程。
# 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将启动配置中指定的线程数。这些线程中的每一个都将检索一个账户的访问顾问数据,然后持久化数据。

数据库

仅支持在Postgres(原生)和SQLite(通过Xion在sqla_regex文件中提供的某种魔法)中执行regex查询。

TLS

我们建议为任何服务启用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_readyon_completeon_failure
updater.AccountToUpdate on_readyon_completeon_erroron_failure

待办事项

请参阅待办事项

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

aardvark-0.4.1.tar.gz (36.8 kB 查看哈希值)

上传时间

构建分布

aardvark-0.4.1-py3-none-any.whl (24.2 kB 查看哈希值)

上传时间 Python 3

支持