Aardvark é uma API AWS IAM Access Advisor de várias contas (e camada de cache).
Certifique-se de ter o Python 3.6 ou posterior. Python 2 não é mais compatível.
git clone https://github.com/Netflix-Skunkworks/aardvark.git
cd aardvark
python3 -m venv env
. env/bin/activate
python setup.py develop
O assistente de configuração do Aardvark irá guiá-lo durante a configuração.
% 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
O Aardvark precisa de uma função IAM em cada conta que será consultada. Além disso, o Aardvark precisa ser lançado com uma função ou usuário que possa sts:AssumeRole
nas diferentes funções da conta.
PerfilAardvarkInstance:
sts:AssumeRole
em todos os AardvarkRole'sAardvarkFunção:
AardvarkInstanceProfile
. iam:GenerateServiceLastAccessedDetails
iam:GetServiceLastAccessedDetails
iam:listrolepolicies
iam:listroles
iam:ListUsers
iam:ListPolicies
iam:ListGroups
Portanto, se você estiver monitorando n
contas, sempre precisará de n+1
funções. ( n
AardvarkRoles e 1
AardvarkInstanceProfile).
Nota: Para executar o aardvark localmente, você não precisa cuidar do AardvarkInstanceProfile. Em vez disso, basta anexar uma política que contenha "sts:AssumeRole" ao usuário que você está usando na AWS CLI para assumir a função do Aardvark. Além disso, o mesmo usuário deve ser mencionado na política de confiança do Aardvark Role para a atribuição adequada dos privilégios.
Você provavelmente desejará atualizar os dados do Access Advisor regularmente. Recomendamos executar o comando update
uma vez por dia. Cron funciona muito bem para isso.
Se você não possui SWAG, pode passar números de contas separados por vírgulas:
aardvark update -a 123456789012,210987654321
O Aardvark pode usar o SWAG para procurar contas, para que você possa competir com todas elas com:
aardvark update
ou por nome/tag da conta com:
aardvark update -a dev,test,prod
aardvark start_api -b 0.0.0.0:5000
Na produção, você provavelmente desejará que algo como um supervisor inicie a API para você.
O Swagger está disponível para a API em <Aardvark_Host>/apidocs/#!
.
O Aardvark responde a solicitações de obtenção/publicação. Todos os resultados são paginados e a paginação pode ser controlada passando argumentos count
e/ou page
. Aqui estão alguns exemplos de consultas:
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$
O Aardvark também pode ser implantado com Docker e Docker Compose. Os serviços do Aardvark são construídos em um contêiner compartilhado. Você precisará do Docker e do Docker Compose instalados para que isso funcione.
Para configurar os contêineres para seu conjunto de contas, crie um arquivo .env
na raiz deste diretório. Defina as variáveis de ambiente neste arquivo. Este exemplo usa chaves de acesso da AWS. Recomendamos o uso de funções de instância na produção.
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>
Nome | Serviço | Descrição |
---|---|---|
AARDVARK_ROLE | collector | O nome da função que o Aardvark deve assumir para poder coletar os dados. |
AARDVARK_ACCOUNTS | collector | Opcional se estiver usando SWAG, caso contrário, obrigatório. Defina isso como uma lista de tags de nomes de contas SWAG ou uma lista de números de contas da AWS dos quais serão coletados registros do Access Advisor. |
AWS_ARN_PARTITION | collector | Obrigatório se não estiver usando uma região comercial da AWS. Por exemplo, aws-us-gov . Por padrão, isso é aws . |
AWS_DEFAULT_REGION | collector | Obrigatório se não estiver em execução em uma instância do EC2 com um perfil de instância apropriado. Defina-os com as credenciais de um usuário AWS IAM com permissão para sts:AssumeRole para a função de auditoria do Aardvark. |
AWS_ACCESS_KEY_ID | collector | Obrigatório se não estiver em execução em uma instância do EC2 com um perfil de instância apropriado. Defina-os com as credenciais de um usuário AWS IAM com permissão para sts:AssumeRole para a função de auditoria do Aardvark. |
AWS_SECRET_ACCESS_KEY | collector | Obrigatório se não estiver em execução em uma instância do EC2 com um perfil de instância apropriado. Defina-os com as credenciais de um usuário AWS IAM com permissão para sts:AssumeRole para a função de auditoria do Aardvark. |
AARDVARK_DATABASE_URI | collector e apiserver | Especifique um URI de banco de dados personalizado compatível com SQL Alchemy. Por padrão, isso usará o valor AARDVARK_DATA_DIR para criar um banco de dados SQLLite. Exemplo: sqlite:///$AARDVARK_DATA_DIR/aardvark.db |
Depois que esse arquivo for criado, construa os contêineres e inicie os serviços. Aardvark consiste em três serviços:
# build the containers
docker-compose build
# start up the containers
docker-compose up
Finalmente, para limpar o meio ambiente
# bring down the containers
docker-compose down
# remove the containers
docker-compoes rm
O Aardvark iniciará o número de threads especificado na configuração. Cada um desses threads recuperará os dados do Access Advisor para uma conta e, em seguida, persistirá os dados.
A consulta regex
é suportada apenas no Postgres (nativamente) e SQLite (por meio de alguma mágica cortesia do Xion no arquivo sqla_regex
).
Recomendamos ativar o TLS para qualquer serviço. As instruções para configurar o TLS estão fora do escopo deste documento.
Novo na v0.3.1
Aardvark usa Blinker para sinais em seu processo de atualização. Esses sinais podem ser usados para coisas como emissão de métricas, registro adicional ou realização de mais ações nas contas. Você pode usá-los escrevendo um script que defina seus manipuladores e chame aardvark.manage.main()
. Por exemplo, crie um arquivo chamado signals_example.py
com o seguinte conteúdo:
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 ()
Este arquivo agora pode ser invocado da mesma forma que manage.py
:
python signals_example.py update -a cool_account
A saída do log será semelhante a esta:
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
Aula | Sinais |
---|---|
manage.UpdateAccountThread | on_ready , on_complete , on_failure |
updater.AccountToUpdate | on_ready , on_complete , on_error , on_failure |
Veja TODO