Peluncuran Modul Mirror dan Basisdata Checksum

Katie Hockman
29 Agustus 2019

Kami sangat senang memberitahu bahwa modul mirror, indeks, dan basisdata checksum telah diluncurkan! Perintah go akan menggunakan modul mirror dan basisdata checksum secara baku untuk pengguna Go 1.13 modul. Lihat halaman privasi untuk informasi privasi penggunaan layanan tersebut dan dokumentasi perintah go untuk detail konfigurasi, termasuk cara mematikan fitur modul tanpa menggunakan server tersebut atau menggunakan server yang berbeda. Jika Anda bergantung pada modul yang tidak publik, lihat dokumentasi konfigurasi untuk lingkungan Anda.

Artikel ini akan menjelaskan tentang layanan-layanan ini and keuntungan dari menggunakan mereka, dan menyimpulkan beberapa poin dari wicara Go Module Proxy: Life of a Query di Gophercon 2019. Lihat wicara tersebut jika Anda tertarik melihat keseluruhan diskusi.

Modul mirror

Modul adalah sekumpulan paket-paket Go yang diberi versi, dan isi dari setiap versi tersebut adalah immutable (kekal). Sifat kekekalan tersebut membuatnya bisa di-cache dan diautentikasi. Bila "go get" berjalan dengan mode modul, ia harus mengambil modul yang berisi paket yang diminta, berikut dengan dependensinya, mengubah berkas go.mod dan go.sum bila diperlukan. Mengambil modul langsung lewat version control sangat membutuhkan biaya, baik secara latensi atau penyimpanan, dalam sistem Anda: perintah go dipaksa untuk menarik semua histori commit dari sebuah repositori yang berisi dependensi transitif, bahkan yang tidak dibutuhkan, hanya supaya dapat memeriksa versinya.

Solusinya yaitu menggunakan sebuah modul proxy, yang memiliki API yang cocok dengan kebutuhan perintah go (lihat "go help goproxy"). Saat "go get" berjalan dalam mode modul dengan sebuah proxy, ia akan berjalan lebih cepat dengan hanya meminta metadata modul tertentu atau sumber kode yang ia butuhkan, dan tidak perlu khawatir dengan hal-hal lainnya. Berikut ini sebuah contoh bagaimana perintah go menggunakan proxy lewat "go get" yang meminta daftar versi, kemudian informasi, berkas mod, dan zip untuk versi yang di tag terakhir kali.

proxy-protocol

Sebuah modul mirror adalah sebuah modul proxy khusus yang men-cache metadata dan sumber kode di dalam sistem penyimpanannya sendiri, yang membolehkan mirror melayani sumber kode yang tidak ada lagi pada lokasi aslinya. Hal ini bisa mempercepat pengunduhan dan melindungi Anda dari dependensi yang hilang. Lihat Go Modul di 2019 untuk informasi lebih lanjut.

Tim Go menjaga sebuah modul mirror, di proxy.golang.org, yang mana akan digunakan oleh perintah go secara baku untuk pengguna modul sejak Go 1.13. Jika Anda menggunakan versi terdahulu dari perintah go, maka Anda dapat menggunakan layanan ini dengan menset GOPROXY=https://proxy.golang.org di dalam lingkungan lokal Anda.

Basisdata checksum

Modul memperkenalkan berkas go.sum, yang berisi daftar hash SHA-256 dari sumber kode, dan berkas go.mod dari setiap dependensi saat ia pertama kali diunduh. Perintah go dapat menggunakan hash tersebut untuk mendeteksi perilaku jahat dari server asli atau proxy yang memberikan Anda kode yang berbeda untuk versi yang sama.

Batasan dari berkas go.sum ini adalah ia bekerja sepenuhnya berdasarkan kepercayaan Anda pada saat pertama kali digunakan. Saat Anda menambahkan sebuah versi dari dependensi yang Anda belum pernah gunakan sebelumnya ke modul Anda (bisa juga lewat memperbarui dependensi yang sudah ada), perintah go mengambil kode dan menambahkan baris ke berkas go.sum secara langsung. Permasalahannya adalah baris baru pada go.sum tersebut tidak diperiksa dengan yang lainnya: ia bisa saja berbeda dengan baris go.sum yang perintah go hasilkan buat orang lain, mungkin karena sebuah proxy secara sengaja memberikan kode jahat yang ditargetkan kepada Anda.

