guacamole container

ติดตั้ง Apache Guacamole เพื่อทำ Remote Desktop Gateway บน Cloud container (Docker)

ก่อนอื่นเราไปทำความรู้จักกับเจ้า Apache Guacamole กันก่อนมันคืออะไร?

Apache Guacamole (กัวคาโมเล) เป็นซอฟต์แวร์แบบโอเพนซอร์สเว็บเกตเวย์สำหรับรีโมท เพื่อให้ไคลเอ็นต์สามารถเข้าถึงเซิร์ฟเวอร์จากระยะไกลได้ ผ่านเว็บเบราว์เซอร์ที่รองรับ HTML5 เช่น Mozila Firefox, Google Chrome หรือ Safari โดยใช้โปรโตคอล เช่น SSH, VNC, RDP และมีระบบยืนยันตัวตนสองชั้น (OTP)

หากใครยังนึกภาพไม่ออกว่าจะเอา Apache Guacamole มาอิมพลีเม้นท์หรือเป็น Solution ทางเลือกท่าไหนได้บ้าง ใช้ประโยชน์อย่างไร ผู้เขียนจะเกริ่นเล่าให้ฟัง…

โดยปกติในองค์กรหรือหน่วยงานที่กำลังมองหา Remote App ที่จะช่วยให้ผู้ใช้งานสามารถทำงานจากที่ไหนก็ได้ เช่น รีโมทมาใช้Application ระบบบัญชี (ERP)หรือใช้ทรัพยากรร่วมกัน (File Server) บนระบบปฏิบัติการ Windows server ถ้าเป็นท่านี้ผู้ดูแลระบบก็เพียงหาซอฟต์แวร์ Remote Desktop มาติดตั้ง หรือติดตั้งเซอร์วิส Remote Desktop Services (RDS) เพื่อให้เครื่องเซิร์ฟเวอร์เครื่องนี้ทำหน้าที่เป็น RDS (Windows Terminal Server)

Remote Desktop Services (RDS) เป็นฟีเจอร์ เซอร์วิสที่มีมาให้ใน Windows Server ทำหน้าที่เป็น Host ในการที่จะให้ Client หรือ User สามารถ Remote เข้ามาใช้งานโปรแกรมต่างๆ บน Terminal Server ได้ เช่น File Shared, Database, Application (ERP) ฯลฯ ซึ่งวิธีของ Client ที่ Remote เข้ามาใช้ก็ผ่าน “Remote Desktop Connection” เป็นต้น.

แล้วติดตั้ง Windows Terminal Server ต้องจ่ายค่าไรบ้าง?

  • License ของ Windows Server
  • Remote Desktop Services License (RDS License) เป็น License ที่ต้องมีไว้ตามจำนวน User ที่จะใช้งาน Remote มี 2 ประเภทคือ User CAL และ Device CAL
  • CAL (Client Access Licenses) เข้าใช้ทรัพยากร

ในเรื่องของ license ผู้เขียนของไม่ของลงรายละเอียดนะครับ แต่ของอธิบายคราวๆ หากเวิร์กสเตชันในองค์กรของคุณเป็น Laptop พนังงานทุกคนมี Laptop ใช้งานเป็นของตนเอง กรณีผู้ใช้ต้องเชื่อมต่อผ่านโปรโตคอล RDP ด้วยโปรแกรม Remote Destop Client และบนเซิร์ฟเวอร์ต้องติดตั้ง license แบบ User CAL ซึ่งเวลาซื้อ license ก็ให้ซื้อตามจำนวนยูสเซอร์

แต่หากกรณีที่เวิร์กสเตชันในองค์กรของคุณเป็นเครื่องพีซี คอมพิวเตอร์แบบตั้งโต๊ะ ผู้ใช้คนไหนมาล็อกอินทำงานได้ ไม่ได้เป็นส่วนบุคคล กรณีแบบนี้ที่เซิร์ฟเวอร์ต้องติดตั้ง license เป็นแบบ Device CAL เป็นต้น เวลาซื้อก็ให้ซื้อตามจำนวนเครื่องคอมพิวเตอร์ที่ต้องการใช้งาน

จะดีไหมถ้าองค์กรของคุณทำให้ RDS License ที่ใช้งานอยู่คุ้มค่าขึ้น

Apache Guacamole สนับสนุนโปรโตคอล RDP ให้ Client เชื่อมต่อเข้าใช้ Application ได้พร้อมๆ กันหลายยูสเซอร์ สามารถเข้าถึงเซิร์ฟเวอร์จากระยะไกลได้ ผ่านเว็บเบราว์เซอร์ แต่ไม่ต้องควักเงินซื้อ License (RDS CALs) เพิ่มแม้แต่ License เดียว!! (Microsoft ไม่ต้องการเห็นโพสต์นี้ ฮ่าาาา)

