Skip to content

Instantly share code, notes, and snippets.

@aldidoanta
Last active February 23, 2021 18:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aldidoanta/b657b03dfbaab99b18b189883869f703 to your computer and use it in GitHub Desktop.
Save aldidoanta/b657b03dfbaab99b18b189883869f703 to your computer and use it in GitHub Desktop.

Menerapkan Signed Commit pada Git Menggunakan GPG

Index

Tentang Git Commit dan Spoofed Commit Author

Tentang Git Signed Commit dan GPG

Signed Commit Step 1: Menyiapkan Key Pair

Signed Commit Step 2: Set Git Config dan Export Public Key

Signed Commit Step 3: Tambahkan Public Key ke Layanan Git Hosting

Signed Commit Step 4: Gunakan Key untuk Melakukan Commit

Referensi

Tentang Git Commit

Git adalah salah satu version control system yang paling populer saat ini. Setelah meng-install Git di local machine yang baru, salah satu hal pertama yang kita lakukan adalah setup identitas berupa nama dan email, yang akan digunakan sebagai commit author. Biasanya identitas ini akan digunakan di beberapa Git repository (repo), sehingga config yang digunakan adalah global config seperti ini

$ git config --global user.name "Nama Saya"
$ git config --global user.email namasaya@example.com

Jika kita menggunakan layanan Git hosting (misalnya GitHub, GitLab, dan Bitbucket), email tersebut akan dicocokkan dengan email yang digunakan untuk akun Git hosting, sehingga user profile kita dapat dilihat di commit history.

Menggunakan Identitas Orang Lain Sebagai Commit Author

Namun informasi commit author ini bisa disalahgunakan. Kita dapat menggunakan nama dan email siapapun sebagai commit author. Untuk membuktikannya, saya membuat sebuah repo di GitHub sebagai contoh.

Tampilan commit history di GitHub. Commit pertama mempunyai label Verified karena dilakukan secara otomatis oleh GitHub.

Kemudian saya akan melakukan spoofing, di mana saya menggunakan identitas orang lain sebagai commit author. Selama saya tahu email yang digunakan seseorang di GitHub, saya bisa membuat commit atas nama user tersebut. Misalnya Head of Engineering di Jabar Digital Service, Yoga Hanggara.

Yang perlu dilakukan adalah mengganti nama dan email yang ada di git config. Perubahan config hanya perlu dilakukan di tingkat repo, sehingga option --global tidak digunakan.

$ git config user.name "Username"
$ git config user.email username@example.com 

Setelah itu, saya dapat mengubah file dan melakukan commit dan push seperti biasa.

Tampilan commit history setelah saya menggunakan identitas orang lain sebagai commit author

Commit dengan username yohang88 di atas dilakukan oleh saya sendiri, menggunakan akun GitHub pribadi saya. Commit history ini juga dapat dilihat di local machine menggunakangit log .

commit 9ebc8fcd310ea42d37b2bcaa9eb0d5e694864dcf (HEAD -> main, origin/main, origin/HEAD)
Author: Yoga <yoga@example.com>
Date:   Sun Feb 14 16:16:59 2021 +0700

commit using someone's name and email

commit b57b9c56fbf8aec217441ae5870373840f51fc30
Author: Aldi <aldi@example.com>
Date:   Sun Feb 14 15:31:30 2021 +0700

commit using my own name and email

commit 47c30a18fe7c47310d39b81ad8a727105db061b5
Author: Aldi <aldi@example.com>
Date:   Sun Feb 14 15:16:54 2021 +0700

Initial commit

Risiko Spoofed Commit Author

Melakukan spoofing terhadap identitas commit author punya level risiko yang beragam, tergantung repo dan user yang di-spoof.

Untuk repo skala kecil dengan contributor yang sedikit dan saling mengenal satu sama lain, spoofed commit dapat dicegah saat proses code review. Reviewer dapat mengecek commit yang ada di dalam sebuah Pull Request (PR) atau Merge Request (MR), dan dapat berkomunikasi dengan PR author jika ada hal yang mencurigakan.

