SSD Nodes Learn Hosting plans →
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-08-13

วิธีติดตั้งและตั้งค่าความปลอดภัย Webmin บน Ubuntu 24.04

คู่มือติดตั้ง Webmin บน Ubuntu 24.04 พร้อมวิธีตั้งค่าความปลอดภัยขั้นสูง ทั้งการจำกัด IP, การใช้ Let's Encrypt, 2FA และการป้องกันด้วย Fail2ban ที่พอร์ต 10000 เพื่อป้องกันการถูกโจมตี

สิ่งที่คุณกำลังสร้าง

Webmin คือแผงควบคุมบนเว็บที่ทำหน้าที่เป็นส่วนติดต่อผู้ใช้ผ่านเบราว์เซอร์สำหรับจัดการเซิร์ฟเวอร์ Linux ทั้งระบบ ไม่ว่าจะเป็นผู้ใช้, แพ็กเกจ, cron jobs, ไฟร์วอลล์, Apache, BIND, ดิสก์ และโมดูลอื่น ๆ อีกนับร้อยรายการ โดยสามารถเข้าถึงได้ผ่าน HTTPS ที่พอร์ต 10000 การติดตั้งใช้เพียงสามคำสั่งและใช้เวลาประมาณหนึ่งนาที เหตุผลที่คู่มือนี้ใช้เนื้อหาส่วนใหญ่ไปกับครึ่งหลังของบทความ เพราะ Webmin ล็อกอินด้วยสิทธิ์ root และสามารถทำทุกอย่างที่ root ทำได้ ดังนั้น Webmin ที่เปิดกว้างหรือไม่มีการยืนยันตัวตนจึงไม่ใช่แค่ "ความเสี่ยงที่ต้องจัดการ" แต่คือการเปิดช่องให้เซิร์ฟเวอร์ถูกยึดครองโดยสมบูรณ์ผ่านหน้าล็อกอิน ดังนั้นให้ติดตั้งให้เสร็จภายในสิบนาที แล้วใช้เวลาที่เหลือของชั่วโมงนั้นตรวจสอบให้แน่ใจว่ามีเพียงคุณเท่านั้นที่เข้าถึงได้

ข้อกำหนดเบื้องต้นและคำเตือนที่สำคัญ

ใช้ Ubuntu 24.04 KVM VPS ที่ติดตั้งใหม่ โดยเข้าถึงด้วยสิทธิ์ root หรือผู้ใช้ที่มีสิทธิ์ sudo ตัว Webmin พัฒนาด้วย Perl และมีน้ำหนักเบา โดยใช้ RAM เพียง 1 GB ก็เพียงพอแล้ว และเมื่อทำงานปกติจะใช้ RAM ไม่ถึง 0.25 GB Webmin จะรอรับการเชื่อมต่อผ่าน TCP พอร์ต 10000 โดยใช้เว็บเซิร์ฟเวอร์ที่มาพร้อมกับตัวโปรแกรมเอง (miniserv.pl) ไม่ใช่ Apache หรือ nginx ดังนั้นจึงไม่จำเป็นต้องติดตั้งซอฟต์แวร์อื่นเพิ่มเติมก่อน

มีสองสิ่งที่ต้องตัดสินใจก่อนเริ่มดำเนินการ ประการแรกคือบัญชีผู้ใช้ที่คุณจะใช้ล็อกอิน: Webmin ตรวจสอบสิทธิ์ผ่าน PAM โดยอ้างอิงจากบัญชีผู้ใช้ Unix ดังนั้นคุณต้องล็อกอินด้วยบัญชี root หรือผู้ใช้ที่อยู่ในกลุ่ม sudo โดยใช้ รหัสผ่าน Unix ของบัญชีนั้น โดยปกติแล้วอิมเมจบนคลาวด์จะอนุญาตให้เข้าถึงผ่าน SSH key เท่านั้นและไม่มีการตั้งรหัสผ่านไว้สำหรับผู้ใช้เริ่มต้น ซึ่ง Webmin ไม่สามารถล็อกอินด้วยบัญชีที่ไม่มีรหัสผ่านได้ คุณต้องตั้งรหัสผ่านด้วยคำสั่ง sudo passwd youruser ก่อน มิฉะนั้นการล็อกอินจะล้มเหลวไม่ว่าคุณจะพิมพ์รหัสผ่านใดก็ตาม

ประการที่สองคือคำเตือน: อย่าเปิดพอร์ต 10000 สู่สาธารณะโดยไม่มีมาตรการป้องกัน ให้ตัดสินใจตั้งแต่ตอนนี้ว่าคุณจะเข้าถึง Webmin ผ่าน SSH tunnel (ซึ่งแนะนำวิธีนี้เพราะไม่มีพอร์ตเปิดเผยสู่ภายนอก) หรือจะจำกัดการเข้าถึงเฉพาะ IP ของคุณเท่านั้น การตัดสินใจนี้จะส่งผลต่อทุกขั้นตอนหลังจากนี้ ดังนั้นโปรดอ่านทั้งสองทางเลือกให้เข้าใจก่อนเริ่มตั้งค่าไฟร์วอลล์

