Lewati ke konten

Praktik 7: GeoServer

InternalSebagian terujiArti badge ini

Materi Praktik 7 mengajarkan menjalankan GeoServer, membuat workspace, menyambung data store PostGIS, mempublikasikan layer, lalu mengatur hak akses layer. Seluruh langkahnya dikerjakan di antarmuka web GeoServer.

Berkas yang diperiksa:

  • Praktik 7/ Praktik 7: Penggunaan Geoserver (.docx)
  • Praktik 7/GeoServer_Presentasi.pptx
  • Praktik 11/2. Praktik Deploy Project: Google Cloud Platform (.docx), rujukan firewall

P7-1. Firewall yang dibutuhkan tidak pernah dibuat (Tinggi)

Section titled “P7-1. Firewall yang dibutuhkan tidak pernah dibuat (Tinggi)”

Praktik 7 meminta membuka GeoServer dari browser, dan Praktik 11 meminta SSH ke VM serta membuka portal. Ketiganya menuntut dua aturan firewall:

Aturan Untuk
allow-webgis-http Port 80 dan 443, supaya portal dan GeoServer terbuka
allow-webgis-iap-ssh Port 22 dari rentang IAP, supaya SSH bisa masuk

Materi hanya memeriksa keduanya:

Terminal window
gcloud compute firewall-rules list \
--filter="name:(allow-webgis-http OR allow-webgis-iap-ssh)"

Tidak ada satu pun perintah gcloud compute firewall-rules create di seluruh materi. Kedua aturan itu diandaikan sudah ada, dan tidak dijelaskan siapa yang membuatnya.

Akibatnya bergantung pada skema yang dipakai:

  • Pada skema project kelompok, akun master yang membuatnya. Peserta yang membaca materi akan mengira dirinya harus membuatnya sendiri, lalu bentrok dengan nama yang dipakai bersama.
  • Pada skema satu project satu orang, tidak ada yang membuatnya. SSH lewat IAP gagal lebih dahulu, sehingga seluruh langkah Praktik 11 setelah itu tidak bisa dijalankan.

Daftar hasil yang kosong juga tidak dijelaskan. Peserta tidak tahu apakah itu berarti firewall-nya belum siap atau ada yang salah dengan projectnya.

P7-2. GeoServer memakai kredensial super user database (Tinggi)

Section titled “P7-2. GeoServer memakai kredensial super user database (Tinggi)”

Praktik 7 meminta mengisi data store dengan “koneksi sesuai dengan koneksi PostgreSQL anda”, dan koneksi yang tersedia adalah user postgres. Pola yang sama dipakai di Praktik 11.

GeoServer lalu memegang kredensial yang bisa menghapus tabel. Salah memilih tabel saat membuat store sudah cukup untuk merusak data, dan kredensial itu juga tersimpan di dalam konfigurasi GeoServer pada volume geoserver-data.

P7-3. GEOSERVER_CORS_ALLOWED_ORIGINS tidak dibaca image kartoza (Sedang)

Section titled “P7-3. GEOSERVER_CORS_ALLOWED_ORIGINS tidak dibaca image kartoza (Sedang)”

Praktik 11 menyetel dua variabel ini pada service geoserver:

- GEOSERVER_CORS_ENABLED=true
- GEOSERVER_CORS_ALLOWED_ORIGINS=*

Saya periksa source image kartoza/docker-geoserver. Fungsi web_cors() pada scripts/functions.sh hanya menyalin berkas web.xml bawaan, dan tidak ada satu baris pun yang membaca kedua variabel tersebut. Pada scripts/env-data.sh juga tidak ada.

CORS sebenarnya diatur di build_data/web.xml dengan cors.allowed.origins bernilai *, dan nilainya selalu *.

Artinya dua baris itu konfigurasi mati. Mengubahnya menjadi domain tertentu juga tidak akan berpengaruh, dan origin tetap terbuka untuk semua.

P7-4. Tidak ada pemeriksaan otomatis untuk klaim akses publik (Sedang)

Section titled “P7-4. Tidak ada pemeriksaan otomatis untuk klaim akses publik (Sedang)”

Praktik 7 ditutup dengan klaim:

Buka browser dalam Incognito mode, copy url GeoJSON lalu buka di Incognito, layer akan terbuka tanpa muncul permintaan login karena layer sudah diberikan akses publik