Solusi Go yaitu sebuah sumber global dari baris-baris go.sum, yang disebut basisdata checksum, yang memastikan supaya perintah go selalu menghasilkan baris yang sama untuk setiap berkas go.sum. Setiap kali perintah go menerima sumber kode baru, ia dapat memverifikasi hash dari kode tersebut dengan basisdata global untuk memastikan bahwa hash-nya sama, memastikan bahwa semua orang menggunakan kode yang sama untuk versi tertentu.

Basisdata checksum dilayani oleh sum.golang.org, dan dibangun di atas Transparent Log (atau "Merkle tree") dari hash-hash yang didukung oleh Trillian. Keuntungan utama dari Merkle tree yaitu tahan rusak dan memiliki properti yang tidak membolehkan perilaku jahat tidak terdeteksi, yang membuatnya lebih dipercaya daripada hanya basisdata biasa. Perintah go menggunakan tree ini untuk memeriksa bukti "inclusion" (bahwa sebuah catatan tertentu ada dalam log) dan bukti "konsistensi" (bahwa tree belum pernah dirusak) sebelum menambahkan baris go.sum yang baru ke dalam berkas go.sum modul Anda. Berikut ini adalah sebuah contoh dari sebuah tree tersebut.

tree

Basisdata chekcsum mendukung sekumpulan endpoint yang digunakan oleh perintah go untuk meminta dan memverifikasi baris-baris go.sum. Endpoint /lookup menyediakan sebuah "signed tree head" (STH) dan baris-baris go.sum yang diminta. Endpoint /tile menyediakan bagian dari tree yang disebut tiles yang mana perintah go dapat gunakan untuk pembuktian. Berikut ini adalah sebuah contoh bagaimana perintah go berinteraksi dengan basisdata checksum dengan melakukan /lookup dari sebuah versi modul, kemudian meminta tiles yang dibutuhkan untuk pembuktian.

sumdb-protocol

Basisdata checksum ini membolehkan perintah go secara aman menggunakan proxy yang tidak dipercaya. Karena ada lapisan keamanan yang teraudit berdiri di atasnya, sebuah proxy atau server asli tidak akan dapat secara sengaja, atau tidak sengaja, memberikan Anda kode yang salah tanpa terdeteksi. Bahkan penulis dari sebuah modul tidak dapat memindahkan tag begitu saja atau suatu hari mengubah kode pada versi tertentu tanpa terdeteksi.

Jika Anda menggunakan Go 1.12 atau sebelumnya, Anda dapat secara manual memeriksa berkas "go.sum" dengan basisdata checksum dengan gosumcheck:

$ go get golang.org/x/mod/gosumcheck
$ gosumcheck /path/to/go.sum

Selain verifikasi yang dilakukan oleh perintah go, auditor pihak ketiga dapat memeriksa apakah basisdata checksum dapat dipercaya dengan membaca log satu per satu untuk mencari catatan yang salah. Mereka dapat bekerja bersama-sama dan berkomunikasi tentang status dari tree saat ia terus bertambah untuk memastikan ia tetap aman, dan kami harap komunitas Go akan menjalankannya.

Modul indeks

Modul indeks dilayani oleh index.golang.org, yang berisi daftar versi modul yang baru yang tersedia dalam proxy.golang.org. Hal ini sangat berguna bagi pengembang perkakas yang ingin menyimpan cache proxy.golang.org buat mereka sendiri, atau untuk selalu tetap mutakhir dengan modul-modul terbaru yang orang gunakan.

Umpan balik atau bug

Kami berharap layanan-layanan ini meningkatkan pengalaman Anda dengan modul, dan mendukung Anda untuk melaporkan isu jika Anda menemukan masalah atau memiliki umpan balik!