27 Mayıs 2014

Syslog Yapısı ve OpenSSL ile Log İmzalama İşlemleri

Bu makalemizde Syslog  ve syslog ile tutulan logların kanıtlanabilir olması açısından OpenSSL kullanılarak nasıl imzalanacağı konusundan bahsedeceğiz.Anlatım sırasında Unix/Linux tabanlı bir işletim sistemi kullanılmıştır. OpenSSL aynı zamanda Windows sistemler üzerindede çalışabilmektedir.Versiyon olarak ise son sürüm olan 1.0.1g sürümü kullanılmıştır.

İmzalama gerçekleştirilirken öncelikle imzalama işlemleri için gerekli konfigürasyonları yapıp ardından oluşturulan bu dosyalar ile imzalama işlemini yapacağız.

1-Syslog


Cihazlar üzerlerinde yapılan işlemler için belirli kayıtlar tutmaktadırlar.Bu tutulan kayıtlara log adı verilmektedir.Syslog bu kayıtlar için tanımlanmış bir servistir.Syslog bilgileri; bilgi sistemlerinin yönetimi ve güvenlik denetimleri için kullanılabilirler.Printerlardan routerlara kadar bir çok cihaz syslog desteklemekte ve logları farklı bir sisteme gönderebilmektedirler.

Syslog mesajları facility kodlarından biri ile etiketlenir ve bir severity tanımı taşırlar.Facility ve severity seviyeleri aşağıdaki gibi gösterilebilirler.

Facility tanımları;

0             kern     
1             user      
2             mail      
3             daemon  
4             auth     
5             syslog  
6             lpr         
7             news    
8             uucp     
9             clock daemon
10           authpriv             
11           ftp         
12           NTP subsystem
13           log audit
14           log alert
15           cron      
16 -23    local 0-local 7

Facility tablosunda görülen bilgiler tüm log desteği olan cihazlar için aynı olmayabilirler.Farklı kodlar farklı anahtar kelimeler için kullanılabilirler.

Severity tanımları;

0             Emergency         emerg (panic)                                 
1             Alert                     alert                                    
2             Critical                 crit                                        
3             Error                    err (error)                                         
4             Warning              warning (warn)                                              
5             Notice                  notice                                                 
6             Informational       info                                                      
7             Debug                 debug

Syslog  Paket Yapısı


Syslog mesaj yapısı üç ayrı parça olarak görüntülenirler.Format olarak aşağıdaki gibidir;

“<pri> header msg”

Priority (pri) : Bu alan Facility ve Severity mesajlarını içerir.Bu mesajlar 8 bitlik numaralardan oluşur.ilk 3 bit Severity geri kalan 5 bit ise Facility kodlarını belirtmektedir.Önemli olan konulardan biri syslog programının herhangi bir Facility veya Severity mesajı üretmemesidir.Kullanılan diğer programlar üzerlerinde işlemler yapıldıkça bu mesajlar oluşurlar.

Header : Bu alan yapılan işlemlerle ilgili oluşan log mesajlarının hangi saat ve tarihte oluştuğunu göstermektedir.Bu zaman bilgisi sisteminize göre ayarlanacaktır. Bu nedenle eğer sistem saat ve tarihiniz yanlış olursa mesajların zamanları da yanlış olacaktır.Bu alan ayrıca hostname ve IP bilgilerini de içermektedir.

Message (msg) : Bu alan log mesajları ilgili bazı ek bilgileri içermektedir.msg alanı kendi içerisinde iki farklı bilgi taşımaktadır.Bu bilgilerden bir tanesi log mesajlarını üreten program veya process ismini diğeri ise ek bilgileri içermektedir.(TAG,Content)

Syslog  ağ servisi UDP 514 portunu kullanarak paketleri iletmektedir.Paketlerin gönderilip gönderilmediğinin kontrolünü yapmamaktadır.Bu nedenle gönderilen paketlerin hedefe ulaşacağının herhangi bir garantisi yoktur. Syslog paketleri maksimum 1024byte büyüklüğünde iletilebilirler,herhangi bir minimum değer kısıtlaması yoktur.

Syslog mesajlarına aşağıdaki satır örnek verilebilir;

<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47
- BOM'su root' failed for lonvick on /dev/pts/8

Syslog Sunucu Konfigürasyonu


Buradaki konfigürasyonlar syslogun daha yeni bir versiyonu olan Rsyslog baz alınarak yapılmıştır.Siz de Unix/Linux tabanlı sistemlerinize Rsyslog ‘ı kolayca entegre edebilirsiniz.

