如何在 Bash 腳本中使用加密密碼

已發表: 2022-01-29
Ubuntu 風格的 Linux 筆記本電腦。
fatmawati achmad zaenuri/Shutterstock.com

如果您被迫使用 Linux 腳本連接到受密碼保護的資源,您可能會對將密碼放入腳本感到不安。 OpenSSL 為您解決了這個問題。

密碼和腳本

將密碼放在 shell 腳本中並不是一個好主意。 事實上,這是一個非常糟糕的主意。 如果腳本落入壞人之手,閱讀它的每個人都可以看到密碼是什麼。 但如果你被迫使用腳本,你還能做什麼?

當進程到達該點時,您可以手動輸入密碼,但如果腳本要在無人看管的情況下運行,那將不起作用。 值得慶幸的是,有一種替代方法可以將密碼硬編碼到腳本中。 與直覺相反,它使用不同的密碼來實現這一點,以及一些強加密。

在我們的示例場景中,我們需要從我們的 Ubuntu 計算機遠程連接到 Fedora Linux 計算機。 我們將使用 Bash shell 腳本與 Fedora 計算機建立 SSH 連接。 該腳本必須在無人值守的情況下運行,並且我們不想將遠程帳戶的密碼放在腳本中。 在這種情況下,我們不能使用 SSH 密鑰,因為我們假裝我們對 Fedora 計算機沒有任何控製或管理權限。

我們將使用著名的 OpenSSL 工具包來處理加密,並使用一個名為sshpass的實用程序將密碼輸入 SSH 命令。

相關:如何從 Linux Shell 創建和安裝 SSH 密鑰

安裝 OpenSSL 和 sshpass

因為許多其他加密和安全工具都使用 OpenSSL,所以它可能已經安裝在您的計算機上。 但是,如果不是,則安裝只需要一點時間。

在 Ubuntu 上,鍵入以下命令:

 sudo apt 獲取 openssl 

要安裝sshpass ,請使用以下命令:

 sudo apt install sshpass 

在 Fedora 上,您需要輸入:

 須藤 dnf 安裝 openssl 

安裝sshpass的命令是:

 須藤 dnf 安裝 sshpass 

在 Manjaro Linux 上,我們可以安裝 OpenSSL:

 sudo pacman -Sy openssl 

最後,要安裝sshpass ,請使用以下命令:

 sudo pacman -Sy sshpass 

在命令行上加密

在我們開始在腳本中使用openssl命令之前,讓我們通過在命令行上使用它來熟悉它。 假設遠程計算機上的帳戶密碼是rusty!herring.pitshaft 。 我們將使用openssl加密該密碼。

我們需要提供加密密碼。 加密密碼用於加密和解密過程。 openssl命令中有很多參數和選項。 稍後我們將逐一介紹它們。

 迴聲'生鏽!鯡魚.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password' 

我們使用echo通過管道將遠程帳戶密碼發送到openssl命令。

openssl參數為:

  • enc -aes-256-cbc :編碼類型。 我們使用帶有密碼塊鏈接的高級加密標準 256 位密鑰密碼。
  • -md sha512 :消息摘要(哈希)類型。 我們正在使用 SHA512 加密算法。
  • -a :這告訴openssl在加密階段和解密階段之前應用 base-64 編碼。
  • -pbkdf2 :使用基於密碼的密鑰派生函數 2 (PBKDF2) 使得暴力攻擊成功猜測您的密碼變得更加困難。 PBKDF2 需要許多計算來執行加密。 攻擊者需要復制所有這些計算。
  • -iter 100000 :設置 PBKDF2 將使用的計算次數。
  • -salt :使用隨機應用的鹽值使加密輸出每次都不同,即使純文本相同。
  • -pass pass:'pick.your.password' :我們需要用來解密加密的遠程密碼的密碼。 用您選擇的健壯密碼替換pick.your.password

我們的rusty!herring.pitshaft密碼的加密版本被寫入終端窗口。

寫入終端窗口的加密密碼

要解密它,我們需要將該加密字符串傳遞給openssl ,其參數與我們用於加密的參數相同,但添加了-d (解密)選項。

 迴聲 U2FsdGVkX19iiiRNhEsG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password' 

廣告

字符串被解密,我們的原始文本——遠程用戶帳戶的密碼——被寫入終端窗口。

