작업 목적
- ISMS 심사 중 OS 보안취약점을 강화하기 위해 스크립트를 돌려야하지만 EKS에 설정된 Launch Template가 변경되지 않으면 스크립트를 적용해도 오토스케일링이 되면 보안설정들이 날라감
- 골든이미지를 생성하여 Dev, Production 환경등에서 빠른 배포가 가능하다.
- 스크립트를 사용하용 버전관리 가능
Packer 란
- Packer는 여러 플랫폼에 대해 동일한 시스템 이미지를 작성하기위한 오픈 소스 도구입니다.
- AWS의 AMI, Azure Image, Google Cloud Image 등을 스크립트 파일을 이용해서 생성할 수 있습니다.
- 패커는 Hashicorp에서 만든 인프라 관리 도구 중 하나이다.
- 인프라 자동화 도구 중 하나로 다양한 플랫폼에서 사용가능한 이미지를 동적으로 생성할 수 있게 도와준다.
Packer - Builder
- 빌더로 이미지를 생성할 플랫폼을 지정할 수 있다.
- AWS, VirtualBox 및 VM웨어와 같은 가상 머신의 이미지, 도커 등 컨테이너 이미지도 생성이 가능하다.
- 현재 packer에서 지원하는 목록은
- 아마존 EC2 AMI
- 디지털오션
- 도커
- 구글 컴퓨트 엔진
- 오픈스택
- 패러럴스
- QEMU
- 버추얼박스
- VM웨어
- Custom
- Null
Packer - Provisioner
- 이미지를 생성할 때 사용할 빌드 도구를 의미한다.
- 셸스크립트와 같은 원시적인 방법인 앤서블, 셰프와 같은 도구들도 지원한다.
- 현재는 셸스크립트를 통해 보안취약점을 해결한 골든이미지를 만드는 작업입니다.
Packer를 사용하여 AWS AMI 만드는 작업순서
1. Packer 설치 방법
- mac 같은 경우 brew로 손쉽게 설치할 수 있습니다.
$ brew tap hashicorp/tap
$ brew install hashicorp/tap/packer
2. AWS 인증 설정하기
- Packer를 사용하기 위해서는 AWS 인증 정보가 필요하다. 따라서 AWS CLI를 사용하여 인증 정보를 설정한다.
aws configure
3. Packer 템플릿 작성하기
- Packer는 JSON 또는 HCL을 사용하여 템플릿을 작성한다. 따라서 JSON을 사용하여 템플릿을 작성하는 방법을 소개.
- 아래는 JSON 방식으로 작성된 template입니다.
{
"variables": {
"aws_region": "us-west-2",
"ami_name": "my-ami",
"instance_type": "t2.micro",
"ssh_username": "ubuntu"
},
"builders": [{
"type": "amazon-ebs",
"region": "{{user `aws_region`}}",
"source_ami_filter": {
"filters": {
"virtualization-type": "hvm",
"name": "ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*",
"root-device-type": "ebs"
},
"owners": ["099720109477"],
"most_recent": true
},
"instance_type": "{{user `instance_type`}}",
"ssh_username": "{{user `ssh_username`}}",
"ami_name": "{{user `ami_name`}}",
"tags": {
"Name": "{{user `ami_name`}}"
}
}],
"provisioners": [
{
"type": "shell",
"inline": [
"echo 'Hello, World!' > /tmp/hello-world.txt"
]
}
]
}
- variables : 변수를 정의
- builders : AMI를 만들기 위한 설정을 정의
- provisioners : AMI를 생성한 후 실행할 스크립트를 정의
4. Packer로 AMI 만들기
- 다음 명령어를 사용하여 Packer로 AMI를 만든다.
- template.json 파일을 템플릿으로 사용하여 AMNI를 생성한다.
$ packer build template.json
Packer를 사용하여 골든이미지 생성
- Template.json 생성
{
"variables": {
"vpc_id": "[VPC 이름]",
"subnet_id": "[subnet 지정]",
"aws_region": "ap-northeast-2",
"ami_name": "EKS-Golden-image-1-{{timestamp}}",
"instance_type": "c7i.xlarge",
"ssh_username": "ec2-user",
"iam_instance_profile": "[ec2에 할당할 iam 맵핑],
"source_ami": "[source_ami]",
"aws_session_token": "{{env `AWS_SESSION_TOKEN`}}",
"aws_access_key": "{{env `AWS_ACCESS_KEY_ID`}}",
"aws_secret_key": "{{env `AWS_SECRET_ACCESS_KEY`}}"
},
"builders": [{
"type": "amazon-ebs",
"region": "{{user `aws_region`}}",
"vpc_id": "{{user `vpc_id`}}",
"subnet_id": "{{user `subnet_id`}}",
"source_ami": "{{user `source_ami`}}",
"instance_type": "{{user `instance_type`}}",
"ssh_username": "{{user `ssh_username`}}",
"ami_name": "{{user `ami_name`}}",
"iam_instance_profile": "{{user `iam_instance_profile`}}",
"ssh_pty": true,
"tags": {
"Name": "{{user `ami_name`}}"
},
"communicator": "ssh",
"ssh_interface": "session_manager"
}],
"provisioners": [
{
"type": "shell",
"inline": [
"sudo yum update -y",
"sudo yum install -y aws-cli",
"sudo yum install -y amazon-cloudwatch-agent",
"sudo sed -i 's/^PASS_MAX_DAYS\\s\\+[0-9]\\+/PASS_MAX_DAYS 90/g' /etc/login.defs",
"sudo sed -i 's/^PASS_MIN_LEN\\s\\+[0-9]\\+/PASS_MIN_LEN 8/g' /etc/login.defs",
"sudo sh -c 'echo \"password requisite pam_cracklib.so try_first_pass retry=3 minlen=8\" >> /etc/pam.d/system-auth'",
"sudo sh -c 'echo \"password requisite pam_cracklib.so try_first_pass retry=3 minlen=8\" >> /etc/pam.d/password-auth'",
"sudo sed -i 's/#\\s\\+minlen\\s\\+=\\s\\+[0-9]\\+/minlen = 8/g' /etc/security/pwquality.conf",
"sudo chmod 4750 /bin/su",
"sudo chown root:wheel /bin/su",
"sudo sh -c 'echo \"\" > /etc/motd'",
"sudo sed -i 's/^#Banner\\s\\+none/Banner none/g' /etc/ssh/sshd_config",
"sudo service sshd restart"
]
}
]
}
2. Packer 명령어
다음은 Packer에서 자주 사용하는 명령어 목록입니다.
- validate : 템플릿 구문 분석을 위한 구문 분석 및 구성 파일 유효성 검사를 실행합니다.
- build : 이미지 빌드를 시작합니다.
- inspect : Packer 템플릿 파일의 내용을 검사합니다.
- fix : Packer 템플릿 파일의 내용을 수정합니다.
- version : Packer의 버전을 출력합니다.
Packer 명령어는 다음과 같이 사용합니다.
$ export AWS_ACCESS_KEY_ID="anaccesskey"
$ export AWS_SECRET_ACCESS_KEY="asecretkey"
$ export AWS_DEFAULT_REGION="ap-northeast-2"
$ packer build template.pkr.hcl
packer validate <filename> # 파일의 유효성을 검사합니다.
packer build <filename> # 파일을 빌드합니다.
packer inspect <filename> # 파일 내용을 검사합니다.
packer fix <filename> # 파일 내용을 수정합니다.
packer version # Packer의 버전을 출력합니다.