Rsyslog yüklü bir sistemi merkezi log sunucusu haline getirmek için “/etc/rsyslog.conf” dosyası altında belirli ayarlar yapılmalıdır.

Sisteminizin üzerine log gelmesini sağlamak için rsyslog.conf dosyası altında  aşağıdaki satırların aktif hale getirlmesi gerekmektedir.Ayrıca eğer network  veya sistemde aktif bir Firewall varsa bu cihaz üzerinde de UDP 514 portunun açık olması gereklidir.





2-OpenSSL Kurulum


Kurulum için aşağıdaki adımlar izlenmelidir;

-Öncelikle openssl sitesi üzerinden 1.0.1g versiyonu indiriyoruz.
wget https://www.openssl.org/source/openssl-1.0.1g.tar.gz 

-Dosya tar.gz ile sıkıştırılmış olarak gelecektir.Dosyayı dizine çıkartmak için;
“tar –xzvf openssl-1.0.1g.tar.gz”  komutu kullanılmalıdır.Dosya çıkarma işlemi bittikten sonra openssl-1.0.1g isimli bir dosya oluşacaktır. cd “openssl-1.0.1g” komutu ile dosya içerisine girilir.


-Daha sonra “./config” komutu çalıştırılarak kurulum işlemi başlatılır.Sonra “make” komutu ile openssl dosyaları derlenir en son olarak “make install” komutu ile kurulum tamamlanır.

Dosyayı çıkarttığımız dizin kurulum yapacağımız dizinden farklı biryerde olabilir.Bu durumda config komutu şu şekilde çalıştırılmalıdır. “./config  --prefix=/usr/local/” bu komut sayesinde openssl kurulumu /usr/local/ dizini altında gerçekleştirilecektir.Siz uygun gördüğünüz herhangi bir yere kurulumu gerçekleştirebilirsiniz.



İmzalama için Gerekli Konfigürasyonlar


Dosyaları karıştırmamak adına imzalama işlemlerimizi gerçekleştireceğimiz dizinleri ve dosyaları manual olarak oluşturabiliriz.Bu işlem için kök dizine bir klasör oluşturalım.Ben “openssl “isimli bir klasör oluşturuyorum.Oluşturucağımız tüm konfigürasyon dosyaları burada tutulacak ve kontrol edilecek.

Oluşturduğumuz bu klasör altına “private” ve “newcerts” adlı iki altklasör oluşturmamız gerekiyor.Farklı bir isim ile oluşturulurlarsa openssl bu klasörleri görmeyecek ve işlemlerimiz başarısız olacaktır.Bu işlemler için aşağıdaki komutlar kullanılabilir;

“mkdir openssl”
“mkdir openssl/private”
“mkdir openssl/newcerts”

Openssl klasörü altına oluşturulması gereken diğer dosyalar “serial” ve “index.txt” dosyalarıdır.Bu dosyalar sertifikalar üreltiğinde otomatik olarak openssl tarafından güncelleneceklerdir.Serial dosyası içerisine openssl kontrolünün sağlanması için bir değer girilmesi gereklidir.Aşağıdaki komutlar ile işlemler gerçekleştirilebilir;

“cd openssl” öncelikle oluşturduğumuz klasör altına gidelim

“touch serial” komutu ile serial dosyası oluşturulur. “echo 01 > serial” komutu ile serial dosyası için gerekli değer girilir.

“touch index.txt”  komutu ile index.txt dosyası oluşturulur.



Gözden geçirilmesi gereken diğer bir konu ise “openssl.cnf” dosyası altındaki ayarlardır.Ben openssl kurulumunu “/usr/local” altına yaptım.Bu nedenle dosyaya ulaşmak için,“cd /usr/local/ssl” dizini altına gidilmelidir.Herhangi bir text editör yardımı ile openssl.cnf dosyası açılır ve içerisindeki satırlar aşağıdaki gibi değiştirilir.Değişiklik yapmadan önce bu dosyanın bir yedeğini almanız faydalı olabilir.

İlk adım olarak oluşturduğumuz klasörün işlemlerimizi geçekleşticeğimiz ana klasörü ve kök sertifikanın bulunduğu yeri belirtiriyoruz.Diğer alanlar otomatik olarak yapılandırılacaktır.



İkinci olarak Time Stamp sertifikalarının bulunacağı dizini gösteriyoruz.Ben hepsini aynı dizin altında toplayacağım bu nedenle buraya da aynı klasör ismini giriyorum.


Son olarak extendedKeyUsage ,basicConstraints ve keyUsage alanlarını aşağıdaki gibi düzenliyoruz.



İmzalama için Gerekli  Sertifikaların Oluşturulması