寫入終端窗口的解密密碼

這證明我們可以安全地加密我們的遠程用戶帳戶密碼。 我們還可以在需要時使用我們在加密階段提供的密碼對其進行解密。

但這真的改善了我們的處境嗎? 如果我們需要加密密碼來解密遠程帳戶密碼,那麼解密密碼肯定需要在腳本中嗎? 嗯,是的,確實如此。 但加密的遠程用戶帳戶密碼將存儲在不同的隱藏文件中。 該文件的權限將阻止除您之外的任何人(顯然還有系統的 root 用戶)訪問它。

要將加密命令的輸出發送到文件,我們可以使用重定向。 該文件名為“.secret_vault.txt”。 我們已將加密密碼更改為更強大的密碼。

 迴聲'生鏽!鯡魚.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' > .secret_vault.txt 

什麼都沒有發生,但密碼被加密並發送到“.secret_vault.txt”文件。

我們可以通過解密隱藏文件中的密碼來測試它是否有效。 請注意,我們在這裡使用cat ,而不是echo

 cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' 

廣告

密碼從文件中的數據成功解密。 我們將使用chmod更改此文件的權限,以便其他人無法訪問它。

 chmod 600 .secret_vault.txt
 ls -l .secret_vault.txt 

使用權限掩碼 600 會刪除文件所有者以外的任何人的所有訪問權限。 我們現在可以繼續編寫我們的腳本了。

相關:如何在 Linux 上使用 chmod 命令

在腳本中使用 OpenSSL

我們的腳本非常簡單:

 #!/bin/bash

# 遠程賬戶名稱
REMOTE_USER=極客

# 遠程賬戶的密碼
REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password')

# 遠程計算機
REMOTE_LINUX=fedora-34.local

# 連接到遠程計算機並將時間戳放入名為 script.log 的文件中
sshpass -p $REMOTE_PASSWD ssh -T $REMOTE_USER@$REMOTE_LINUX << _remote_commands
echo $USER "-" $(date) >> /home/$REMOTE_USER/script.log
_remote_commands
  • 我們將一個名為REMOTE_USER的變量設置為“geek”。
  • 然後,我們使用我們剛才使用的相同命令,將一個名為REMOTE_PASSWD的變量設置為從“.secret_vault.txt”文件中提取的解密密碼的值。
  • 遠程計算機的位置存儲在一個名為REMOTE_LINUX的變量中。

有了這些信息,我們就可以使用ssh命令連接到遠程計算機。

  • sshpass命令是連接線上的第一個命令。 我們將它與-p (密碼)選項一起使用。 這讓我們可以指定應該發送到ssh命令的密碼。
  • 我們對ssh使用-T (禁用偽終端分配)選項,因為我們不需要在遠程計算機上為我們分配偽 TTY。
如何在 Linux 上的 Bash 中使用“這裡的文檔”
相關如何在 Linux 上的 Bash 中使用“這裡的文檔”

我們正在使用一個簡短的此處文檔將命令傳遞給遠程計算機。 兩個_remote_commands字符串之間的所有內容都作為指令發送到遠程計算機上的用戶會話——在這種情況下,它是一行 Bash 腳本。

發送到遠程計算機的命令只是將用戶帳戶名和時間戳記錄到名為“script.log”的文件中。

將腳本複制並粘貼到編輯器中,並將其保存到名為“go-remote.sh”的文件中。 請記住更改詳細信息以反映您自己的遠程計算機的地址、遠程用戶帳戶和遠程帳戶密碼。

使用chmod使腳本可執行。

 chmod +x go-remote.sh 

廣告

剩下的就是嘗試一下。 讓我們啟動我們的腳本。

 ./go-remote.sh 

因為我們的腳本是無人值守腳本的極簡模板,所以終端沒有輸出。 但是如果我們檢查 Fedora 計算機上的“script.log”文件,我們可以看到遠程連接已經成功建立,並且“script.log”文件已經更新了時間戳。

 貓腳本.log 

您的密碼是私密的

您的遠程帳戶密碼未記錄在腳本中。

儘管解密密碼在腳本中但沒有其他人可以訪問您的“.secret_vault.txt”文件以對其進行解密並檢索遠程帳戶密碼。