Bash Komut Dosyalarında Şifreli Parolalar Nasıl Kullanılır
Yayınlanan: 2022-01-29
Parola korumalı bir kaynağa bağlanmak için bir Linux komut dosyası kullanmak zorunda kalırsanız, bu parolayı komut dosyasına koymaktan muhtemelen rahatsız olursunuz. OpenSSL bu sorunu sizin için çözer.
Şifreler ve Komut Dosyaları
Kabuk komut dosyalarına parola koymak iyi bir fikir değildir. Aslında, bu gerçekten kötü bir fikir. Senaryo yanlış ellere geçerse, onu okuyan herkes şifrenin ne olduğunu görebilir. Ancak bir komut dosyası kullanmak zorunda kalırsanız, başka ne yapabilirsiniz?
İşlem bu noktaya ulaştığında parolayı manuel olarak girebilirsiniz, ancak komut dosyası katılımsız çalışacaksa bu çalışmaz. Neyse ki, şifreleri komut dosyasına sabit kodlamanın bir alternatifi var. Sezgisel olarak, bunu başarmak için bazı güçlü şifreleme ile birlikte farklı bir şifre kullanır.
Örnek senaryomuzda Ubuntu bilgisayarımızdan bir Fedora Linux bilgisayarına uzak bağlantı yapmamız gerekiyor. Fedora bilgisayarına SSH bağlantısı yapmak için bir Bash kabuk betiği kullanacağız. Komut dosyası katılımsız çalışmalıdır ve komut dosyasına uzak hesabın parolasını koymak istemiyoruz. Bu durumda SSH anahtarlarını kullanamayız çünkü Fedora bilgisayar üzerinde herhangi bir kontrol veya yönetici hakkımız yokmuş gibi davranıyoruz.
Şifrelemeyi işlemek için iyi bilinen OpenSSL araç setini ve parolayı SSH komutuna beslemek için sshpass adlı bir yardımcı programı kullanacağız.
İLGİLİ: Linux Kabuğundan SSH Anahtarları Nasıl Oluşturulur ve Yüklenir
OpenSSL ve sshpass'ı yükleme
Diğer birçok şifreleme ve güvenlik aracı OpenSSL kullandığından, bilgisayarınızda zaten yüklü olabilir. Ancak, değilse, yüklenmesi yalnızca bir dakika sürer.
Ubuntu'da şu komutu yazın:
sudo uygun olsun openssl

sshpass yüklemek için şu komutu kullanın:
sudo apt sshpass'ı kurun

Fedora'da şunu yazmanız gerekir:
sudo dnf install openssl

sshpass kurma komutu:
sudo dnf sshpass'ı kurun

Manjaro Linux'ta OpenSSL'yi aşağıdakilerle kurabiliriz:
sudo pacman -Sy openssl

Son olarak, sshpass kurmak için şu komutu kullanın:
sudo pacman -Sy sshpass

Komut Satırında Şifreleme
openssl komutunu betiklerle kullanmaya başlamadan önce, komut satırında kullanarak onu tanıyalım. Diyelim ki uzak bilgisayardaki hesabın şifresi rusty!herring.pitshaft . Bu şifreyi openssl kullanarak şifreleyeceğiz.
Bunu yaparken bir şifreleme şifresi sağlamamız gerekiyor. Şifreleme şifresi, şifreleme ve şifre çözme işlemlerinde kullanılır. openssl komutunda bir çok parametre ve seçenek bulunmaktadır. Her birine birazdan göz atacağız.
yankı 'paslı!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'

Uzak hesap parolasını bir boru aracılığıyla ve openssl komutuna göndermek için echo kullanıyoruz.
openssl parametreleri şunlardır:
- enc -aes-256-cbc : Kodlama türü. Şifre bloğu zincirleme ile Gelişmiş Şifreleme Standardı 256 bit anahtar şifresini kullanıyoruz.
- -md sha512 : Mesaj özeti (karma) türü. SHA512 şifreleme algoritmasını kullanıyoruz.
- -a : Bu,
opensslşifreleme aşamasından sonra ve şifre çözme aşamasından önce base-64 kodlamasını uygulamasını söyler. - -pbkdf2 : Parola Tabanlı Anahtar Türetme İşlevi 2'yi (PBKDF2) kullanmak, bir kaba kuvvet saldırısının parolanızı tahmin etmede başarılı olmasını çok daha zor hale getirir. PBKDF2, şifrelemeyi gerçekleştirmek için birçok hesaplama gerektirir. Bir saldırganın tüm bu hesaplamaları çoğaltması gerekir.
- -iter 100000 : PBKDF2'nin kullanacağı hesaplamaların sayısını ayarlar.
- -salt : Rastgele uygulanan bir tuz değeri kullanmak, düz metin aynı olsa bile şifreli çıktıyı her seferinde farklı kılar.
- -pass pass:'pick.your.password' : Şifrelenmiş uzak parolanın şifresini çözmek için kullanmamız gereken parola.
pick.your.password, seçtiğiniz sağlam bir parolayla değiştirin.
rusty!herring.pitshaft şifreli hali terminal penceresine yazılır.

Bunun şifresini çözmek için, bu şifreli dizgiyi, şifrelemek için kullandığımız aynı parametrelerle, ancak -d (şifre çözme) seçeneğini ekleyerek openssl geçirmemiz gerekiyor.
yankı U2FsdGVkX19iiiRNHESG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'

