[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