การติดตั้ง Webmin จาก repository อย่างเป็นทางการ

Webmin เผยแพร่ apt repository ที่มีการลงลายเซ็นดิจิทัล สคริปต์ตั้งค่าจะเพิ่ม repository และ GPG signing key เข้าไป เพื่อให้การรัน apt upgrade ในอนาคตสามารถดึง Webmin มาติดตั้งได้เหมือนแพ็กเกจอื่น ๆ และคุณจะได้รับอัปเดตที่ผ่านการตรวจสอบความถูกต้อง แทนการดาวน์โหลด .deb มาติดตั้งเองซึ่งจะไม่สามารถอัปเดตตัวเองได้

curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.sh

สคริปต์จะแสดงรายการสิ่งที่กำลังจะดำเนินการและสอบถาม Setup repository? (y/N) ให้ตอบ y เมื่อเสร็จสิ้น ให้ติดตั้งแพ็กเกจ โดยใช้แฟล็ก --install-recommends เพื่อดึง dependency ของ Perl และ SSL ทั่วไปมาด้วย เพื่อป้องกันไม่ให้โมดูลแต่ละตัวทำงานล้มเหลวในภายหลังเนื่องจากขาดไลบรารี

sudo apt-get install --install-recommends webmin

Webmin เคยเปลี่ยนชื่อสคริปต์นี้มาก่อน คู่มือเก่าอาจอ้างอิงถึง setup-repos.sh ดังนั้นหาก URL ดิบส่งค่า 404 กลับมา ให้คัดลอกคำสั่ง one-liner ล่าสุดโดยตรงจาก webmin.com/download แทนการยึดติดกับชื่อไฟล์ การติดตั้งที่ถูกต้องจะจบลงด้วยบรรทัดที่คล้ายกับ Webmin install complete. You can now login to https://your-host:10000/ as root บริการจะถูกเปิดใช้งานและทำงานอยู่ ไฟล์คอนฟิกอยู่ที่ /etc/webmin ส่วน request จะถูกบันทึกไว้ที่ /var/webmin/miniserv.log และการล็อกอินที่ล้มเหลวจะถูกส่งไปยัง syslog ซึ่งบน Ubuntu 24.04 จะหมายถึง systemd journal

ตรวจสอบให้แน่ใจว่าบริการทำงานและกำลังรอรับการเชื่อมต่อก่อนเปิดเบราว์เซอร์:

sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000

คุณควรเห็นสถานะเป็น active (running) และบรรทัดที่แสดง miniserv.pl ซึ่งผูกอยู่กับ 0.0.0.0:10000 โดยที่อยู่ดังกล่าวจะเปลี่ยนเป็น 127.0.0.1:10000 เมื่อคุณใช้เส้นทางผ่าน tunnel ตามที่ระบุไว้ด้านล่าง หาก ss ไม่แสดงผลใด ๆ บนพอร์ต 10000 แสดงว่า Webmin ไม่ได้เริ่มทำงาน ให้ตรวจสอบ journalctl -u webmin -n 50 ก่อนดำเนินการต่อ

การเข้าสู่ระบบครั้งแรกและคำเตือนเรื่องใบรับรอง

ให้ชี้เบราว์เซอร์ของคุณไปที่ https://YOUR_SERVER_IP:10000 จะมีสองสิ่งที่เกิดขึ้นบนเซิร์ฟเวอร์ที่เพิ่งติดตั้งใหม่

หาก ufw ทำงานอยู่ (โดยปกติอิมเมจเซิร์ฟเวอร์ของ Ubuntu จะปิดไว้ แต่ผู้ให้บริการหลายรายเปิดใช้งานไว้ล่วงหน้า) หน้าเว็บจะไม่โหลดเลย ซึ่งจะกล่าวถึงในหัวข้อโหมดความล้มเหลวด้านล่าง หากพอร์ตเปิดอยู่ เบราว์เซอร์ของคุณจะแสดงหน้าบล็อกเต็มหน้าจอว่า "Your connection is not private" พร้อมรหัส NET::ERR_CERT_AUTHORITY_INVALID ใน Chrome หรือ SEC_ERROR_UNKNOWN_ISSUER / "Warning: Potential Security Risk Ahead" ใน Firefox นี่เป็นสิ่งที่คาดการณ์ได้และไม่ใช่การบุกรุก Webmin ได้สร้างใบรับรองแบบ self-signed ขึ้นมาในขณะติดตั้ง (/etc/webmin/miniserv.pem) และเนื่องจากไม่มีหน่วยงานออกใบรับรอง (Certificate Authority) ใดรับรองความถูกต้อง เบราว์เซอร์จึงปฏิเสธที่จะเชื่อถือโดยอัตโนมัติ การเชื่อมต่อยังคงถูกเข้ารหัสอยู่ เพียงแต่ไม่มีการรับรองความถูกต้องเท่านั้น ให้คลิกผ่านไปก่อน (เลือก Advanced แล้วเลือก Proceed) เราจะเปลี่ยนใบรับรองนี้ให้ถูกต้องในขั้นตอนถัดไป

