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.
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.
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...