Namun hal tersebut akan menjadi masalah jika repo tersebut berskala besar dan mempunyai banyak contributor, misalnya pada open source project yang populer. Jika proses code review tidak dilakukan dengan ketat, seseorang dapat memasukkan kode yang berbahaya, dan membuat commit atas nama user lain (misalnya project maintainer). Di kemudian hari, maintainer tersebut akan kebingungan karena ada commit asing yang menurutnya tidak pernah dia buat sebelumnya. Siapa yang sebenarnya melakukan commit hanya bisa dilacak melalui PR yang mengandung commit tersebut.

Tentang Git Signed Commit

Salah satu cara yang dapat dilakukan untuk mengatasi risiko spoofed author adalah dengan melakukan signing commit. Idenya, setiap commit ditambahkan digital signature yang digunakan sebagai bukti identitas yang sah. Informasi digital signature ini akan di-upload ke layanan Git hosting (misalnya GitHub), sehingga GitHub dapat memberikan label Verified untuk commit-commit tersebut. Fungsi label Verified ini mirip dengan label verified ☑️ yang ada di media sosial, yang meyakinkan user bahwa informasi yang sedang dilihat adalah informasi terverifikasi dan dapat dipercaya.

Tentang GPG

Untuk melakukan signing commit, kita dapat menggunakan GPG (GNU Privacy Guard) ataupun S/MIME (Secure/Multipurpose Internet Mail Extensions). Namun artikel ini hanya akan membahas commit signing menggunakan GPG.

GPG sendiri menggunakan asymmetric encyption, yang akan menghasilkan pasangan private key dan public key. Private key bersifat rahasia dan disimpan di local machine, sedangkan public key boleh disebar ke pihak yang membutuhakan. Ibaratnya, private key adalah stempel pribadi yang kita miliki, sedangkan public key adalah contoh cap yang bisa digunakan orang untuk memastikan keaslian stempel kita.

Private-public key yang dibuat menggunakan GPG dapat digunakan untuk beberapa hal, seperti membuat digital signature dan autentikasi Secure Shell (SSH).

Ilustrasi digital signature menggunakan pasangan private-public key. Image credit: https://exploitedbunker.com/articles/verifying-digital-signatures/

Signed Commit Step 1: Menyiapkan Key Pair

Jika kita pernah membuat PGP key pair sebelumnya (misalnya untuk autentikasi SSH), maka key pair tersebut dapat digunakan. Namun harus dipastikan bahwa key pair tersebut menggunakan nama dan email yang sesuai dengan akun Git hosting yang digunakan.

Jika kita belum punya key pair yang dibutuhkan, maka kita harus membuat key pair baru.

  1. Pastikan GPG sudah di-install di local machine. OS berbasis Linux pada umumnya sudah ter-install GPG sejak awal.

    \

  2. Jalankan command berikut untuk membuat key pair yang baru.

    \

gpg --full-generate-key
  1. Pilih algoritma enkripsi. RSA adalah pilihan default dan paling umum digunakan.
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1
  1. Pilih key length. Saya set di angka tertinggi, 4096 bits.
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072)
  1. Pilih expiration time. Pilihan default adalah tidak ada expiration time. Jika kita ingin memasang expiration time untuk memperkuat keamanan, kita bisa gunakan notasi yang ditampilkan di shell. Misalnya jika kita ingin key ini berlaku selama satu tahun, maka kita isi dengan notasi 1y.
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 1y
  1. Setelah melakukan konfirmasi, langkah selanjutnya adalah pengisian identitas berupa nama, email, dan comment (opsional). Untuk bagian email, pastikan email yang dimasukkan adalah email terverifikasi yang digunakan di akun Git hosting kita.

  2. Setelah mengkonfirmasi identitas pribadi, langkah terakhir adalah mengisi passphrase untuk key pair yang akan dibuat.

Signed Commit Step 2: Set Git Config dan Export Public Key

  1. Jalankan command berikut untuk melihat daftar key pair yang sudah dibuat.

    \