เข้าสู่ระบบด้วย root หรือผู้ใช้ sudo ของคุณพร้อมรหัสผ่าน Unix แล้วคุณจะเข้าสู่แดชบอร์ด System Information ข้อผิดพลาดที่พบบ่อยคือการพิมพ์ http:// แทนที่จะเป็น https:// ซึ่ง miniserv จะตอบกลับด้วย HTTP ปกติบนพอร์ตนั้นพร้อมข้อความว่า "This web server is running in SSL mode. Try the URL https://..." วิธีแก้ไขคือให้เปลี่ยน http เป็น https ในแถบที่อยู่ของเบราว์เซอร์โดยตรง

การตัดสินใจด้านความปลอดภัย: คุณจะเข้าถึง Webmin ได้อย่างไร

นี่คือส่วนที่สำคัญที่สุด แผงควบคุมที่มีสิทธิ์เทียบเท่า root ไม่ควรเปิดรับการพยายามล็อกอินจากสแกนเนอร์ทั่วโลกบนอินเทอร์เน็ตสาธารณะ คุณมีทางเลือกที่ปลอดภัยสองทางโดยเรียงตามลำดับความสำคัญ พื้นที่การจัดการของบริการที่โฮสต์เองทุกแห่งล้วนเผชิญกับคำถามนี้ ซึ่งเป็นเหตุผลว่าทำไม ความปลอดภัยของ Vaultwarden จึงขึ้นอยู่กับ endpoint ของผู้ดูแลระบบและไฟล์สำรองข้อมูล มากกว่าตัวการเข้ารหัสเอง

การทำ SSH tunnel ในทางเลือก B เป็นวิธีที่ดีกว่าเนื่องจากไม่มีการเปิดเผยพอร์ตใดๆ ออกสู่ภายนอก การใช้ IP allowlist ในทางเลือก A เป็นวิธีที่ยอมรับได้หากคุณมี IP address แบบคงที่ การไม่ทำทั้งสองวิธีคือข้อผิดพลาดที่คู่มือฉบับนี้ต้องการป้องกัน หากคุณต้องการเข้าถึง Webmin ผ่านเครือข่ายส่วนตัวมากกว่าวิธีอื่น ให้วางเซิร์ฟเวอร์ไว้หลัง WireGuard VPN ที่โฮสต์เอง และผูก Webmin ไว้กับ tunnel address แทนที่จะเป็น IP สาธารณะ

ทางเลือก A: จำกัดการเข้าถึง Webmin เฉพาะ IP ของคุณ

ในแผงควบคุม ให้เปิด Webmin จากนั้นไปที่ Webmin Configuration แล้วเลือก IP Access Control เลือก "Only allow from listed addresses" และระบุ IP สาธารณะของคุณ ซึ่งคุณสามารถตรวจสอบได้โดยรันคำสั่ง curl ifconfig.me บนแล็ปท็อปของคุณ จากนั้นกดบันทึก Webmin จะเขียนค่านี้ลงในบรรทัด allow= ในไฟล์ /etc/webmin/miniserv.conf และทำการรีสตาร์ทตัวเอง

ข้อควรระวัง: หาก IP ที่บ้านของคุณเป็นแบบไดนามิกและมีการเปลี่ยนแปลง หรือคุณพิมพ์ที่อยู่ผิดพลาด คุณจะถูกล็อกไม่ให้เข้าใช้งาน เบราว์เซอร์จะแสดงข้อความ "Access denied for <your IP>" และไม่มีหน้าล็อกอินปรากฏขึ้น ทำให้ไม่สามารถเข้าถึงผ่านหน้าเว็บได้อีก คุณสามารถแก้ไขปัญหานี้ได้จากคอนโซลของเซิร์ฟเวอร์ผ่าน SSH หรือผ่าน VNC ของผู้ให้บริการของคุณ:

sudo nano /etc/webmin/miniserv.conf
# find the line that begins  allow=
# correct your IP, or delete the whole line to allow all again
sudo systemctl restart webmin

การลบบรรทัด allow= จะเป็นการคืนค่าให้เข้าถึงได้โดยทั่วไป ดังนั้นให้ทำวิธีนี้เพื่อกู้คืนระบบเท่านั้น และหลังจากนั้นให้รีบกำหนดค่าที่ถูกต้องทันที

