如何在 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”文件以对其进行解密并检索远程帐户密码。