# Melihat semua key
gpg --list-secret-keys --keyid-format LONG

# Melihat semua key yang menggunakan email name@example.com
gpg --list-secret-keys --keyid-format LONG name@example.com

Tampilan di shell kurang lebih akan seperti ini.

sec   rsa4096/62E5DB1B0C06DA93 2021-02-21 [SC] [expires: 2022-02-21]
      C89BF790113DE68E45CA5FD962E5DB1B0C06DA93
uid                 [ultimate] Aldi Doanta Kurnia <aldi@example.com>
ssb   rsa4096/158A03B594F171A5 2021-02-21 [E] [expires: 2022-02-21]

GPG key ID yang digunakan adalah yang ada di baris pertama, yang menggunakan prefix sec (secret key). Berdasarkan contoh di atas, key ID adalah 62E5DB1B0C06DA93.

  1. Masukkan GPG key ID tersebut ke dalam Git config. Disarankan menggunakan option --global jika key ID ingin digunakan di seluruh Git repo.
# Set Git global config untuk menggunakan GPG Key ID 62E5DB1B0C06DA93
git config --global user.signingkey 62E5DB1B0C06DA93
  1. Jalankan command berikut untuk meng-export public key dengan GPG key ID yang tadi kita dapatkan.
# Melakukan export public key dengan GPG key ID 62E5DB1B0C06DA93
gpg --armor --export 62E5DB1B0C06DA93

Shell akan menampilkan public key dengan format sebagai berikut.

-----BEGIN PGP PUBLIC KEY BLOCK-----
...
-----END PGP PUBLIC KEY BLOCK-----

Public key inilah yang akan kita submit ke layanan Git hosting.

Signed Commit Step 3: Tambahkan Public Key ke Layanan Git Hosting

Saya akan menggunakan GitHub sebagai contoh layanan Git hosting.

  1. Login ke akun GitHub, lalu masuk ke https://github.com/settings/keys

  2. Di bagian GPG Keys, akan ditampilkan daftar key yang pernah ditambahkan. Klik New GPG Key untuk menambahkan key yang baru.

  3. Masukkan public key yang kita dapatkan dari step 2, lalu klik Add GPG Key.

Signed Commit Step 4: Gunakan Key untuk Melakukan Commit

Untuk menggunakan key yang sudah dibuat sebelumnya, tambahkan option -S saat melakukan commit. Kemudian masukkan passphrase untuk key tersebut.

git commit -S -m "signed commit"

Jika kita ingin menerapkan signed commit untuk semua commit berikutnya, kita bisa set di dalam Git config. Disarankan menggunakan option --global jika signed commit ingin diterapkan di seluruh Git repo.

git config --global commit.gpgsign true

Setelah config tersebut di-set, kita tidak perlu menggunakan option -S saat melakukan commit.

Untuk melihat signed commit yang sudah dibuat, kita bisa menggunakan git log --show-signature . Tampilan signed commit kurang lebih akan seperti ini.

commit 48f00135b7ef1f7aa6f3fe33e7265542b18f4171 (HEAD -> main, origin/main, origin/HEAD)
gpg: Signature made Tue 23 Feb 2021 06:18:23 PM WIB
gpg:                using RSA key C89BF790113DE68E45CA5FD962E5DB1B0C06DA93
gpg: Good signature from "Aldi Doanta Kurnia <aldi@example.com>" [ultimate]
Author: Aldi Doanta <aldi@example.com>
Date:   Tue Feb 23 18:18:23 2021 +0700

    signed commit using my own name and email

Tampilan Signed Commit di Layanan Git Hosting

GitHub

GitLab

Referensi

https://mikegerwitz.com/2012/05/a-git-horror-story-repository-integrity-with-signed-commits

https://medium.com/@pjbgf/spoofing-git-commits-7bef357d72f0

https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work

https://docs.github.com/en/github/authenticating-to-github/managing-commit-signature-verification

https://docs.gitlab.com/ee/user/project/repository/gpg_signed_commits/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment