Bash Komut Dosyalarında Şifreli Parolalar Nasıl Kullanılır
Yayınlanan: 2022-01-29Parola 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_USER
adlı bir değişkeni “geek” olarak belirledik. - Daha sonra “.secret_vault.txt” dosyasından alınan şifresi çözülmüş şifrenin değerine
REMOTE_PASSWD
adlı bir değişkeni, biraz önce kullandığımız komutun aynısını kullanarak ayarlıyoruz. - Uzak bilgisayarın konumu,
REMOTE_LINUX
adlı bir değişkende saklanır.
Bu bilgi ile uzaktaki bilgisayara bağlanmak için ssh
komutunu kullanabiliriz.
-
sshpass
komutu, bağlantı satırındaki ilk komuttur.-p
(şifre) seçeneği ile kullanıyoruz. Bu,ssh
komutuna gönderilmesi gereken şifreyi belirlememizi sağlar. -
-T
(sözde terminal tahsisini devre dışı bırak) seçeneğinissh
ile 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.