ทางเลือก B: ผูกกับ localhost และทำ tunnel ผ่าน SSH (แนะนำ)

วิธีที่ดีกว่าการใช้ allowlist คือการไม่เปิดรับการเชื่อมต่อบน public interface เลย ให้กำหนดค่า miniserv ให้ผูกกับ loopback เท่านั้น จากนั้นเข้าถึงผ่าน SSH tunnel ที่เข้ารหัสซึ่งคุณเชื่อถืออยู่แล้ว

แก้ไขไฟล์ /etc/webmin/miniserv.conf และเพิ่มหรือแก้ไขบรรทัดต่อไปนี้:

bind=127.0.0.1

รีสตาร์ทด้วยคำสั่ง sudo systemctl restart webmin ขณะนี้ Webmin จะไม่สามารถเข้าถึงได้จากอินเทอร์เน็ต การสแกนพอร์ต 10000 จะไม่พบสิ่งใด และการตรวจสอบด้วย ss จากก่อนหน้านี้จะแสดงว่ามันผูกอยู่กับ 127.0.0.1:10000 เท่านั้น จากแล็ปท็อปของคุณ ให้เปิด tunnel ดังนี้:

ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IP

ปล่อยให้ session นั้นเปิดไว้แล้วเข้าใช้งานผ่าน https://localhost:10000 ทราฟฟิกจะถูกส่งผ่าน SSH ซึ่งมีการยืนยันตัวตนด้วยคีย์ของคุณและเข้ารหัสไว้แล้ว ดังนั้นคุณสามารถยอมรับ self-signed certificate ได้อย่างปลอดภัย เพราะชั้นของ SSH ทำหน้าที่ป้องกันจริงอยู่แล้ว หากปิด session SSH ไป Webmin ก็จะหายไปทันที ไม่ต้องตั้งค่า allowlist ไม่มีการเปิดเผยบริการ และไม่ต้องเพิ่มความปลอดภัยให้กับบริการอื่นเพิ่มเติม

หากคุณตั้งค่า bind=127.0.0.1 แล้วลืมเปิด tunnel การเข้าถึงจากระยะไกลจะหยุดลงทันที ซึ่งนั่นคือการทำงานตามปกติของฟีเจอร์ ไม่ใช่ข้อผิดพลาด คุณสามารถกู้คืนได้เช่นเดียวกับทางเลือก A: จากคอนโซล ให้ลบบรรทัด bind ออก หรือตั้งค่า bind=0.0.0.0 จากนั้นรีสตาร์ท นี่เป็นนิสัยการทำ tunnel แบบเดียวกับที่คุณใช้เพื่อเข้าถึง เครื่องพัฒนาทางไกลที่รัน Claude Code ใน tmux คือใช้หนึ่ง SSH session ทุกอย่างเป็นส่วนตัว และไม่มีบริการใดเปิดรับการเชื่อมต่อบน public interface เพิ่มเติม

แทนที่ self-signed certificate ด้วยใบรับรองจริง

หากคุณเปิดใช้งาน Webmin ผ่านชื่อโฮสต์ตามตัวเลือก A ให้กำจัดคำเตือนของเบราว์เซอร์ด้วยใบรับรอง Let's Encrypt จริง คุณจำเป็นต้องมีชื่อ DNS เช่น panel.example.com โดยมี A record ชี้มาที่เซิร์ฟเวอร์ และมีบริการที่ตอบรับ HTTP challenge บนพอร์ต 80 ในระหว่างการตรวจสอบ

Webmin มีฟีเจอร์นี้ในตัว: ไปที่ Webmin จากนั้นเลือก Webmin Configuration ตามด้วย SSL Encryption และแท็บ Let's Encrypt ให้ระบุชื่อโฮสต์ กำหนด "website root directory" ไปยัง path ที่ถูกให้บริการบนพอร์ต 80 สำหรับโดเมนนั้น แล้วกดร้องขอ Webmin จะดำเนินการขอใบรับรอง อัปเดตบรรทัด certfile= และ keyfile= ในไฟล์ miniserv.conf ให้คุณโดยอัตโนมัติ และจะต่ออายุใบรับรองก่อนหมดอายุให้เอง เมื่อโหลดหน้าเว็บใหม่ ไอคอนรูปแม่กุญแจจะแสดงสถานะปลอดภัย

