如何在 Bash 脚本中使用加密密码

如何在 Bash 脚本中使用加密密码
如果您被迫使用 Linux 脚本连接到受密码保护的资源,您可能会对将该密码放入脚本中感到不安。OpenSSL 为您解决了这个问题。

密码和脚本

将密码放在 shell 脚本中并不是一个好主意。事实上,这是一个非常糟糕的主意。如果脚本落入坏人之手,每个阅读它的人都可以看到密码是什么。但是如果你被迫使用脚本,你还能做什么?

当进程到达该点时,您可以手动输入密码,但如果脚本要在无人看管的情况下运行,那将不起作用。值得庆幸的是,有一种替代方法可以将密码硬编码到脚本中。与直觉相反,它使用不同的密码以及一些强加密来实现这一点。

在我们的示例场景中,我们需要从我们的 Ubuntu 计算机远程连接到 Fedora Linux 计算机。我们将使用 Bash shell 脚本与 Fedora 计算机建立 SSH 连接。该脚本必须在无人值守的情况下运行,我们不想将远程帐户的密码放在脚本中。在这种情况下我们不能使用 SSH 密钥,因为我们假装我们对 Fedora 计算机没有任何控制或管理权限。

我们将使用著名的 OpenSSL 工具包 来处理加密,并使用一个实用程序sshpass来将密码输入 SSH 命令。

安装 OpenSSL 和 sshpass

由于许多其他加密和安全工具都使用 OpenSSL,因此您的计算机上可能已经安装了它。但是,如果不是,则安装只需要一点时间。

在 Ubuntu 上,键入以下命令:

sudo apt 获取 openssl

如何在 Bash 脚本中使用加密密码

要安装sshpass,请使用以下命令:

sudo apt 安装 sshpass

如何在 Bash 脚本中使用加密密码

在 Fedora 上,您需要输入:

须藤 dnf 安装 openssl

如何在 Bash 脚本中使用加密密码

安装命令sshpass为:

须藤 dnf 安装 sshpass

如何在 Bash 脚本中使用加密密码

在 Manjaro Linux 上,我们可以使用以下命令安装 OpenSSL:

须藤吃豆子 -Sy openssl

如何在 Bash 脚本中使用加密密码

最后,要安装sshpass,请使用以下命令:

须藤吃豆子 -Sy sshpass

如何在 Bash 脚本中使用加密密码

在命令行上加密

在我们开始在openssl脚本中使用该命令之前,让我们通过在命令行上使用它来熟悉它。假设远程计算机上帐户的密码是rusty!herring.pitshaft. 我们将使用 加密该密码openssl

当我们这样做时,我们需要提供一个加密密码。加密密码用于加密和解密过程。命令中有很多参数和选项 openssl 。稍后我们将逐一介绍它们。

echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password'

如何在 Bash 脚本中使用加密密码

我们正在使用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 密码的加密版本 被写入终端窗口。

如何在 Bash 脚本中使用加密密码

要解密它,我们需要openssl使用与加密时相同的参数传递加密字符串,但要添加-d(decrypt) 选项。

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

如何在 Bash 脚本中使用加密密码

字符串被解密,我们的原始文本——远程用户帐户的密码——被写入终端窗口。

如何在 Bash 脚本中使用加密密码

这证明我们可以安全地加密我们的远程用户帐户密码。我们也可以在需要时使用我们在加密阶段提供的密码解密它。

但这真的能改善我们的处境吗?如果我们需要加密密码来解密远程帐户密码,那么解密密码肯定需要在脚本中吗?嗯,是的,确实如此。但是加密的远程用户帐户密码将存储在不同的隐藏文件中。该文件的权限将阻止除您之外的任何人——以及系统的 root 用户,显然——访问它。

要将加密命令的输出发送到文件,我们可以使用重定向。该文件名为“.secret_vault.txt”。我们已将加密密码更改为更强大的密码。

echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' > .secret_vault.txt

如何在 Bash 脚本中使用加密密码

没有任何可见的事情发生,但密码已加密并发送到“.secret_vault.txt”文件。

我们可以通过解密隐藏文件中的密码来测试它是否有效。请注意,我们在cat这里使用,而不是echo.

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

如何在 Bash 脚本中使用加密密码

从文件中的数据成功解密密码。我们将用于chmod更改此文件的权限,以便其他人无法访问它。

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

如何在 Bash 脚本中使用加密密码

使用 600 的权限掩码会删除文件所有者以外的任何人的所有访问权限。我们现在可以继续编写我们的脚本。

在脚本中使用 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命令的密码。
  • 我们使用-T(禁用伪终端分配)选项,ssh因为我们不需要在远程计算机上为我们分配伪 TTY。

我们正在使用一个简短的here 文档将命令传递到远程计算机。两个_remote_commands字符串之间的所有内容都作为指令发送到远程计算机上的用户会话——在本例中,它是一行 Bash 脚本。

发送到远程计算机的命令只是将用户帐户名和时间戳记录到名为“script.log”的文件中。

将脚本复制并粘贴到编辑器中,然后将其保存到名为“go-remote.sh”的文件中。请记住更改详细信息以反映您自己的远程计算机的地址、远程用户帐户和远程帐户密码。

使用chmod使脚本可执行文件。

chmod +x go-remote.sh

如何在 Bash 脚本中使用加密密码

剩下的就是尝试一下。让我们启动我们的脚本。

./go-remote.sh

如何在 Bash 脚本中使用加密密码

因为我们的脚本是无人值守脚本的极简模板,所以终端没有输出。但是如果我们检查 Fedora 计算机上的“script.log”文件,我们可以看到远程连接已成功建立,并且“script.log”文件已更新时间戳。

猫脚本.log

如何在 Bash 脚本中使用加密密码

您的密码是私密的

您的远程帐户密码未记录在脚本中。

虽然解密密码是,在剧本,没有人能以解密和检索远程账号密码访问“.secret_vault.txt”文件。

正文完