ก่อนหน้านี้ Garudust Agent รัน terminal tool ได้สองแบบ — บนเครื่อง local โดยตรง หรือ wrap ผ่าน Docker container เพื่อ isolation
v0.13 เพิ่ม SSH sandbox — แบบที่สาม ที่ส่งทุก command ผ่าน ssh ไปรันบน remote host แทน
security:
terminal_sandbox: ssh
ssh_host: "build.example.com"
ssh_user: "deploy"
ssh_port: 22
ssh_key_path: ~/.ssh/deploy_key
ไม่ต้องแก้โค้ด ไม่ต้องเพิ่ม dependency — ใช้ ssh binary ที่มีอยู่แล้ว
ทำไมถึงมีประโยชน์?
ปัญหาของ terminal_sandbox: none และ docker คือทั้งคู่รันบนเครื่องที่ garudust อยู่เท่านั้น ถ้า agent อยู่บน laptop แต่อยากให้มันจัดการ production server — ก็ทำไม่ได้
SSH sandbox แก้ปัญหานี้ตรงๆ
Use Case 1 — Build & Deploy บน Remote Server
สมมติมี build server แยกต่างหาก ไม่อยากให้ laptop ต้อง build เอง:
security:
terminal_sandbox: ssh
ssh_host: "build.internal.example.com"
ssh_user: "ci"
ssh_key_path: ~/.ssh/ci_key
แล้วคุยกับ agent ได้เลย:
"build release และ deploy ไปที่ /opt/app"
Agent จะรัน:
-
cargo build --release— บน build server -
systemctl restart myapp— บน build server
เครื่อง local ไม่ต้องมี Rust, ไม่ต้องมี prod credentials ไม่มีอะไรรั่วออกมา
Use Case 2 — Ops Assistant จาก Telegram
ผูก Garudust เข้า Telegram แล้วถามสุขภาพ server ได้ตลอดเวลา:
คุณ: disk เต็มไหม
Agent: ✓ terminal: df -h /
/ → 23% used (226 GB / 981 GB)
ปกติดีครับ
คุณ: process ที่กิน RAM มากสุด 5 อันดับ
Agent: ✓ terminal: ps aux --sort=-%mem | head -6
1. postgres 12.3%
2. node 8.1%
...
ทุก command ผ่าน hardline check + approval gate ก่อนเสมอ — ไม่มีทางที่ prompt injection จะสั่ง rm -rf ได้
Use Case 3 — ควบคุม Raspberry Pi ผ่าน LINE
Pi อยู่ใน home network ไม่ได้ expose port ออกอินเทอร์เน็ต ให้ garudust-server อยู่บน Pi เดียวกันหรือเครื่องในวง LAN แล้วรับคำสั่งจาก LINE:
security:
terminal_sandbox: ssh
ssh_host: "192.168.1.50" # Pi อยู่ใน LAN
ssh_user: "pi"
"เปิดสปริงเกลอร์ 5 นาที"
→ terminal: python3 ~/scripts/sprinkler.py on 300
"อุณหภูมิตอนนี้เท่าไหร่"
→ terminal: cat /sys/bus/w1/devices/28-*/w1_slave | grep t= | awk -F= '{printf "%.1f°C\n", $2/1000}'
สั่งงานผ่าน LINE ได้เหมือน SSH เข้าไปเอง แต่ไม่ต้องเปิด terminal
Use Case 4 — Isolated Environment โดยไม่ใช้ Docker
บางเครื่อง Docker ไม่ available (ARM SBC, embedded, VPS ราคาถูก) แต่อยากได้ isolation — ใช้ VM หรือ LXC container ที่มี SSH แทน:
laptop (garudust) → SSH → sandbox VM → รัน untrusted code
ถ้า agent ทำอะไรผิดพลาด snapshot VM กลับมาได้ทันที โดยที่ local filesystem ไม่โดนแตะเลย
Security ที่ได้มาโดยอัตโนมัติ
SSH sandbox ไม่ได้แค่ส่ง command ไป remote — มี hardening ติดมาด้วยทุกครั้ง:
| Property | วิธีทำ |
|---|---|
| ไม่มี interactive prompt |
BatchMode=yes — fail ทันทีถ้า key auth ล้มเหลว |
| ป้องกัน MITM |
StrictHostKeyChecking=accept-new — เชื่อ host แรก, ปฏิเสธถ้า key เปลี่ยน |
| Connection timeout |
ConnectTimeout=min(timeout, 30) — ไม่แขวน process |
| ป้องกัน flag injection |
-- ก่อน command เสมอ — command ที่ขึ้นต้นด้วย - ไม่ถูกตีความเป็น ssh flag |
| Secrets ไม่รั่ว |
env_clear() ก่อน spawn ssh — API key ไม่ถึง remote host |
ลองได้เลย — ไม่ต้องมี server จริง
# 1. สร้าง SSH key สำหรับทดสอบ
ssh-keygen -t ed25519 -f /tmp/test_key -N ""
# 2. รัน SSH container
PUBKEY=$(cat /tmp/test_key.pub)
docker build -t sshd-test - << 'EOF'
FROM ubuntu:24.04
RUN apt-get update -qq && apt-get install -y openssh-server \
&& useradd -m testuser && mkdir -p /home/testuser/.ssh /var/run/sshd
ARG PUBKEY
RUN echo "$PUBKEY" > /home/testuser/.ssh/authorized_keys \
&& chmod 700 /home/testuser/.ssh \
&& chmod 600 /home/testuser/.ssh/authorized_keys \
&& chown -R testuser:testuser /home/testuser/.ssh \
&& ssh-keygen -A
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
EOF
docker run -d --name sshd-test -p 2222:22 --build-arg PUBKEY="$PUBKEY" sshd-test
# 3. ทดสอบกับ garudust
GARUDUST_TERMINAL_SANDBOX=ssh \
GARUDUST_SSH_HOST=127.0.0.1 \
GARUDUST_SSH_USER=testuser \
GARUDUST_SSH_PORT=2222 \
GARUDUST_SSH_KEY_PATH=/tmp/test_key \
GARUDUST_APPROVAL_MODE=auto \
garudust "บอก OS version, จำนวน CPU และ memory บน remote host"
ผลที่ได้ (จาก container):
- ระบบปฏิบัติการ: Ubuntu 24.04.4 LTS (Noble Numbat)
- จำนวน CPU: 14 แกน
- หน่วยความจำ: 7.7 GiB (ใช้ไป 544 MiB, ว่าง 6.7 GiB)
hostname คืน container ID → ยืนยันว่า command รันบน remote จริง ไม่ใช่ local
สรุป
| Mode | เหมาะกับ |
|---|---|
none |
dev machine, ทดสอบ, low-risk tasks |
docker |
production local, untrusted code, ต้องการ filesystem isolation |
ssh |
remote server, IoT/Pi, build farm, VM sandbox, ไม่มี Docker |
ติดตั้งจาก GitHub Releases หรือ:
cargo install garudust
Source: garudust-org/garudust-agent
Top comments (0)