openSSL ve TSA ile Otomatik Log Imzalayıcı (Shell) Script
| Daha önce bir yazımda openSSL kullanarak 5651 sayılı kanunun gerektirdiği şekilde log dosyalarını zaman damgası ile imzalama işlerinin nasıl yapılacağını anlatan bir konuya değinmiştim. Bildiğiniz gibi openSSL’i TSA patch’i ile derleyerek logları formal olarak zaman damgası ile imzalamak mümkün. |
openSSL ile log imzalama işlemi güzel de, bu iş için manuel olarak bir takım komutlar vermeniz gerekiyor. Ancak log imzalama işleri periyodik olarak yapılması gereken bir prosedür olduğundan dolayı her seferinde bu komutları manuel olarak vermek ciddi bir külfet oluyor. İşte bu nedenle, imzalama işlerini otomatik olarak yapmak üzere crondan çalıştırılabilecek, aşağıdaki linklerden download edebileceğiniz bir shell script yazdım.
Scripti kullanabilmek için, sisteminizde TSA patch’i geçilmiş bir openSSL sürümü olması gerekir. Bu işi nasıl yapabileceğiniz ile ilgili bir dökümana http://www.syslogs.org/2009/08/openssl-ile-5651-sayili-kanun-geregi-log-imzalamak/ adresinden erişebilirsiniz.
Ayrıca, scriptin aşağıdaki linklerden erişebileceğiniz FreeBSD ve CentOS uyumlu olmak üzere iki farklı versiyonu bulunuyor.
Betiğin yaptığı işlemler sırası ile şöyle:
- İmzalama işleri için kullanılmak üzere belirlediğiniz dizin (mevcut değilse) oluşturuluyor.
- Log dosyası Çalışma dizinine kopyalanıyor.
- openSSL ve TSA kullanılacak imzalama işlemiyapılıyor.
- İmza işlerinden sonra, imzalı log dosyası doğrulanıyor.
- İmza doğrulaması başarılı olursa, imzalanan dosyalar dosyaadi-tarih.tar.gz ismiyle
paketlenip saklama dizinine taşınıyor. Son olarak çalışma dizinindeki işi bitmiş dosyalar siliniyor. - İmza doğrulaması başarısız olursa, hatalı imzalanmış olan dosyalar hatali-imza.tarih
isimli dizine taşınıyor ve belirttiginiz e-posta adresine bir mail gönderiliyor.
- İmza doğrulaması başarılı olursa, imzalanan dosyalar dosyaadi-tarih.tar.gz ismiyle
Download
FreeBSD: http://www.syslogs.org/getfile/openssl-log-imzalayici-BSD.sh
CentOS: http://www.syslogs.org/getfile/openssl-log-imzalayici-CNT.sh
İçerik
Hızlıca göz atmak isterseniz, içeriği de şu şekildedir:
FreeBSD
#!/bin/sh
# DEGISKENLER
# Imzali dosyalara ait tar.gz dosyasinin ismine eklenecek zaman bilgisi.
tarih=`date "+%Y%m%d-%H%M%S"`
# Imza islemi icin calisma dizinine kopyalanacak log dosyasinin adi.
dosya_adi=messages
# Log dosyasinin bulundugu dizin.
yol=/var/log
# Imzalama islerinin yapilacagi dizinin adi.
calisma_dizini=/var/imza_isleri
# Imza sonrasi olusan dosyalarin backuplanacagi dizin.
saklama_dizini=/var/imzali_loglar
#Hatali imzalanmis dosyalarin tasinacagi dizin.
hatali_imzalar=/var/imzali_loglar/hatali-imza-$dosya_adi-$tarih
# Imzalama sirasinda kullanilan CA private key'e ait public key.
CAPublicKEY=/CA/cacert.pem
# Zaman damgasi otoritesine ait public key.
TSAPublicKEY=/CA/tsacert.pem
# Imzalama sirasinda kullanilan TSA private key'e ait public key.
openssl=/usr/local/ssl/bin/openssl
# Imza islemi icin kullanilacak openssl binarysi.
openssl_conf=/usr/local/ssl/openssl.cnf # OpenSSL binary'sinin kullanacagi config dosyasi.
# TSA'ya ait Private Key'in Pass Pharse'i
password=parolaniz
# Hata durumunda gonderilecek bildirim maili'nin gidecegi posta adresinizi girin.
eposta_adresi=eposta-adresiniz
#--------------------------------------CALISMA DIZININE KOPYALAMA ISLEMI--------------------------------------#
if [ ! -d $calisma_dizini ]
then
mkdir $calisma_dizini
fi
sleep 1
cp $yol/$dosya_adi $calisma_dizini
cd $calisma_dizini
#--------------------------------------IMZALAMA ISLEMI--------------------------------------#
$openssl ts -query -data $dosya_adi -no_nonce -out $dosya_adi.tsq
sleep 1
$openssl ts -reply -queryfile $dosya_adi.tsq -out $dosya_adi.der -token_out -config $openssl_conf -passin pass:$password
#--------------------------------------DOGRULAMA ISLEMI--------------------------------------#
COMMAND=`$openssl ts -verify -data $dosya_adi -in $dosya_adi.der -token_in -CAfile $CAPublicKEY -untrusted $TSAPublicKEY`
if [ "${COMMAND}" = "Verification: OK" ]
then
echo "Dogrulama tamam."
else
echo "Dogrulama Saglanamadi. Islemler geri aliniyor."
if [ ! -d $saklama_dizini ]
then
mkdir $saklama_dizini
fi
if [ ! -d $hatali_imzalar ]
then
mkdir $hatali_imzalar
fi
mv $calisma_dizini/$dosya_adi* $hatali_imzalar
echo "$dosya_adi isimli log dosyasi imzalamanamadi.
Imza islemi geri alinmis durumda. Hatali dosyalari $hatali_imzalar dizininde bulabilirsiniz. Problemin nedenini gormek icin scripti manuel olarak calistirabilirsiniz." | mail -s "Log Imzalayici" "$eposta_adresi"
exit
fi
sleep 1
if [ ! -d $saklama_dizini ]
then
mkdir $saklama_dizini
fi
sleep 1
tar cvfz $saklama_dizini/$dosya_adi.$tarih.tar.gz $dosya_adi*
sleep 1
rm $calisma_dizini/$dosya_adi*
CentOS
#!/bin/sh
# DEGISKENLER
# Imzali dosyalara ait tar.gz dosyasinin ismine eklenecek zaman bilgisi.
tarih=`date "+%Y%m%d-%H%M%S"`
# Imza islemi icin calisma dizinine kopyalanacak log dosyasinin adi.
dosya_adi=messages
# Log dosyasinin bulundugu dizin.
yol=/var/log
# Imzalama islerinin yapilacagi dizinin adi.
calisma_dizini=/var/imza_isleri
# Imza sonrasi olusan dosyalarin backuplanacagi dizin.
saklama_dizini=/var/imzali_loglar
#Hatali imzalanmis dosyalarin tasinacagi dizin.
hatali_imzalar=/var/imzali_loglar/hatali-imza-$dosya_adi-$tarih
# Imzalama sirasinda kullanilan CA private key'e ait public key.
CAPublicKEY=/CA/cacert.pem
# Zaman damgasi otoritesine ait public key.
TSAPublicKEY=/CA/tsacert.pem
# Imzalama sirasinda kullanilan TSA private key'e ait public key.
openssl=/usr/local/ssl/bin/openssl
# Imza islemi icin kullanilacak openssl binarysi.
openssl_conf=/usr/local/ssl/openssl.cnf # OpenSSL binary'sinin kullanacagi config dosyasi.
# TSA'ya ait Private Key'in Pass Pharse'i
password=parolaniz
# Hata durumunda gonderilecek bildirim maili'nin gidecegi posta adresinizi girin.
eposta_adresi=posta-adresiniz
#--------------------------------------CALISMA DIZININE KOPYALAMA ISLEMI--------------------------------------#
if [ ! -d $calisma_dizini ]
then
mkdir $calisma_dizini
fi
sleep 1
cp $yol/$dosya_adi $calisma_dizini
cd $calisma_dizini
#--------------------------------------IMZALAMA ISLEMI--------------------------------------#
$openssl ts -query -data $dosya_adi -no_nonce -out $dosya_adi.tsq
sleep 1
$openssl ts -reply -queryfile $dosya_adi.tsq -out $dosya_adi.der -token_out -config $openssl_conf -passin pass:$password
#--------------------------------------DOGRULAMA ISLEMI--------------------------------------#
COMMAND=`$openssl ts -verify -data $dosya_adi -in $dosya_adi.der -token_in -CAfile $CAPublicKEY -untrusted $TSAPublicKEY`
if [ "$COMMAND" == "Verification: OK" ]
then
echo "Dogrulama tamam."
else
echo "Dogrulama Saglanamadi. Islemler geri aliniyor."
if [ ! -d $saklama_dizini ]
then
mkdir $saklama_dizini
fi
if [ ! -d $hatali_imzalar ]
then
mkdir $hatali_imzalar
fi
mv $calisma_dizini/$dosya_adi* $hatali_imzalar
echo "$dosya_adi isimli log dosyasi imzalanamadi.
Imza islemi geri alinmis durumda.
Hatali dosyalari $hatali_imzalar dizininde bulabilirsiniz.
Problemin nedenini gormek icin scripti manuel olarak calistirabilirsiniz." | mail -s "Log Imzalayici" "$eposta_adresi"
exit
fi
sleep 1
if [ ! -d $saklama_dizini ]
then
mkdir $saklama_dizini
fi
sleep 1
tar cvfz $saklama_dizini/$dosya_adi.$tarih.tar.gz $dosya_adi*
sleep 1
rm $calisma_dizini/$dosya_adi*
Scripti daha fazla geliştirmek mümkün, ihtiyaçlarınıza göre düzenlemeleri yaptıktan sonra kullanabilirsiniz. Umarım işinize yarar.
Tags: openssl, timestamp, tipsBelki şu konular da ilginizi çeker
YORUMLAR
Trackbacks
Yorumda bulunun.




