Git adalah sistem versioning yang banyak digunakan. Di antaranya dipakai oleh pengembang aplikasi sebagai repositori proyek. Digunakan untuk merekam perubahan-perubahan dari berbagai berkas dari waktu ke waktu.

Dengan sistem versioning ini memungkinkan untuk mengembalikan berkas-berkas atau bahkan mengembalikan seluruh proyek kembali ke keadaan sebelumnya, membandingkan perubahan-perubahan di setiap waktu, melihat siapa yang terakhir mengubah sesuatu yang mungkin menimbulkan masalah, siapa dan kapan yang mengenalkan sebuah isu dan banyak lagi.

GitHub adalah salah satu layanan repositori Git. Banyak proyek open source menggunakan Github untuk menyimpan Git, pelacakan masalah, tinjauan kode, dan hal-hal lainnya. Tetapi untuk alasan kontrol, dikarenakan penyimpanan GitHub terpusat di server mereka, langkah terbaik untuk meletakkan repositori Git berada di server milik sendiri.

Tulisan ini dikhususkan membahas tentang membuat server Git yang diakses menggunakan SSH. Server Git dapat dipasang di jaringan lokal seperti menggunakan server berdaya rendah dengan komputer ARM atau melalui Internet dengan menyewa cloud server.

Memasang Git

Setidaknya ada dua komputer yang sudah siap digunakan untuk praktek. Pertama komputer server yang diakses remote menggunakan SSH dan satu lagi komputer lokal.

Komputer yang digunakan sebagai server Git menggunakan sistem operasi Linux Ubuntu, tapi bisa diaplikasikan di distro Linux lainnya seperti Debian atau CentOS. Sedangkan komputer lokal bisa dipasang juga sistem operasi Linux, atau bisa juga menggunakan Windows.

Pasang Git dengan perintah berikut:

$ sudo apt-get install git-core

Jika menggunakan CentOS, memasang Git dengan perintah:

$ sudo yum install git

Sedangkan pengguna Windows dapat mengakses server Git dengan memasang Git for Windows yang dapat di download dari https://git-scm.com/download/win.

Shell Git di Windows

Setelah itu lakukan konfigurasi untuk memasukkan beberapa informasi tentang pengguna yang digunakan saat melakukan perintah commit pada Git. Lakukan perintah git config dengan menyediakan informasi nama dan surel sebagai berikut:

$ git config --global user.name "Nama Pengguna"
$ git config --global user.email "[email protected]"

Menyiapkan Server

Buatlah pengguna baru di Linux bernama git. Pengguna ini yang akan digunakan untuk mengakses repositori ke server melalui SSH.

$ sudo useradd -r -u 170 -d /srv/git -s /usr/bin/git-shell -c "Git User" git

Ada beberapa opsi yang digunakan dalam perinah useradd. Dua opsi -r -u 170 berarti pengguna adalah pengguna sistem dengan UID 170, silahkan ganti UID sesuai kebutuhan sistem. Sedangkan opsi -s /usr/bin/git-shell mengatur shell default pengguna git agar bisa berinteraksi melalui koneksi SSH tapi tidak bisa login klien SSH secara remote.

Opsi -d /srv/git menunjukkan bahwa direktori home pengguna git berada di direktori /srv/git. Buat direktori baru dengan kepemilikan dan akses ditujukan untuk pengguna git:

$ sudo mkdir /srv/git
$ sudo chmod 770 /srv/git
$ sudo chown git:git /srv/git

Sampai di sini, pengguna git siap untuk digunakan. Untuk memastikannya, cobalah login sebagai pengguna git dengan perintah sudo su git dengan menambahkan opsi -s /bin/bash (perlu diingat bahwa pengguna git menggunakan shell default /usr/bin/git-shell).

$ sudo su git -s /bin/bash

Selanjutnya buat proyek Git baru dengan serangkaian perintah berikut:

$ cd
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/

Akses ke Server

Untuk memudahkan akses ke server, kita akan membuat koneksi SSH tanpa password. Pertama buatlah kunci SSH dengan perintah berikut:

$ ssh-keygen -t rsa

Dari perintah ssh-keygen di atas akan menghasilkan kunci pribadi disimpan dalam file .ssh/id_rsa dan kunci publik yang disimpan dalam file .ssh/id_rsa.pub, keduanya berada di direktori home pengguna komputer lokal. Simpan baik-baik kunci pribadi secara rahasia, sedangkan kunci publik akan dikirinkan ke komputer server sebagai akses.

Unggah file kunci publik tersebut ke server Git agar komputer lokal bisa mengakses server melalui koneksi SSH. Kita asumsikan kunci publik diunggah menggunakan aplikasi scp ke server git yang mempunyai hostname gitserver di penyimpanan sementara /tmp:

$ scp ~/.ssh/id_rsa.pub pengguna@gitserver:/tmp/id_rsa.pengguna1.pub

Sedangkan di komputer server, buatlah berkas .ssh/authorized_keys di direktori home pengguna git. Berkas tersebut berisikan kunci-kunci publik para pengguna yang dapat mengakses komputer server melalui SSH.

$ sudo su git -s /bin/bash
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

Semua kunci publik yang telah diunggah di direktori sementara /tmp dimasukkan ke berkas .ssh/authorized_keys:

$ cat /tmp/id_rsa.pengguna1.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.pengguna2.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.pengguna3.pub >> ~/.ssh/authorized_keys

Tambahkan semua kunci publik pengguna komputer lokal yang ingin melakukan akses repositori Git di file .ssh/authorized_keys. Isi file tersebut kurang lebih seperti di bawah ini:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEwENNMomTbo... pengguna1@laptop-ubuntu
ssh-rsa AAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN... pengguna2@pc-windows
.....

Menyiapkan Repositori di Komputer Lokal

Masuk ke direktori proyek di komputer lokal kemudian atur agar server remote mengarah ke server Git yang telah dibuat sebelumnya dan kirimkan commit pertama.

$ cd myproject
$ git init
$ git add .
$ git commit -m 'Initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master

Lakukan pula perintah clone repositori Git di atas di komputer lain. Coba lah edit satu berkas, misalkan ganti berkas README, kemudian lakukan commit dan naikkan ke server.

$ git clone git@gitserver:/srv/git/project.git
$ cd project
$ vim README
$ git commit -am 'Fix for README file'
$ git push origin master

Selain menggunakan klien Git berbasis baris perintah, server Git juga dapat diakses dengan klien Git berbasis grafis. Berikut adalah tampilan Sourcetree, sebuah klien Git berbasis grafis di Windows.

Aplikasi Sourcetree, klien Git berbasis grafis di Windows. https://www.sourcetreeapp.com/

Menambah Kemanan Koneksi SSH

Pengguna Git mempunyai shell default /usr/bin/git-shell. Koneksi SSH digunakan hanya untuk menjalankan perintah-perintah Git, seperti clone, push atau pull melalui Git Server. Tapi Git tidak dapat diakses secara remote menggunakan klien SSH.

$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.

Tetapi sampai di sini masih ada celah keamanan yang harus diperbaiki. Pengguna masih dapat port forwarding menggunakan SSH melalui server Git. Untuk mencegah itu tambahkan opsi berikut pada setiap key di berkas .ssh/authorized_keys

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

Hasil dari pembatasan di atas akan menghasilkan output sebagai berikut:

$ cat ~/.ssh/authorized_keys
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4....
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDEwENNMomTboYI+LJieaAY16qiXiH3wuvENhBG...