Dizenin şifresi çözülür ve orijinal metnimiz—uzak kullanıcı hesabının parolası—terminal penceresine yazılır.


Bu, uzak kullanıcı hesabı parolamızı güvenli bir şekilde şifreleyebileceğimizi kanıtlar. Ayrıca şifreleme aşamasında verdiğimiz şifreyi kullanarak ihtiyaç duyduğumuzda şifresini de çözebiliriz.
Ama bu durumumuzu gerçekten iyileştiriyor mu? Uzak hesap şifresinin şifresini çözmek için şifreleme şifresine ihtiyacımız varsa, şifre çözme şifresinin kesinlikle komut dosyasında olması gerekecek mi? Evet, öyle. Ancak şifrelenmiş uzak kullanıcı hesabı parolası farklı, gizli bir dosyada saklanacaktır. Dosyadaki izinler, sizin ve sistemin kök kullanıcısı dışında herkesin dosyaya erişmesini engeller.
Çıktıyı şifreleme komutundan bir dosyaya göndermek için yeniden yönlendirmeyi kullanabiliriz. Dosyanın adı “.secret_vault.txt”. Şifreleme parolasını daha sağlam bir parolayla değiştirdik.
yankı 'paslı!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' > .secret_vault.txt

Görünür bir şey olmaz, ancak parola şifrelenir ve “.secret_vault.txt” dosyasına gönderilir.
Gizli dosyadaki şifreyi çözerek çalıştığını test edebiliriz. Burada cat kullandığımızı unutmayın, echo değil.
kedi .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password'

Parola, dosyadaki verilerden başarıyla çözüldü. Bu dosyadaki izinleri başka kimsenin erişemeyeceği şekilde değiştirmek için chmod kullanacağız.
chmod 600 .secret_vault.txt
ls -l .secret_vault.txt

600 izin maskesi kullanmak, dosya sahibi dışındaki herkesin tüm erişimini kaldırır. Artık senaryomuzu yazmaya geçebiliriz.
İLGİLİ: Linux'ta chmod Komutu Nasıl Kullanılır
Bir Komut Dosyasında OpenSSL Kullanmak
Senaryomuz oldukça basit:
#!/bin/bash # uzak hesabın adı REMOTE_USER=geek # uzak hesap için şifre REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password') # uzak bilgisayar REMOTE_LINUX=fedora-34.yerel # uzak bilgisayara bağlanın ve script.log adlı bir dosyaya bir zaman damgası koyun sshpass -p $REMOTE_PASSWD ssh -T $REMOTE_USER@$REMOTE_LINUX << _remote_commands echo $USER "-" $(tarih) >> /home/$REMOTE_USER/script.log _remote_commands
-
REMOTE_USERadlı bir değişkeni “geek” olarak belirledik. - Daha sonra “.secret_vault.txt” dosyasından alınan şifresi çözülmüş şifrenin değerine
REMOTE_PASSWDadlı bir değişkeni, biraz önce kullandığımız komutun aynısını kullanarak ayarlıyoruz. - Uzak bilgisayarın konumu,
REMOTE_LINUXadlı bir değişkende saklanır.
Bu bilgi ile uzaktaki bilgisayara bağlanmak için ssh komutunu kullanabiliriz.
-
sshpasskomutu, bağlantı satırındaki ilk komuttur.-p(şifre) seçeneği ile kullanıyoruz. Bu,sshkomutuna gönderilmesi gereken şifreyi belirlememizi sağlar. -
-T(sözde terminal tahsisini devre dışı bırak) seçeneğinisshile kullanıyoruz çünkü uzak bilgisayarda bize tahsis edilmiş bir sözde-TTY'ye ihtiyacımız yok.
Uzak bilgisayara bir komut iletmek için kısa bir burada belge kullanıyoruz. İki _remote_commands dizesi arasındaki her şey, uzak bilgisayardaki kullanıcı oturumuna talimatlar olarak gönderilir; bu durumda, bu tek bir Bash betiği satırıdır.
Uzak bilgisayara gönderilen komut, kullanıcı hesabı adını ve zaman damgasını "script.log" adlı bir dosyaya kaydeder.
Komut dosyasını kopyalayıp bir düzenleyiciye yapıştırın ve "go-remote.sh" adlı bir dosyaya kaydedin. Ayrıntıları kendi uzak bilgisayarınızın adresini, uzak kullanıcı hesabını ve uzak hesap parolasını yansıtacak şekilde değiştirmeyi unutmayın.
Komut dosyasını yürütülebilir hale getirmek için chmod kullanın.
chmod +x go-remote.sh

Geriye sadece denemek kalıyor. Senaryomuzu ateşleyelim.
./go-remote.sh

Komut dosyamız, katılımsız bir komut dosyası için minimalist bir şablon olduğundan, terminale çıktı yoktur. Ancak Fedora bilgisayarındaki “script.log” dosyasını kontrol edersek, uzak bağlantıların başarıyla yapıldığını ve “script.log” dosyasının zaman damgalarıyla güncellendiğini görebiliriz.
kedi betiği.log

Şifreniz Gizli
Uzak hesap parolanız komut dosyasına kaydedilmez.
Ve şifre çözme şifresi komut dosyasında olmasına rağmen, şifresini çözmek ve uzak hesap şifresini almak için “.secret_vault.txt” dosyanıza başka hiç kimse erişemez.