ปัญหาที่อาจพบคือ เซิร์ฟเวอร์ของ Webmin ทำงานบนพอร์ต 10000 ไม่ใช่ 80 ดังนั้น http-01 challenge จึงต้องการเว็บเซิร์ฟเวอร์จริงอย่าง Apache หรือ nginx เพื่อตอบรับคำขอสำหรับ panel.example.com บนพอร์ต 80 หรือต้องใช้การตรวจสอบผ่าน DNS แทน ในกรณีที่เป็นเครื่องที่รันเฉพาะ Webmin และไม่มีบริการใดบนพอร์ต 80 การร้องขอจะล้มเหลวด้วยข้อผิดพลาดในการตรวจสอบ จนกว่าคุณจะเปิดทางให้ Let's Encrypt เข้าถึงไฟล์ challenge ได้ กลไกการทำงาน, DNS record, การตรวจสอบผ่านพอร์ต 80 และการต่ออายุนั้นเหมือนกับการออกใบรับรองให้เว็บไซต์ทั่วไป หากคุณต้องการศึกษาพื้นฐานดังกล่าว คู่มือการใช้ Let's Encrypt TLS certificates ด้วย Certbot และ nginx จะอธิบายขั้นตอนการตรวจสอบและตั้งค่า DNS ไว้อย่างละเอียด หากคุณเลือกใช้วิธี SSH-tunnel คุณสามารถข้ามส่วนนี้ไปได้เลย เนื่องจากใบรับรองแบบ self-signed นั้นเพียงพอแล้วสำหรับการใช้งานผ่าน SSH และการใช้ใบรับรองจริงที่ออกให้ panel.example.com จะทำให้เกิดคำเตือนชื่อไม่ตรงกันเมื่อคุณเข้าใช้งาน https://localhost:10000 อยู่ดี

เปิดใช้งานการยืนยันตัวตนแบบสองปัจจัย (Two-Factor Authentication)

รหัสผ่านเพียงอย่างเดียวให้การป้องกันที่เบาบางเกินไปสำหรับแผงควบคุมระดับ root ดังนั้นควรเพิ่มปัจจัยที่สองเข้าไป ให้เปิด Webmin จากนั้นไปที่ Webmin Configuration แล้วเลือก Two-Factor Authentication เลือกผู้ให้บริการเป็น Google Authenticator ซึ่งเป็นมาตรฐาน TOTP จึงสามารถใช้งานร่วมกับ Authy, 1Password หรือแอปยืนยันตัวตนใดๆ ก็ได้ แล้วกดบันทึก Webmin จะติดตั้ง Perl module ขนาดเล็กที่จำเป็น (Authen::OATH รวมทั้งตัวสร้าง QR code) และเปิดใช้งานฟีเจอร์นี้ ขั้นตอนนี้เพียงอย่างเดียวจะยังไม่ปกป้องบัญชีใดๆ

จากนั้นแต่ละบัญชีจะต้องลงทะเบียนอุปกรณ์ของตนเอง เมื่อเปิดใช้งาน 2FA แล้ว ให้เปิด Webmin ไปที่ Webmin Users เลือกบัญชีที่ต้องการ แล้วเลือก Enable Two-Factor For User จากนั้น Webmin จะแสดง QR code ขึ้นมา ให้สแกนด้วยแอปและกรอกรหัสที่สร้างขึ้นหนึ่งชุดเพื่อยืนยัน หลังจากนั้น การเข้าสู่ระบบจะถามหาโทเค็นหกหลักหลังจากใส่รหัสผ่านแล้ว ควรลงทะเบียนให้เรียบร้อยก่อนออกจากระบบ หากมีการบังคับใช้ 2FA แต่บัญชีของคุณยังไม่ได้สแกนรหัส คุณยังสามารถล้างข้อกำหนดดังกล่าวได้จากคอนโซล แต่การลงทะเบียนไว้ก่อนจะสะดวกกว่ามาก

เพิ่ม Fail2ban เพื่อบล็อกการพยายามล็อกอินแบบ brute-force

แม้แต่จุดล็อกอินที่จำกัดสิทธิ์ก็ควรมีมาตรการลงโทษเมื่อมีการล็อกอินล้มเหลวซ้ำๆ Webmin จะรายงานการล็อกอินที่ล้มเหลวไปยัง syslog ในรูปแบบ webmin[12345]: Invalid login as root from 10.0.0.9 หรือ Non-existent login as ... สำหรับชื่อผู้ใช้ที่ไม่มีบัญชี Unix อยู่จริง บน Ubuntu 24.04 บรรทัดเหล่านี้จะถูกบันทึกลงใน systemd journal เนื่องจากอิมเมจมาตรฐานไม่มี /var/log/auth.log ติดตั้งมาให้ Fail2ban มีตัวกรอง webmin-auth มาตรฐานที่ตรงกับรูปแบบทั้งสองบรรทัดนี้พอดี และ jail ด้านล่างนี้จะตั้งค่า backend = systemd ด้วยตัวเอง จึงไม่จำเป็นต้องใช้ regex หรือระบุ path ของ log เพิ่มเติม

สร้างไฟล์ /etc/fail2ban/jail.d/webmin.local:

