저는 임베디드 Linux 시스템용 펌웨어 업데이트 시스템을 설계하려고 합니다. 내 계획은 전체 파일의 압축을 풀 필요가 없도록 대상 시스템에 설치할 수 있는 이미지를 보내는 것입니다. 또한 이미지를 암호화하고 선택적으로 압축하고 싶습니다. 이 이미지를 생성하는 데 사용되는 빌드 시스템은 여러 시스템에 배포되므로 빌드 시스템에서 최소한의 설정만 필요하도록 하려고 합니다. 즉, 루트 권한이 필요하지 않습니다.
losetup
다음을 사용하여 이미지 파일을 설치하는 작업 모델을 만들었습니다.
dd if=/dev/zero of=image_file bs=1M count=10
losetup -e aes loop0 image_file
mkfs.ext2 /dev/loop0
losetup -d loop0
mount -t ext2 -o loop,encryption=aes image_file some_working_folder/
# Add files to some_working_folder
umount some_working_folder
# Send encrypted image to the target system
이제 일부 시스템에서는 설정하기가 다소 번거롭기 때문에 고정된 크기의 이미지를 만드는 것을 피하고 싶습니다. 그래서 losetup
명령을 다른 것으로 바꾸고 싶습니다 . virt-make-fs
파일 시스템을 사용하여 설치 가능한 이미지를 생성할 수 있는 명령을 찾았습니다 ext2
. 이제 Linux 커널이 해독할 수 있는 방식으로 이미지 파일을 암호화하기만 하면 됩니다. OpenSSL을 사용해 보았지만 올바른 알고리즘을 찾을 수 없거나 뭔가 빠졌을 수 있습니다. 이 작업을 수행하는 방법을 아는 사람이 있나요? 기본적으로 아래 스크립트와 같은 것을 원합니다.
tar -cf archive.tar some files
virt-make-fs archive.tar image.ext2
# the below command need to be fixed/replaced
openssl enc -aes192 -in image.ext2 -out image.ext2.aes
대상 시스템에서 다음 명령이나 적어도 유사한 명령을 사용할 수 있기를 바랍니다.
# The next command should be done on the target
mount -t ext2 -o loop,encryption=aes image.ext2.aes /mnt/upgrade
# work with files in /mnt/upgrade
따라서 명확히 하자면, 루트가 되지 않고 암호화된 설치 가능 이미지 파일을 어떻게 생성합니까?
제가 새로운 방법을 시도하고 있거나 이 문제에 대한 입증된 다른 해결책이 있다면 언제든지 의견을 남겨주세요. 더 나은 솔루션이 있지만 암호화 문제를 해결하는 명령에는 여전히 관심이 있습니다.
편집: 지적했듯이 cryptoloop는 안전하지 않습니다.http://lwn.net/Articles/67216/. 그래서 다른 해결책을 찾을 수도 있습니다. util을 찾았 aespipe
는데 사용할 수 있을지도 모르겠네요.
편집 2: Linux 커널의 AES 모듈에 있는 소스 코드를 조사한 결과 아마도 문제를 일으키는 것은 비밀번호의 해싱일 것이라는 결론에 도달했습니다. AES 모듈은 모두 aespipe
AES-256-CBC 암호화를 사용합니다. 내가 아는 한, Linux 커널은 주어진 비밀번호를 키로 사용하고 aespipe
들어오는 비밀번호를 해시합니다. "루트 없음" 부분이 나에게 매우 중요하기 때문에 다른 솔루션을 찾기 시작했으며 현재 계획은 내 개발 컴퓨터에서 다음과 같은 솔루션을 사용하는 것입니다.
tar -cf - file0 file1 ... | gzip -c | aespipe -e aes256 > arhive_file
그런 다음 대상 시스템에서 실행
rm -rf /tmp/update ; mkdir -p /tmp/update
aespipe -d -e aes256 < archive.mbl | gzip -cd | tar -C /tmp/update -xf -
답변1
cryptloop의 보안은 취약하지만,이것.
사용자 모드 FS 생성자를 사용할 수 있습니다(예: buildroot geneext2fs.sh 또는 android make_ext4fs). aespipe 도구와 함께 사용하면 루트/수퍼유저 권한 없이 호스트에 암호화된 이미지를 생성할 수 있습니다.
하지만 Lostup을 패치해야 합니다(적어도 설치해야 합니다).루프 aes그리고 대상의 Linux 커널이 이러한 암호화 이미지를 직접 마운트할 수 있도록 cryptoloop를 모듈 또는 내장으로 활성화하십시오.
다음은 암호화된 ext4 파일 시스템 이미지의 경우 이 작업을 수행하는 방법을 보여줍니다(ext2 FS의 경우 처음 2개의 명령을 buildroot genext2fs.sh[3]으로 바꾸면 됩니다).
HOST $ make_ext4fs -s -l 512M -a data yourimage.simg folder/
HOST $ simg2img yourimage.simg yourimage.img
HOST $ cat yourimage.img | aespipe -e aes256 > yourimage.crypt
TARGET # modprobe cryptoloop #in case of cryptoloop as module.
TARGET # losetup.patched -e aes-256 /dev/loop0 yourimage.crypt
TARGET # mount -t ext4 /dev/loop0 /mnt/uncrypt
답변2
Linux의 사실상 표준 디스크 암호화 하위 시스템인 dmcrypt를 사용하십시오.
개발자 컴퓨터에서 설치크립트 설치그리고구성하다루트가 아닌 사용자로 설치할 수 있습니다. 에 들어가야 하기 때문에 번거롭습니다 /etc/cryptmount/cmtab
.
upgrade {
keyformat=luks
dev=/home/bob/upgrade/image.enc
dir=/mnt/upgrade
}
설치 및 제거:
cryptmount -m upgrade
cryptmount -u upgrade
또는 개발자가 cryptsetup
비밀번호 없이 실행할 수 있도록 sudo 규칙을 설정하세요.losetup
Cmnd_Alias CryptLoop = cryptsetup luksOpen * *, cryptsetup remove *, losetup * *
bob ALL=(ALL) NOPASSWD: CryptLoop
답변3
내가 정확하게 기억한다면 보안 문제로 인해 dmcrypt를 선호하여 암호화 지원이 mount
제거 되었습니다. 그래서 암호화 없이 사용하고 그 위에 DM 암호화 장치를 올려야 한다고 losetup
가정하겠습니다 .losetup
losetup /dev/loop0 /image/clearfile.img
losetup /dev/loop1 /image/cryptfile.img
cryptsetup create cr_loop /dev/loop1
dd if=/dev/loop0 of=/dev/mapper/cr_loop bs=100M
그리고 cryptfile.img
암호화가 있습니다. (복호화된 장치를 설치한 후)를 반복하여 배포하고 사용 가능하게 만들 수 있습니다 losetup
.cryptsetup
cryptsetup
기본값을 변경할 때 문제가 발생하지 않도록 통화 등에 사용할 비밀번호를 추가할 수 있습니다 . 아니면 대신 LUKS를 사용하세요. 그러나 이 경우 암호화된 파일은 일반 텍스트 이미지보다 약간 커야 합니다(5MiB이면 충분함). 파일 시스템은 장치보다 약간 작을 수 있지만 이는 중요하지 않습니다.