Harika olmuş :) Teşekkürler.
[Cevapla]
Merhaba,
birinci sorum; imzalama işleminde kullanılan TSA için özel/genel anahtarlar akıllı kartta kullanılmak isterse ne yapılması gerekir.
ikincisi; TSA için alınan sertifika başka bir CA altındaysa yani CA sertifikası zincir şeklindeyse burada nasıl yazılabilir.
KURUM ROOT CA
KURUM SUBCA
TSA
[Cevapla]
Merhaba,
Her iki soru icin de, enine boyuna test etmedim ama konu imzalama isleminin dogru anahtarlarla yapilmasi oldugundan dolayi hangi mecralarda kullanildigi ile ilgili bir sıkıntı yasamamalisiniz.
Ama bu net cevap degildir, cunku dedigim gibi ihtiyacim disinda kalan sekillerde denemeler yapmadim.
[Cevapla]
Merhaba, ek olarak bu signserver uygulaması bu imzalama scriptiyle karşılaştırılabilirmisiniz?
signserver.org
tşk.
[Cevapla]
Bu konuda da verebilecek net bir yanitim yok, cunku hic incelemedim signserver uygulamasini.
[Cevapla]
Selamlar.
Debian Etch ile bir önceki manuel log imzala işlerini hallettim.
Acaba yukarıdaki hangi script sürekli olarak log imzalama işimi görür. ?
Teşekkürler iyi çalışmalar.
[Cevapla]
Merhaba,
CentOS versiyonunu kullanabilirsiniz, hata alırsanız durumu burada paylasirsaniz cozumunu de bulabiliriz.
[Cevapla]
Selamlar.
Evet. Centos versiyonu ile sorunsuz çalıştı. Teşekkürler…
[Cevapla]
sistem: centos 5.4
openssl 1.1.0 stabil son surum yuklu
/usr/local/ssl/bin/openssl ts -reply -queryfile messages.tsq -out messages.tsr -config /usr/local/ssl/openssl.cnf
Using configuration from /usr/local/ssl/openssl.cnf
Response is not generated.
46947602110416:error:2F083075:time stamp routines:TS_RESP_CTX_set_signer_cert:invalid signer certificate purpose:ts_rsp_sign.c:206:
yardımlarınızı bekliyorum
[Cevapla]
Imzalama islemini yapan sertifikada bir sorun oldugunu soyluyor. Gozunuzden kacan bir nokta olmamasi icin asagidaki adreste bulunan kurulum islemlerini yeniden gozden gecirebilirsiniz.
Bunun yani sira, openssl’in yeni sürümünde ts özelliği geliyor, dolayısı ile patch gecmenize gerek kalmiyor. Onu da deneyebilirsiniz.
http://www.syslogs.org/2009/08/openssl-ile-5651-sayili-kanun-geregi-log-imzalamak/
[Cevapla]
evet aynı sorun ile bende karsılastım. bende cevap bekliyorum
[Cevapla]
Merhaba, yukarıda karşılaşılan sorunlar ile bende karşılaştım. Sistem openssl 1.0.0 kullanıyorum. Sertifika oluşturma sırasında makalede yazan şekilde yapmaya çalıştığımda openssl ca -config /usr/local/ssl/openssl.cnf -in tsareq.csr -out tsacert.pem satırını çalıştırdığımda aşagıdaki hatayı alıyorum.
default is an unsupported message digest type
15207:error:02001002:system library:fopen:No such file or directory:/usr/src/lib/libssl/src/crypto/bio/bss_file.c:126:fopen(‘/CA/index.txt.attr’,'rb’)
15207:error:2006D080:BIO routines:BIO_new_file:no such file:/usr/src/lib/libssl/src/crypto/bio/bss_file.c:129:
15207:error:0E078072:configuration file routines:DEF_LOAD:no such file:/usr/src/lib/libssl/src/crypto/conf/conf_def.c:197:
Ancak openssl.cnf dosyasında bulunan
# For the CA policy
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
Satırları optional olarak değiştirip tekrar denediğimde o zaman sertifika oluşturabiliyorum. O zamanda log imzalama kısmında yukarıdaki arkadaşların aldığı hata mesajını alıyorum. İşin içinden bir türlü çıkamadım, ne yapmak lazım nerede hata yapıyorum bir türlü bulamadım. yardımlarınız bekliyorum. Kolay gelsin.
[Cevapla]
Merhabalar,
Sorununuzun nedeni sertifika bilgileriniz ile alakali gibi gorunuyor. http://www.syslogs.org/openssl-ile-5651-sayili-kanun-geregi-log-imzalamak/ adresindeki yazida, sertifika bilgileri konusunda su sekilde bir ibare var:
Certificate authority sertifikasi ile Time Stamp Authority icin olusturulan private key’inizin bilgileri ayni degil ise bu sorunu yasayabilirsiniz. Bir kontrol etmenizi oneririm.
[Cevapla]
Dokümanlar için teşekkürler, gerçekten çok güzel olmuş herşey açık.
bugün 10′un üzerinde denemeler yaptım
aşamaları aynen takip ettim, openssl 1.0.0 ve sizin patch’li olan sürümü de denedim.
ancak response oluşturma noktasında ben de aynı hatayı alıyorum:
:error:2F083075:time stamp routines:TS_RESP_CTX_set_signer_cert:invalid signer certificate purpose:ts_rsp_sign.c:206:
tüm satırlarda /usr/local/ssl/bin/openssl’i kullandım.
Bi çözüm bulan var mı? Her şeyi aynı çok yaptım, çok defa teyit ettim.
[Cevapla]
Merhabalar,
Son zamanlarda ayni hatayi alan bir kac kisiden yorum geldi.
Kurulum adimlarini ve scripti bir kac kez deneyerek, dogruluguna %100 emin olarak yayinladim ama son zamanlarda bir sorun var gorunuyor.
Asamalari tekrar deneyip kontrol edecegim.
[Cevapla]
Arkadaşlar yanlış anlamasın, script’i henüz denemedim;
bu hata ile karşılaşanları burada gördüğüm için yazdım.
http://www.syslogs.org/2009/08/openssl-ile-5651-sayili-kanun-geregi-log-imzalamak/
linkinde yer alan aşamalarda response üretme noktasında takılmıştım, script’ten kaynaklanan bir hata olmayabilir…
iyi çalışmalar, teşekkürler
[Cevapla]
oldu sonunda, zannediyorum sorun şurada, openssl.cnf dosyasında şu satırların yorumlarını açmak lazım:
+extendedKeyUsage = critical,timeStamping
+keyUsage = nonRepudiation, digitalSignature
bir sorum daha olacak; token_out nedir, token_out olmadan sadece response oluşturarak imzalamış sayılıyor muyuz?
[Cevapla]
openssl 1.0 sürümünde mi düzel yoksa her iki sürüm için de geçerli mi bu durum?
token_out response’un bir alternatifidir response oluşturmak da imzalamak icin yeterli oluyor.
[Cevapla]
Ben de birkaç gündür log imzalama olayına göz gezdiriyorum ancak yukardaki sorunla ben de karşılaştım ve dediğiniz gibi extendedKeyUsage ve keyUsage ibarelerini açınca openssl.cnf dosyasında bir düzelme olmadı.
Acaba örnek bir openssl.cnf hazırlamanız mümkün müdür? (bu arada fedora 12 üzerinde çalışıyorum. openssl rpm’inin ts desteği mevcut)
bu arada dokümantasyon çok güzel olmuş, ellerinize sağlık
[Cevapla]
Selamlar,
Sistemime openssl-1.0 kurup yazida anlasttigim sekilde imzalama islemlerini yeniden yaptim. Sonuc olarak imzalama islemi sorunsuz gerceklesti. Bu yorumun en altinda imzalama islemlerine dair islem loglarını bulabilirsiniz.
openssl.cfg dosyasi ise default kuruldugu seklide, sadece yazida anlattigim sekilde sertifika dosyalarinin yeri ./demoCA yerine /CA olarak set edilmis durumda. (Sertifikalar o dizinde duruyorlar:
Yukaridaki bu iki degisiklikten baska bir sey yapmadim cfg dosyasinda.
Imza islemlerina ait komutlar ve ciktilari:
[Cevapla]
openssl 1.0.0 sürümünde düzeldi. patch’li sürümü denemedim.
ancak farklı bişey daha yapmışım; başka bir dokümantasyondan taklit ettiğim /CA/serial dosyası için:
echo ’100001′ > serial
ayrıca openssl.cnf dosyasında “$dir/tsaserial” dosyasının da arandığını gördüm. bu dosya bulunmadığı için
“cp serial tsaserial”
yaptık ama kullanılıyor mu ne için kullanılıyor hangisi düzeltti derseniz pek emin değilim :)
[Cevapla]
bende aynı yerde takılıp kaldım şifre sormadan
# openssl ts -reply -queryfile messages.tsq -out messages.tsr -config /usr/local/openssl/openssl.cnf
Using configuration from /usr/local/openssl/openssl.cnf
Response is not generated.
674878472:error:2F083075:time stamp routines:TS_RESP_CTX_set_signer_cert:invalid signer certificate purpose:ts_rsp_sign.c:206:
boyle cıkıyor @Tugrul beyin dediklerini de denedim ama olmadı denemelere devam :)
[Cevapla]