[webmin-auth]
enabled  = true
port     = 10000
filter   = webmin-auth
backend  = systemd
maxretry = 4
bantime  = 1h

โหลดการตั้งค่าใหม่ด้วย sudo systemctl restart fail2ban จากนั้นตรวจสอบว่า jail ทำงานอยู่:

sudo fail2ban-client status webmin-auth

คุณควรเห็น jail ปรากฏในรายการโดยมีตัวนับการแบนเริ่มต้นที่ศูนย์ (บน backend ของ journal จะไม่มีบรรทัด File list:) เพื่อทดสอบการเชื่อมต่อตั้งแต่ต้นจนจบ ให้ลองล็อกอินล้มเหลวจากเครือข่ายอื่นสองสามครั้ง จากนั้นรันคำสั่งสถานะอีกครั้งและดูค่า Currently banned ที่เพิ่มขึ้น หากค่าไม่เพิ่มขึ้น ให้ตรวจสอบว่าคุณไม่ได้ทดสอบจากที่อยู่ IP ที่อยู่ใน ignoreip ของ Fail2ban และรัน journalctl SYSLOG_IDENTIFIER=webmin บนเซิร์ฟเวอร์เพื่อยืนยันว่ามีการเขียนบรรทัด Invalid login ลงใน log จริง หากยังไม่ได้ติดตั้ง Fail2ban บนเครื่องนี้ คู่มือการติดตั้ง Fail2ban บน Ubuntu 24.04 สำหรับ SSH จะครอบคลุมขั้นตอนการติดตั้งและ jail สำหรับ SSH ที่คุณควรใช้งานควบคู่ไปกับ jail นี้

จำกัดสิทธิ์การเข้าถึงของผู้ใช้ Webmin แต่ละราย

ไม่ใช่ทุกคนที่จำเป็นต้องใช้งานแผงควบคุมจะต้องการสิทธิ์ระดับ root ในทุกส่วน ภายใต้เมนู Webmin แล้วเลือก Webmin Users คุณสามารถสร้างบัญชีผู้ใช้ Webmin เพิ่มเติมและกำหนดสิทธิ์ให้แต่ละบัญชีเข้าถึงเฉพาะโมดูลที่จำเป็นเท่านั้น ตัวอย่างเช่น เจ้าหน้าที่สำรองข้อมูลที่สามารถมองเห็นได้เฉพาะโมดูล cron และ filesystem เมื่อแก้ไขข้อมูลผู้ใช้ ระบบจะแสดงรายการโมดูลทั้งหมดให้เลือก การยกเลิกการเลือกโมดูลใดโมดูลหนึ่งจะเป็นการนำโมดูลนั้นออกจากเมนูของผู้ใช้รายดังกล่าวและปิดกั้นการเข้าถึง URL ที่เกี่ยวข้อง นี่คือการป้องกันเชิงลึก (defence in depth): แม้เซสชัน Webmin ที่มีสิทธิ์ต่ำจะถูกขโมยไป ผู้บุกรุกก็ไม่สามารถแก้ไข /etc/shadow ได้ หากโมดูล Users ไม่อยู่ในรายการสิทธิ์ของผู้ใช้นั้น

การอัปเดต Webmin ให้เป็นปัจจุบัน

เนื่องจากคุณติดตั้งผ่าน apt repository ตัว sudo apt update && sudo apt upgrade จะดึง Webmin เวอร์ชันใหม่มาพร้อมกับส่วนอื่นๆ ของระบบ คุณควรติดตั้งแพตช์โดยทันที เนื่องจากแผงควบคุมเป็นเป้าหมายยอดนิยมของผู้ไม่หวังดี Webmin สามารถอัปเดตตัวเองได้ผ่านเมนู Webmin, แล้วไปที่ Webmin Configuration, จากนั้นเลือก Upgrade Webmin แต่การอัปเดตผ่าน apt บน Ubuntu นั้นเป็นวิธีที่สะอาดกว่า เพราะช่วยให้เวอร์ชันของซอฟต์แวร์สอดคล้องกับระบบจัดการแพ็กเกจอื่นๆ ของคุณ อย่ามองข้ามขั้นตอนนี้ เนื่องจากช่องโหว่ CVE ของ Webmin ในอดีตหลายรายการเป็นบั๊กประเภท remote-code-execution ซึ่งสิ่งที่กั้นระหว่างสถานะ "ได้รับการแก้ไขแล้ว" กับ "ถูกเจาะระบบ" คือความเร็วในการอัปเดตของผู้ดูแลระบบเท่านั้น

รูปแบบความล้มเหลวและข้อความที่คุณจะพบ

