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
すべての 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 を気にする必要はありません。代わりに、AWS CLI で使用しているユーザーに「sts:AssumeRole」を含むポリシーをアタッチして、Aardvark ロールを引き受けます。また、権限を適切に割り当てるために、Aardvark ロールの信頼ポリシーに同じユーザーを記載する必要があります。
Access Advisor データを定期的に更新することが必要になる場合があります。 update
コマンドは 1 日に 1 回程度実行することをお勧めします。 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 は取得/投稿リクエストに応答します。すべての結果はページ分割され、 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 は 3 つのサービスで構成されます。
# 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 |
「TODO」を参照