Syslogs

Linux/Unix ve Acık Kod uygulamalar uzerine dokumanlar, ipuclari, gelistirmeler ve fazlasi…
idefix Satış Ortağı

Ana Sayfa » *nix » openSSL ve TSA ile Otomatik Log Imzalayıcı (Shell) Script

openSSL ve TSA ile Otomatik Log Imzalayıcı (Shell) Script

BerbatKötüİdare EderGüzelHarika (Toplam 1 oy. Ortalama puan 5 üzerinden 5.00 || Oy vererek siz de katkıda bulunabilirsiniz.)
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. shell

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:

  1. İmzalama işleri için kullanılmak üzere belirlediğiniz dizin (mevcut değilse) oluşturuluyor.
  2. Log dosyası Çalışma dizinine kopyalanıyor.
  3. openSSL ve TSA kullanılacak imzalama işlemiyapılıyor.
  4. İ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.

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

Shell Çıktısı
#!/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

Shell Çıktısı
#!/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.

  • Google Bookmarks
  • Twitter
  • FriendFeed
  • LinkedIn
  • Digg
  • Technorati
  • Facebook
  • del.icio.us
  • Add to favorites
  • Yahoo! Bookmarks
  • Live
  • Reddit
  • StumbleUpon
  • MySpace
  • Print
  • PDF
  • email
Tags: , ,

Belki şu konular da ilginizi çeker
Kategori: *nix,ipucu | |

YORUMLAR


  1. Halid | (Ekim 10th, 2009 11:22 pm)

    Harika olmuş :) Teşekkürler.

    [Cevapla]

  2. Alparslan | (Ekim 15th, 2009 9:18 am)

    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]

    Cagri Ersen tarafından yanıtlandı.

    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]

  3. Alparslan | (Ekim 15th, 2009 9:21 am)

    Merhaba, ek olarak bu signserver uygulaması bu imzalama scriptiyle karşılaştırılabilirmisiniz?

    signserver.org

    tşk.

    [Cevapla]

    Cagri Ersen tarafından yanıtlandı.

    Bu konuda da verebilecek net bir yanitim yok, cunku hic incelemedim signserver uygulamasini.

    [Cevapla]

  4. metin | (Şubat 3rd, 2010 9:22 am)

    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]

    Cagri Ersen tarafından yanıtlandı.

    Merhaba,

    CentOS versiyonunu kullanabilirsiniz, hata alırsanız durumu burada paylasirsaniz cozumunu de bulabiliriz.

    [Cevapla]

    metin tarafından yanıtlandı.

    Selamlar.

    Evet. Centos versiyonu ile sorunsuz çalıştı. Teşekkürler…

    [Cevapla]

  5. ayhan elmas | (Mayıs 12th, 2010 9:53 pm)

    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]

    Cagri Ersen tarafından yanıtlandı.

    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]

  6. ahmet seker | (Mayıs 18th, 2010 8:07 pm)

    evet aynı sorun ile bende karsılastım. bende cevap bekliyorum

    [Cevapla]

  7. zeynel buyuk | (Mayıs 20th, 2010 12:39 pm)

    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]

    Cagri Ersen tarafından yanıtlandı.

    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:

    Bu kısımda ise yukarıda gördüğünüz ülke, bölge, şehir, firma ismi, e-mail gibi bilgiler soruluyor. Bu soruları yukarıdaki cevaplarda verildiği gibi formal bir şekilde yanıtlayın. Bu kısıma girdiğiniz bilgileri bir yere not edin. Çünkü biraz sonra yapılacak Time Stamp Authority için oluşturulacak private key’de de aynı bilgilerin kullanılması gerekiyor.

    Certificate authority sertifikasi ile Time Stamp Authority icin olusturulan private key’inizin bilgileri ayni degil ise bu sorunu yasayabilirsiniz. Bir kontrol etmenizi oneririm.

    [Cevapla]

    Tuğrul tarafından yanıtlandı.

    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]

    Cagri Ersen tarafından yanıtlandı.

    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]

    Tuğrul tarafından yanıtlandı.

    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]

    Tuğrul tarafından yanıtlandı.

    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]

    Cagri Ersen tarafından yanıtlandı.

    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]

    Emre tarafından yanıtlandı.

    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]

    Cagri Ersen tarafından yanıtlandı.

    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:

    
    dir             = /CA                  # Where everything is kept
    
    dir             = /CA                  # TSA root directory
    

    Yukaridaki bu iki degisiklikten baska bir sey yapmadim cfg dosyasinda.

    Imza islemlerina ait komutlar ve ciktilari:

    [root@centlab001]# /usr/local/ssl1.0/bin/openssl
    OpenSSL> version
    OpenSSL 1.0.0 29 Mar 2010
    
    [root@centlab001 imza]# cp /var/log/messages /imza
    
    [root@centlab001 imza]# cd /imza
    
    [root@centlab001 imza]# /usr/local/ssl1.0/bin/openssl ts -query -data messages -no_nonce -out messages.tsq
    
    RESPONSE OLUSTURMAK
    [root@centlab001 imza]# /usr/local/ssl1.0/bin/openssl ts -reply -queryfile messages.tsq -out messages.tsr -config /usr/local/ssl1.0/openssl.cnf
    Using configuration from /usr/local/ssl1.0/openssl.cnf
    Enter PEM pass phrase:
    Response has been generated.
    
    RESPONSE UZERINDEN DOGRULAMA
    [root@centlab001 imza]# /usr/local/ssl1.0/bin/openssl ts -verify -queryfile messages.tsq -in messages.tsr -CAfile /CA/cacert.pem -untrusted /CA/tsacert.pem
    Verification: OK
    
    LOG DOSYASI UZERINDEN DOGRULAMA
    [root@centlab001 imza]# /usr/local/ssl1.0/bin/openssl ts -verify -data messages -in messages.tsr -CAfile /CA/cacert.pem -untrusted /CA/tsacert.pem
    Verification: OK
    
    TOKEN
    [root@centlab001 imza]# /usr/local/ssl1.0/bin/openssl ts -reply -queryfile messages.tsq -out messages.der -token_out -config /usr/local/ssl1.0/openssl.cnf
    Using configuration from /usr/local/ssl1.0/openssl.cnf
    Enter PEM pass phrase:
    Response has been generated.
    
    VERIFY TOKEN
    [root@centlab001 imza]# /usr/local/ssl1.0/bin/openssl ts -verify -data messages -in messages.der -token_in -CAfile /CA/cacert.pem -untrusted /CA/tsacert.pem
    Verification: OK
    

    [Cevapla]

  8. Tuğrul | (Mayıs 22nd, 2010 8:25 pm)

    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]

    Veli ADIGÜZEL tarafından yanıtlandı.

    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]

Trackbacks

Yorumda bulunun.