Libreboot ve GnuPG ile boot güvenliği
- Bir GnuPG anahtarı oluşturun
- Gerekli yazılımları indirin
- Değiştirilecek Libreboot imajını elde edin
- ROM imajından grubtest.cfg dosyasını çıkarın
- GRUB güvenliği için parola belirleyin
- Açık anahtarınızı hazırlayın
- GRUB'ın imza kontrolünü açın
- Çekirdek ve yapılandırma dosyalarını imzalayın
- Libreboot ROM'una grubtest.cfg'nin yazılması
- ROM'a libreboot.rom imajının yazılması
- Bilgisayarınızı yeniden başlatın ve denemenizi yapın
- Yapılandırmanızı kalıcı hale getirin
- İmzalama işlemini otomatikleştirmek
- İşler ters giderse
- Ek Okumalar
Libreboot, GnuPG ile birlikte bilgisayarınızı daha güvenli hale getirebilir. Bunun için öncelikle bir bilgisayarın nasıl çalıştığını ve açılmak için içinden geçtiği süreçlerin anlaşılması gereklidir.
Bir bilgisayar hayatına elektrik ile başladığında sırasıyla aşağıdaki adımlar gerçekleşir:
- Libreboot, anakarttaki bir hafızadan RAM'e yüklenir ve çalışmaya başlar.
- Libreboot, bir önyükleyici (bootloader) olan GRUB'ı yükler.
- GRUB
/boot
dizininde bulunan ayar dosyasına bağlı olarak Linux'u yani çekirdeği yükler. - Çekirdek donanımları devreye alarak işletim sistemini yükler.
- Bilgisayarınız açılır.
Bu sürecin güvenliği, her aşamanın kendinden sonraki aşamayı istenilen şekilde ve bilinen kaynaktan yüklenmesinin sağlanması ile mümkündür.
Libreboot, kendi dahilinde GRUB'ı çalıştırır. Bu bakımdan Libreboot kurulu bir cihazda kullanılabilecek biri depolama aygıtında, biri BIOS çipinde olmak üzere iki GRUB bulunur. Libreboot çalışma aşamasında BIOS çipinde bulunan GRUB'ı kullanarak sistemde bulunan GRUB'ı yükler.
GnuPG ile Libreboot'un GRUB'ın kurulumunu ve yüklenecek çekirdeklerin değiştirilmediğini doğrulaması için ayarlarda bir miktar değişiklik yapmak gerekmektedir.
Bir GnuPG anahtarı oluşturun
GRUB, kriptografik olarak çekirdek ve ayar dosyalarını denetlemek için GnuPG kullanmaktadır. Şifreleme esnasında kullanılacak anahtarın kullanıcı tarafından üretilmesi gerekmektedir. Eğer halihazırda bir GnuPG anahtarınız yoksa, sadece bu amaçla kullanmak için veya genel olarak kullanılmak üzere bir GnuPG anahtarı üretebilirsiniz. Bunun için GnuPG anahtar üretimi rehberinden yararlanabilirsiniz.
Bu noktada, ihtiyaç ve beklentilerinize göre değerlendirmeniz gereken bir husus vardır. Eğer kişisel GnuPG anahtarınızı sürekli olarak kullanacaksanız, bu anahtarın bir noktada açığa çıkması veya kaybedilmesi tehlikesini de göze almanız gerekecektir. Aynı zamanda bu durum, siz farkında olmadan anahtarınız kullanılarak çekirdeklerin veya ayar dosyalarının sizin anahtarınızla imzalanabileceği anlamına da gelmektedir. Bu sebepten dolayı anahtarınızı bir zarola ile korumanızı ve kağıt bir yedeğini almanızı şiddetle tavsiye ederiz.
GnuPG anahtarınızı oluşturduktan sonra sonraki aşamaya geçebilirsiniz.
Gerekli yazılımları indirin
Libreboot imajında değişiklikler yapabilmek ve bu değişiklikleri BIOS çipine yükleyebilmek için bazı yazılımlara ihtiyaç vardır. Libreboot'un arşivinden gerekli dosyaları indirebilir, indirilen dosyaların imzalarını GnuPG ile doğrulayabilirsiniz. İhtiyacınız olan cbfstool
ve flashrom
(dizinde flash adında) yazılımları indirdiğiniz arşivin dizininde bulunmaktadır.
Flashrom yazılımını dağıtımınızın paket depolarından da indirebilirsiniz.
APT paket yöneticisi kullanan dağıtımlarda (Debian, Mint, Ubuntu vb.):
sudo apt-get update
sudo apt-get install flashrom
Yum paket yöneticisi kullanan dağıtımlarda (Fedora, CentOS vb.):
sudo yum install flashrom
Değiştirilecek Libreboot imajını elde edin
Bu noktada iki seçenek bulunmaktadır. Şayet cihazınızda halihazırda Libreboot yüklüyse, cihazınızın ROM'undan doğrudan imajı çekebilir ve üzerinde değişiklik yapabilirsiniz.
- Bunun için aşağıdaki komutu çalıştırabilirsiniz;
sudo flashrom -p internal -r libreboot.rom
ROM imajı libreboot.rom olarak bulunduğunuz dizine kaydolacaktır.
- Eğer ROM imajını indirip değişikliklerinizi yapmak isterseniz, Libreboot imajını buradan indirebilirsiniz.
Çipin boyutunu öğrenmek için, flashrom -p internal
komutunu çalıştırın. Aşağıdaki gibi bir çıktı elde etmeniz gerekmektedir:
Found Macronix flash chip "MX25L6406E/MX25L6408E" (8192 kB, SPI)
mapped at physical address 0x00000000ff800000.
Yukarıdaki örnekte, çip boyutu 8 MB olarak görünmektedir.
Dilediğiniz arşiv yöneticisi ile cihazınıza uygun olan imajı çıkarabilirsiniz.
ROM imajından grubtest.cfg dosyasını çıkarın
ROM imajında yapılacak değişiklikler için cbfstool
yazılımını kullanabilirsiniz. Bunun için çıkardığınız libreboot.rom
dosyasını cbfstool
'un bulunduğu dizine koyun.
Uçbirimde cbfstool
dizininde iken ./cbfstool libreboot.rom print
komutu ile ROM imajında bulunan dosyaları listeleyebilirsiniz. İmaj içinde grub.cfg
ve grubtest.cfg
adlı iki GRUB ayar dosyası görülecektir. grub.cfg
, Libreboot'un temel kullandığı yapılandırma dosyasıdır. Öncelikle grubtest.cfg
dosyasını düzenleyerek bir deneme yapılandırması oluşturun. Böylece, yapılandırmadan memnun olduktan sonra grub.cfg
dosyası ile test dosyasını değiştirip cihazınızı güvenli şekilde hazır hale getirebilirsiniz.
cbfstool
dizininde libreboot.rom
'un bulunduğundan emin olup, aşağıdaki komutu çalıştırarak grubtest.cfg
dosyasını çıkarabilirsiniz.
./cbfstool libreboot.rom extract -n grubtest.cfg -f grubtest.cfg
GRUB güvenliği için parola belirleyin
Bir saldırganın GnuPG doğrulamasını aşmak için yapması gereken tek şey, boot aşamasında GRUB'a doğrulama yapmamasını söylemektir. Bu bakımdan, Libreboot içinde çalışan GRUB'ın ayar değişiklikleri için parola talep etmesi güvenliğin anlamlı olabilmesi için şarttır.
Bunun için Zarola yöntemini kullanmanızı şiddetle tavsiye ederiz. Çünkü bilgisayarınızın güvenliğinin ilk adımı bu parolanın güvenliğine bağlıdır.
Bunun için bir uçbirim açıp, grub-mkpasswd-pbkdf2
komutunu çalıştırıp parolanızı girebilirsiniz. Çıktı şuna benzeyecektir:
grub.pbkdf2.sha512.10000.B08007ADC512E1BB058D62132F94A6EBF96E27511538F1F9ED59B3DE0556FA70A63F617C56D532C499D2E42AABF6B9F8F5EDAC604DC88567268A2D63DF0325F3.A9392DB618EE22AC423CB490B9809B08FB003FBA63B04F310DCD776335282B5D57134671248C711D9D60A7E9A220821B6701EB038F1368D87B66FC632B73801B
Seçtiğiniz metin editörü ile grubtest.cfg
dosyasına, bir önceki adımda aldığınız parola özüt (hash) değerini aşağıdaki şekilde girin.
gfxpayload=keep
terminaloutput --append gfxterm
set superusers="root"
password_pbkdf2 root grub.pbkdf2.sha512.10000.B08007ADC512E1BB058D62132F94A6EBF96E27511538F1F9ED59B3DE0556FA70A63F617C56D532C499D2E42AABF6B9F8F5EDAC604DC88567268A2D63DF0325F3.A9392DB618EE22AC423CB490B9809B08FB003FBA63B04F310DCD776335282B5D57134671248C711D9D60A7E9A220821B6701EB038F1368D87B66FC632B73801B
#Default to first option, automatically boot after 1 seccond
Her açılışta GRUB'a parola girmemek için, standart yükleme seçeneğini parola gerektirmeyen bir şekilde ayarlamak yerinde olacaktır. GRUB, GnuPG ile kontrolleri yapacağı için bu işlem güvenlik açısından bir sorun teşkil etmeyecektir. Bunun için --unrestricted
parametresini aşağıdaki gibi ekleyin.
menuentry 'Load Operating System (incl. fully encrypted disks) [o]' --hotkey='o' --unrestricted {
Sabit diskinizde bulunan GRUB'ın GnuPG güvenliğini geçememesi için aşağıdaki gibi unset superusers
satırının başına #
koyarak devre dışı bırakılması gerekmektedir.
function try_user_config {
set root="${1}"
for dir in boot grub grub2 boot/grub boot/grub2; do
for name in '' autoboot_ libreboot_ coreboot_; do
if [ -f /"${dir}"/"${name}"grub.cfg ]; then
#unset superusers
configfile /"${dir}"/"${name}"grub.cfg
fi
done
done
}
Açık anahtarınızı hazırlayın
GRUB'ın kontrolleri yapacağı GnuPG anahtarınızın açık anahtarını (public key) uygun formatta kaydetmeniz gerekmektedir. Bunun için aşağıdaki komutu çalıştırın. Açık anahtarınız, boot.key
ismiyle bulunduğunuz dizine kaydedilecektir. (Birden fazla GnuPG anahtarınız varsa, --export
parametresinden sonra anahtar ID'nizi ya da e-posta adresinizi girmeniz gerekmektedir.)
gpg --export > boot.key
GRUB'ın imza kontrolünü açın
Libreboot GRUB'ın imzaları GnuPG anahtarınızla kontrol etmesi için aşağıdaki parametreyi grubtest.cfg
yapılandırma dosyasında menü girdilerinden üste ekleyin.
trust (cbfsdisk)/boot.key
set check_signatures=enforce
Çekirdek ve yapılandırma dosyalarını imzalayın
Libreboot'un kontrol etmesi gereken dosyalara kendi anahtarınızla imza atmanız gerekmektedir. İmzalanacak dosyalar aşağıdaki gibidir;
/boot/initramd veya initramfs
/boot/vmlinuz.*
/boot/grub/grub.cfg
Libreboot'a eklenecek;
grubtest.cfg
Dosyaları imzalamak için aşağıdaki komutu listedeki dosyalar için tek tek çalıştırın.
gpg -u [anahtar ID veya e-postanız] --detach-sign [imzalanacak dosya]
Her işlem sonrasında imzalanan dosyanın adı ile bir .sig dosyası oluşacaktır. Boot dizini altındaki dosyaları imzalamak için root yetkisine ihtiyacınız vardır. GnuPG'yi root yetkisi ile çalıştırdığınızda, anahtarınız root kullanıcısının anahtarlığında olmadığından ilgili anahtarın bulunamadığına dair bir hata alabilirsiniz. Bunun için çalıştırdığınız GnuPG komutlarına --homedir /home/kullaniciadi/.gnupg
parametresini ekleyerek GnuPG'nin anahtarınızın bulunduğu dizinde çalışmasını sağlayabilirsiniz.
Her bir .sig dosyasını ilgili dosyanın yanına ekledikten sonra ROM'un hazırlanmasına ve yüklenmesine geçebilirsiniz.
Libreboot ROM'una grubtest.cfg'nin yazılması
Aşağıdaki dosyaları cbfstool
dizininin altına alın:
boot.key
grubtest.cfg
grubtest.cfg.sig
Daha sonra ROM'un içindeki eski dosyaların silinmesi gerekmektedir. Bunun için aşağıdaki komutları sırasıyla çalıştırın:
./cbfstool libreboot.rom remove -n boot.key
./cbfstool libreboot.rom remove -n grubtest.cfg
./cbfstool libreboot.rom remove -n grubtest.cfg.sig
Ardından yeni dosyalarımızın libreboot.rom
'un içine eklenmesi gerekmektedir. Bunun için:
./cbfstool libreboot.rom add -n boot.key -f boot.key -t raw
./cbfstool libreboot.rom add -n grubtest.cfg -f grubtest.cfg -t raw
./cbfstool libreboot.rom add -n grubtest.cfg.sig -f grubtest.cfg.sig -t raw
Artık libreboot.rom
dosyanız BIOS çipinize yazılmaya hazır.
ROM'a libreboot.rom imajının yazılması
libreboot.rom
dosyasını "flash" dosyasının bulunduğu dizine alın ve ardından aşağıdaki komutu çalıştırarak çipe imajı yazın.
sudo ./flash update libreboot.rom
Eğer doğru ROM imajını seçtiğinizden emin olmanıza rağmen uyumsuzluk hatası alıyorsanız yazım işlemini zorla yapabilirsiniz.
KESİNLİKLE GARANTİSİ YOKTUR, BİLGİSAYARINIZI KULLANILAMAZ HALE GETİREBİLİRSİNİZ.
sudo ./flash forceupdate libreboot.rom
Bilgisayarınızı yeniden başlatın ve denemenizi yapın
ROM yazıldıktan sonra, bilgisayarınızı yeniden başlatıp yaptığınız değişikliklerin çalışıp çalışmadığını deneyebilirsiniz. Ekranınız açılır açılmaz birkaç kere boşluk tuşuna basıp, gelen GRUB ekranında Load test configuration (grubtest.cfg) inside of CBFS
seçeneğini seçin. Gelen ekrandan bilgisayarınızı başlattığınızda sorunsuz şekilde çalışıyorsa her şey yolunda demektir.
Herhangi bir şey yanlışsa ve cihazınız açılmazsa, bilgisayarınızı kapatıp yeniden açtığınızda olağan yapılandırmanız ile açılacaktır, panik yapmayın.
Eğer imza sisteminin çalışıp çalışmadığını denemek isterseniz, kasıtlı olarak imzalı dosyalarını silip grubtest.cfg
ile bilgisayarınızı başlatmaya çalışırsanız hata almanız lazımdır. Bu şekilde yapılandırmanızın doğru olduğunu ve imzaları denetlediğini görebilirsiniz.
Yapılandırmanızı kalıcı hale getirin
Eğer grubtest.cfg
yapılandırmasından memnun kaldıysanız, grubtest.cfg
dosyasını grub.cfg
olarak adlandırıp 7. adımdan itibaren işlemleri tekrarladığınızda, bilgisayarınız Libreboot ve GRUB'ın GnuPG denetimi altında açılacaktır.
Çekirdek veya GRUB yapılandırmalarınıza güncelleme geldiği durumlarda imzaları yenilemeyi ihmal etmeyin, aksi takdirde bilgisayarınız açılmaz.
İmzalama işlemini otomatikleştirmek
Güncellemeler, kurulumunuza bağlı olarak kendiliğinden ve sessizce gerçekleşebilmektedir. Bu durum, güncellenen çekirdek ve GRUB yapılandırma dosyası imzalanmayacağı için, Libreboot'un bir sonraki açılışta cihazınızı çalıştırmayı reddetmesi ile sonuçlanabilir. Bu durumda Libreboot'u, parolasını girerek, imza kontrolü olmadan çalıştırabilirsiniz. Ancak gereksiz paniğe yol açmamak adına, işletim sisteminizin çekirdeğinizi her güncellediğinde imzalarını da yenilemesini sağlayabilirsiniz. Bunun için küçük bir betiğe ihtiyacınız vardır. Bu betiğin olduğu gibi çalışabilmesi için özel anahtarınızı (private key) root kullanıcısının anahtarlığına koyabilir (gpg --import ile
) ya da betiğin içerisinde gpg
ile başlayan tüm komutların sonuna --homedir /home/kullaniciadiniz/.gnupg
parametresini ekleyebilirsiniz.
grub2-signing-extension betiğini bağlantıdan indirebilir veya aşağıdan kopyalayabilirsiniz.
#!/bin/bash
#grub2-update-kernel-signature
#Renews the signature in /boot/.
#Author: Bandie
#Licence: GNU-GPLv3
function sign(){
for f in `find /boot -maxdepth 1 -type f`
do
if gpg --detach-sign $f
then
echo $f signed.
else
return 1
fi
done
if gpg --detach-sign "/boot/grub/grub.cfg"
then
echo /boot/grub/grub.cfg signed.
else
return 1
fi
return 0
}
rm /boot/*.sig
rm /boot/grub/grub.cfg.sig
if ! sign
then
sign
fi
Betiği aşağıdaki dizine zz-update-signatures adıyla kaydedin:
Dizindeki betikler isimlerine göre sırayla çağrıldıklarından betiğinizin alfabetik olarak sonda yer alması gerekiyor.
/etc/kernel/postinst.d/
Ardından dosyaya çalıştırma izni verin:
sudo chmod +x zz-update-signatures
Bu aşamanın ardından, her çekirdek güncellemesinde ilgili betik çalışarak imzaların varlığını kontrol edecek, imza yoksa /boot
dizinindeki her dosyayı imzalayacak ve ardından GRUB yapılandırmasını imzalayacaktır. Bu aşamada cihazınız sizden GnuPG anahtarınızın parolasını isteyecektir.
İşler ters giderse
Şayet işler ters giderse cihazınızı hala çalıştırmak isteyebilirsiniz. Ters gidebilecek şeyler arasında bir güncelleme sırasında grub.cfg, initrm veya vmlinuz dosyalarının güncellenmesi fakat bir sebepten imzalanmaması olabilir veya biri bilgisayarınızı kurcalamıştır ve Libreboot bunun farkında varmış olabilir.
Kimi zamanlarda imza korumasını güvenlik gereklilikleri dışında da devredışı bırakmak isteyebilirsiniz. Mesela bir liveUSB ile GNU/Linux çalıştırmak isterseniz.
Bunu yapmak için Libreboot ekranı geldiği zaman bir tuşa basarak boot işlemini durdurun veya parolanızı girmeyerek menüye geri dönün.
Ardından ctrl + C
tuş kombinasyonu ile grub terminaline girip aşağıdaki komutu girin:
set check_signatures=no
Bunun ardından cihazınızı başlatmak üzere menüden dilediğiniz seçeneği seçin. Bu sefer için Libreboot imza kontrolünü yapmadan yapılandırmadaki işlemleri uygulayacak ve bilgisayarınızı çalıştıracaktır.
Ek Okumalar
https://libreboot.org/docs/gnulinux/grub_hardening.html
https://github.com/Bandie/grub2-signing-extension
https://www.crowdstrike.com/blog/enhancing-secure-boot-chain-on-fedora-29/
https://www.gnu.org/software/grub/manual/grub/html_node/Using-digital-signatures.html