หรืออีกท่าหนึ่งคือ ใช้Apache Guacamole ทำเป็น KVM เป็นเว็บเกตเวย์ควบคุม Server (โดยไม่ต้องซื้อ KVM switch) ผู้ดูแลระบบสามารถเข้าถึงเซิร์ฟเวอร์จากระยะไกลได้ ไม่ว่าจะเข้าถึง Linux server หรือ Windows serverผ่านเว็บเบราว์เซอร์ (โดยไม่ต้องใช้โปรแกรมอย่าง Putty หรือ Remote Desktop Client)

ใครอ่านมาถึงตรงนี้น่าจะบอกมองเห็นภาพกันแล้วนะครับ ว่าเราจะเอาApache Guacamole ไปใช้ท่าไหนหรือนำไปเสริมอิมพลีเม้นท์ระบบอะไรได้บ้าง ผู้เขียนขอหยิบข้อดีข้อเสียมาให้ดู

แล้วข้อดีของ Windows Terminal Sever ล่ะ?

  • ผู้ดูแลระบบสามารถจัดการระบบได้จากศูนย์กลาง (ติดตั้งโปรแกรม, อัปเดตโปรแกรมต่างๆ)
  • Client ทำงานได้ทุกที่ แค่เชื่อมต่อ Internet
  • ลดการติดตั้งโปรแกรมใน Laptop ของ User
  • ทุก User ใช้โปรแกรมเวอร์ชั่นเดียวกันทั้งหมด ผู้ดูแลระบบทำการ Update ที่เครื่อง Terminal เครื่องเดียว ไม่ต้องทำอะไรเพิ่ม
  • ไฟล์ข้อมูลทั้งหมดเก็บไว้ที่เครื่อง Server หรือ Storage

แน่นอนครับเหรียญยังมีสองด้าน มันต้องมีข้อเสียบ้างล่ะ

ข้อเสียของ Windows Terminal Server ล่ะ?

  • เป็นระบบ Share Environment เมื่อ User ใด User หนึ่งมีการใช้งาน Resource สูง จะทำให้ User คนอื่นๆ ได้รับผลกระทบในการใช้งานด้วย เช่น ระบบทำงานช้า
    (แต่ถ้าเป็นระบบ VDI ผู้ดูแบบระบบจะสามารถกำหนด Resource ให้แต่ละ User ได้ หรือ Dedicated Environment)
  • ไม่ใช่ทุกโปรแกรมที่สนับสนุนติดตั้งบน Windows Server ได้
  • RDS License ต้องซื้อ License ตามจำนวน Client ที่ใช้งาน เช่น 100 Users ก็ซื้อ 100 RDS CALs
  • ถ้าเครื่อง Server พัง Client จะใช้งานไม่ได้ (แต่ Production ไม่ได้มีเพียงเครื่องเดียวอยู่แล้ว)

จากที่เกริ่น (ซะยาว) ไปแล้ว สำหรับในบทความนี้จะเป็นการติดตั้งApache Guacamole ใน Docker (docker-compose) โดยแยกเซอร์วิสออกเป็นcontainers หรือใครจะติดตั้งบนระบบปฏิบัติการ Linux ก็ได้เช่นกัน

ขอบคุณ Ruk-com cloud แพลตฟอร์ม PaaS ที่สนับสนุน  LAB environment ในการติดตั้งในครั้งนี้ครับ

Apache Guacamole ประกอบด้วย 2 ส่วนประกอบหลัก

  • Guacamole Server ทำหน้าที่เป็น Server (server-side) ที่เป็นเซอร์วิ ที่ทำงานที่ฝั่งเซิร์ฟเวอร์ เรียก component ต่างๆ ค่อยเชื่อมต่อกับ remote desktop
  • Guacamole Client ทำหน้าที่เป็น Remote Desktop Client (HTML 5 web application) เพื่อเข้าถึงเซิร์ฟเวอร์จากระยะไกลได้ ผ่านเว็บเบราว์เซอร์

เอาล่ะ ไปดูstructure ที่เราจะติดตั้งกันเลยดีกว่าครับ ^^

Apache Guacamole structure

cr. image: oradba.ch

จากรูป Structure ประกอบด้วย containers ดังนี้

  • nginx : ทำหน้าที่เป็น Reverse Proxy ช่วยให้ Host Server รองรับผู้ใช้งานจำนวนมากได้
    (By default this container does bind to HTTP and HTTPS to allow client access)
  • certbot : ใช้สร้าง ssl ของ Let’s Encrypt certificates (gen ssl สำหรับ application)
  • guacamole : Apache Guacamole container
  • guacd : Server-side proxy server สำหรับ Guacamole
  • mysql : Database เก็บ Guacamole connection information ต่างๆ

วิธีการติดตั้ง Apache Guacamole บน Docker host

1. ติดตั้ง Docker host

ล็อกอินเข้าใช้ Ruk-Com Cloud แล้วคลิก คลิกที่ “Create New Environment”

คลิก Docker Engine CE (ติดตั้งแบบ Standalone engine)

