배경
내 목표는 사용하는 것입니다포장기보안 강화를 위해 다양한 파일 시스템에 여러 경로가 탑재된 Amazon 머신 이미지(AMI)를 생성합니다. 예를 들어, /tmp
이 옵션은 파일 시스템에 설치하는 데 사용해야 합니다 noexec
.
AMI를 만들기 위해 자동화된 프로세스를 만들고 싶다는 것은 인스턴스 자체에서 재설치 명령을 실행할 수 없다는 것을 의미하므로 대신 Packer를 사용했습니다.아마존 chroot 빌더. 이는 EC2 인스턴스를 실행하고 해당 EC2 인스턴스에서 Packer를 실행한다는 의미입니다. 그러면 Packer는 소스 AMI와 함께 사용되는 EBS 스냅샷에서 가져온 EBS 볼륨을 탑재합니다. 이제 마운트된 EBS 볼륨에서 몇 가지 작업을 수행해야 합니다.
내 영감은 다음에서 비롯됩니다이 주제에 대한 최근 프레젠테이션누구의 슬라이드가 있는지http://wernerb.github.io/hashiconf-hardening.
내 질문
내 EBS 볼륨(블록 장치)이 처음 마운트되면 여기에 표시되는 파티션은 다음과 같습니다 gdisk -l /dev/xvdf
.
Disk /dev/xvdf: 16777216 sectors, 8.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 726A877B-31D7-4C00-99E4-5A2CCB8E0EAD
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 16777182
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number Start (sector) End (sector) Size Code Name
1 4096 16777182 8.0 GiB 8300 Linux
128 2048 4095 1024.0 KiB EF02 BIOS Boot Partition
그런 다음 다음을 수행합니다.
- "Linux" 파티션 삭제
sgdisk --delete 1 /dev/xvdf
- LVM 볼륨 그룹 생성
lvm vgcreate -y main /dev/xvdf1
- 일련의 LVM 논리 볼륨을 생성하고 다음 명령을 사용하여 포맷합니다.
/sbin/mkfs.ext4 -m0 -O ^64bit "/dev/main/lvroot"
- 모두 마운트하고 여러 파일을 복사하십시오.
- 연결된 EBS 볼륨은
/etc/fstab
다음과 같이 업데이트됩니다(/mnt/ebs-volume/etc/fstab
호스트 시스템의 관점에서 본 것임).
/etc/fstab /dev/xvdf1에 씁니다:
#
/dev/mapper/main-lvroot / ext4 defaults,noatime 1 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/mapper/main-lvvar /var ext4 defaults 0 0
/dev/mapper/main-lvvarlog /var/log ext4 defaults 0 0
/dev/mapper/main-lvvarlog/audit /var/log/audit ext4 defaults 0 0
/dev/mapper/main-lvhome /home ext4 defaults 0 0
/dev/mapper/main-lvtmp /tmp ext4 defaults 0 0
마지막으로 Packer는 /dev/xvdf
EBS 볼륨의 콘텐츠에서 Amazon 머신 이미지(AMI)를 탑재 해제하고 생성합니다.
새 AMI를 시작할 때 실제로 시작되지 않는다는 점을 제외하면 지금까지는 매우 좋습니다. SSH를 통해 연결할 수 없으며 AWS를 통한 "시스템 로그 보기"에는 아무 것도 표시되지 않습니다. 그래서 저는 "BIOS 부팅 파티션"이 포함된 "128" 파티션을 엉망으로 만들었다고 가정합니다. 또한 새 EC2 인스턴스가 부팅될 때 LVM에서 생성된 논리 볼륨을 "활성화"하는 방법에 대해서도 혼란스럽습니다.
기본적으로 부팅 파티션에 무엇이 있어야 하는지에 대한 정신적 모델이 없습니다. LVM 자체를 사용하여 루트 볼륨을 생성하는 경우 EC2 인스턴스는 어떻게 LVM을 시작하고 실행합니까? 에 특별한 파티션을 만들어야 하는지 궁금합니다 /boot
. 그런데 거기에 무엇을 넣어야 할까요? 내 컴퓨터에는 실제로 /dev/xvdf
"BIOS 부팅 파티션", "기존"(ext4 형식) 파티션 /boot
, LVM 관리 파티션(다른 모든 항목용) 등 세 개의 파티션이 있어야 합니까 ?
답변1
문제는 LVM과 관련이 없는 것으로 밝혀졌습니다. 에서와 같이이 변경으로 인해 블록 장치가 부팅되지 않는 이유는 무엇입니까?, 실제 문제는 /
및 /boot
두 개의 별도 파티션으로 분할하면 MBR 구성이 더 이상 올바르지 않다는 것입니다. 이 문제를 해결하기 위해 GRUB 구성 파일을 업데이트할 수 없었기 때문에 결국 동일한 파티션을 /
유지 하고 다른 파티션을 별도로 추가해야 했습니다. /boot
이상적이지는 않지만 효과적입니다.
답변2
LVM 논리 볼륨 부팅의 핵심은 (물론) 커널에서 LVM을 지원하고 LVM 지원을 포함하는 initrd로 부팅하는 것입니다. initrd를 생성하는 것은 간단한 일이 아니므로 Linux 배포판이 LVM에서 부팅하도록 설정되어 있는지 확인하는 것이 좋습니다. 또한 EC2가 initrd를 사용하여 커널을 부팅하는지 확인하세요.