AWS ec2 인스턴스는
(iam 유저의 역할을 부여할 때와 마찬가지로)
최소한의 네트워크 접근만 허용해야 한다.
물론 보안상의 이유때문이다.
"Best practice to always give the minimal access that is required for a service."
보안그룹
을 설정하자.
resource "aws_security_group" "bastion" {
description = "Control bastion inbound and outbound access"
name = "${local.prefix}-bastion"
vpc_id = aws_vpc.main.id
ingress {
protocol = "tcp"
from_port = 22
to_port = 22
cidr_blocks = ["0.0.0.0/0"]
}
egress {
protocol = "tcp"
from_port = 443
to_port = 443
cidr_blocks = ["0.0.0.0/0"]
}
egress {
protocol = "tcp"
from_port = 80
to_port = 80
cidr_blocks = ["0.0.0.0/0"]
}
egress {
protocol = "tcp"
from_port = 5432
to_port = 5432
cidr_blocks = [
aws_subnet.private_a.cidr_block,
aws_subnet.private_b.cidr_block
]
}
tags = local.common_tags
}
만약 bastion 인스턴스가 해킹됐을 때,
우리가 모르는 다른 서버와의 접촉으로 2, 3차 파장을 초래하기 때문이다.
(생략)
resource "aws_instance" "bastion" {
ami = data.aws_ami.amazon_linux.id
user_data = file("./templates/bastion/user-data.sh")
instance_type = "t2.micro"
iam_instance_profile = aws_iam_instance_profile.bastion.name
key_name = var.bastion_key_name
subnet_id = aws_subnet.public_a.id
vpc_security_group_ids = [
aws_security_group.bastion.id
]
tags = merge(
local.common_tags,
map("Name", "${local.prefix}-bastion")
)
}
(생략)
resource "aws_security_group" "rds" {
description = "Allow access to the RDS database instance"
name = "${local.prefix}-rds-inbound-access"
vpc_id = aws_vpc.main.id
ingress {
protocol = "tcp"
from_port = 5432
to_port = 5432
security_groups = [
aws_security_group.bastion.id
]
}
tags = local.common_tags
}