İmzalama işlemlerimizi gerçekleştirebilmemiz için tüm sertifikaların oluşmasını sağlayacak bir sertifika otoritesine (CA) ihtiyacımız vardır.Oluşturacağımız bu sertifika kök sertifikadır .

Kök sertifikayı oluştururken dikkat etmemiz gereken bir kaç konu var.Öncelikle openssl programını kurduğumuz dizin altında çalıştırmaya özen gösterelim.Sisteminizde varsayılan olarak gelen sürüm en son sürüm olmayabilir.Bu nedenle hatalar alabilirsiniz.

Diğer bir konu ise,kök sertifikalar daha önceden openssl.cnf dosyasında girdiğimiz  klasör altında olmalılar.Şimdi aşağıdaki komut ile bahsettiğimiz sertifika  (CA) ve bu sertifikanın private keyini oluşturalım;

Öncelikle openssl programını kurduğumuz ve çalıştıracağımız “bin” dizinine gidelim.

"cd  /usr/local/bin"

Daha sonra aşağıdaki komutu çalıştıralım.Bu komut ile önce gerekli kök sertifikayı ikinci olarak da bu sertifikaya ait private keyi oluşturuyoruz.Dikkat edilmesi gereken nokta ise oluşturulan private key mutlaka oluşturduğumuz private klasörü altında olmalıdır.

"openssl  req  -new  -x509  -newkey  rsa:2048  -days 3650  -out  /openssl/cacert.pem  –keyout  /openssl/private/cakey.pem"

Komut çalıştırıldığında sizden sertifika için şifre ve farklı birkaç bilgi girmenizi isteyecektir.Buraya belirlediğiniz bir şifreyi ve şehir firma gibi diğer bilgileri girin.Bu şifre ve girdiğiniz diğer bilgileri kaybetmeyin.



Sırada TSA (Time Stamp) için bir private key oluşturma var.Önceki işlemde olduğu gibi bu key de mutlaka private klasörü altında bulunmalıdır.

"openssl    genrsa  -aes256  -out  /openssl/private/tsakey.pem"

Komut çalıştırıldığında sizden  şifre isteyecektir buraya da belirlediğimiz bir şifre girelim ve bu şifreyi de saklayalım.



Dosyamızın imzalanması için kullanacağımız tsakey.pem private keyine uygun bir request oluşturalım;

"openssl  req  -new  -key  /openssl/private/tsakey.pem  -out  /openssl/tsareq.csr"

Burada şifreler girilirken TSA private key oluştururken girdiğiniz şifreyi girmeniz gereklidir.Ayrıca bilgileriniz CA oluştururken girdiğiniz bilgilerle eşleşmelidir.Şifre yanlış girilirse program sizi uyaracaktır.Extra attribute kısmını boş geçebilirsiniz,örnek olarak sadece şifre kısmını girdim.



Burada farklı olarak .csr uzantılı bir dosya oluşacaktır. Sertifika İmza Talebi (Certificate Signing Request) anlamına gelmektedir.  CSR dosyası; sertifikayı talep eden kurum bilgisi,sertifikanın kullanılacağı adres (Common Name),public Key gibi bilgileri içerir ve oluşturduğumuz kök sertifikadan imza talebinde bulunur.

Buradaki son aşama olan daha onceden olusturulmus ana sertifika (CA) kullanilarak TSA'nin gizli anahtarina uygun sertifikanin üretilmesidir.Bu işlem için oluşturulan tsareq.csr dosyasını kullanıyoruz;

"openssl  ca  -days 3650  -in  /openssl/tsareq.csr  -out  /openssl/tsacert.pem"

Komut girildiğinde bizden her adımda olduğu gibi bir şifre isteyecektir.Burada girilecek olan şifre CA ana sertifikasını oluştururken girdiğimiz şifredir.



Şifreyi doğru girdiğiniz takdirde karşınıza aşağıdaki gibi bir ekran gelecektir.Sertifikanızı imzalamak ve mevcut veritabanını güncellemek için sizden onay isteyecektir.Her iki soruyada “y” diyerek ilerliyoruz.




Son olarak aşağıdaki gibi bir ekran karşınıza çıkacaktır.Diğer sertifika bilgileri update edilecektir.



İşlemler bittiğinde klasör altında openssl klasörü içeriği aşağıdaki gibi görünecektir;

Serial ve index.txt dosyaları güncellendiği için program otomatik olarak bunların yedeklerini oluşturacak ve sonralarına “.old” ifadesini ekleyecektir.









 İmzalama İşlemi


