[Gelistirici] Depo ve Paket İmzalama - Son Round

Bahadır Kandemir bahadir at pardus.org.tr
29 Eki 2010 Cum 02:46:16 EEST


Merhaba,

Depo/paket imzalamanın neden gerekli olduğu konusuna girmeyeceğim. Bunu 
desteklemememizin oluşturduğu problemleri ve tehditleri sıralamaya çalışacak, 
sonra da bu eksiği nasıl kapatmayı planladığımdan bahsedeceğim.

Problem 1: İkili paket depolarımızı sadece HTTP üzerinden sunuyoruz. HTTPS 
kullanmak problemlerin sadece bir kısmını çözeceğinden olsa gerek, paketler 
sunucusu HTTPS üzerinden hizmet vermemiş hiç. Ciddi bir man-in-the-middle [0] 
tehdidi var ortada.

Problem 2: Resmi paket deposu yansısı veremiyoruz, imzalama olmadan yapılmaz 
bu iş çünkü. Dağıtılan paketlerin, tarafımızdan yapıldığının garantisini 
vermeliyiz. <geyik>"Paket indeksini HTTPS ile bizden alınsın, paketler ise 
yansıdan alınsın" gibi fantastik bir çözümü var, dijital imzalama gibi bir 
icat olmasaydı dünyada, kodlaması eğlenceli olabilirdi.</geyik>

Problem 3: Hem kendimiz, hem kendi deposunu oluşturanlar, hem de tek tek paket 
oluşturup dağıtan 3. kişiler için bir dijital imzalama çözümü gerekiyor. Hem 
depo indekslerinin, hem ikili paketlerin imzalanması gerekiyor.

Paket indeksi, depodaki her bir paketin SHA1 özetini tutuyor, bu da ikili 
paketlerin imzalanması şartını ortadan kaldırıyor gibi görünüyor. Ancak, 
kullanıcıların güvendikleri bir depodan elle paket indirip bilgisayarlarına 
kurmak istedikleri durumda, paketin tek başına imzalı olması gerekliliği 
ortaya çıkıyor. Burada, kullanıcının paket dışında bir dosya indirmesi 
gerekliliğini (ayrı bir dosya olursa indirmez, bu bir gerçek) ortadan 
kaldıracak bir çözüm gerekiyor, imzayı pakete dahil etmek gibi. Elbette, paket 
formatını bozmadan.

Kurumsal 2 Beta yaklaşınca (Beta'nın gelişi Alpha'dan bellidir), bir süredir 
üzerinde çalıştığım (aylar önce depodaya koymama rağmen ilgilenmediğim) paket 
imzalama uygulamasını [1] elden geçirerek PiSi'ye dahil etmeye [2] karar 
verdim.

ZIP dosyalarını (PiSi ikili dosya formatı aslında ZIP) imzaladığında (ZIP 
içindeki her dosya adı ve içeriğinin özeti imzanalıyor), sertifika ve imza 
ikilisini ZIP dosyasının "yorum" [3] bölümüne ekliyor, böylece imza için ayrı 
bir dosya taşımak gerekmiyor. ZIP dosyası içine, imzalar için ayrı bir dizin 
eklemek masraflı (eklemek kolay, güncellemek ve silmek için arşivi yeniden 
oluşturmak gerekiyor) olduğu için bu yolu tercih ettik, öneri için Onur'a 
teşekkürler.

ZIP harici dosyaları imzalarken ise, dosya ile aynı dizinde .SIG ve .CRT 
dosyaları oluşturuluyor. Burada, ZIP'teki gibi bir voodoo büyüsü yok.

Doğrulama kısmında ise, sertifikanın teknik olarak güvenilir olup olmadığı ve 
verinin o sertifika ile imzalanıp imzalanmadığı kontrol [4] ediliyor. 
Sertifika sahibinin paket dağıtıcısı olarak güvenilir olup olmadığının 
belirlenmesi içinse, sertifikanın /etc/pisi/trusted/ altında bulunup 
bulunmadığı kontrol ediliyor.

