การเข้ารหัสพื้นที่สวอปบนระบบ Debian 12 ที่มีอยู่แล้วนั้นคุ้มค่าเมื่อคุณต้องการป้องกันไม่ให้หน้าหน่วยความจำ รหัสผ่าน ส่วนของเอกสาร และข้อมูลชั่วคราวอื่นๆ ถูกเขียนลงดิสก์ในรูปแบบข้อความธรรมดา สำหรับเครื่องที่ไม่จำเป็น ต้องใช้โหมดไฮเบอร์เนต เอกสารของ Debian ได้แนะนำการออกแบบที่เรียบง่าย: ตั้งค่าพาร์ติชันสวอปไว้หลังการเข้ารหัส dm-crypt แบบธรรมดา และสร้างคีย์การเข้ารหัสแบบสุ่มใหม่ทุกครั้งที่บูตเครื่อง
คู่มือนี้ใช้การออกแบบดังกล่าว โดยสมมติว่าใช้ Debian 12 “bookworm” พาร์ติชั่น swap เฉพาะ และ systemd เป็นระบบ init คำสั่งต่างๆ ถูกออกแบบมาอย่างระมัดระวัง เพราะความผิดพลาดในเส้นทางของอุปกรณ์บล็อกอาจเขียนทับพาร์ติชั่นที่ไม่ถูกต้องได้ โปรดอ่านจุดตัดสินใจก่อน จากนั้นแทนที่ตัวระบุอุปกรณ์ของคุณเองแทนที่จะคัดลอกค่าตัวอย่างโดยไม่คิดไตร่ตรอง
เอกสาร cryptsetup ของ Debian อธิบายถึง swap ที่เข้ารหัสโดยเฉพาะ และแนะนำให้ปิดใช้งาน swap เพิ่มพาร์ติชัน/etc/crypttabด้วย/dev/urandomเปลี่ยน/etc/fstabไปใช้อุปกรณ์ที่แมปไว้ จากนั้นเปิดใช้งาน swap อีกครั้ง ดูREADME ของ cryptsetup ใน Debian คู่มือ crypttab(5) ของ Debian 12 ยังบันทึกฟิลด์ crypttab และตัวเลือก dm-crypt ทั่วไปอีกด้วย
คุณควรใช้การเข้ารหัสสวอปแบบคีย์สุ่มหรือไม่?
ใช้เมื่อคุณต้องการเข้ารหัสข้อมูลใน swap และไม่จำเป็นต้องใช้โหมดไฮเบอร์เนต คีย์จะถูกสร้างขึ้นใหม่ทุกครั้งที่บูตเครื่อง ดังนั้นข้อมูล swap เก่าจึงอ่านไม่ได้หลังจากปิดเครื่อง นี่คือคุณสมบัติด้านความปลอดภัยที่การติดตั้งบนเดสก์ท็อปและเซิร์ฟเวอร์ส่วนใหญ่ต้องการ
อย่าใช้การตั้งค่านี้หากคุณต้องพึ่งพาการจำศีล (hibernation), การระงับการทำงานลงดิสก์ (suspend-to-disk), การนอนหลับแบบไฮบริด (hybrid sleep) หรือการระงับการทำงานแล้วจำศีล (suspend-then-hibernate) การกลับมาทำงานต่อ (resume) จำเป็นต้องถอดรหัสภาพจำศีลเดิมในการบูตครั้งถัดไป ซึ่งการใช้คีย์สุ่มใหม่ทำให้เป็นไปไม่ได้ Debian ระบุไว้อย่างชัดเจนว่าการสลับคีย์สุ่มไม่สามารถใช้เป็นอุปกรณ์สำหรับการกลับมาทำงาน ต่อได้ เอกสารประกอบการใช้งาน systemd hibernate-resume ของ Debian 12 ก็แสดงให้เห็นเช่นกันว่าการกลับมาทำงานต่อขึ้นอยู่กับอุปกรณ์สำหรับการกลับมาทำงานต่อแบบถาวร
หากจำเป็นต้องใช้โหมดจำศีล ให้ใช้การออกแบบการเข้ารหัสแบบถาวร เช่น อุปกรณ์สลับข้อมูลที่ใช้ LUKS พร้อมการกำหนดค่าการปลดล็อกและการกลับมาทำงานที่เหมาะสมแทน ซึ่งเป็นการตั้งค่าที่แตกต่างออกไปและอยู่นอกเหนือคู่มือนี้โดยเจตนา
ไฟล์สวอปของคุณได้รับการปกป้องด้วยการเข้ารหัสดิสก์แล้วหรือยัง?
ตรวจสอบก่อนทำการเปลี่ยนแปลงใดๆ หากวอลุ่มลอจิกสวอปของคุณอยู่ภายในคอนเทนเนอร์ที่เข้ารหัสด้วย LUKS อยู่แล้ว การเพิ่มเลเยอร์ dm-crypt อีกชั้นอาจให้ประโยชน์ในทางปฏิบัติเพียงเล็กน้อย ในขณะเดียวกันก็เพิ่มความซับซ้อนขึ้น
swapon --show
lsblk -o NAME,PATH,TYPE,FSTYPE,SIZE,MOUNTPOINTS,PARTUUID
ดูอุปกรณ์ที่แสดงโดยswapon --showและติดตามหาอุปกรณ์แม่ของมันในlsblk. รูปแบบที่ไม่เข้ารหัสทั่วไปอาจแสดง/dev/sda3โดยตรงเป็นประเภทswap. การติดตั้ง LVM ที่เข้ารหัสอาจแสดง swap อยู่ใต้crypto_LUKSparent แทน
ก่อนทำการเปลี่ยนแปลงใดๆ โปรดระบุพาร์ติชันสวอปที่ใช้งานอยู่และตัวระบุพาร์ติชันเสถียร ชื่ออุปกรณ์และตัวระบุที่แสดงในที่นี้เป็นเพียงตัวอย่างเท่านั้น
ความแตกต่างนี้มีความสำคัญ เนื่องจากบทความนี้เกี่ยวกับการแปลงพาร์ติชันสวอปเฉพาะที่ไม่ได้เข้ารหัส หากswapon --showรายงานว่าเป็นไฟล์สวอป ให้ใช้วิธีการเฉพาะสำหรับไฟล์สวอป หากสวอปอยู่ภายในพื้นที่จัดเก็บข้อมูลที่เข้ารหัสอยู่แล้ว ให้พิจารณาก่อนว่าจำเป็นต้องมีเลเยอร์ที่สองหรือไม่
คุณควรบันทึกอะไรบ้างก่อนที่จะปิดฟังก์ชันสลับใช้งาน?
บันทึกเส้นทางพาร์ติชันที่แน่นอน ขนาด และPARTUUID ของพาร์ติชันนั้น PARTUUID เป็นตัวระบุรายการในตารางพาร์ติชัน และยังคงมีประโยชน์แม้ว่าลายเซ็นการสลับข้อมูลภายในพาร์ติชันจะถูกแทนที่ด้วยข้อมูลที่เข้ารหัสแล้วก็ตาม
ตัวอย่างเช่น:
sudo blkid /dev/sda3
ls -l /dev/disk/by-partuuid/
คุณอาจเห็นผลลัพธ์ที่มีค่าเช่น:
PARTUUID="11111111-2222-3333-4444-555555555555"
ในตัวอย่างด้านล่าง เส้นทางเสถียรที่สอดคล้องกันคือ:
/dev/disk/by-partuuid/11111111-2222-3333-4444-555555555555
หลีกเลี่ยงการพึ่งพาว่า/dev/sda3การระบุดิสก์จะเปลี่ยนแปลงได้หรือไม่ นอกจากนี้ ควรหลีกเลี่ยงการใช้ UUID ของระบบไฟล์สวอปแบบเก่าเป็นตัวระบุแหล่งที่มาในระยะยาว เนื่องจากการตั้งค่าสวอปที่เข้ารหัสจะสร้างลายเซ็นสวอปขึ้นใหม่บนอุปกรณ์ที่เข้ารหัสที่แมปไว้ ดังนั้น UUID ของสวอปแบบดิบแบบเก่าจึงไม่ใช่ตัวระบุถาวรที่ถูกต้องสำหรับพาร์ติชันพื้นฐาน
1. คุณจะเตรียมระบบให้ปลอดภัยได้อย่างไร?
ติดตั้ง cryptsetup หากยังไม่ได้ติดตั้ง จากนั้นสำรองข้อมูลไฟล์การกำหนดค่าทั้งสองไฟล์ที่คุณจะแก้ไข
sudo apt update
sudo apt install cryptsetup
sudo cp -a /etc/crypttab /etc/crypttab.before-encrypted-swap 2>/dev/null || true
sudo cp -a /etc/fstab /etc/fstab.before-encrypted-swap
หาก/etc/crypttabยังไม่มีอยู่ ก็ไม่ใช่ปัญหา คุณสามารถสร้างมันขึ้นมาได้เมื่อแก้ไขการตั้งค่า
ถัดไป ตรวจสอบให้แน่ใจว่าระบบมีหน่วยความจำว่างเพียงพอสำหรับช่วงเวลาสั้นๆ ขณะที่ปิดใช้งานสวอป จากนั้นให้ปิดเฉพาะพาร์ติชันสวอปที่คุณกำลังแปลง การใช้พาร์ติชั่นเดียวที่แน่นอนนั้นปลอดภัยกว่าswapoff -aการใช้เครื่องที่มีพื้นที่สวอปหลายแห่ง:
sudo swapoff /dev/sda3
swapon --show
ปิดใช้งานอุปกรณ์สวอปเป้าหมายก่อนที่จะทำการเข้ารหัส ในระบบที่มีอุปกรณ์สวอปหลายตัว ให้ดำเนินการกับอุปกรณ์ที่ต้องการใช้งานแทนที่จะปิดใช้งานทุกอย่างโดยไม่จำเป็น
mkswapหลังจากนี้ห้ามรัน บนพาร์ติชั่นดิบอีก ต่อไป ควรสร้างลายเซ็นสวอปบนอุปกรณ์แมปเปอร์ที่เข้ารหัส ไม่ใช่บนพาร์ติชั่นสำรองที่ไม่ได้เข้ารหัส
2. ไฟล์ใดบ้างที่ควรอยู่ใน /etc/crypttab?
สร้างหรือแก้ไข/etc/crypttabและเพิ่มรายการหนึ่งรายการสำหรับการแมปสวอปที่เข้ารหัส โดยทำตามขั้นตอนต่อไปนี้ตามเอกสาร cryptsetup ของ Debian:
cswap /dev/disk/by-partuuid/11111111-2222-3333-4444-555555555555 /dev/urandom plain,cipher=aes-xts-plain64,size=256,swap
แทนที่ PARTUUID ตัวอย่างด้วยค่า PARTUUID จากระบบของคุณ
ช่องเหล่านี้หมายถึง:
cswapคือชื่อตัวสร้างแผนที่/dev/mapper/cswap.
ช่องที่สองคือพาร์ติชันสวอปที่แท้จริงซึ่งอยู่เบื้องหลัง
/dev/urandomระบบจะสร้างคีย์สุ่มใหม่ทุกครั้งที่มีการสร้างการแมป
plainเลือกใช้ dm-crypt แบบธรรมดาแทนที่จะใช้ส่วนหัว LUKS แบบถาวร
cipher=aes-xts-plain64,size=256ทำให้พารามิเตอร์ plain-dm-crypt ระบุอย่างชัดเจน แทนที่จะพึ่งพาค่าเริ่มต้นที่อาจเปลี่ยนแปลงได้
swapแจ้งให้ระบบการรวม cryptsetup ทราบว่าอุปกรณ์ที่แมปนี้คือ swap และควรได้รับการเริ่มต้นอย่างเหมาะสม
รายการในไฟล์ crypttab จะสร้างการแมปที่เข้ารหัสชั่วคราวชื่อ cswap โดยใช้คีย์ใหม่จาก /dev/urandom ทุกครั้งที่มีการเปิดใช้งาน
คู่มือการใช้งาน crypttab ของ Debian เตือนว่า dm-crypt แบบธรรมดาไม่ได้จัดเก็บข้อมูลเมตาของรหัสเข้ารหัส แฮช หรือขนาดคีย์ไว้ในส่วนหัว ซึ่งแตกต่างจาก LUKS นั่นเป็นเหตุผลว่าทำไมการบันทึกรหัสเข้ารหัสและขนาดคีย์อย่างชัดเจนจึงมีประโยชน์ คู่มือยังกล่าวถึงdiscardแต่ไม่ได้ระบุถึงผลกระทบด้านความปลอดภัย อย่าเพิ่มข้อมูลนี้เพียงเพราะอุปกรณ์จัดเก็บข้อมูลเป็น SSD เว้นแต่คุณได้ประเมินข้อดีข้อเสียนั้นแล้ว
3. มีการเปลี่ยนแปลงอะไรบ้างในไฟล์ /etc/fstab?
ค้นหาบรรทัด swap เก่าที่ไม่ได้เข้ารหัสในไฟล์/etc/fstab.com/file.js อาจใช้ UUID, เส้นทางอุปกรณ์ หรือตัวระบุถาวรอื่นๆ ตัวอย่างเช่น:
UUID=OLD-SWAP-UUID none swap sw 0 0
แทนที่ด้วยอุปกรณ์เข้ารหัสที่แมปไว้:
/dev/mapper/cswap none swap sw 0 0
อย่าเปิดใช้งานทั้งสองรายการพร้อมกัน หากทั้งพาร์ติชั่นดิบและ/dev/mapper/cswapพาร์ติชั่นสลับถูกเปิดใช้งาน จะทำให้การเข้ารหัสพาร์ติชั่นนั้นไร้ประโยชน์ และอาจทำให้เกิดความสับสนในการเปิดใช้งานขณะบูตเครื่องได้
ไฟล์ fstab ควรชี้ไปยังอุปกรณ์ mapper ที่เข้ารหัส ไม่ใช่ไปยังพาร์ติชัน swap ดั้งเดิม
คู่มือ fstab(5) ของ Debian กำหนดรูปแบบรายการ swap ในขณะที่swapon(8) อธิบายวิธีการเปิดใช้งานรายการที่ทำเครื่องหมายเป็น swap
4. คุณจะเปิดใช้งานและตรวจสอบความถูกต้องก่อนรีบูตเครื่องอย่างไร?
หลังจากบันทึกไฟล์ทั้งสองแล้ว ให้เริ่มการแมปที่เข้ารหัส จากนั้นเปิดใช้งานรายการสวอป เอกสาร cryptsetup ของ Debian ใช้ดังนี้:
sudo cryptdisks_start cswap
sudo swapon -a
ตอนนี้ตรวจสอบทั้งสามชั้น:
swapon --show
sudo cryptsetup status cswap
lsblk -o NAME,TYPE,FSTYPE,SIZE,MOUNTPOINTS
ผลลัพธ์ที่ดีควรแสดงว่ามีการสลับข้อมูลเกิดขึ้น/dev/mapper/cswapไม่ใช่สลับไปยังพาร์ติชันเดิมโดยตรง และcryptsetup status cswapควรรายงานว่าการแมปนั้นใช้งานอยู่
หากcryptdisks_startไม่สามารถใช้งานได้ในการติดตั้งของคุณ อย่าใช้คำสั่งที่ก่อให้เกิดความเสียหายโดยพลการ ตรวจสอบอีกครั้งว่าcryptsetupได้ติดตั้งแพ็กเกจแล้วและไวยากรณ์ของ crypttab นั้นถูกต้อง คุณยังสามารถปล่อยให้กระบวนการบูตตามปกติของ Debian สร้างการแมปหลังจากเสร็จสิ้นการกำหนดค่าการทำงานต่อด้านล่าง Debian 12 ใช้ตัวสร้าง systemd เพื่อแปลงการกำหนดค่า crypttab และ fstab เป็นหน่วยการทำงานในระหว่างการบูต
5. คุณต้องการปิดใช้งานการกลับมาทำงานหลังจากจำศีลหรือไม่?
ใช่ ถ้าพาร์ติชั่นนี้ถูกกำหนดค่าให้เป็นอุปกรณ์กู้คืนระบบ คีย์แบบสุ่มไม่สามารถถอดรหัสอิมเมจไฮเบอร์เนชั่นที่เขียนด้วยคีย์ก่อนหน้าได้ คำแนะนำเกี่ยวกับการเข้ารหัสสวอปของ Debian ระบุอย่างชัดเจนให้ผู้ดูแลระบบปิดใช้งานการกู้คืนเมื่อแปลงพาร์ติชั่นสวอปกู้คืนแบบเก่าเป็นสวอปที่เข้ารหัสด้วยคีย์แบบสุ่ม
ตรวจสอบการตั้งค่าปัจจุบัน:
grep -R "^[[:space:]]*RESUME=" /etc/initramfs-tools/conf.d/ 2>/dev/null
หากหมายถึงพาร์ติชั่นสวอปที่คุณเพิ่งแปลง ให้ตั้งค่า resume เป็น none:
echo "RESUME=none" | sudo tee /etc/initramfs-tools/conf.d/resume
sudo update-initramfs -u
นี่คือจุดที่update-initramfs -uเกี่ยวข้อง คุณไม่จำเป็นต้องสร้าง initramfs ใหม่เพียงเพราะรายการ swap หลังบูตตามปกติมีการเปลี่ยนแปลง คุณจำเป็นต้องอัปเดต initramfs เมื่อลบเป้าหมายการกลับมาจากการจำศีลเก่าที่ initramfs อาจพยายามใช้ในกรณีอื่น
การทดสอบการรีบูต: อะไรคือสิ่งที่พิสูจน์ได้ว่าการตั้งค่าใช้งานได้?
รีบูตเครื่องหลังจากที่การเปิดใช้งานแบบเรียลไทม์สำเร็จและไฟล์การกำหนดค่าถูกต้องแล้วเท่านั้น:
sudo reboot
หลังจากระบบกลับมาทำงานแล้ว ให้รันคำสั่งต่อไปนี้:
swapon --show
sudo cryptsetup status cswap
lsblk -o NAME,TYPE,FSTYPE,SIZE,MOUNTPOINTS
cat /proc/swaps
เกณฑ์ความสำเร็จที่สำคัญนั้นตรงไปตรงมา:
/dev/mapper/cswapเปิดใช้งานเป็นสวอป
พาร์ติชั่นสำรองข้อมูลแบบดิบไม่ได้ถูกระบุโดยตรงว่าเป็นสวอปที่ใช้งานอยู่
cryptsetup status cswapรายงานการแมป dm-crypt แบบธรรมดาที่ใช้งานอยู่
เครื่องจะบูตโดยไม่ต้องขอรหัสผ่านสำหรับสลับไฟล์ เนื่องจากรหัสสุ่มจะถูกสร้างขึ้นโดยอัตโนมัติ
คุณสามารถรีบูตสองครั้งและเปรียบเทียบพฤติกรรมการแมปได้เช่นกัน จุดประสงค์ของการออกแบบนี้คือคีย์การเข้ารหัสเป็นคีย์ชั่วคราว เนื้อหาของหน่วยความจำสวอปจากการบูตครั้งก่อนจะไม่สามารถกู้คืนได้หลังจากสร้างการแมปใหม่แล้ว
ถ้าเครื่องเข้าสู่โหมดฉุกเฉินล่ะ?
สาเหตุที่พบบ่อยที่สุดคือ เส้นทางอุปกรณ์สำรองข้อมูลไม่ถูกต้อง การพิมพ์ผิด/etc/crypttabหรือ/etc/fstabบรรทัดที่ยังคงชี้ไปยังสวอปแบบดิบเก่า ให้บูตเข้าสู่โหมดกู้คืนหรือใช้สภาพแวดล้อมกู้คืน ติดตั้งระบบไฟล์รูทแบบอ่านเขียน และกู้คืนข้อมูลสำรองหากจำเป็น
การตรวจสอบที่เป็นประโยชน์ ได้แก่:
sudo cryptsetup status cswap
systemctl status systemd-cryptsetup@cswap.service
systemctl status dev-mapper-cswap.swap
journalctl -b -u systemd-cryptsetup@cswap.service
ชื่อหน่วยอาจมีการเข้ารหัสที่แตกต่างกันสำหรับชื่อตัวกำหนดแผนที่ที่ไม่คุ้นเคย ดังนั้นควรใช้systemctl list-units '*cryptsetup*'หากชื่อบริการที่แน่นอนไม่ชัดเจน
แล้วถ้าใช้ SSD แล้วทิ้งล่ะ?
อย่าเปิดใช้งานฟังก์ชัน "ทิ้งข้อมูล" (discard) เป็นค่าเริ่มต้นเพียงเพื่อหวังประสิทธิภาพ SSD ที่ดีขึ้นตามทฤษฎี เอกสาร crypttab ของ Debian ระบุว่า การส่งคำขอทิ้งข้อมูลผ่านอุปกรณ์ที่เข้ารหัสมีผลกระทบต่อความปลอดภัย คู่มือ swapon ของ Debian ก็ระบุเช่นกันว่า การทิ้งข้อมูลอาจช่วยเพิ่มประสิทธิภาพใน SSD บางรุ่น แต่ส่วนใหญ่แล้วมักไม่ได้ผล หากคุณต้องการใช้งานฟังก์ชันนี้ ให้ประเมินรูปแบบการจัดเก็บข้อมูลและรูปแบบภัยคุกคามก่อน จากนั้นจึงเพิ่มฟังก์ชันนี้อย่างรอบคอบ
หากระบบไฟล์รูทไม่ได้เข้ารหัส การเข้ารหัสสวอปยังคงมีประโยชน์อยู่หรือไม่?
ใช่ แต่ต้องเข้าใจขอบเขตด้วย การเข้ารหัสสวอปจะปกป้องหน้าหน่วยความจำที่เขียนไปยังพาร์ติชันสวอปเท่านั้น มันจะไม่เข้ารหัสไฟล์ที่บันทึกไว้ในระบบไฟล์รูทหรือโฮมที่ไม่ได้เข้ารหัส ประวัติการใช้งานเชลล์ แคชของแอปพลิเคชัน ไฟล์ดัมพ์การทำงานผิดพลาด ไฟล์ชั่วคราว หรือบันทึกต่างๆ หากเป้าหมายคือการป้องกันข้อมูลรั่วไหลจากดิสก์ที่ถูกขโมย การเข้ารหัสทั้งดิสก์หรือระบบไฟล์จะเป็นการควบคุมที่สมบูรณ์กว่า
รายการตรวจสอบขั้นสุดท้าย
ตรวจสอบให้แน่ใจว่าเป้าหมายเป็นพาร์ติชันสวอปเฉพาะที่ไม่ได้เข้ารหัส ไม่ใช่ไฟล์สวอป และไม่ได้ถูกป้องกันโดยอุปกรณ์หลักที่เข้ารหัสไว้แล้ว
บันทึกเส้นทางพาร์ติชันที่เสถียร เช่น/dev/disk/by-partuuid/....
ปิดใช้งาน raw swap ก่อนทำการกำหนดค่า dm-crypt
เพิ่มรายการเข้ารหัส DM แบบธรรมดาที่มีคีย์แบบสุ่มลงใน/etc/crypttab.
ชี้ ไปที่ . /etc/fstabเท่านั้น/dev/mapper/cswap
เปิดใช้งานการแมปและตรวจสอบก่อนรีบูตเครื่อง
หากอุปกรณ์สลับไฟล์เก่าเป็นอุปกรณ์ที่สามารถกลับมาทำงานได้ ให้ตั้งค่าRESUME=noneและเรียกใช้update-initramfs -uงาน
หลังจากรีบูตแล้ว ตรวจสอบให้แน่ใจว่ามีเพียงตัวแมปเปอร์ที่เข้ารหัสเท่านั้นที่ทำงานเป็นสวอป
สำหรับระบบ Debian 12 ที่ไม่ใช้โหมดไฮเบอร์เนต วิธีการนี้จะช่วยให้การตั้งค่ามีขนาดเล็กและหลีกเลี่ยงการจัดเก็บคีย์สวอปแบบถาวร ประเด็นสำคัญไม่ได้อยู่ที่ว่า “ฉันควรใช้คำสั่งเข้ารหัสแบบใด” แต่เป็นการพิจารณาว่าการใช้คีย์สวอปแบบสุ่มนั้นเหมาะสมกับข้อกำหนดด้านการจัดการพลังงานของคุณหรือไม่ เมื่อตัดสินใจได้แล้ว ส่วนที่เหลือก็คือการย้ายข้อมูลอย่างเป็นระบบจากพาร์ติชันสวอปแบบดิบไปยังการแมป dm-crypt ที่จะถูกสร้างขึ้นใหม่อย่างปลอดภัยทุกครั้งที่บูตเครื่อง