
リソースARNとアクセスレベルに基づいて最小権限のAWS IAMポリシーを生成し、クラウドインフラストラクチャのセキュアなポリシー作成を自動化します。
IAM最小権限ポリシージェネレーター。

チュートリアルと完全なドキュメントについては、ReadTheDocs上のプロジェクトをご覧ください。
Policy Sentryに関するSalesforce Engineering Blogの記事もご確認ください。
セキュリティを考慮したIAMポリシーを手作業で作成するのは、非常に退屈で非効率です。多くのInfrastructure as Code開発者は、次のような経験をしたことがあるでしょう。
このようなプロセスは、セキュリティにとってもInfrastructure as Code開発者にとっても理想的ではありません。IAMポリシーを安全に作成することを容易にし、最小権限IAMポリシー作成の複雑さを抽象化する必要があります。そのためにこのツールを作りました。
Policy Sentryを使用すると、ユーザーは数秒で最小権限のIAMポリシーを作成できます。従来のように手作業でIAMポリシーを作成するのではなく、アクセスレベルとリソースに基づいてスコープが絞られたポリシーが生成されます。侵害が発生した場合、認証情報の被害範囲を制限し、IAMプリンシパルが必要なものにのみアクセスできるようにします。
このツール以前は、リソースARN制約付きのIAMポリシーを作成するのに数時間かかることがありましたが、今では数秒で完了します。 開発者はアクセスが必要なリソースを決定するだけでよく、Policy SentryがIAMポリシーの複雑さを抽象化して開発プロセスから取り除きます。
Policy Sentryのフラッグシップ機能は、リソースARNとアクセスレベルに基づいてIAMポリシーを作成できることです。CRUD機能は、IAC開発者がAWS IAMの複雑さを理解する必要はないという意見に基づいています。複雑さを抽象化すべきです。実際、開発者は次のように言えるべきです。
arn:aws:s3:::example-org-sbx-vmimport への読み取り/書き込み/一覧アクセスが必要"arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret への権限管理アクセスが必要"arn:aws:ssm:us-east-1:123456789012:parameter/test へのタグ付けアクセスが必要"...そして、自動化がそれらのアクセスレベルに対応するポリシーを作成するべきです。
どうやってこれを実現するのでしょうか?Policy Sentryは、AWSのアクション、リソース、条件キーに関するドキュメントを活用して、アクション、アクセスレベル、リソースタイプを検索し、ARNとアクセスレベルに基づいてポリシーを生成します。以下の表のスニペットを考えてみてください。
Policy Sentryは、これらすべてのドキュメントを単一のデータベースに集約し、そのデータベースを使用してアクション、リソース、アクセスレベルに基づいてポリシーを生成します。
brew tap salesforce/policy_sentry https://github.com/salesforce/policy_sentry
brew install policy_sentry
pip3 install --user policy_sentry
Bash補完を有効にするには、.bashrcに以下を追加します:
eval "$(_POLICY_SENTRY_COMPLETE=bash_source policy_sentry)"
ZSH補完を有効にするには、.zshrcに以下を追加します:
eval "$(_POLICY_SENTRY_COMPLETE=zsh_source policy_sentry)"
policy_sentry create-template --output-file crud.yml --template-type crud
mode: crud
name: ''
# リソースARNを指定
read:
- ''
write:
- ''
list:
- ''
tagging:
- ''
permissions-management:
- ''
# リソース制約をサポートしないアクション
wildcard-only:
single-actions: # 単独のアクション
- ''
# サービス全体 - 's3'や'ec2'など
service-read:
- ''
service-write:
- ''
service-list:
- ''
service-tagging:
- ''
service-permissions-management:
- ''
# ここにアクションをリストすると、リソース制約の要件をスキップします。
skip-resource-constraints:
- ''
# ここに指定したアクションを出力から除外します。kms:Delete*のようなワイルドカードを受け付けます。
exclude-actions:
- ''
# このポリシーにAssumeRoleアクションを含める場合
sts:
assume-role:
- ''
assume-role-with-saml:
- ''
assume-role-with-web-identity:
- ''
mode: crud
read:
- 'arn:aws:ssm:us-east-1:123456789012:parameter/myparameter'
write:
- 'arn:aws:ssm:us-east-1:123456789012:parameter/myparameter'
list:
- 'arn:aws:ssm:us-east-1:123456789012:parameter/myparameter'
tagging:
- 'arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret'
permissions-management:
- 'arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret'
policy_sentry write-policy --input-file crud.yml
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SsmReadParameter",
"Effect": "Allow",
"Action": [
"ssm:GetParameter",
"ssm:GetParameterHistory",
"ssm:GetParameters",
"ssm:GetParametersByPath",
"ssm:ListTagsForResource"
],
"Resource": [
"arn:aws:ssm:us-east-1:123456789012:parameter/myparameter"
]
},
{
"Sid": "SsmWriteParameter",
"Effect": "Allow",
"Action": [
"ssm:DeleteParameter",
"ssm:DeleteParameters",
"ssm:LabelParameterVersion",
"ssm:PutParameter"
],
"Resource": [
"arn:aws:ssm:us-east-1:123456789012:parameter/myparameter"
]
},
{
"Sid": "SecretsmanagerPermissionsmanagementSecret",
"Effect": "Allow",
"Action": [
"secretsmanager:DeleteResourcePolicy",
"secretsmanager:PutResourcePolicy"
],
"Resource": [
"arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret"
]
},
{
"Sid": "SecretsmanagerTaggingSecret",
"Effect": "Allow",
"Action": [
"secretsmanager:TagResource",
"secretsmanager:UntagResource"
],
"Resource": [
"arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret"
]
}
]
}
上記のポリシーが、ユーザーが指定したARNと要求されたアクセスレベルを認識していることに注目してください。例えば、SID SecretsmanagerTaggingSecret には、secretリソースタイプに割り当てられたタグ付けアクションのみが含まれています。
これにより、IAMポリシーの開発時間が大幅に短縮され、作成されるすべてのポリシーがロールに必要なものだけにアクセスを制限することが保証されます。開発者はアクセスが必要なリソースを決定するだけでよく、IAMポリシーの複雑さを開発プロセスから抽象化できます。
# まずテンプレートを作成!!!これにより、YAML形式を覚える必要なく、必要な値を貼り付けるだけで済みます
# CRUDモード
policy_sentry create-template --output-file tmp.yml --template-type crud
# アクションモード
policy_sentry create-template --output-file tmp.yml --template-type actions
# リソース固有のアクセスレベルに基づいてポリシーを作成
policy_sentry write-policy --input-file examples/yml/crud.yml
# アクションのリストに基づいてポリシーを作成
policy_sentry write-policy --input-file examples/yml/actions.yml
###############
# アクションテーブル
###############
# 注:出力形式を変更するには --fmt yaml または --fmt json を使用。デフォルトはクエリ用のjson
# リソース制約をサポートしないアクションのリストを取得
policy_sentry query action-table --service s3 --resource-type "*" --fmt yaml
# S3の"書き込み"レベルでリソース制約をサポートしないアクションのリストを取得
policy_sentry query action-table --service s3 --access-level write --resource-type "*" --fmt yaml
# 全てのサービスから"権限管理"アクセスを持つIAMアクションのリストを取得
policy_sentry query action-table --service all --access-level permissions-management
# RAMサービスで利用可能なすべてのIAMアクションのリストを取得
policy_sentry query action-table --service ram
# `ram:TagResource` IAMアクションの詳細を取得
policy_sentry query action-table --service ram --name tagresource
# RAMサービスで権限管理アクセスレベルを持つすべてのIAMアクションのリストを取得
policy_sentry query action-table --service ram --access-level permissions-management
# SESサービスで`ses:FeedbackAddress`条件キーをサポートするすべてのIAMアクションのリストを取得
policy_sentry query action-table --service ses --condition ses:FeedbackAddress
###########
# ARNテーブル
###########
# SSMサービスで利用可能なすべてのRAW ARN形式のリストを取得
policy_sentry query arn-table --service ssm
# `cloud9` ARNの短縮名`environment`に対応するRAW ARN形式を取得
policy_sentry query arn-table --service cloud9 --name environment
# すべてのRAW ARN形式とその短縮名のキー/バリューペアを取得
policy_sentry query arn-table --service cloud9 --list-arn-types
######################
# 条件キーテーブル
######################
# Cloud9サービスで利用可能なすべての条件キーのリストを取得
policy_sentry query condition-table --service cloud9
# `cloud9:Permissions`という条件キーの詳細を取得
policy_sentry query condition-table --service cloud9 --name cloud9:Permissions
# policy_sentryの設定フォルダを初期化し、IAMデータベーステーブルを作成
policy_sentry initialize
# AWSドキュメントの最新バージョンを取得して、新しいサービスを試す
policy_sentry initialize --fetch
# 独自のアクセスレベルファイルを指定してアクセスレベルを上書き(例:権限管理レベルの修正)
policy_sentry initialize --access-level-overrides-file ~/.policy_sentry/overrides-resource-policies.yml
policy_sentry initialize --access-level-overrides-file ~/.policy_sentry/access-level-overrides.yml
create-template:write-policyコマンドタイプで使用するYMLファイルテンプレートを作成します。
write-policy:YAMLファイルを利用してポリシーを自動生成します。
query:IAMデータベーステーブルを照会します。Policy Sentryテンプレートの記入や、データベースの簡単な知識照会に役立ちます。
action-table)arn-table)condition-table)initialize:(オプション)アクション、リソース、条件キーのドキュメントで利用可能なすべてのサービスを含むSQLiteデータベースを作成します。ドキュメントを参照してください。
独自のPythonコードを開発していて、Policy Sentryをサードパーティパッケージとしてインポートしたい場合、初期化をスキップして、Pythonパッケージ自体にバンドルされているローカルデータベースファイルを利用できます。
これは、IAMデータベースの使用を必要とするPolicy Sentryの機能(IAMデータベーステーブルの照会など)を活用したい開発者にとって特に便利です。これにより、データベースを初期化する必要がなく、すぐに照会を実行できます。
コード例はこちらにあります。以下にも示します。
from policy_sentry.querying.actions import get_actions_for_service
def example():
actions = get_actions_for_service('cloud9') # データベースへのアクセスを必要とする任意のメソッドを利用できます
for action in actions:
print(action)
if __name__ == '__main__':
example()
結果は次のようになります:
cloud9:CreateEnvironmentEC2
cloud9:CreateEnvironmentMembership
cloud9:DeleteEnvironment
cloud9:DeleteEnvironmentMembership
cloud9:DescribeEnvironmentMemberships
cloud9:DescribeEnvironmentStatus
cloud9:DescribeEnvironments
cloud9:GetUserSettings
cloud9:ListEnvironments
cloud9:ListTagsForResource
cloud9:TagResource
cloud9:UntagResource
cloud9:UpdateEnvironment
cloud9:UpdateEnvironmentMembership
cloud9:UpdateUserSettings
Pythonでスクリプトをインストールする代わりにDockerを使用したい場合、それもサポートしています。リポジトリのルートから、次のコマンドでDockerイメージをビルドします:
docker build -t kmcquade/policy_sentry .
基本的なコマンドを実行するには、次のようにします:
# 引数なしの基本コマンド
docker run -i --rm kmcquade/policy_sentry:latest "--help"
docker run -i --rm kmcquade/policy_sentry:latest "query"
# データベースの照会
docker run -i --rm kmcquade/policy_sentry:latest "query action-table --service all --access-level permissions-management"
write-policyコマンドは、STDINを介してYML設定を渡すこともサポートしています。Docker方式を使用している場合は、以下で試してみてください:
# STDINで設定を渡してポリシーを作成
cat examples/yml/crud.yml | docker run -i --rm kmcquade/policy_sentry:latest "write-policy"
cat examples/yml/actions.yml | docker run -i --rm kmcquade/policy_sentry:latest "write-policy"
Terraformモジュールはこちらで公開・保守されています。
| アクション | アクセスレベル | リソースタイプ |
|---|---|---|
| ssm:GetParameter | 読み取り | parameter |
| ssm:DescribeParameters | 一覧 | parameter |
| ssm:PutParameter | 書き込み | parameter |
| secretsmanager:PutResourcePolicy | 権限管理 | secret |
| secretsmanager:TagResource | タグ付け | secret |