"Your connection is not private" / NET::ERR_CERT_AUTHORITY_INVALID ปรากฏขึ้นในการโหลดครั้งแรก สาเหตุ: ใบรับรองแบบ self-signed ที่ Webmin สร้างขึ้นระหว่างการติดตั้งไม่มีผู้ออกใบรับรองที่เชื่อถือได้ นี่ไม่ใช่การโจมตี ช่องทางสื่อสารมีการเข้ารหัสแล้ว เพียงแต่ไม่มีการยืนยันตัวตนจากหน่วยงานภายนอก วิธีแก้ไข: ดำเนินการผ่านคำเตือนไปก่อน จากนั้นจึงออกใบรับรอง Let’s Encrypt จริง หรือยอมรับใบรับรองนี้อย่างถาวรหากคุณเข้าถึง Webmin ผ่าน SSH tunnel

"This web server is running in SSL mode. Try the URL https://..." คุณพิมพ์ http://server:10000 เข้าไป miniserv สื่อสารผ่าน TLS บนพอร์ตนั้นเท่านั้นและกำลังแจ้งให้คุณทราบด้วยข้อความธรรมดา วิธีแก้ไข: เปลี่ยน http เป็น https ในแถบที่อยู่ของเบราว์เซอร์

หน้าเว็บหมดเวลา (Timeout), ERR_CONNECTION_TIMED_OUT / "This site can't be reached" คำขอไม่เคยไปถึง Webmin บน Ubuntu ปัญหานี้มักเกิดจาก ufw ปฏิเสธการเชื่อมต่อที่พอร์ต 10000 ตรวจสอบด้วย sudo ufw status หากไม่มีพอร์ต 10000 แสดงอยู่ในรายการ ให้เปิดพอร์ตด้วย sudo ufw allow 10000/tcp หรือวิธีที่ดีกว่าคือปล่อยให้ปิดไว้แล้วใช้ SSH tunnel ตามตัวเลือก B โปรดสังเกตความแตกต่าง: timeout หมายถึง firewall ปฏิเสธแพ็กเก็ตโดยไม่แจ้งเตือน ในขณะที่ ERR_CONNECTION_REFUSED หมายถึงสามารถเข้าถึงพอร์ตได้แต่ Webmin ไม่ได้ทำงานอยู่ ให้ตรวจสอบ sudo systemctl status webmin

"Access denied for <your IP>" คุณตั้งค่า IP Access Control ไว้ในตัวเลือก A และที่อยู่ IP ปัจจุบันของคุณไม่อยู่ในรายการที่อนุญาต, IP แบบไดนามิกของคุณมีการเปลี่ยนแปลง หรือมีการพิมพ์ผิด คุณไม่สามารถย้อนกลับผ่านเบราว์เซอร์ได้ วิธีแก้ไขจากคอนโซล: แก้ไขบรรทัด allow= ในไฟล์ /etc/webmin/miniserv.conf โดยแก้ไขหรือลบออก แล้วรันคำสั่ง sudo systemctl restart webmin

"Login failed. Please try again." ทั้งที่ข้อมูลล็อกอินถูกต้อง บัญชีผู้ใช้นั้นไม่มีรหัสผ่าน Unix ซึ่งเป็นค่าเริ่มต้นในอิมเมจคลาวด์ที่ใช้เฉพาะคีย์ (key-only) Webmin ตรวจสอบสิทธิ์ผ่าน PAM เทียบกับรหัสผ่าน Unix และรหัสผ่านนั้นไม่มีอยู่สำหรับผู้ใช้ดังกล่าว วิธีแก้ไข: รันคำสั่ง sudo passwd youruser บนเซิร์ฟเวอร์แล้วจึงล็อกอิน หาก /var/webmin/miniserv.log แสดงผลเป็น Non-existent login as ... แสดงว่าชื่อผู้ใช้ที่คุณพิมพ์ไม่ใช่บัญชีผู้ใช้ Unix

สำหรับการจัดการเซิร์ฟเวอร์มากกว่าสองสามเครื่อง การใช้ระบบอัตโนมัติจะขยายขีดความสามารถได้ดีกว่าการติดตั้งแผงควบคุมบนทุกเครื่อง: Ansible playbook แรกของคุณ คือจุดเริ่มต้นของเรื่องนี้

FAQ

การเปิด Webmin สู่สาธารณะปลอดภัยหรือไม่?

ให้ถือว่า Webmin ที่เปิดสู่สาธารณะเป็น root shell ที่มีหน้าล็อกอิน เพราะนั่นคือสิ่งที่มันเป็นจริงๆ การเปิดใช้งานจะปลอดภัย เพียงพอ ก็ต่อเมื่อมีการป้องกันหลายชั้น ได้แก่ การใช้ใบรับรองจริง, การยืนยันตัวตนสองชั้น (2FA), Fail2ban และการจำกัด IP หรือที่ปลอดภัยที่สุดคือไม่เปิดสู่สาธารณะเลย การตั้งค่าที่มีความเสี่ยงต่ำที่สุดคือการผูก Webmin ไว้กับ 127.0.0.1 แล้วเข้าถึงผ่าน SSH tunnel เพื่อไม่ให้พอร์ต 10000 ตอบสนองต่อการเชื่อมต่อจากอินเทอร์เน็ตภายนอก

