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 关于[操作、资源和条件键][1] 的文档来查找操作、访问级别和资源类型,并根据 ARN 和访问级别生成策略。考虑下面的表格片段:
| 操作 | 访问级别 | 资源类型 |
|---|---|---|
| ssm:GetParameter | 读取 | 参数 |
| ssm:DescribeParameters | 列表 | 参数 |
| ssm:PutParameter | 写入 | 参数 |
| secretsmanager:PutResourcePolicy | 权限管理 | 密钥 |
| secretsmanager:TagResource | 标签管理 | 密钥 |
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