วิธีติดตั้งและตั้งค่าความปลอดภัย 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 Webmin stable repository? (y/N) ให้ตอบ y เมื่อเสร็จสิ้น ให้ดำเนินการติดตั้งแพ็กเกจ โดยใช้แฟล็ก --install-recommends เพื่อดึง dependency ของ Perl และ SSL module ที่จำเป็นมาด้วย เพื่อป้องกันไม่ให้โมดูลแต่ละตัวทำงานล้มเหลวในภายหลังเนื่องจากขาดไลบรารี
sudo apt-get install --install-recommends webminWebmin เคยเปลี่ยนชื่อสคริปต์นี้มาก่อน คู่มือเก่าอาจอ้างอิงถึง 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 คำขอจะถูกบันทึกไว้ที่ /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 ด้วยใบรับรองจริง
หากคุณเปิดใช้งาน Webmin ตามตัวเลือก A ให้กำจัดคำเตือนของเบราว์เซอร์ด้วยใบรับรอง Let's Encrypt ของจริง คุณต้องมีชื่อสำหรับใบรับรองและช่องทางให้ Let's Encrypt เข้าถึงพอร์ต 80 ในระหว่างการตรวจสอบความถูกต้อง โดยปกติชื่อจะเป็นชื่อ DNS เช่น panel.example.com ซึ่งมี A record ชี้มาที่เซิร์ฟเวอร์ ตั้งแต่ Webmin 2.650 (ที่ปล่อยออกมาเมื่อวันที่ 25 มิถุนายน 2026) เป็นต้นมา ชื่อนี้ยังสามารถเป็น IP address สาธารณะของเซิร์ฟเวอร์ได้ หากติดตั้ง Certbot 5.3 หรือใหม่กว่าไว้ Let's Encrypt จะออกใบรับรองสำหรับ IP เฉพาะในโปรไฟล์ที่มีอายุสั้น ซึ่งมีอายุประมาณหกวัน ดังนั้นให้ตั้งค่าช่วงเวลาการต่ออายุอัตโนมัติของ Webmin เป็นจำนวนวัน โดย Webmin จะไม่ยอมรับช่วงเวลาที่ยาวกว่านี้สำหรับใบรับรอง IP
Webmin มีฟีเจอร์นี้ในตัว: ไปที่ Webmin จากนั้นเลือก Webmin Configuration ตามด้วย SSL Encryption แล้วเลือกแท็บ Let's Encrypt ให้ระบุ hostname หรือ IP address เลือกวิธีการตรวจสอบความถูกต้อง แล้วกดร้องขอ Webmin จะดำเนินการขอใบรับรอง อัปเดตบรรทัด certfile= และ keyfile= ใน miniserv.conf ให้คุณโดยอัตโนมัติ และจะต่ออายุใบรับรองก่อนหมดอายุให้เอง เมื่อโหลดหน้าเว็บใหม่ ไอคอนรูปแม่กุญแจจะแสดงสถานะที่ปลอดภัย
ปัญหาที่อาจเกิดขึ้นจริงคือ เซิร์ฟเวอร์ของ Webmin ทำงานบนพอร์ต 10000 ไม่ใช่ 80 ดังนั้นจึงต้องมีบริการอื่นตอบรับการตรวจสอบ http-01 บนพอร์ต 80 คุณสามารถทำได้ 3 วิธี หาก Apache หรือ nginx ให้บริการชื่อนั้นบนพอร์ต 80 อยู่แล้ว ให้ชี้การตรวจสอบความถูกต้องไปยัง document directory ของเว็บไซต์นั้น (สำหรับ IP address วิธีนี้ต้องใช้ Certbot 5.4 หรือใหม่กว่า) หากไม่มีบริการใดทำงานบนพอร์ต 80 ให้เลือกใช้เว็บเซิร์ฟเวอร์ในตัวของ Certbot ซึ่งเป็นโหมด standalone ที่ Webmin เพิ่มเข้ามาในเวอร์ชัน 2.110 โดย Certbot จะรันเว็บเซิร์ฟเวอร์ของตัวเองบนพอร์ต 80 ชั่วคราว ดังนั้นต้องติดตั้ง Certbot ไว้และพอร์ต 80 ต้องว่างและเปิดใช้งานในไฟร์วอลล์ของคุณ หรือจะใช้การตรวจสอบความถูกต้องผ่าน DNS ซึ่งใช้ได้กับ hostname แต่ใช้ไม่ได้กับ IP address แพ็กเกจ certbot ของ Ubuntu 24.04 เป็นเวอร์ชัน 2.9 ซึ่งเพียงพอสำหรับการตรวจสอบแบบ standalone สำหรับ hostname แต่เก่าเกินไปสำหรับใบรับรอง IP หากต้องการใช้ใบรับรอง IP ให้ติดตั้ง Certbot เวอร์ชันปัจจุบัน เช่น เวอร์ชัน snap ซึ่งอยู่ที่ 5.8 ณ เดือนตุลาคม 2026 หากไม่ทำตามขั้นตอนเหล่านี้ คำขอจะล้มเหลวด้วยข้อผิดพลาดในการตรวจสอบความถูกต้อง กลไกการทำงาน, DNS record, การตรวจสอบผ่านพอร์ต 80 และการต่ออายุ จะเหมือนกับการออกใบรับรองสำหรับเว็บไซต์ทั่วไป หากคุณต้องการข้อมูลพื้นฐานดังกล่าว สามารถดูรายละเอียดขั้นตอนการตรวจสอบความถูกต้องและการตั้งค่า DNS ได้ที่ คู่มือการใช้ Let's Encrypt TLS certificates ร่วมกับ Certbot และ nginx หากคุณเลือกใช้วิธี SSH-tunnel คุณสามารถข้ามส่วนนี้ไปได้เลย เนื่องจากใบรับรองแบบ self-signed นั้นเพียงพอแล้วสำหรับการใช้งานผ่าน SSH และการใช้ใบรับรองจริงที่ออกให้ panel.example.com จะทำให้เกิดคำเตือนเรื่องชื่อไม่ตรงกัน (name-mismatch) เมื่อคุณเข้าใช้งาน 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 ปล่อยทิ้ง (drop) แพ็กเก็ตที่พอร์ต 10000 แต่ควรตรวจสอบให้แน่ใจก่อนสรุป ให้รันคำสั่ง sudo ufw status หากรายงานว่า Status: inactive แสดงว่า ufw ไม่ได้บล็อกการเชื่อมต่อใดๆ (โดยปกติ Ubuntu จะปิดการใช้งาน ufw มาตั้งแต่ต้น และการเพิ่มกฎอนุญาตไม่ได้เป็นการเปิดใช้งาน ufw) ดังนั้นให้ตรวจสอบที่ต้นทางอื่น เช่น ไฟร์วอลล์ในแผงควบคุมของผู้ให้บริการคลาวด์ของคุณ หากรายงานว่า Status: active ให้รัน sudo ufw status verbose เพื่อดูนโยบายขาเข้าเริ่มต้นและกฎอื่นๆ หากการจราจรขาเข้าถูกปฏิเสธและไม่มีพอร์ต 10000 ระบุไว้ ให้เปิดพอร์ตด้วย sudo ufw allow 10000/tcp หรือทางที่ดีกว่าคือปล่อยให้ปิดไว้แล้วใช้ SSH tunnel ตามวิธีใน Option B โปรดสังเกตความแตกต่าง: timeout หมายถึงไฟร์วอลล์กำลังทิ้งแพ็กเก็ตโดยเงียบเชียบ ในขณะที่ ERR_CONNECTION_REFUSED หมายถึงพอร์ตสามารถเข้าถึงได้แต่ Webmin ไม่ได้ทำงานอยู่ ให้ตรวจสอบ sudo systemctl status webmin
"Access denied for <your IP>." คุณตั้งค่า IP Access Control ไว้ใน Option A และที่อยู่ IP ปัจจุบันของคุณไม่อยู่ในรายการที่อนุญาต, IP ของคุณเป็นแบบไดนามิกและมีการเปลี่ยนแปลง หรือเกิดจากการพิมพ์ผิด ซึ่งไม่มีทางแก้ไขผ่านเบราว์เซอร์ได้ วิธีแก้ไขจากคอนโซล: แก้ไขบรรทัด allow= ในไฟล์ /etc/webmin/miniserv.conf โดยแก้ไขหรือลบรายการนั้นออก แล้วรัน sudo systemctl restart webmin
"Login failed. Please try again." ทั้งที่ข้อมูลล็อกอินถูกต้อง บัญชีผู้ใช้นั้นไม่มีรหัสผ่าน Unix ซึ่งเป็นค่ามาตรฐานในอิมเมจคลาวด์ที่ใช้เฉพาะ SSH key ในการล็อกอิน 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 ให้ใช้ชื่อโดเมนที่ชี้มายังเซิร์ฟเวอร์ หรือใช้ IP สาธารณะของเซิร์ฟเวอร์หากติดตั้ง Certbot 5.3 ขึ้นไป พอร์ต 80 ต้องเปิดให้เข้าถึงได้เพื่อทำการตรวจสอบ (challenge) โดยเว็บเซิร์ฟเวอร์ที่มีอยู่หรือ standalone server ของ Certbot หากคุณเข้าถึง 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 ส่วนใหญ่มักตั้งค่าให้ใช้เฉพาะ SSH 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 ก่อน เนื่องจากทั้งสองเครื่องมือมีความแตกต่างกันในแง่ของขอบเขตการแก้ไขระบบและการยืนยันตัวตนผู้ใช้งาน