Klaim ini tidak disertai cara membuktikannya selain membuka Incognito secara manual. Peserta tidak punya cara mengetahui apakah hak aksesnya benar tanpa mengulang pemeriksaan itu.

P7-5. Namespace URI memakai alamat yang akan berubah (Rendah)

Section titled “P7-5. Namespace URI memakai alamat yang akan berubah (Rendah)”

Materi meminta mengisi Namespace URI dengan domain GeoServer saat ini diikuti nama workspace, dan Praktik 11 memakai http://IP_EKSTERNAL_VM/geoportal. Namespace URI melekat pada setiap layer dan tidak ikut berubah saat alamatnya berganti ke subdomain atau HTTPS. Layer yang dipublikasikan sebelum alamatnya tetap akan memakai alamat lama.

Bagi tugasnya dengan tegas, dan tulis di modul siapa mengerjakan apa:

Aturan Dibuat oleh Peserta
allow-webgis-http Penyelenggara, sekali per project Hanya memeriksa
allow-webgis-iap-ssh Penyelenggara, sekali per project Hanya memeriksa

Lalu tambahkan hasil yang harus muncul di modul, supaya daftar kosong tidak menimbulkan tebakan:

Terminal window
gcloud compute firewall-rules list \
--filter="name:(allow-webgis-http OR allow-webgis-iap-ssh)" \
--format="table(name,direction,allowed[].map().firewall_rule().list())"

Dua baris harus muncul. Bila kosong, peserta berhenti dan melapor, tidak membuat sendiri.

Buat peran khusus baca-saja untuk GeoServer:

Terminal window
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 \
-v sandi_geoserver='GANTI_SANDI_KUAT' -f 01_peran_geoserver.sql

Berkas itu membuat dua peran: geoserver_ro untuk publikasi layer, dan geoserver_rw bila nanti ada fitur edit. Keduanya bukan super user, dan hanya geoserver_ro yang perlu dipakai pada data store.

Isi form data store PostGIS dengan peran itu, bukan dengan postgres.

Hapus dua baris ini dari docker-compose.yml, karena tidak dibaca image:

- GEOSERVER_CORS_ENABLED=true
- GEOSERVER_CORS_ALLOWED_ORIGINS=*

CORS yang berlaku diatur build_data/web.xml dengan cors.allowed.origins bernilai *. Bila perlu dibatasi, caranya dengan menyalin web.xml ke volume EXTRA_CONFIG_DIR, bukan lewat variabel lingkungan.

Pada skema ini Nginx melayani aplikasi dan GeoServer pada origin yang sama, sehingga CORS tidak diperlukan sama sekali.

Ganti langkah Incognito manual dengan perintah yang bisa diulang:

Terminal window
curl -sS -o /dev/null -w "%{http_code}\n" \
"http://IP_VM/geoserver/wfs?service=WFS&version=2.0.0\
&request=GetFeature&typeNames=geoportal:batas_admin&outputFormat=application/json&count=1"

Kode 200 berarti layer terbuka untuk publik. Kode 401 atau 403 berarti hak aksesnya belum disetel, dan peserta tahu persis langkah mana yang kurang.

Berkas periksa-geoserver.mjs melakukan pemeriksaan ini beserta empat pemeriksaan lain dalam satu perintah.

Tetapkan alamat akhir lebih dahulu, lalu pakai alamat itu sejak awal. Bila belum tahu, pakai bentuk yang tidak akan berubah:

http://IP_STATIS_VM/geoportal

Alamat IP statis tidak berubah, sedangkan nama host bisa berubah. Namespace URI melekat pada setiap layer dan tidak ikut berubah saat alamatnya berganti.

Berkas Isi
Praktik 7/sql/01_peran_geoserver.sql Peran geoserver_ro dan geoserver_rw
Praktik 7/tools/periksa-geoserver.mjs Periksa login, workspace, store, layer, akses publik, dan CORS
Butir Tingkat Inti
P7-1 Tinggi Firewall yang dibutuhkan tidak pernah dibuat
P7-2 Tinggi GeoServer memakai kredensial super user database
P7-3 Sedang Dua variabel CORS tidak dibaca image yang dipakai
P7-4 Sedang Klaim akses publik tidak bisa diperiksa otomatis
P7-5 Rendah Namespace URI memakai alamat yang akan berubah