如何在json IAM策略中添加注解?

1qczuiv0  于 2023-10-21  发布在  其他
关注(0)|答案(4)|浏览(138)

IAM政策是复杂的野兽。这将是很好的添加一个评论时,制作它们。比如说,

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Sid": "Stmt1422979261000",
  6. "Effect": "Allow",
  7. "Action": [
  8. "route53:ListHostedZones",
  9. ],
  10. "Comment": "Foo"
  11. # or Bar
  12. "Resource": [
  13. "*"
  14. ]
  15. }
  16. ]
  17. }

这两个都不管用。是否存在向这些策略添加注解的方法?

lsmepo6l

lsmepo6l1#

Hyper Anthony的answer在严格意义上的“注解”是正确的-然而,在大多数情况下,您至少可以使用Sid作为伪注解来传达意图或任何约束等:
Sid(语句ID)是您为策略语句提供的可选标识符**。可以为语句数组中的每个语句分配Sid值。在允许您指定ID元素的服务(如SQS和SNS)中,Sid值只是策略文档ID的子ID。在IAM中,Sid值在策略中必须是唯一的。[强调我的]
这是例如例如在AWS博客文章Demystifying EC2 Resource-Level Permissions中使用TheseActionsSupportResourceLevelPermissions

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Sid": "TheseActionsSupportResourceLevelPermissions",
  6. "Effect": "Allow",
  7. "Action": [
  8. "ec2:RunInstances",
  9. "ec2:TerminateInstances",
  10. "ec2:StopInstances",
  11. "ec2:StartInstances"
  12. ],
  13. "Resource": "arn:aws:ec2:us-east-1:accountid:instance/*"
  14. }
  15. ]
  16. }
  • 正如在Sid中提到的,有些服务 * 可能需要这个元素,并且对它有唯一性要求 *,但是我还没有遇到过由此产生的命名约束。
展开查看全部
wb1gzix0

wb1gzix02#

不。一般来说,你描述的评论是are not allowed in JSON。要有效地创建注解,您需要允许一个描述注解的新元素。由于AWS是这个json对象的主人,他们将负责允许这一点。
目前,only allow the following elements

  • 版本
  • ID
  • 声明
  • Sid
  • 效果
  • 主要
  • 非主要
  • 行动
  • NotAction
  • 资源
  • NotResource
  • 条件
展开查看全部
2ul0zpep

2ul0zpep3#

