테라폼 구성에 필요한 최소 AWS 권한을 결정하는 가장 효율적인 방법은 무엇입니까?
테라폼 구성에 필요한 최소 AWS 권한을 결정하는 가장 효율적인 방법은 무엇입니까?
AWS에서 배포를 대상으로 하는 Terraform 구성이 있습니다. 이 기능은 모든 작업을 수행할 수 있는 권한이 있는 IAM 사용자를 사용할 때 아름답게 적용됩니다(예:
이 Terraform 구성의 적용을 자동화하기 위해 초기에 구성을 적용하고 이후 변경 사항을 적용하는 데 필요한 권한 집합을 결정하고자 합니다. 나는 특히 정책에서 광범위한 권한을 주는 것을 피하고 싶다.
지금까지, 나는 단지 오류가 발생할 때까지 달리고 있다. 출력 또는 테라폼 로그 출력을 보고 실패한 API 호출을 확인한 다음 배포 사용자 정책에 추가합니다. EC2와 S3는 작업의 이름이 API 메서드 이름과 일치하지 않는 것처럼 보이기 때문에 특히 불만스럽다. 나는 내가 얼마나 오래 있는지 쉽게 알 수 있는 몇 시간 동안 이 일에 빠져 있다.
이것을 하는 더 효율적인 방법이 있나요?
테라포름이 내게 필요한 권한/액션을 알려주면 정말 좋겠지만 그것은 해시코프에게 가장 좋은 제품 향상이다.
효율적인 방법으로 따라왔지
제가 처리하는 방법은 먼저 해당 서비스에 대한 모든 권한(*)을 허용한 다음, 필요하지 않은 경우 일부 권한을 거부하는 것입니다.
예를들면
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSpecifics",
"Action": [
"ec2:*",
"rds:*",
"s3:*",
"sns:*",
"sqs:*",
"iam:*",
"elasticloadbalancing:*",
"autoscaling:*",
"cloudwatch:*",
"cloudfront:*",
"route53:*",
"ecr:*",
"logs:*",
"ecs:*",
"application-autoscaling:*",
"logs:*",
"events:*",
"elasticache:*",
"es:*",
"kms:*",
"dynamodb:*"
],
"Effect": "Allow",
"Resource": "*"
},
{
"Sid": "DenySpecifics",
"Action": [
"iam:*User*",
"iam:*Login*",
"iam:*Group*",
"iam:*Provider*",
"aws-portal:*",
"budgets:*",
"config:*",
"directconnect:*",
"aws-marketplace:*",
"aws-marketplace-management:*",
"ec2:*ReservedInstances*"
],
"Effect": "Deny",
"Resource": "*"
}
]
}
테라폼이 필요하지 않거나 회사에서 일부 AWS 서비스를 사용하지 않는 경우 거부 세션에서 목록을 쉽게 조정할 수 있습니다.
편집 2021년 2월: i live 및 클라이언트 측 모니터링을 사용하는 더 나은 방법이 있습니다. 저의 다른 답변을 봐주세요.
완벽한 해결책은 없다고 생각하기 때문에, 이 대답을 제가 머리를 쥐어짜는 결과로 조금 다루세요. 적어도 초기 권한 설정을 위해 다음과 같은 것을 상상할 수 있었다.
먼저 모든 것을 허용한 다음 CloudTrail 로그를 처리하여 /cycle에서 어떤 API 호출이 이루어졌는지 확인합니다.
그런 다음 이러한 호출을 정확히 포함하도록 IAM 정책을 업데이트합니다.
위에서 언급한 것과 유사하지만 CloudTrail에 들어가지 않은 또 다른 접근 방식이 있습니다.
- IAM 사용자에게 전체 권한을 부여합니다.
- 달려.
- 달려.
사용된 모든 AWS 액션의 목록이 표시됩니다.
나는 여전히 그러한 초강경 정책이 지속적인 고통이 될 것이고 생산성을 해칠 가능성이 있다고 믿지만(그러나 프로젝트에 따라 달라질 수도 있다), 이제 이것을 위한 도구가 있다.
에서는 AWS SDK의 클라이언트 측 모니터링 기능을 사용하여 실행된 API 호출을 기반으로 최소 정책을 생성합니다. 테라포름이 AWS SDK를 사용하기 때문에 이 기능도 여기서 작동한다.
이전(그리고 수락된) 답변과 달리, iLive는 API 호출 1:1과 반드시 일치하지는 않는 실제 IAM 작업을 올바르게 파악해야 합니다(CloudTrail에 의해 기록됨).
이것이 테라폼과 함께 작동하려면, 당신은 해야 한다.
이전에 제안한 /i live / CloudTrail 접근 방식 외에도 구성 관리(리소스 생성/업데이트/삭제)에 필요한 전체 작업 집합을 캡처하려면 실제로 다음 세 가지 구성을 적용해야 합니다.
- 원본은 리소스를 생성하는 데 필요한 작업을 캡처하는 것입니다.
- 리소스를 업데이트하는 데 필요한 작업을 캡처하기 위해 가능한 한 많은 리소스 인수가 변경된 인수로 변환되었습니다.
- 리소스 삭제에 필요한 작업을 캡처하려면 하나를 비우거나(마지막으로 적용됨)
구성 1과 3을 고려하는 것이 일반적이지만 구성 2는 때때로 간과되고 준비하기가 지루할 수 있습니다. 이 기능이 없으면 Terraform은 리소스를 삭제하고 다시 만드는 대신 리소스를 수정하는 변경사항을 적용하지 못합니다.
최소 권한 추적은 이제 AWS 자체에서 제공합니다.
최소한의 실행 가능한 권한 원칙을 고집하고 싶다면 Cloud Formation StackSets를 사용하여 최소 권한으로 서로 다른 역할을 배포할 수 있습니다. 따라서 Terraform은 서로 다른 공급자를 통해 각 모듈 호출에서 역할을 가정할 수 있습니다(예: ASG, LB 및 EC2 인스턴스를 배포하는 모듈이 있는 경우).
- 워크로드가 상주하는 역할에 이러한 작업을 포함
- Terraformaws 공급자 추가 해당 역할 차단
- 모듈 호출 내에서 사용합니다.
부담은 아마도 꽤 많은 테라폼 역할을 관리하는 것이지만, 앞서 말했듯이 까다롭거나 테라폼 사용자의 권한을 축소해야 하는 고객 요구사항이 있는 경우입니다.
또한 최근 X일(최대 90일) 동안의 CloudTrail 이벤트 기록을 다운로드하여 다음을 실행할 수도 있습니다.
cat event_history.json <(echo "]}") | jq '[.Records[] | .eventName] | unique'
에코는 CloudTrail 페이지에서 다운로드할 때 파일이 너무 크고 축소되었기 때문입니다(알 수 없는 이유). 아래에서 확인할 수 있습니다.
> jsonlint event_history.json
Error: Parse error on line 1:
...iam.amazonaws.com"}}
-----------------------^
Expecting ',', ']', got 'EOF'
at Object.parseError (/usr/local/Cellar/jsonlint/1.6.0/libexec/lib/node_modules/jsonlint/lib/jsonlint.js:55:11)
at Object.parse (/usr/local/Cellar/jsonlint/1.6.0/libexec/lib/node_modules/jsonlint/lib/jsonlint.js:132:22)
at parse (/usr/local/Cellar/jsonlint/1.6.0/libexec/lib/node_modules/jsonlint/lib/cli.js:82:14)
at main (/usr/local/Cellar/jsonlint/1.6.0/libexec/lib/node_modules/jsonlint/lib/cli.js:136:14)
at Object.<anonymous> (/usr/local/Cellar/jsonlint/1.6.0/libexec/lib/node_modules/jsonlint/lib/cli.js:178:1)
at Module._compile (node:internal/modules/cjs/loader:1097:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1149:10)
at Module.load (node:internal/modules/cjs/loader:975:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
다음은 에 대한 확장입니다.
cat log.log | ack -o "(?<=DEBUG: Request )[^ ]*" | sort -u
이 명령은 Terraform이 기록한 모든 고유한 AWS 요청을 출력합니다.
- 패턴은 매치 후 첫 번째 단어를 찾기 위해 네거티브 룩어헤드를 수행합니다.
- 이 플래그는 출력에 일치 항목만 표시합니다.
- 목록에서 고유한 값을 선택하고 정렬합니다.
이전 답변 외에 다른 옵션은 다음과 같습니다.
- 앞서 설명한 바와 같이 광범위하게 허가하다.
- AWS 콘솔의 탭에서 사용된 사용 권한을 확인한 다음 그에 따라 사용 권한을 줄입니다.