Bu bölümde log dosyasının imzalama kısmını anlatmaya çalışacağım.Öncelikle daha kolay erişilmesi açısından ana dizin altına log adında bir klasör oluşturup sistemde bulunan syslog adındaki log dosyasını buraya kopyaladım.

Öncelikle aşağıdaki komut çalıştırılarak imzalanacak dosya için bir request oluşturuyoruz;

"openssl  ts  -query  -data  /log/syslog  -no_nonce  -out  /openssl/syslog.tsq"

Daha sonra oluşturduğumuz request için bir time stamp token oluşturacağız.Bu işlemle oluşturduğumuz token ,response yerine kullanılacaktır;

"openssl  ts  -reply  -queryfile  /openssl/syslog.tsq  -out  /openssl/syslog.der   -token_out  -config /usr/local/ssl/openssl.cnf"

Komut çalıştırıldığında sizden parolanızı girmenizi isteyecektir.Burada girmeniz gereken parola TSA private key oluşturulurken (tsakey.pem) girdiğiniz parola olmalıdır.Eğer parolanız doğru şekilde girilirse aşağıdaki gibi token oluşturulduğu bilgisi gelecektir.



Bu sırada karşınıza bir  uyarı gelebilir.Bunun nedeni programın default olarak tsaserial dosyasını aramasıdır.Fakat biz daha önceden serial adında bir dosya oluşturduğumuz için işlemlerimizi bu dosya ile sorunsuz gerçekleştirecektir.Ayrıca openssl.cnf dosyası içerisinde yaptığımız konfigürasyon hatalı olursa çalıştırdığımız komut bize hata döndürecektir.

Bu işlemin ardından klasör içerisinde “syslog.der” adında bir dosya oluşacaktır.Dosya oluştuğu takdirde imzalama işleminiz gerçekleşmiş anlamına gelmektedir.Bu dosya herhangi bir text editör yardımı ile açılamaz.Bu nedenle eğer kontrol etmek isterseniz aşağıdaki komutu kullanabilirsiniz;

"openssl  ts  -reply  -in  /openssl/syslog.der  -token_in  -text  -token_out"



Oluşturulan token dosyası ile imza işleminin doğru bir şekilde gerçekleştirilip gerçekleştirilmediğini kontrol etmek isterseniz aşağıdaki komutu kullanabilirsiniz;

"openssl  ts  -verify  -data  /log/syslog  -in  /openssl/syslog.der  -token_in  -CAfile  /openssl/cacert.pem   -untrusted  /openssl/tsacert.pem"

İmzalama işlemi düzgün bir şekilde gerçekleşmişse komutun çıktısı aşağıdaki gibi olacaktır.




Kullanılan komutların kısaca açıklamaları aşağıdaki gibidir;

req: Belirlediğimiz kök (CA) sertifikayı oluşturur.

new:  Yeni bir sertifika istediği gönderir.

X509: Self-signed bir kök sertifika  (CA) oluşturmak için kullanılır.

newkey:  Yeni bir sertifika ve private key oluşturma isteği için kullanılır.Komuttan sonra belirli parametreler girilmesi gereklidir.Örneğin rsa:2048 parametresi ile 2048 bitlik bir rsa oluşturulur.

days:  Sertifikanın ne kadar süreyle geçerli olacağını belirtmektedir.(Deneme amaçlı 10 yıllık 3650 gün olacak şekilde girildi ihtiyacınıza göre bir değer verebilirsiniz.)

out: Verilen parametrelere göre çıktı oluşmasını sağlar.

keyout: Out parametresine benzer fakat private key çıktıları için kullanılmaktadır.

genrsa: RSA için bir private key oluşturulur.PEM sertifikalar için aes kriptolama kullanılmaktadır.

ca: Sertifika isteklerinin imzalanması için kullanılmaktadır.

ts: Time Stamp Authority (TSA) işlemleri için kullanılan parametredir.

query : Time Stamp istekleri oluşturmak için kullanılmaktadır.

reply: Time Stamp response veya token üretmek için kullanılmaktadır.

token_out: Time stamp token üretmek için kullanılmaktadır.

config: İşlemleri gerçekleştirilirken kontrol edilecek konfigürasyon dosyasını belirtmektedir.

verify: Time stamp token ve datanın doğruluğunu kontrol etmek için kullanılmaktadır.

CAfile : PEM formatındaki self-signed CA sertifikasını belirtmek için kullanılmaktadır.

untrusted: PEM formatındaki güvenilir olmayan sertifika belirtilir.







www.syslogs.org
www.wikipedia.org
www.openssl.org 
www.ulakbim.gov.tr