JSON不支持注解。但是我们可以添加'Sid:'作为注解,以便将多个服务策略分类到一个策略中。下面我正在上传Ec2,S3,Lambda,ElasticBeanStalk服务的单个JSON策略。

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Sid": "EC2FullAccess",
  6. "Action": "ec2:*",
  7. "Effect": "Allow",
  8. "Resource": "*"
  9. },
  10. {
  11. "Effect": "Allow",
  12. "Action": "elasticloadbalancing:*",
  13. "Resource": "*"
  14. },
  15. {
  16. "Effect": "Allow",
  17. "Action": "cloudwatch:*",
  18. "Resource": "*"
  19. },
  20. {
  21. "Effect": "Allow",
  22. "Action": "autoscaling:*",
  23. "Resource": "*"
  24. },
  25. {
  26. "Effect": "Allow",
  27. "Action": "iam:CreateServiceLinkedRole",
  28. "Resource": "*",
  29. "Condition": {
  30. "StringEquals": {
  31. "iam:AWSServiceName": [
  32. "autoscaling.amazonaws.com",
  33. "ec2scheduled.amazonaws.com",
  34. "elasticloadbalancing.amazonaws.com",
  35. "spot.amazonaws.com",
  36. "spotfleet.amazonaws.com",
  37. "transitgateway.amazonaws.com"
  38. ]
  39. }
  40. }
  41. },
  42. {
  43. "Sid": "S3FullAccess",
  44. "Effect": "Allow",
  45. "Action": [
  46. "s3:*",
  47. "s3-object-lambda:*"
  48. ],
  49. "Resource": "*"
  50. },
  51. {
  52. "Sid": "LambdaFullAccess",
  53. "Effect": "Allow",
  54. "Action": [
  55. "cloudformation:DescribeStacks",
  56. "cloudformation:ListStackResources",
  57. "cloudwatch:ListMetrics",
  58. "cloudwatch:GetMetricData",
  59. "ec2:DescribeSecurityGroups",
  60. "ec2:DescribeSubnets",
  61. "ec2:DescribeVpcs",
  62. "kms:ListAliases",
  63. "iam:GetPolicy",
  64. "iam:GetPolicyVersion",
  65. "iam:GetRole",
  66. "iam:GetRolePolicy",
  67. "iam:ListAttachedRolePolicies",
  68. "iam:ListRolePolicies",
  69. "iam:ListRoles",
  70. "lambda:*",
  71. "logs:DescribeLogGroups",
  72. "states:DescribeStateMachine",
  73. "states:ListStateMachines",
  74. "tag:GetResources",
  75. "xray:GetTraceSummaries",
  76. "xray:BatchGetTraces"
  77. ],
  78. "Resource": "*"
  79. },
  80. {
  81. "Effect": "Allow",
  82. "Action": "iam:PassRole",
  83. "Resource": "*",
  84. "Condition": {
  85. "StringEquals": {
  86. "iam:PassedToService": "lambda.amazonaws.com"
  87. }
  88. }
  89. },
  90. {
  91. "Effect": "Allow",
  92. "Action": [
  93. "logs:DescribeLogStreams",
  94. "logs:GetLogEvents",
  95. "logs:FilterLogEvents"
  96. ],
  97. "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/*"
  98. },
  99. {
  100. "Effect": "Allow",
  101. "Action": [
  102. "acm:Describe*",
  103. "acm:List*",
  104. "autoscaling:Describe*",
  105. "cloudformation:Describe*",
  106. "cloudformation:Estimate*",
  107. "cloudformation:Get*",
  108. "cloudformation:List*",
  109. "cloudformation:Validate*",
  110. "cloudtrail:LookupEvents",
  111. "cloudwatch:DescribeAlarms",
  112. "cloudwatch:GetMetricStatistics",
  113. "cloudwatch:ListMetrics",
  114. "codecommit:Get*",
  115. "codecommit:UploadArchive",
  116. "ec2:AllocateAddress",
  117. "ec2:AssociateAddress",
  118. "ec2:AuthorizeSecurityGroup*",
  119. "ec2:CreateLaunchTemplate*",
  120. "ec2:CreateSecurityGroup",
  121. "ec2:CreateTags",
  122. "ec2:DeleteLaunchTemplate*",
  123. "ec2:DeleteSecurityGroup",
  124. "ec2:DeleteTags",
  125. "ec2:Describe*",
  126. "ec2:DisassociateAddress",
  127. "ec2:ReleaseAddress",
  128. "ec2:RevokeSecurityGroup*",
  129. "ecs:CreateCluster",
  130. "ecs:DeRegisterTaskDefinition",
  131. "ecs:Describe*",
  132. "ecs:List*",
  133. "ecs:RegisterTaskDefinition",
  134. "elasticbeanstalk:*",
  135. "elasticloadbalancing:Describe*",
  136. "iam:GetRole",
  137. "iam:ListAttachedRolePolicies",
  138. "iam:ListInstanceProfiles",
  139. "iam:ListRolePolicies",
  140. "iam:ListRoles",
  141. "iam:ListServerCertificates",
  142. "logs:Describe*",
  143. "rds:Describe*",
  144. "s3:ListAllMyBuckets",
  145. "sns:ListSubscriptionsByTopic",
  146. "sns:ListTopics",
  147. "sqs:ListQueues"
  148. ],
  149. "Resource": "*"
  150. },
  151. {
  152. "Effect": "Allow",
  153. "Action": [
  154. "autoscaling:*"
  155. ],
  156. "Resource": [
  157. "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/awseb-e-*",
  158. "arn:aws:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/eb-*",
  159. "arn:aws:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/awseb-e-*",
  160. "arn:aws:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/eb-*"
  161. ]
  162. },
  163. {
  164. "Effect": "Allow",
  165. "Action": [
  166. "cloudformation:CancelUpdateStack",
  167. "cloudformation:ContinueUpdateRollback",
  168. "cloudformation:CreateStack",
  169. "cloudformation:DeleteStack",
  170. "cloudformation:GetTemplate",
  171. "cloudformation:ListStackResources",
  172. "cloudformation:SignalResource",
  173. "cloudformation:TagResource",
  174. "cloudformation:UntagResource",
  175. "cloudformation:UpdateStack"
  176. ],
  177. "Resource": [
  178. "arn:aws:cloudformation:*:*:stack/awseb-*",
  179. "arn:aws:cloudformation:*:*:stack/eb-*"
  180. ]
  181. },
  182. {
  183. "Effect": "Allow",
  184. "Action": [
  185. "cloudwatch:DeleteAlarms",
  186. "cloudwatch:PutMetricAlarm"
  187. ],
  188. "Resource": [
  189. "arn:aws:cloudwatch:*:*:alarm:awseb-*",
  190. "arn:aws:cloudwatch:*:*:alarm:eb-*"
  191. ]
  192. },
  193. {
  194. "Effect": "Allow",
  195. "Action": [
  196. "codebuild:BatchGetBuilds",
  197. "codebuild:CreateProject",
  198. "codebuild:DeleteProject",
  199. "codebuild:StartBuild"
  200. ],
  201. "Resource": "arn:aws:codebuild:*:*:project/Elastic-Beanstalk-*"
  202. },
  203. {
  204. "Effect": "Allow",
  205. "Action": [
  206. "dynamodb:CreateTable",
  207. "dynamodb:DeleteTable",
  208. "dynamodb:DescribeTable",
  209. "dynamodb:TagResource"
  210. ],
  211. "Resource": [
  212. "arn:aws:dynamodb:*:*:table/awseb-e-*",
  213. "arn:aws:dynamodb:*:*:table/eb-*"
  214. ]
  215. },
  216. {
  217. "Effect": "Allow",
  218. "Action": [
  219. "ec2:RebootInstances",
  220. "ec2:TerminateInstances"
  221. ],
  222. "Resource": "arn:aws:ec2:*:*:instance/*",
  223. "Condition": {
  224. "StringLike": {
  225. "ec2:ResourceTag/aws:cloudformation:stack-id": [
  226. "arn:aws:cloudformation:*:*:stack/awseb-e-*",
  227. "arn:aws:cloudformation:*:*:stack/eb-*"
  228. ]
  229. }
  230. }
  231. },
  232. {
  233. "Effect": "Allow",
  234. "Action": "ec2:RunInstances",
  235. "Resource": "*",
  236. "Condition": {
  237. "ArnLike": {
  238. "ec2:LaunchTemplate": "arn:aws:ec2:*:*:launch-template/*"
  239. }
  240. }
  241. },
  242. {
  243. "Effect": "Allow",
  244. "Action": [
  245. "ecs:DeleteCluster"
  246. ],
  247. "Resource": "arn:aws:ecs:*:*:cluster/awseb-*"
  248. },
  249. {
  250. "Effect": "Allow",
  251. "Action": [
  252. "elasticloadbalancing:*Rule",
  253. "elasticloadbalancing:*Tags",
  254. "elasticloadbalancing:SetRulePriorities",
  255. "elasticloadbalancing:SetSecurityGroups"
  256. ],
  257. "Resource": [
  258. "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/*/*",
  259. "arn:aws:elasticloadbalancing:*:*:listener/app/*/*/*",
  260. "arn:aws:elasticloadbalancing:*:*:listener-rule/app/*/*/*/*"
  261. ]
  262. },
  263. {
  264. "Effect": "Allow",
  265. "Action": [
  266. "elasticloadbalancing:*"
  267. ],
  268. "Resource": [
  269. "arn:aws:elasticloadbalancing:*:*:targetgroup/awseb-*",
  270. "arn:aws:elasticloadbalancing:*:*:targetgroup/eb-*",
  271. "arn:aws:elasticloadbalancing:*:*:loadbalancer/awseb-*",
  272. "arn:aws:elasticloadbalancing:*:*:loadbalancer/eb-*",
  273. "arn:aws:elasticloadbalancing:*:*:loadbalancer/*/awseb-*/*",
  274. "arn:aws:elasticloadbalancing:*:*:loadbalancer/*/eb-*/*",
  275. "arn:aws:elasticloadbalancing:*:*:listener/awseb-*",
  276. "arn:aws:elasticloadbalancing:*:*:listener/eb-*",
  277. "arn:aws:elasticloadbalancing:*:*:listener/*/awseb-*/*/*",
  278. "arn:aws:elasticloadbalancing:*:*:listener/*/eb-*/*/*",
  279. "arn:aws:elasticloadbalancing:*:*:listener-rule/app/awseb-*/*/*/*",
  280. "arn:aws:elasticloadbalancing:*:*:listener-rule/app/eb-*/*/*/*"
  281. ]
  282. },
  283. {
  284. "Effect": "Allow",
  285. "Action": [
  286. "iam:AddRoleToInstanceProfile",
  287. "iam:CreateInstanceProfile",
  288. "iam:CreateRole"
  289. ],
  290. "Resource": [
  291. "arn:aws:iam::*:role/aws-elasticbeanstalk*",
  292. "arn:aws:iam::*:instance-profile/aws-elasticbeanstalk*"
  293. ]
  294. },
  295. {
  296. "Effect": "Allow",
  297. "Action": [
  298. "iam:AttachRolePolicy"
  299. ],
  300. "Resource": "arn:aws:iam::*:role/aws-elasticbeanstalk*",
  301. "Condition": {
  302. "StringLike": {
  303. "iam:PolicyArn": [
  304. "arn:aws:iam::aws:policy/AWSElasticBeanstalk*",
  305. "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalk*"
  306. ]
  307. }
  308. }
  309. },
  310. {
  311. "Effect": "Allow",
  312. "Action": "iam:PassRole",
  313. "Resource": "arn:aws:iam::*:role/*",
  314. "Condition": {
  315. "StringEquals": {
  316. "iam:PassedToService": [
  317. "elasticbeanstalk.amazonaws.com",
  318. "ec2.amazonaws.com",
  319. "ec2.amazonaws.com.cn",
  320. "autoscaling.amazonaws.com",
  321. "elasticloadbalancing.amazonaws.com",
  322. "ecs.amazonaws.com",
  323. "cloudformation.amazonaws.com"
  324. ]
  325. }
  326. }
  327. },
  328. {
  329. "Effect": "Allow",
  330. "Action": [
  331. "iam:CreateServiceLinkedRole"
  332. ],
  333. "Resource": [
  334. "arn:aws:iam::*:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling*",
  335. "arn:aws:iam::*:role/aws-service-role/elasticbeanstalk.amazonaws.com/AWSServiceRoleForElasticBeanstalk*",
  336. "arn:aws:iam::*:role/aws-service-role/elasticloadbalancing.amazonaws.com/AWSServiceRoleForElasticLoadBalancing*",
  337. "arn:aws:iam::*:role/aws-service-role/managedupdates.elasticbeanstalk.amazonaws.com/AWSServiceRoleForElasticBeanstalk*",
  338. "arn:aws:iam::*:role/aws-service-role/maintenance.elasticbeanstalk.amazonaws.com/AWSServiceRoleForElasticBeanstalk*"
  339. ],
  340. "Condition": {
  341. "StringLike": {
  342. "iam:AWSServiceName": [
  343. "autoscaling.amazonaws.com",
  344. "elasticbeanstalk.amazonaws.com",
  345. "elasticloadbalancing.amazonaws.com",
  346. "managedupdates.elasticbeanstalk.amazonaws.com",
  347. "maintenance.elasticbeanstalk.amazonaws.com"
  348. ]
  349. }
  350. }
  351. },
  352. {
  353. "Effect": "Allow",
  354. "Action": [
  355. "logs:CreateLogGroup",
  356. "logs:DeleteLogGroup",
  357. "logs:PutRetentionPolicy"
  358. ],
  359. "Resource": "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk/*"
  360. },
  361. {
  362. "Effect": "Allow",
  363. "Action": [
  364. "rds:*DBSubnetGroup",
  365. "rds:AuthorizeDBSecurityGroupIngress",
  366. "rds:CreateDBInstance",
  367. "rds:CreateDBSecurityGroup",
  368. "rds:DeleteDBInstance",
  369. "rds:DeleteDBSecurityGroup",
  370. "rds:ModifyDBInstance",
  371. "rds:RestoreDBInstanceFromDBSnapshot"
  372. ],
  373. "Resource": [
  374. "arn:aws:rds:*:*:db:*",
  375. "arn:aws:rds:*:*:secgrp:awseb-e-*",
  376. "arn:aws:rds:*:*:secgrp:eb-*",
  377. "arn:aws:rds:*:*:snapshot:*",
  378. "arn:aws:rds:*:*:subgrp:awseb-e-*",
  379. "arn:aws:rds:*:*:subgrp:eb-*"
  380. ]
  381. },
  382. {
  383. "Effect": "Allow",
  384. "Action": [
  385. "s3:Delete*",
  386. "s3:Get*",
  387. "s3:Put*"
  388. ],
  389. "Resource": "arn:aws:s3:::elasticbeanstalk-*/*"
  390. },
  391. {
  392. "Effect": "Allow",
  393. "Action": [
  394. "s3:CreateBucket",
  395. "s3:GetBucket*",
  396. "s3:ListBucket",
  397. "s3:PutBucketPolicy"
  398. ],
  399. "Resource": "arn:aws:s3:::elasticbeanstalk-*"
  400. },
  401. {
  402. "Effect": "Allow",
  403. "Action": [
  404. "sns:CreateTopic",
  405. "sns:DeleteTopic",
  406. "sns:GetTopicAttributes",
  407. "sns:Publish",
  408. "sns:SetTopicAttributes",
  409. "sns:Subscribe",
  410. "sns:Unsubscribe"
  411. ],
  412. "Resource": "arn:aws:sns:*:*:ElasticBeanstalkNotifications-*"
  413. },
  414. {
  415. "Effect": "Allow",
  416. "Action": [
  417. "sqs:*QueueAttributes",
  418. "sqs:CreateQueue",
  419. "sqs:DeleteQueue",
  420. "sqs:SendMessage",
  421. "sqs:TagQueue"
  422. ],
  423. "Resource": [
  424. "arn:aws:sqs:*:*:awseb-e-*",
  425. "arn:aws:sqs:*:*:eb-*"
  426. ]
  427. }
  428. ]
  429. }
展开查看全部
7y4bm7vi

7y4bm7vi4#

虽然Sid是解决缺乏评论能力的一个很好的解决方案,但使用标签也是另一种尚未提到的方法。另外,另一种方法是完全停止使用JSON。详情如下...

使用标签

当在AWS中创建策略时,you can add tags to that policy将允许您在键值对中插入用户生成的注解。

停止使用JSON

理想情况下,您的策略声明不应该存储在AWS中,因为您无法在那里获得源代码跟踪。在将代码部署到AWS之前,应始终使用Github或CodeCommit等工具来存储代码。AWS不应该是您应用程序的真实来源,而是使用CloudformationCDK、Terraform、AWS CLI等部署策略的地方。在这些情况下,您的策略文档可以存储为YAML(或其他语言)而不是JSON。例如,如果使用Typescript + CDK,则可以在代码中添加注解。或者如果你使用Cloudformation,使用支持注解的YAML。如果您使用AWS CLI,请在使用json之前使用YAML转换器工具。我相信这是对最初问题的最理想的回答,因为AWS等云环境几乎从未被设计为轻松跟踪随时间推移对部署代码的更改。例如,AWS IAM策略can only have 5 versions之前,您必须删除一个才能插入新版本的策略。

相关问题