ตั้งชื่อ Environment, Display Name (จะเปลี่ยนหรือไม่ก็ได้) และเลือก Region ศูนย์ข้อมูลที่ต้องการติดตั้งเซิร์ฟเวอร์

ถัดไปคลิก “Install”

หรือใครจะ Deploy จาก GitHub ก็ได้เช่นกัน โดยคลิกที่ “Deploy containers from compose.yml ได้ แต่ในบทความนี้ให้เลือกติดตั้งแบบ Standalone engine

หลังจากติดตั้งDocker Engine CE เสร็จ (ดังรูป)

หรือคุณสามารถแก้ไข Stack เพิ่ม Load Balancer layer ก็ได้โดยติดตั้ง Nginx ให้ทำหน้าที่เป็นโหนด Load balancer ให้กับ Docker host ครับ (ดังรูป)

2. ถัดไปให้ Clone ซอฟต์แวร์โค้ดจาก GitHub repository

เข้าสู่ Server คลิกที่ web console

พิมพ์คำสั่งดังนี้

git clone https://github.com/oehrlis/guacamole.git

3. แก้ไขไฟล์ configuration

Define environment variables (.env)

พิมพ์คำสั่ง cd เข้าไปยังไดเรกทอรี guacamole

vi .env 

4. ตรวจสอบไฟล์ docker-compose.yml

5. จัดเตรียม MySQL database

SQL script ไฟล์ 02_connections.sql (config/mysql/02_connections.sql)

ให้แก้ไขเป็น IP Address เครื่อง Terminal Server ของเรา

cd guacamole
vi config/mysql/02_connections.sql
INSERT INTO guacamole_connection (connection_name, protocol) 
    VALUES ('Windown Terminal Server (ts - 10.103.1.250)', 'rdp');
INSERT INTO guacamole_connection_parameter VALUES (2, 'hostname', '10.103.1.250');
INSERT INTO guacamole_connection_parameter VALUES (2, 'port', '3389');
INSERT INTO guacamole_connection_parameter VALUES (2, 'user1', 'p@$$w0rd');

รันสคริปต์ “prepare_initdb.sh” เตรียมความพร้อม Database

./bin/prepare_initdb.sh

note: กรณีที่ไม่ได้เปลี่ยนแปลงแก้ไขไฟล์ .env สคริปต์จะสร้าง password ขึ้นมาให้อัตโนมัติ

MYSQL_PASSWORD=kzjI72bZHx93
GUACADMIN_PASSWORD=1pRkJ9qXoN2E

6. สตาร์ท guacamole containers (guacamole services)

docker-compose up -d guacamole mysql guacd

จากนั้นพิมพ์คำสั่งรันสคริปต์ “prepare_certs.sh” initial certification request

อย่าลืม! แก้ไขโดเมน suseman.com เป็นโดเมนเนมของคุณด้วยนะครับ

export HOSTNAME="guacamole"
export DOMAINNAME="www.suseman.com"
export EMAIL="[email protected]"
export STAGING_ENABLE=1
./bin/prepare_certs.sh

7. ขั้นตอนสุดท้าย สั่งสตาร์ท containers ทั้งหมด เป็นอันสำเร็จครับ

docker-compose up -d

หลังจาก containers ทำงานแล้ว จะเข้าสู่หน้า Login (guacamole remote desktop gateway) ดังรูป

USERNAME: guacadmin
PASSWORD: 1pRkJ9qXoN2E

ถัดไปผู้เขียนทดสอบสร้าง Windows ขึ้นมาสักเครื่อง เพื่อทดสอบ Remote ครับ

เมื่อสร้างเครื่อง Windows เสร็จแล้ว ให้นำ IP Address ไปเพิ่มใน Guacamole

จากนั้นก็ลองเทสเชื่อมต่อดูเป็นอันสำเร็จครับ 🙂

สุดท้าย จากทุก step ที่ทำมาคุณสามารถรันเซตอัพ Guacamole Docker stack ผ่านสคริปต์นี้ได้เลย ^^

git clone https://github.com/oehrlis/guacamole.git
cd guacamole
export HOSTNAME="guacamole"
export DOMAINNAME="yourdomain.org"
export EMAIL="[email protected]"
export STAGING_ENABLE=1
./bin/setup_guacamole.sh

note: สามารถแก้ไข variable “GUACAMOLE_USER” และส่วน Customization ในไฟล์ setup_guacamole.sh

สุดท้ายนี้หวังว่าบทความนี้จะเป็นประโยชน์สำหรับผู้แวะมาส่องหรือเรื่อยผ่านบางนะครับ ฮ่าๆๆๆ
แต่ยังไงแม้เรื่อยผ่านก็ฝากช่วยแชร์โพสต์บทความนี้ด้วยนะครับ ขอบคุณมากครับ 🙂 ^^

source:
[1] https://github.com/oehrlis/guacamole
[2] https://pentacent.medium.com/nginx-and-lets-encrypt-with-docker-in-less-than-5-minutes-b4b8a60d3a71

Scroll to top