๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿง‘๐Ÿป‍๐Ÿ’ป Develop/DevOps

Terraform Backend ์—์„œ PoLP ์‹คํ˜„: ๋กœ๊ทธ ๋ถ„์„์œผ๋กœ ํ•„์š”ํ•œ ๊ถŒํ•œ๋งŒ ์ ์šฉํ•˜๊ธฐ

by dev-jaesoon 2025. 5. 8.
๋ฐ˜์‘ํ˜•

Terraform ์œผ๋กœ AWS Backend(S3 + DynamoDB)๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ, ๋ฌด์‹ฌ์ฝ” AmazonS3FullAccess ๊ฐ™์€ managed policy ๋ฅผ ๋ถ™์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” PoLP(์ตœ์†Œ ๊ถŒํ•œ ์›์น™) ์— ์œ„๋ฐฐ๋œ๋‹ค. ์‹ค์ œ ํ•„์š”ํ•œ ๊ถŒํ•œ๋งŒ ์•Œ์•„๋‚ด ์ •ํ™•ํžˆ ๋ถ€์—ฌํ•˜๋Š” ๊ฒŒ ๋ณด์•ˆ์ƒ ์ ์ ˆํ•˜๋‹ค.

์ด ๊ธ€์—์„  Terraform apply ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•ด ์–ด๋–ค API๊ฐ€ ํ˜ธ์ถœ๋๋Š”์ง€ ์ถ”์ถœํ•˜๊ณ , ๊ทธ๊ฑธ ๋ฐ”ํƒ•์œผ๋กœ ์ •์ œ๋œ IAM Policy ๋ฅผ ๊ตฌ์„ฑํ•œ ๊ณผ์ •์„ ๊ณต์œ ํ•œ๋‹ค.

 


 

Terraform Debug log ๋กœ API ์‚ฌ์šฉ ๋‚ด์—ญ ์ถ”์ถœํ•˜๊ธฐ

๋จผ์ € ๋””๋ฒ„๊ทธ ๋กœ๊ทธ๋ฅผ ์ผœ์„œ, Terraform apply ์‹คํ–‰ ์‹œ, ์–ด๋–ค AWS API ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”์ง€ ๊ธฐ๋กํ•œ๋‹ค.

$ export TF_LOG=DEBUG
$ export TF_LOG_PATH=./terraform.log
$ terraform apply

 

 

๊ทธ ํ›„, log ์—์„œ S3 ์™€ DynamoDB ๊ด€๋ จ AWS API ํ˜ธ์ถœ ์ •๋ณด๋ฅผ ์ถ”์ถœํ–ˆ๋‹ค.

$ cat terraform.log | grep -E 'rpc.service=(S3|DynamoDB)' | awk '{
  for(i=1; i<=NF; i++) {
    if($i ~ /^rpc.service=/) service = $i;
    if($i ~ /^rpc.method=/) method = $i;
  }
  if(service && method) print service ":" method;
}' | sed -E 's/rpc.service=([^:]*):rpc.method=([^:]*)$/\1:\2/' | sort | uniq -c

   2 DynamoDB:CreateTable
   2 DynamoDB:DescribeContinuousBackups
  12 DynamoDB:DescribeTable
   2 DynamoDB:DescribeTimeToLive
   1 DynamoDB:GetBucketTagging
   2 DynamoDB:ListTagsOfResource
   1 DynamoDB:PutBucketLifecycleConfiguration
   2 S3:CreateBucket
   2 S3:GetBucketAccelerateConfiguration
   2 S3:GetBucketAcl
   3 S3:GetBucketCors
   2 S3:GetBucketEncryption
  32 S3:GetBucketLifecycleConfiguration
   2 S3:GetBucketLogging
   3 S3:GetBucketPolicy
   3 S3:GetBucketReplication
   2 S3:GetBucketRequestPayment
   4 S3:GetBucketTagging
   2 S3:GetBucketVersioning
   3 S3:GetBucketWebsite
   3 S3:GetObjectLockConfiguration
   6 S3:HeadBucket
   1 S3:PutBucketLifecycleConfiguration

 

