Alpine Linux เป็นอิมเมจที่เล็กที่สุดที่เรามี บนเซิร์ฟเวอร์ของเรา Alpine 3.21 ที่เพิ่งติดตั้งใช้ RAM 55 MB และดิสก์ 153 MB ตอนว่าง เทียบกับ 313 MB และ 2.7 GB ของ Ubuntu 24.04 แลกกับการทิ้งเครื่องมือที่คุ้นเคย Alpine ใช้ apk แทน apt ใช้ doas แทน sudo ใช้ OpenRC แทน systemd และใช้ musl แทน glibc
ขั้นตอนด้านล่างคือสิบนาทีแรกแบบเดียวกับบน Debian หรือ Ubuntu แต่ปรับเป็นแบบ Alpine ก่อนเผยแพร่ เรารันทุกคำสั่งบนอิมเมจ Alpine 3.21 ของเรา และมีสองคำสั่งที่ทำให้เราสะดุดในครั้งแรก ล็อกอินเป็น root ด้วยรหัสผ่านจากแดชบอร์ด
1. อัปเดต แล้วรีบูตหนึ่งครั้ง
apk update && apk upgrade
uname -r
ls /lib/modules
เซิร์ฟเวอร์ติดตั้งอัปเดตที่มีอยู่ไปแล้วตั้งแต่บูตครั้งแรก apk upgrade จึงมักไม่ค่อยเหลืองานให้ทำ ให้ดูสองบรรทัดสุดท้ายแทน ถ้าการอัปเดตครั้งแรกนั้นนำเคอร์เนลใหม่มา เคอร์เนลที่กำลังทำงาน (uname -r) จะไม่มีโมดูลอยู่บนดิสก์อีกแล้ว อะไรก็ตามที่โหลดโมดูลจะล้มเหลวจนกว่าจะรีบูต บนเซิร์ฟเวอร์ทดสอบของเรา การติดตั้งไฟร์วอลล์แสดง ERROR: Couldn't determine iptables version ถ้าสองเวอร์ชันไม่ตรงกัน ให้รีบูตตอนนี้:
reboot
เซิร์ฟเวอร์ทดสอบของเรากลับมาภายในไม่ถึงหนึ่งนาที
2. สร้างผู้ใช้ที่ล็อกอินได้
adduser -D deploy
passwd deploy
adduser deploy wheel
อย่าข้าม passwd เพราะ adduser -D สร้างบัญชีโดยไม่มีรหัสผ่าน Alpine จะถือว่าบัญชีถูกล็อก และ sshd ปฏิเสธบัญชีที่ถูกล็อก แม้จะใช้คีย์ที่ถูกต้อง ในการทดสอบของเรา เบาะแสเดียวคือบรรทัดนี้ใน /var/log/messages:
User deploy not allowed because account is locked
รหัสผ่านยังสำคัญในภายหลังด้วย เพราะ doas จะถามรหัสนี้
ถ้าคุณใส่คีย์ SSH ตอนสั่งเซิร์ฟเวอร์ คีย์นั้นอยู่ใน authorized_keys ของ root คัดลอกให้ผู้ใช้ใหม่:
install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
install -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys
ยังไม่มีคีย์? สร้างบนคอมพิวเตอร์ของคุณ แล้ววางส่วนสาธารณะลงใน /home/deploy/.ssh/authorized_keys
3. ให้ doas ถามรหัสผ่าน
Alpine ใช้ doas แทน sudo และอิมเมจของเราอนุญาตให้กลุ่ม wheel ใช้อยู่แล้ว กฎใน /etc/doas.d/wheel.conf คือ permit nopass :wheel หมายความว่าสมาชิก wheel คนไหนก็เป็น root ได้โดยไม่ต้องพิมพ์อะไร เปลี่ยนให้ถามรหัสผ่าน แล้วจำไว้สักสองสามนาที:
echo 'permit persist :wheel' > /etc/doas.d/wheel.conf
จากนี้ไป doas apk add nano ใช้งานได้เหมือน sudo apt install nano บน Ubuntu
4. SSH: ใช้คีย์เท่านั้น ไม่ให้ root
sshd อ่านไฟล์ใน /etc/ssh/sshd_config.d/ ตามลำดับชื่อ และเก็บค่าแรกที่พบสำหรับแต่ละการตั้งค่า ในอิมเมจของเรา ไฟล์แรกคือ 00-eqvps.conf ซึ่งอนุญาตให้ root และรหัสผ่านล็อกอินได้ เพื่อให้คุณเข้าได้ในวันแรก แทนที่เนื้อหาของไฟล์:
cat > /etc/ssh/sshd_config.d/00-eqvps.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
EOF
sshd -t && rc-service sshd restart
sshd -T | grep -E '^(permitrootlogin|passwordauthentication|kbdinteractiveauthentication) '
บรรทัดที่สามสำคัญบน Alpine อิมเมจใช้ OpenSSH รุ่นที่มี PAM และถ้ามีแค่สองบรรทัดแรก เซิร์ฟเวอร์ทดสอบของเรายังเสนอการล็อกอินแบบ keyboard-interactive อยู่ เมื่อมีครบสามบรรทัด การพยายามล็อกอินโดยไม่มีคีย์จะได้:
Permission denied (publickey).
เปิดเซสชัน root ค้างไว้ ในเทอร์มินัลที่สอง ตรวจว่า ssh deploy@YOUR.SERVER.IP ใช้ได้ (ในแพ็กเกจ NAT ให้เพิ่ม -p และพอร์ตส่วนตัวจากแดชบอร์ด) และ doas id รับรหัสผ่าน
5. ไฟร์วอลล์: ufw
ufw อยู่ในคลัง community ซึ่งเปิดไว้แล้วในอิมเมจของเรา:
apk add ufw
ufw limit 22/tcp
ufw --force enable
rc-update add ufw default
ufw status
limit ยอมให้ SSH ผ่าน แต่จะชะลอคนที่เปิดการเชื่อมต่อจำนวนมากติดกัน rc-update สำคัญตรงนี้ เพราะ OpenRC จะไม่เริ่มไฟร์วอลล์หลังรีบูตถ้าคุณไม่เพิ่มเข้า runlevel หลังรีบูต เซิร์ฟเวอร์ของเรากลับมาพร้อม Status: active ในแพ็กเกจ NAT ให้ SSH อยู่ที่พอร์ต 22 ต่อไป เพราะพอร์ตภายนอกส่วนตัวของคุณถูกส่งต่อไปยังพอร์ต 22 ในเซิร์ฟเวอร์ ในแพ็กเกจที่มี IPv4 ของตัวเอง ให้เปิดพอร์ตเว็บเมื่อจำเป็น (ufw allow 80/tcp, ufw allow 443/tcp) ส่วนที่เหลืออยู่ในคู่มือ ufw
6. เปิด cron และการอัปเดตรายวัน
เซิร์ฟเวอร์ Alpine ที่เพิ่งติดตั้งไม่ได้รัน cron เลย เปิดใช้:
rc-update add crond default
rc-service crond start
crontab ของ root บน Alpine รันทุกอย่างใน /etc/periodic/daily ตอน 02:00 อยู่แล้ว วางสคริปต์อัปเดตไว้ที่นั่น:
cat > /etc/periodic/daily/apk-upgrade <<'EOF'
#!/bin/sh
apk upgrade --update-cache --no-progress >> /var/log/apk-auto.log 2>&1
EOF
chmod +x /etc/periodic/daily/apk-upgrade
run-parts --test /etc/periodic/daily
คำสั่งสุดท้ายแสดงรายการสคริปต์ที่ cron จะรัน และสคริปต์ของคุณควรอยู่ในรายการ วิธีนี้ทำให้คุณได้รับการแก้ไขของ 3.21 ส่วนการย้ายไปรุ่นถัดไปของ Alpine เป็นอีกขั้นตอนที่ต้องทำเอง การอัปเดตเคอร์เนลยังต้องรีบูต: ทำการตรวจ uname -r / ls /lib/modules จากขั้นตอนที่ 1 ซ้ำเป็นครั้งคราว
7. OpenRC ในตารางเดียว
ถ้าคุณรู้จัก systemd นี่คือสิ่งที่เปลี่ยนไปเกือบทั้งหมด:
| งาน | systemd | Alpine (OpenRC) |
|---|---|---|
| เริ่มบริการ | systemctl start nginx | rc-service nginx start |
| เริ่มตอนบูต | systemctl enable nginx | rc-update add nginx default |
| สถานะ | systemctl status nginx | rc-service nginx status |
| อะไรกำลังทำงาน | systemctl list-units | rc-status |
| ล็อกของระบบ | journalctl | /var/log/messages |
8. Docker และพอร์ตที่ ufw ไม่บล็อก
Alpine เป็นโฮสต์ Docker ที่ดี เพราะตัวระบบแทบไม่เกะกะ:
apk add docker docker-cli-compose
rc-update add docker default
rc-service docker start
docker run --rm hello-world
บนเซิร์ฟเวอร์ของเรา ใช้เวลา 12 วินาทีรวมการดาวน์โหลด เมื่อ Docker daemon ทำงาน หน่วยความจำที่ใช้เพิ่มจาก 57 MB เป็น 124 MB
กับดักที่ไม่ได้เกิดเฉพาะกับ Alpine: Docker เขียนกฎไฟร์วอลล์ของตัวเอง ขณะที่ ufw อนุญาตแค่ SSH เรารัน nginx ด้วย -p 8080:80 แล้วเข้าถึงได้จากนอกเซิร์ฟเวอร์ที่พอร์ต 8080 ufw ไม่ได้บล็อก ถ้าคอนเทนเนอร์ควรเข้าถึงได้ผ่าน reverse proxy บนเซิร์ฟเวอร์เดียวกันเท่านั้น ให้เผยแพร่บน localhost:
docker run -d -p 127.0.0.1:8080:80 nginx:alpine
เลือกแพ็กเกจไหน
Alpine เหลือ RAM เกือบทั้งหมดไว้ให้ซอฟต์แวร์ของคุณ แพ็กเกจ Nano (2 vCPU, 1 GB, 15 GB, $3/เดือน) พอสำหรับบริการเล็ก ๆ หรือคอนเทนเนอร์ไม่กี่ตัว เป็นแพ็กเกจ NAT จึงเข้า SSH ผ่านพอร์ตส่วนตัว ถ้าต้องเปิดพอร์ต 80 และ 443 สู่อินเทอร์เน็ต Nano-IP มี IPv4 ของตัวเองในราคา $8/เดือน สำหรับชุด Docker ที่หนักขึ้น Micro ให้ 2 GB ในราคา $5/เดือน
Alpine 3.21 อยู่ในหน้า Alpine VPS และเลือกได้ในทุกแพ็กเกจ Linux ที่ VPS ชำระเงินด้วย USDT, USDC หรือ ETH บนเครือข่าย Base, Ethereum หรือ Polygon โดยไม่ต้องใช้บัตรประชาชนหรือบัตรเครดิต
ความคิดเห็น
ยังไม่มีความคิดเห็น เป็นคนแรกสิ