多账户AWS IAM访问顾问API
项目描述
Aardvark - 多账户AWS IAM访问顾问API
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 |
collector 和apiserver |
指定由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_ready 、on_complete 、on_failure |
updater.AccountToUpdate |
on_ready 、on_complete 、on_error 、on_failure |
待办事项
请参阅待办事项
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分布
构建分布
aardvark-0.4.1.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2d7cc1e003ef42661616c112d05aecf3c782c0e9cb2091c2356c268f054650f9 |
|
MD5 | 855e787ebae4e1c52de2467e9255ee20 |
|
BLAKE2b-256 | 哈希值:e779568f171f8ced2377f415b7ffa2658ba43b813f7b7fae73e17e590f57f8ea |