Hazırladığım yamada önemli bir açık var. A deposu için güvenilir olan depo 
yöneticisi, "araya sızıp" B deposunu ele geçirirse, sertifikası güvenilir 
olacağından nahoş bir durum ile karşılaşıyoruz. Sertifikanın depo ismi ile 
aynı olması zorunluluğu getirme gibi çözülebilecek bir sorun. Yamayı test 
etmek isteyenlerin fazla uğraşmaması için şimdilik bunu düzeltmiyorum. (TODO 
1)

Yamada bulunan kitaplık (signature.py), PiSi dosyalarının imzalanmasını 
desteklese de, indeksleme işleminde bu dosyaları imzalanması işini sonraya 
bıraktım. (TODO 2)

Güvenilir sertifikaların yönetimi işi (şimdilik) sertifikaların bir dizine 
kopyalanması ile yapılıyor. Bunun için PiSi'sel bir çözüm gerekebilir, 
şimdilik bunu da LATER olarak işaretliyorum. (TODO 3)

Test için kullanabileceğiniz bir depo oluşturdum [5] ve imzalama için gerekli 
dosyaları (parola dahil) da ekledim.

Yamayı (2009 için hazırladım) uyguladıktan sonra, aşağıdaki dosyaları yerine 
koymanız, ve gerekli dizinleri oluşturmanız gerekiyor:

/etc/pisi/key.pem
/etc/pisi/cert.pem
/etc/pisi/trusted/

Paylaştığım depodaki .pisi dosyalarının birkaçını indirdikten sonra, imzalamak 
için "index" komutunu "--skip-signing" olmadan çalıştırmanız yeterli:

test-repo $ pisi index . --skip-sources
Password required for signing.
Password: ******

(Anahtarın parolası 123456.)

Deponun güvenilirliği ile ilgili testler için, depoyu sisteminize eklemeniz 
yeterli. İkili dosya bütünlükleri PiSi tarafından yapıltığı için, pisi-
index.xml* dosyalarını kurcalamanız kafi. Depoyu güvenilir olarak işaretlemek 
için, "cert.pem" dosyasını "/etc/pisi/trusted/" altına kopyalamayı unutmayın.

Bundan sonraki kısım, daha çok PiSi geliştiricilerini ilgilendiriyor:

Uygulamayı PiSi'ye dahil ederken karşılaştığım bir hata, PiSi fetcher ile 
indirilen dosyaların, bütünlük kontrolü yapılmadan direk hedef dizine 
yazılmasıydı. Dosya bütünlüğü ile ilgili problem yaşamadığımızdan ve tahminen 
herkes bz2'li pisi-index dosyasını indirdiğinden olsa gerek, bu sorun başımızı 
ağrıtmadı. SHA1SUM'ı bozuk bir *pisi-index.xml* indirmeyi deneyin, bütünlük 
kontrolü sağlanmasa bile depo indeksi indirilmiş ve sisteme eklenmiş oluyor...

İndirilen dosyaların hedef dizine ".tmp" adıyla kayıt edilmesini, bütünlük (ve 
varsa, imza) kontrolünden geçirdikten sonra asıl adına çevrilmesini sağlayan 
bir değişiklik yaptım. Bütünlük ve imza kontrolünden kalan pisi-index.xml*'ler 
artık sisteme eklenmiyor, sadece depo adı ve adresi eklenmiş oluyor.

Bir de, kullanıcıdan parola istenmesi için pisi.ui'ye yeni bir metod eklemem 
gerekti.

Selamlar.

[0] http://en.wikipedia.org/wiki/Man-in-the-middle_attack
[1] https://svn.pardus.org.tr/uludag/trunk/pisi/scripts/package-
signing/pisign.py
[2] http://cekirdek.pardus.org.tr/~bahadir/repo/pisi-2.3-signature.patch
[3] http://en.wikipedia.org/wiki/ZIP_(file_format)#File_headers
[4] http://en.wikipedia.org/wiki/Public_key_certificate
[5] http://cekirdek.pardus.org.tr/~bahadir/repo/



Gelistirici mesaj listesiyle ilgili daha fazla bilgi