จะกำจัดคำเตือนเรื่องใบรับรองของ Webmin ได้อย่างไร?

คำเตือน (NET::ERR_CERT_AUTHORITY_INVALID) ปรากฏขึ้นเพราะ Webmin มาพร้อมกับใบรับรองที่ลงนามด้วยตนเอง (self-signed certificate) คุณสามารถออกใบรับรองจริงได้จาก Webmin ในหัวข้อ Webmin Configuration, SSL Encryption, Let's Encrypt โดยใช้ชื่อ DNS ที่ชี้มายังเซิร์ฟเวอร์และมีบริการที่รองรับการตรวจสอบผ่านพอร์ต 80 หากคุณเข้าถึง Webmin ผ่าน SSH tunnel ไปยัง localhost เท่านั้น คำเตือนนี้ก็ไม่มีอันตราย เนื่องจาก SSH ทำการเข้ารหัสและยืนยันตัวตนการเชื่อมต่ออยู่แล้ว คุณสามารถยอมรับใบรับรองที่ลงนามด้วยตนเองได้อย่างปลอดภัย

จะจำกัดการเข้าถึง Webmin ให้เฉพาะ IP ของฉันได้อย่างไร?

ไปที่ Webmin เลือก Webmin Configuration, IP Access Control, เลือก "Only allow from listed addresses" แล้วระบุ IP สาธารณะของคุณจาก curl ifconfig.me Webmin จะเก็บค่านี้ไว้ในบรรทัด allow= ของไฟล์ /etc/webmin/miniserv.conf โปรดระวังหาก IP ที่บ้านของคุณเป็นแบบ dynamic เพราะหาก IP เปลี่ยน คุณจะถูกล็อกไม่ให้เข้าใช้งานและต้องแก้ไขบรรทัด allow= จากคอนโซลของเซิร์ฟเวอร์ ดังนั้นการใช้ IP แบบ static หรือวิธี SSH tunnel จึงมีความน่าเชื่อถือมากกว่าในทางปฏิบัติ

ทำไมฉันถึงล็อกอินไม่ผ่านทั้งที่รหัสผ่านถูกต้อง?

Webmin ยืนยันตัวตนผ่าน PAM โดยเทียบกับรหัสผ่าน Unix ของคุณ แต่โดยปกติแล้ว cloud image มักจะอนุญาตเฉพาะการใช้ key และไม่ได้ตั้งรหัสผ่านไว้สำหรับบัญชีเริ่มต้น ทำให้ PAM ไม่มีรหัสผ่านให้ตรวจสอบและปฏิเสธการล็อกอิน ให้รันคำสั่ง sudo passwd youruser บนเซิร์ฟเวอร์เพื่อตั้งรหัสผ่านก่อนแล้วจึงล็อกอิน หากพบข้อความ Non-existent login as ... ใน /var/webmin/miniserv.log แสดงว่าชื่อผู้ใช้นั้นไม่ใช่บัญชี Unix จริง

Webmin มีข้อดีอย่างไรเมื่อเทียบกับการใช้ SSH โดยตรง?

Webmin เป็นชั้นซอฟต์แวร์ที่ช่วยให้ค้นหาและจัดการระบบได้สะดวกขึ้น มันมีประโยชน์อย่างยิ่งสำหรับการดูไฟล์ log, จัดการผู้ใช้และ cron, แก้ไขกฎ firewall รวมถึงดูสถานะของดิสก์และบริการต่างๆ โดยไม่ต้องจำคำสั่งทั้งหมด ซึ่งเหมาะสำหรับผู้ดูแลระบบที่ไม่ได้ทำเป็นประจำหรือทีมที่มีทักษะหลากหลาย การใช้ SSH โดยตรงนั้นรวดเร็วกว่า เขียนสคริปต์ได้ และมีช่องโหว่ให้โจมตีน้อยกว่าสำหรับการทำงานทั่วไป ผู้ดูแลระบบจำนวนมากใช้งานทั้งสองอย่างควบคู่กัน คือใช้ SSH สำหรับงานประจำวัน และใช้ Webmin ที่ผูกไว้กับ localhost ผ่าน tunnel สำหรับงานที่ต้องการการคลิกเมาส์เป็นครั้งคราว หากคำถามของคุณคือการเลือกระหว่างแผงควบคุม (panel) กับ shell ควรพิจารณาเปรียบเทียบ Cockpit กับ Webmin ก่อน เนื่องจากทั้งสองเครื่องมือมีความแตกต่างกันในแง่ของขอบเขตการแก้ไขระบบและการยืนยันตัวตนผู้ใช้