Gitolite İle Git Depo Erişimi

yazar:

kategori:

Gitolite sunucu üzerinde bulunan Git depolarına (repository) erişimi kontrol etmek için kullanılan bir ara katman. Gitolite ile kullanıcılara SSH protokolü aracılığı ile depo bazında okuma ve yazma hakları tanımak mümkün. Bu yazımda Gitolite kurulumu ve depo erişim haklarının nasıl tanımlandığını örnekler üzerinde göstermek istiyorum.

Geolite kurulumuna başlamadan önce Git sunucusu olacak bilgisayar üzerinde git isminde bir sistem kullanıcısı oluşturmamız gerekiyor.

[sourcecode language=”java”]
$ adduser -r git
[/sourcecode]

Root olarak login yaptığımız sunucuda git isimli kullanıcıyı oluşturduktan sonra, Gitolite kurulum işlemine başlayabiliriz.

[sourcecode language=”java”]
$ su – git
$ mkdir -p ~/bin
$ git clone git://github.com/sitaramc/gitolite
$ gitolite/install -ln ~/bin
$ gitolite setup -pk gitadmin.pub
[/sourcecode]

Gitolite kurulumunu yapabilmek için gitadmin.pub isminde bir public anahtara ihtiyacımız var. Bu anahtarı şu şekilde oluşturabiliriz (Bu işlemi Git sunucusu üzerinde ya da başka başka bir bilgisayarda yapabilirsiniz. Git Bash bünyesinde de ssh-keygen komutu mevcut, yani Windows altında bile bu anahtar çiftini oluşturabilirsiniz):

[sourcecode language=”java”]
$ ssh-keygen -t rsa -f gitadmin
[/sourcecode]

Bu işlemin ardından aşağıdaki anahtar çifti oluşmuş olur:

[sourcecode language=”java”]
$ ls -l
total 5
-rw-r–r– 1 oezcanac Administ 1679 Nov 26 12:03 gitadmin
-rw-r–r– 1 oezcanac Administ 402 Nov 26 12:03 gitadmin.pub
[/sourcecode]

gitadmin private yani gizli ve kullanıcıda kalması gereken, gitadmin.pub public yani herkesin görebileceği açık anahtar parçasıdır. Gitolite kurulumunu public anahtar ile yapmamız gerekiyor.

Gitolite kurulumunu gerçekleştirdikten sonra, dizin yapısı aşağidaki şekilde olacaktır:

[sourcecode language=”java”]
$ ls -l
drwxrwxr-x. 2 git git 4096 Nov 26 11:13 bin
-rw-r–r–. 1 git git 402 Nov 26 11:09 gitadmin.pub
drwxrwxr-x. 6 git git 4096 Nov 26 11:12 gitolite
-rw——-. 1 git git 0 Nov 26 13:09 projects.list
drwx——. 5 git git 4096 Nov 26 12:07 repositories
[/sourcecode]

repositories dizininde git depoları bulunmaktadır. Başlangıçta Gitolite aşağıdaki depoları oluşturur:

[sourcecode language=”java”]
ls -l
total 12
drwx——. 8 git git 4096 Nov 26 13:09 gitolite-admin.git
drwx——. 7 git git 4096 Nov 26 12:13 testing.git
[/sourcecode]

Gitolite kullanıcı erişim haklarını gitolite-admin.git ismini taşıyan Git deposu üzerinden yönetmektedir. Git depolarına erişim hakkı tanımak istediğimiz kullanıcıların public anahtarlarını bu depoya eklememiz gerekiyor. Bu amaçla önce bu depoyu klonlamamız gerekiyor. Şu şekilde yapıyoruz:

[sourcecode language=”java”]
git clone git@gitsunucusu:gitolite-admin
[/sourcecode]

Bu şekilde gitolite-admin deposunu klonlamak istedigimde, git SSH protokolünü kullanmaktadır. Klonlama işlemini kendi desktop bilgisayarım üzerinde yapıyorum. Gitolite ve Git depolarının bulunduğu sunucu gitsunucusu ismine ve 192.168.1.10 ip adresine sahip. Kendi bilgisayarımdan Git sunucusuna bağlanabilmem için Gitolite kurulumunu yaparken kullandığım anahtarın gizli olan private anahtar parçasını kullanmak gerekiyor. Sadece bu anahtar yardımıyla gitolite-admin deposunu klonlayabilirim, çünkü sadece bu anahtarın gitolite-admin deposuna erişim hakkı var.