์ถœ๋ ฅ๋œ ๊ฒฐ๊ณผ์—๋Š” ์‹ค์ œ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์•ก์…˜ (e.g. DynamoDB:GetBucketTagging ๋“ฑ) ์ด ํฌํ•จ๋˜๊ฑฐ๋‚˜, ๋กœ๊ทธ์— ๋‚˜ํƒ€๋‚œ ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ IAM Policy ์˜ Action ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. ์ด๋Ÿฐ ๋ถ€๋ถ„์€ GPT์˜ ๋„์›€์„ ๋ฐ›์•„ ์‹ค์ œ ํ•„์š”ํ•œ ์•ก์…˜์œผ๋กœ ์ •ํ™•ํžˆ ์ •๋ฆฌํ–ˆ๋‹ค.

 

์‹ค์ œ ํ•„์š”ํ•œ IAM Policy ๋ชฉ๋ก (์ •์ œ ํ›„)

๋‹ค์Œ์€ ์ตœ์ข…์ ์œผ๋กœ ๊ตฌ์„ฑํ•œ PoLP ๊ธฐ๋ฐ˜ IAM Policy ์ด๋‹ค. ์‹ค์งˆ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ์•ก์…˜๋งŒ ํฌํ•จํ–ˆ๊ณ , ๋ฆฌ์†Œ์Šค๋„ ๊ตฌ์ฒด์ ์œผ๋กœ ์ง€์ •ํ–ˆ๋‹ค.

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"s3:CreateBucket",
				"s3:ListBucket",
				"s3:GetBucketLocation",
				"s3:GetBucketAcl",
				"s3:GetBucketVersioning",
				"s3:GetBucketPolicy",
				"s3:GetBucketRequestPayment",
				"s3:GetBucketLogging",
				"s3:GetEncryptionConfiguration",
				"s3:GetLifecycleConfiguration",
				"s3:GetBucketObjectLockConfiguration",
				"s3:PutLifecycleConfiguration",
				"s3:GetBucketTagging",
				"s3:GetReplicationConfiguration",
				"s3:GetAccelerateConfiguration",
				"s3:GetBucketCORS",
				"s3:GetBucketWebsite"
			],
			"Resource": [
				"arn:aws:s3:::<BUCKET_NAME>",
				"arn:aws:s3:::<BUCKET_NAME>/*"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"dynamodb:CreateTable",
				"dynamodb:DescribeTable",
				"dynamodb:DescribeContinuousBackups",
				"dynamodb:DescribeTimeToLive",
				"dynamodb:ListTagsOfResource"
			],
			"Resource": "arn:aws:dynamodb:ap-northeast-1:XXX:table/<TABLE_NAME>"
		},
		{
			"Effect": "Allow",
			"Action": "sts:GetCallerIdentity",
			"Resource": "*"
		}
	]
}

 


 

์ •๋ฆฌ

  • Terraform Debug log ๋ฅผ ๋ถ„์„ํ•˜๋ฉด ์‹ค์ œ ํ˜ธ์ถœ๋˜๋Š” AWS API ์ •๋ณด๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ฅผ IAM Policy (Action) ์œผ๋กœ ๋งคํ•‘ํ•˜๋ฉด ์ •ํ™•ํ•˜๊ณ  ์ตœ์†Œํ•œ์˜ ์ •์ฑ…์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • "์ž˜ ๋ชจ๋ฅด๋ฉด FullAccess" ์™€ ๊ฐ™์€ ๊ณผ๋„ํ•œ ์ •์ฑ…์€ ํ”ผํ•˜๊ณ , "์‹ค์ œ ํ•„์š”ํ•œ ๊ถŒํ•œ"๋งŒ ์ •ํ™•ํžˆ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ๋กœ๊ทธ๋ฅผ ๋จผ์ € ํ™•์ธํ•˜๋ฉด PoLP (์ตœ์†Œ ๊ถŒํ•œ ์›์น™) ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐ ํ›จ์”ฌ ์ˆ˜์›”ํ•˜๋‹ค.

 

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€