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.
$ adduser -r git
Root olarak login yaptığımız sunucuda git isimli kullanıcıyı oluşturduktan sonra, Gitolite kurulum işlemine başlayabiliriz.
$ su - git $ mkdir -p ~/bin $ git clone git://github.com/sitaramc/gitolite $ gitolite/install -ln ~/bin $ gitolite setup -pk gitadmin.pub
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):
$ ssh-keygen -t rsa -f gitadmin
Bu işlemin ardından aşağıdaki anahtar çifti oluşmuş olur:
$ 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
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:
$ 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
repositories dizininde git depoları bulunmaktadır. Başlangıçta Gitolite aşağıdaki depoları oluşturur:
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
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:
git clone git@gitsunucusu:gitolite-admin
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:
$ 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
Gizli olan gitadmin anahtarını OpenSSH formatına dönüştürmem gerekiyor. Bunu puttygen.exe ile yapabilirim:
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.
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.
where ssh C:\ProgramFiles\Git\bin\ssh.exe
Peki Git klonlama işleminde hangi SSH implementasyonunu kullanıyor?
set GIT_SSH GIT_SSH=C:\Program Files\TortoiseSVN\bin\TortoisePlink.exe
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:
set GIT_SSH=C:\ProgramFiles\Git\bin\ssh.exe
Bunun ardından klonlama işlemini şu şekilde gerçekleştirebiliriz:
git clone git@gitsunucusu:gitolite-admin
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:
$ su -l git $ pwd $ /home/git $ cd repositories $ mkdir pratikprogramci.git $ cd pratikprogramc.git $ git init --bare
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:
$ ssh-keygen -t rsa -f user1
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:
$ 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
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:
repo gitolite-admin RW+ = gitadmin repo pratikprogramci RW+ = user1
Şimdi yaptığımız değişiklieri commitleyerek, yeni kullanıcı için gerekli işlemleri tamamlayalım.
$ git add --all $ git commit -m "user user1 added" $ git push
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:
git clone git@gitsunucusu:pratikprogramci
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
git clone git@gitsunucusu:gitolite-admin
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