Şimdi oluşturduğum ve kullandığım anahtar çiftinin nasıl olduğunu tekrar hatırlayalım:

[sourcecode language=”java”]
$ ls -l
total 5
-rw-r–r– 1 oezcanac Administ 1679 Nov 26 12:03 gitadmin
-rw-r–r– 1 oezcanac Administ 402 Nov 26 12:03 gitadmin.pub
[/sourcecode]

Gizli olan gitadmin anahtarını OpenSSH formatına dönüştürmem gerekiyor. Bunu puttygen.exe ile yapabilirim:

gitolite_puttygen

Bu amaçla Load butonuna tıklayarak, gizli olan anahtar parçasını yüklüyorum. Akabinde Export OpenSSH key menüsüyle dönüşümü gerçekleştiriyorum.

gitolite_puttygen2

Yeni anahtarın id_rsa ismi altında C:\Users\kullanici-ismi\.ssh dizinine yerleştirilmesi gerekiyor. Klonlama işleminde SSH protokolü ile sunucuya bağlanıldığında, ssh.exe bu dizinde olan id_rsa anahtarını kullanacaktır.

Bir şeyi daha kontrol etmemiz gerekiyor. Klonlama işlemini gerçekleştirdiğimiz bilgisayar ile Gitolite sunucusunun aynı SSH implementasyonunu kullanmaları gerekiyor. Bu benim örneğimde OpenSSH.

Yerel bilgisayarda hangi ssh implementasyonun kullanıldığını şu şekilde bulabiliriz.

[sourcecode language=”java”]
where ssh
C:\ProgramFiles\Git\bin\ssh.exe
[/sourcecode]

Peki Git klonlama işleminde hangi SSH implementasyonunu kullanıyor?

[sourcecode language=”java”]
set GIT_SSH
GIT_SSH=C:\Program Files\TortoiseSVN\bin\TortoisePlink.exe
[/sourcecode]

Git’in kullandığı SSH implementasyonunu tayin etmek için GIT_SSH isminde bir çevre değişkeninin tanımlanmış olması gerekiyor. Yukarıdaki örnekte Tortoise Git client ile gelen ssh implementasyonunu kullanmaktayım. Bu sunucu bağlantılarında sorun oluşturdu, çünkü kullanıcı ve sunucu SSH implementasyonları uyumlu değil. Bu yüzden GIT_SSH parametresinin içeriğini şu şekilde değiştirdim:

[sourcecode language=”java”]
set GIT_SSH=C:\ProgramFiles\Git\bin\ssh.exe
[/sourcecode]

Bunun ardından klonlama işlemini şu şekilde gerçekleştirebiliriz:

[sourcecode language=”java”]
git clone git@gitsunucusu:gitolite-admin
[/sourcecode]

Bu işlemin hangi safhalardan oluştuğunu tekrar özetleyelim:

  • Git clone komutu ssh protokolünü kullanarak gitsunucusu isimli sunucuya bağlanıyor. Git’in kullandığı SSH implementasyonun lokasyonu GIT_SSH isimli değişken bünyesinde kayıtlı.
  • Kullanılan SSH implementasyonu kullanıcının .ssh dizininde bulunan id_rsa isimli gizli anahtar yardımıyla gerekli şifreleme işlemini gerçekleştiriyor. Kullanıcı ile sunucu arasındaki işlem tamamen public/private anahtar çifti aracılığı ile gerçekleşiyor. Bağlantı için ne bir kullanıcı ismi ne de bir şifre gerekli.
  • Sunucuda bulunan SSH implementasyonu bağlantı isteğini git isimli kullanıcı aracılığı ile karşılıyor. Bu kullanıcının .ssh dizininde bulunan authorized_keys dosyasında bağlantı isteğini gerçekleştiren kullanıcının public anahtarının kayıtlı olması gerekiyor. Gitolite kurulumu esnasında kullandığımız gitadmin.pub anahtarı bu dosyaya Gitolite tarafından eklendi. Bu yüzden bağlantı gerçekleşiyor ve gitolite-admin deposunu klonlayabiliyoruz.

