Gönderen Konu: Pratik OpenSSL Kullanımı  (Okunma sayısı 556 defa)

GuvenliHost

  • Yönetici
  • Kahraman Üye
  • *****
  • İleti: 514
  • Karma +10/-0
    • Profili Görüntüle
Pratik OpenSSL Kullanımı
« : 06 Mart 2009, 22:51:08 »
Hemen her gün çeşitli işlerim için openssl’i kullanıyorum. Ara ara da arkadaşlardan bunu openssl’le nasil yaparim, openssl’in şu komutu ne işe yarardı gibisinden sorular aliyorum. Uzun zaman once bu konuda birseyler yazmistim ama usb diskimi Izmir’de kaybetmem sonrasi yayınlayamadım. Sonra tekrar hazırladım ve tekrar usb diskimi kaybettim. Pazar gunu biraz vakit bulunca hem egitim notlarina ekleyeceklerimi gozden gecirdim hem de bu konuda sık karşılaştığım soruları içeren openssl mini howto’sunu yazmaya oturdum. Eger yazı yayınlanırsa bilin ki bu sefer usb diskimi kaybetmedim:)
 Yazı hazırlarken benim için  en zor bölümü giriş kısmıdır. Üzerine yazdığım konu ile ilgili temel ifadeleri yazmakta o kadar zorlanırım ki bazen sırf bunu aşamadığım için yazıyı bırakırım. Masaüstümde adı konulmuş içeriği doldurulmuş ama giriş bölümü hazırlanmamış onca belge var. bu sefer de aynı akibete ugramamak icin dogrudan icerige giriyorum. Temel seyleri merak edenler konu hakkında daha fazla bilgi bulabilecekleri arama motorlarına danışmalı.
 Ilk Not: Openssl kullanarak aklınza gelebilecek her tür şifreleme/encoding(turkcesi ne ola ki?) ve tersi işlemler yapılabilir.
 OpenSSL Yardım Menüsü

 Openssl kullanımı aslında oldukça kolaydır fakat sunduğu seçenek sayısı fazla olduğu için genelde hangi paramnetrenin hangi sırada kullanılacağı şaşırılır. Bunun için openssl’in help özelliği kullanıabilir.
 # openssl -h openssl:Error: '-h' is an invalid command. Standard commands asn1parse      ca             ciphers        crl            crl2pkcs7 dgst           dh             dhparam        dsa            dsaparam ec             ecparam        enc            engine         errstr gendh          gendsa         genrsa         nseq           ocsp passwd         pkcs12         pkcs7          pkcs8          prime rand           req            rsa            rsautl         s_client s_server       s_time         sess_id        smime          speed spkac          verify         version        x509 Message Digest commands (see the `dgst' command for more details) md2            md4            md5            rmd160         sha sha1 Cipher commands (see the `enc' command for more details) aes-128-cbc    aes-128-ecb    aes-192-cbc    aes-192-ecb    aes-256-cbc aes-256-ecb    base64         bf             bf-cbc         bf-cfb bf-ecb         bf-ofb         cast           cast-cbc       cast5-cbc cast5-cfb      cast5-ecb      cast5-ofb      des            des-cbc des-cfb        des-ecb        des-ede        des-ede-cbc    des-ede-cfb des-ede-ofb    des-ede3       des-ede3-cbc   des-ede3-cfb   des-ede3-ofb des-ofb        des3           desx           rc2            rc2-40-cbc rc2-64-cbc     rc2-cbc        rc2-cfb        rc2-ecb        rc2-ofb rc4            rc4-40 Buradan alt komutlara ait kullanım bilgisi için de openssl alt_komt -h parametresi kullanılır.
 Mesela Openssl’in passwd altkomutunun kullanımı ile ilgili bilgi almak için
 # openssl passwd -h Usage: passwd [options] [passwords] where options are -crypt             standard Unix password algorithm (default) -1                 MD5-based password algorithm -apr1              MD5-based password algorithm, Apache variant -salt string       use provided salt -in file           read passwords from file -stdin             read passwords from stdin -noverify          never verify when reading password from terminal -quiet             no warnings -table             format output as table -reverse           switch table columns Base64 Encode/Decode İşlemleri

 İçerisinde HuzeyfeOnal yazılı bir dosyanın base64 ile encoding yapılması sonucu oluşan çıktı.
 root@home-labs:~# openssl enc -base64 -in test -out test1 SHV6ZXlmZU9uYWwK decoding için
 openssl enc -d -base64 …
 komutu kullanılır.
 SSL üzerinden çalışan bir servise bağlanma

 SSL/TLS üzerinden çalışmayan servislere kontrol amaçlı bağlanırken dogrudan telnet ip port ya da nc ip port komutlarını kullanırız fakat servis ssl çalıştırıyorsa bu iki bilinen  komut istediğimiz sonucu vermeyecektir. Bunun yerine Openssl ile birlitke gelen s_client parametresini kullanabiliriz.
 # telnet vpn.lifeoverip.net 443 Trying 80.93.212.86... Connected to vpn.lifeoverip.net. Escape character is '^]'. root@home-labs:~# openssl s_client -connect Zorla Guvenlik Olmaz… CONNECTED(00000003) depth=0 /C=TR/ST=Istanbul/L=Basaksehir/O=Lifeoverip/CN=mail.lifeoverip.net/emailAddress=huzeyfe@lifeoverip.net verify error:num=18:self signed certificate verify return:1 depth=0 /C=TR/ST=Istanbul/L=Basaksehir/O=Lifeoverip/CN=mail.lifeoverip.net/emailAddress=huzeyfe@lifeoverip.net verify return:1 --- Certificate chain  0 s:/C=TR/ST=Istanbul/L=Basaksehir/O=Lifeoverip/CN=mail.lifeoverip.net/emailAddress=huzeyfe@lifeoverip.net    i:/C=TR/ST=Istanbul/L=Basaksehir/O=Lifeoverip/CN=mail.lifeoverip.net/emailAddress=huzeyfe@lifeoverip.net --- Server certificate -----BEGIN CERTIFICATE----- MIIDljCCAv+gAwIBAgIJAOZtLpQBRe+5MA0GCSqGSIb3DQEBBAUAMIGPMQswCQYD VQQGEwJUUjERMA8GA1UECBMISXN0YW5idWwxEzARBgNVBAcTCkJhc2Frc2VoaXIx EzARBgNVBAoTCkxpZmVvdmVyaXAxHDAaBgNVBAMTE21haWwubGlmZW92ZXJpcC5u ZXQxJTAjBgkqhkiG9w0BCQEWFmh1emV5ZmVAbGlmZW92ZXJpcC5uZXQwHhcNMDgw NDIwMTgzNzMxWhcNMTEwMTE1MTgzNzMxWjCBjzELMAkGA1UEBhMCVFIxETAPBgNV BAgTCElzdGFuYnVsMRMwEQYDVQQHEwpCYXNha3NlaGlyMRMwEQYDVQQKEwpMaWZl b3ZlcmlwMRwwGgYDVQQDExNtYWlsLmxpZmVvdmVyaXAubmV0MSUwIwYJKoZIhvcN AQkBFhZodXpleWZlQGxpZmVvdmVyaXAubmV0MIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQCqqYPSzpC1ldtTc4o1/iQqN18C89lZg4jHqRplppkwHRhyCW/6ua3S ssUFPxm6rYVxjY+1hG13CHgJXhX22Agnr2PBicJrv1xvjWP571YZhVoof6UNpPDG WUe/3J4mVOXD7J2KvsOcW4zoTOCZauE5z0oeUu+77glvqOiF2pu3LQIDAQABo4H3 MIH0MB0GA1UdDgQWBBSEhZEvLn4PMLo+UravLekmt+RL7zCBxAYDVR0jBIG8MIG5 gBSEhZEvLn4PMLo+UravLekmt+RL76GBlaSBkjCBjzELMAkGA1UEBhMCVFIxETAP BgNVBAgTCElzdGFuYnVsMRMwEQYDVQQHEwpCYXNha3NlaGlyMRMwEQYDVQQKEwpM aWZlb3ZlcmlwMRwwGgYDVQQDExNtYWlsLmxpZmVvdmVyaXAubmV0MSUwIwYJKoZI hvcNAQkBFhZodXpleWZlQGxpZmVvdmVyaXAubmV0ggkA5m0ulAFF77kwDAYDVR0T BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBttymnjSI8Q1WcwuJH6bpz0OyWEU6w QCACvidVTbmtg9kWebXWolE9JDgp6n1tuU571qIu+HzkL8btsvBV2jl0JOmYmcFN bH0nyElWOU9+je92O1JnGeARcB2n6OLnRFO4KrgeNeVZLtPX3uyu68BEWl4ub/tg yMIXGPUwgSYnag== -----END CERTIFICATE----- subject=/C=TR/ST=Istanbul/L=Basaksehir/O=Lifeoverip/CN=mail.lifeoverip.net/emailAddress=huzeyfe@lifeoverip.net issuer=/C=TR/ST=Istanbul/L=Basaksehir/O=Lifeoverip/CN=mail.lifeoverip.net/emailAddress=huzeyfe@lifeoverip.net --- No client certificate CA names sent --- SSL handshake has read 1486 bytes and written 316 bytes --- New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA Server public key is 1024 bit Compression: NONE Expansion: NONE SSL-Session:     Protocol  : TLSv1     Cipher    : DHE-RSA-AES256-SHA     Session-ID: DA3CB24F96F6843BD4C66E23F8862EFB3EFF61CC706C379A5ED75753C8D6B4DE     Session-ID-ctx:     Master-Key: BD2985CDA790CDDE2D2BA27C66EC8C0210F1BEAA31906A6760A1B2560C7F318BCF3039EF0894CB0198759968DFFEAF39     Key-Arg   : None     Start Time: 1235905711     Timeout   : 300 (sec)     Verify return code: 18 (self signed certificate) --- GET / HTTP/1.1 Host:Zorla Guvenlik Olmaz… HTTP/1.1 302 Found Date: Sun, 01 Mar 2009 10:59:01 GMT Server: Apache/5.2.0 (Fedora) Location: src/login.php Content-Length: 0 Content-Type: text/html SSL Destekli Web Sunucu Simulasyonu

 Openssl kullanarak SSL destekli bir web sunucu simulasyonu gerçekleştirebiliriz. Kullanıcılar belirttiğimiz adrese bağlanarak normal bir ssl sitesine bağlanmış gibi işlem yapabilirler. Openssl’le yapılacak bu tip bir çalışmada web sunucu dogrudan çalıştırıldığı dizini gösterecektir.
 # openssl s_server -accept 444 -cert mycert.pem -WWW Using default temp DH parameters Using default temp ECDH parameters ACCEPT bad gethostbyaddr ACCEPT bad gethostbyaddr ACCEPT bad gethostbyaddr FILE:log/messages ACCEPT
 Hash Fonksiyonlarını Kullanma

 Openssl’inhangi hash fonksiyonlarını desteklediğini bulmak için openssl dgst -h komutu kullanılabilir.
 ... -md5            to use the md5 message digest algorithm (default) -md4            to use the md4 message digest algorithm -md2            to use the md2 message digest algorithm -sha1           to use the sha1 message digest algorithm -sha            to use the sha message digest algorithm -sha224         to use the sha224 message digest algorithm -sha256         to use the sha256 message digest algorithm -sha384         to use the sha384 message digest algorithm -sha512         to use the sha512 message digest algorithm -mdc2           to use the mdc2 message digest algorithm -ripemd160      to use the ripemd160 message digest algorithm Bir dosyanın hash’ini alma
 Md5 için;
 root@home-labs:~# openssl dgst -md5 /etc/passwd MD5(/etc/passwd)= 8edec48e1ba2784977bfd127474ce2c7 SHA512 için;
 root@home-labs:~# openssl dgst -sha512 /etc/passwd SHA512(/etc/passwd)= cf7626685b2a31be1d43338a48740a1297a2837b4b7c3638eab8174300650136907a1961fe8063cd9657cd9c120e3a24cdd979b4ba42c4255fbf3a1d42c59786 Komut satırından herhangi bir stringin hash değerini bulmak için
 ~# echo "huzeyfe" |openssl dgst -md5 cc33aa30e69ff51055dd3fb12e148f35 Simetrik Şifreleme ile Dosya Güvenliği

 Herhangi bir dosyayı des3 ile şifreleme
 root@home-labs:~# openssl enc -e -des3 -in /tmp/gizli_bilgi -out gizli_bilgi.des3 enter des-ede3-cbc encryption password: Verifying - enter des-ede3-cbc encryption password: yeni oluşturulan gizli_bilgi.des3 dosyasının içeriği okunmak istenirse anlamsız karekterler gözükecektir.
 # more gizli_bilgi.des3 Salted__æÛéA´µt(?äǰEÆ! Bu şekilde bir dosyayı şifreleyerek  kullanabilirsiniz.
 Oluşturulan dosyanın içeriğinin binary yerine text(Ascii-Armour) olması istenirse -a parametresi kullanılmalıdır.
 root@home-labs:~# openssl enc -a -e -des3  -in /etc/hosts -out hosts.des3 enter des-ede3-cbc encryption password: Verifying - enter des-ede3-cbc encryption password: root@home-labs:~# cat hosts.des3 U2FsdGVkX19F9/5/iH2jgjWlBCaw80hq2WsQ06KdKlimLdnXmoZLMTf9rtgwxM+L oN7nqMwFycIiR/2+K0IL/wID8xzkuC/VcrMnf6xumHS8T955yVhkrj80t3lHvKBY UTz0KsttNsgxN+X84b+VEg8YGwV8hks7nbDS/6c7lTD1XM9PhOTFTV7mEfM4vIaJ LMVKU4g4jla0igLzCRkF+2K028f4cHixxlIE5ol1C0x9t3butjmztzHnVrMyddZz SNXUCe/544epItIZtZWsaTBN4q/uRfZHwA/oo9b6tSP3LOwWvhmO7uuKfmMF8q3Q iL3JeTpEpuZU3bIyFOU2FRJdKvCW+rEHRY/+gfJFSdE= Şifreli dosyayı açmak için
 #openssl enc -d -des3 -in gizli_bilgi.des3 -out gizli_bilgi komutu kullanılır.
 Linux/UNIX Sistemlerin Parola Güvenliği

 UNIX/Linux sistemlerde kullanıcıların parola bilgileri /etc/shadow ya da /etc/master.passwd gibi dosyalarda şifrelenmiş olarak saklanır. Şifreleme için genelde kullanılan yöntem Md5 olmakla birlikte bazı dağıtımlar SHA256/512 kullanır. Linux/UNIX sistemlerde parolaların güvenliği sadece şifrelenmekle sağlanmaz, parolanın hash’ini ele geçiren birinin aynı zamanda bu şifrelemeyi karmaşıklaştırmak için kullanılan salt değerini ve tipini de ele geçirmesi gerekir.
 Mesela aşağıdaki gibi bir bilgi saldırganın işine yaramaz
 huzeyfe: mqTpXxm7ygQ9DD/pVIw7MLE444/PuNnAsRLy96SWJudCjvwQaD/.wPfA/AW7rnsRMkjeuIXFqP0RK0gEc6NFi
 Sebebi ise bu hashlenmiş parola bilgisinin bruteforce ya da rainbowtable larla çözülebilmesi için bunu hashlemek için kullanılan algoritmaya ve salt değerine ihtiyaç duyulmasıdır.
 Klasik bir UNIX/Linux Parola kontrol işlemi şu şekilde yapılır.
 Kullanıcı parola bilgisini girer–>Sistem bu parola bilgisi için otomatik bir salt değeri üretir ve yapılan ayara göre MD5 ya da başka bir algoritma ile hash değerini alır base64 encoding işlemine sokar –>/etc/shadow’a yazar.
 Aynı kullanıcı aynı parolayı bir kere daha girse sistemde oluşacak hash değeri farklı olacaktır.
 huzeyfe:$6$rqPzY.iD$mqTpXxm7ygQ9DD/pVIw7MLE444/PuNnAsRLy96SWJudCjvwQaD/.wPfA/AW7rnsRMkjeuIXFqP0RK0gEc6NFi.:14304:0:99999:7::: # passwd huzeyfe Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Her ikisi de aynı parola da aynı  olmasına rağmen yeni oluşan parola hash değeri  öncekinden farklı çıkacaktır.
 huzeyfe:$6$YKT3ptRg$JJWYIM5XF184QneNMk9qJTaCt.ESMlt2rOYCdJsW1alUBdCbaLAiFl/Zy8tMedjXAfPkuZIoIe4BSHYg7.1Cg/:14304:0:99999:7::: Bunun sebebi yeni bir şifre oluşturulurken seçilen salt değerlerinin farklı olmasıdır.
 Parolanın hash değerindeki önemli alanlar
 huzeyfe: kullanıcı ismi $6$ parolanın SHA512 algoritması kullanılarak hashlendiği $....$ Rastgele seçilen salt değeri. JJWYIM5XF184QneNMk9qJTaCt.ESMlt2rOYCdJsW1alUBdCbaLAiFl/Zy8tMedjXAfPkuZIoIe4BSHYg7.1Cg  parolanın salt(tuz?) katılmış halinin hash değeri. Openssl ile Linux/UNIX benzeri parolalar oluşturmak

 Openssl’in passwd altkomutu ile md5, apr1 tipi algoritmalar kullanılarak oluşturulmuş  ve salt eklenmiş hash değerleri oluşturulabilir.
 openssl passwd -1 -salt xyz  parola gibi.
 Mesela passwd komutu kullanarak erhan kullanicisinin parolasini test1234 olarak degistirelim.
 Sonra bu değişikliği shadow dosyasından okuyalım.
 #passwd erhan ... #grep erhan /etc/shadow erhan:$1$vJbpReZd$/T7fZLwSquIMe.yLMsd9U/ Aynı değeri openssl passwd -1 komutu ile ede edebiliriz.
 # openssl passwd -1 -salt vJbpReZd test1234 $1$vJbpReZd$/T7fZLwSquIMe.yLMsd9U/ Cisco IOS type 5   Parola Güvenliği

 Cisco enable  parolası kaydedilirken Linux sistemlerdekine benzer mantık  işler bunun sebebi Cisco IOS’un FreeBSD şifreleme kütüphanesini kullanmasıdır. Aşağıdaki çıktı bize daha fazla fikir verecektir.
 Router(config)#enable secret HL_R12 en parolasini HL_R12 yaptık sonra sistemde bunun nasıl gözüktüğüne bakalım.
 Router#sh run | include secret enable secret 5 $1$RK5L$05G045n5XVlENtyo04PBT1 görüleceği üzere Linux/UNIX sistemlerdekine benzer/aynı bir çıktı.
 $1$ :Md5 kullanılmış RK5L :Salt değeri 05G045n5XVlENtyo04PBT1: Hash değeri. Salt değeri ve parolayı kullanarak aynı çıktıyı Openssl ile elde edebiliriz.
 ~# openssl passwd -1 -table -salt "RK5L" "HL_R12" HL_R12  $1$RK5L$05G045n5XVlENtyo04PBT1 OpenSSL ile sertifika işlemleri vs için http://csirt.ulakbim.gov.tr/dokumanlar/ssl_sayisal_sertifikalar.pdf adresindeki yazı işinize yarayacaktır.