IAM 最小权限策略生成器。

有关详细说明和完整文档,请访问 ReadTheDocs 上的项目。
查看 Salesforce 工程博客文章 了解 Policy Sentry。
手动编写安全高效的 IAM 策略既繁琐又低效。许多基础设施即代码 (IaC) 开发者都有过这样的经历:
这样的流程对于安全性和基础设施即代码开发者来说都不理想。我们需要让安全地编写 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 仅包含分配给秘密资源类型的标签管理操作。
这极大地加快了开发 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
# 获取所有 AWS 服务中具有“权限管理”访问级别的所有 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 服务可用的所有原始 ARN 格式列表
policy_sentry query arn-table --service ssm
# 获取 `cloud9` ARN 的原始 ARN 格式,短名称为 `environment`
policy_sentry query arn-table --service cloud9 --name environment
# 获取所有原始 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
如果你更喜欢使用 Docker 而不是用 Python 安装脚本,我们也支持这种方式。从仓库根目录,使用以下命令构建 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 | 读取 | 参数 |
| ssm:DescribeParameters | 列表 | 参数 |
| ssm:PutParameter | 写入 | 参数 |
| secretsmanager:PutResourcePolicy | 权限管理 | 密钥 |
| secretsmanager:TagResource | 标签管理 | 密钥 |