GUAC_VERSION 1.5.5 -> 1.6.0. Docker podrska je u 1.6.0 prepisana:
ekstenzije se ukljucuju preko <PREFIX>_ENABLED varijabli, a sve su
vec u imageu.
- BAN_ENABLED: guacamole-auth-ban, nova u 1.6.0. Blokira IP nakon 5
promasenih prijava. Radi unutar aplikacije, za razliku od fail2ban
jaila koji cita nginx log.
- POSTGRESQL_USER -> POSTGRESQL_USERNAME. U 1.6.0 je USERNAME
kanonski naziv; USER je deprecated alias.
- REMOTE_IP_VALVE_ENABLED + INTERNAL_PROXIES: bez toga kontejner vidi
samo docker bridge (172.18.0.1) kao izvor svih zahtjeva, pa ban
ekstenzija banira cijeli proxy put i zakljuca SVE korisnike odjednom
— isti problem koji smo rijesili za nginx sa set_real_ip_from.
internalProxies namjerno pokriva samo docker raspone (172.16-31),
da LAN klijenti na 192.168.x ostanu prepoznati kao stvarni klijenti.
Nadogradnja postojece instalacije trazi rucnu migraciju sheme:
upgrade-pre-1.6.0.sql (dodaje AUDIT u guacamole_system_permission_type).
Nove instalacije to ne trebaju — initdb.sh generira aktualnu shemu.
Provjereno: sve tri ekstenzije se ucitavaju, TOTP enrollment i
korisnici prezivjeli migraciju, ban se okida na 5. pokusaju i pogadja
tocno IP napadaca — pristup s drugih adresa i kroz NPM ostaje ziv.
Prezivi reboot.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1) Debian/Ubuntu u jail.d/defaults-debian.conf postavlja globalni
backend = systemd. Nasi nginx jailovi ga nisu nadjacali, pa su
naslijedili systemd, ignorirali logpath i citali journal u kojem
nginx access loga nema. "fail2ban-client get nginx-basicauth
logpath" je vracao "No file is currently monitored" — jailovi
nikad nisu banali nista, iako fail2ban-regex nad istim logom
nalazi 48 poklapanja. Dodan eksplicitan backend = auto na oba
nginx jaila; sshd ostaje na systemd backendu gdje mu je mjesto.
2) Novo pitanje pri instalaciji: je li server iza reverse proxyja.
Ako da, generira se conf.d/guacamole-realip.conf sa
set_real_ip_from / real_ip_header X-Forwarded-For. Bez toga je
$remote_addr uvijek IP proxyja, pa bi fail2ban banirao proxy i
zakljucao sve korisnike odjednom, rate limit bi bio jedan
zajednicki budzet, a GeoIP bi gledao krivu adresu.
Provjereno iza Nginx Proxy Managera: direktan pristup i dalje daje
LAN IP, spoofani X-Forwarded-For s nepovjerljive adrese se ignorira,
a kroz proxy fail2ban sad biljezi stvarni javni IP klijenta.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
install.sh je nosio vlastitu kopiju Web GUI-ja u heredoc blokovima i ta
se kopija razisla s webgui/ direktorijem: inline verzija imala je 8
stranica, webgui/ ih ima 10. Stranice Backup i Azuriranja, koje README
i UPUTE.txt dokumentiraju, tako nikad nisu zavrsile na serveru.
Sada se app.py i predlosci kopiraju iz webgui/ pokraj skripte (SRC_DIR).
Uklonjeno ~1090 linija duplikata. Ako webgui/ nedostaje, skripta pukne s
jasnom porukom umjesto da instalira nepotpun GUI.
README i UPUTE dopunjeni: treba kopirati cijeli repo, ne samo install.sh.
Provjereno cistim installom na Ubuntu 24.04: svih 9 stranica vraca 200,
backup stvarno kreira arhivu s pg_dumpom i nginx/ssl konfiguracijom,
TOTP se ucitava, sve prezivi reboot.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1) Nakon uspjesnog logina redirect je isao na sirovi 'next' parametar.
'next' dolazi iz request.path, dakle bez SCRIPT_NAME prefiksa, pa je
/guacadmin/login?next=/ nakon prijave vodio na / -> /guacamole/.
Korisnik bi se prijavio i zavrsio na Guacamole login ekranu umjesto
na dashboardu. Sad se dodaje request.script_root, uz provjeru da je
next relativna putanja (open-redirect).
2) limit_req_zone je bio rate=10r/m - deset zahtjeva po MINUTI.
Guacamole je Angular SPA i na jedno otvaranje ispali desetke
zahtjeva, pa je nginx redom vracao 503 na app.js, app.css,
api/tokens i translations. Podignuto na 10r/s, burst 50.
Brute-force i dalje pokrivaju basic auth + fail2ban.
Provjereno: /guacadmin/ -> login -> /guacadmin/dashboard (200), svih
osam GUI stranica 200, 40 paralelnih zahtjeva na Guacamole API sve 200.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Flask slusa na rootu, a nginx ga proxira na ${GUI_PATH} (/guacadmin/).
Bez SCRIPT_NAME-a svi redirecti i url_for pozivi generirali su putanje
izvan prefiksa - / je redirectao na /login, sto nginx ne poznaje, pa je
GUI bio potpuno nedostupan (404 odmah nakon otvaranja).
Dodan PrefixMiddleware koji postavlja SCRIPT_NAME iz nove GUI_PATH
env varijable; systemd unit je sad prosljedjuje. Isto primijenjeno na
webgui/app.py i na inline kopiju u install.sh.
Provjereno: /guacadmin/ -> /guacadmin/login -> login -> /guacadmin/dashboard
(200), svi navigacijski linkovi ostaju pod prefiksom.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Preuzimanje je gadalo .jar, a Apache distribuira ekstenzije kao
.tar.gz -> wget je ostavljao 0-bajtni jar u extensions/.
- Volume ./extensions je montiran na /etc/guacamole/extensions, ali
stvarni GUACAMOLE_HOME u imageu je /home/guacamole/.guacamole, pa
se taj direktorij uopce nije citao.
Image vec sadrzi TOTP jar u /opt/guacamole/totp, pa se rucno
preuzimanje mice i koristi TOTP_ENABLED=true. GUACAMOLE_HOME je
postavljen na /etc/guacamole da montirani extensions/ posluzi kao
predlozak koji start.sh kopira - custom ekstenzije tako i dalje rade.
Provjereno: 'Extension "TOTP TFA Authentication Backend" (totp) loaded.'
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- POSTGRES_PASS generiranje: `tr ... </dev/urandom | head -c 32` puca
na SIGPIPE (exit 141). Uz `set -euo pipefail` install.sh je tiho
izlazio prije nego sto je ista instalirao. Zamijenjeno ogranicenim
citanjem: `head -c 512 /dev/urandom | tr -dc ... | cut -c1-32`.
- docker-compose.yml: guacamole/guacamole:1.5.5 trazi POSTGRESQL_USER,
a compose je postavljao POSTGRESQL_USERNAME. Kontejner je zavrsavao
u restart petlji s "FATAL: Missing required environment variables".
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
All-in-one installer za Apache Guacamole s Nginx reverse proxy,
fail2ban, SSL (Let's Encrypt / Self-signed), GeoIP blokiranjem
i Flask web GUI za upravljanje.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>