Klonlama işlemi gerçekleştikten sonra yeni kullanıcı ve kullanıcı hakları tanımlayabiliriz. Bunun nasıl yapıldığını şimdi bir örnek üzerinde inceleyelim.

Gitolite bünyesinde pratikprogramci.git isminde yeni bir depo oluşturmak istediğimizi düşünelim. Bu depo için user1 isimli kullanıcıya okuma ve yazma hakları tanıyacağız.

Önce Gitolite sunucusunda yeni depoyu oluşturuyoruz:

[sourcecode language=”java”]
$ su -l git
$ pwd
$ /home/git
$ cd repositories
$ mkdir pratikprogramci.git
$ cd pratikprogramc.git
$ git init –bare
[/sourcecode]

En son komutu yalın (bare) bir Git deposu oluşturmak için kullandım. Sunucu üzerinde gerekli Git deposunu oluşturmus olduk. Şimdi user1 ismini taşıyan kullanıcı için gerekli anahtar çiftini oluşturalım:

[sourcecode language=”java”]
$ ssh-keygen -t rsa -f user1
[/sourcecode]

ssh-keygen Git Bash ile kullanılabilecek olan bir komut. Ayrıca puttygen.exe ile bu anahtar çiftini oluşturmak mümkün. Oluşan anahtar çifti aşağıdaki şekilde:

[sourcecode language=”java”]
$ ls -l
-rw-r–r–. 1 git git 402 Nov 26 11:09 user1
-rw-r–r–. 1 git git 402 Nov 26 11:09 user1.pub
[/sourcecode]

gitolite-admin deposunu daha önce klonlamıştık. user1.pub dosyasını bu depada yer alan keydir dizinine kopyalıyoruz. Ayrıca user1 isimli kullanıcının pratikprogramci.git dizine olan erişim haklarını gitolite-admin/conf/gitolite.conf dosyasında şu şekilde tanımlıyoruz:

[sourcecode language=”java”]
repo gitolite-admin
RW+ = gitadmin

repo pratikprogramci
RW+ = user1
[/sourcecode]

Şimdi yaptığımız değişiklieri commitleyerek, yeni kullanıcı için gerekli işlemleri tamamlayalım.

[sourcecode language=”java”]
$ git add –all
$ git commit -m "user user1 added"
$ git push
[/sourcecode]

Push işlemi esnasında Gitolite gitolite-admin/keydir/ dizine koyduğumuz user1.pub dosyasını alarak (Git bünyesinde bu bir hook ile yapılmaktadır), içeriğini /home/git/.ssh/authorized_keys dosyasına eklemektedir. Sadece bu durumda ssh ile sunucuya bağlanmak isteyen bir kullanıcının sunucuya erişebilmesi mümkündür. Kullanıcının gizli anahtarı ile şifrelenmiş olan bilgiler sunucu tarafından kullanıcının public anahtarı kullanılarak doğrulanmaktadır.

Böylece user1 isimli kullanıcıyı pratikprogramci.git isimli depoyu klonlayabilir hale getirmiş olduk. Şimdi user1 bu depoyu şu şekilde klonlayabilir:

[sourcecode language=”java”]
git clone git@gitsunucusu:pratikprogramci
[/sourcecode]

Bu işlemin gerçekleşebilmesi için user1 isimli kullanıcının sahip olduğu id_rsa dosyasının .ssh dizinine kopyalanması gerekiyor. Bu dosyayı OpenSSH formatında puttygen.exe ve kullanıcının gizli anahtarı yardımıyla oluşturabiliriz.

Eğer user1 aşağıdaki klonlama işlemini gerçekleştirseydi, hata alırdı, çünkü bu kullanıcının gitolite-admin isimli depoya erişim hakkı bulunmamaktadir

[sourcecode language=”java”]
git clone git@gitsunucusu:gitolite-admin
[/sourcecode]

Eğer Git kullanımı ilginizi çekiyorsa, Pratik Git isimli kitabıma bir göz atmanızı tavsiye edebilirim.


EOF (End Of Fun)
Özcan Acar