📜  生产环境中的 Vault 部署 - PHP (1)

📅  最后修改于: 2023-12-03 14:56:15.803000             🧑  作者: Mango

生产环境中的 Vault 部署 - PHP

Vault 是一个开源的秘密管理工具,它提供了一种安全地存储和访问网站和应用程序的敏感数据的方法。在生产环境中,我们需要对 Vault 进行部署,并使用其 API 访问敏感数据。

部署 Vault

在生产环境中部署 Vault,有几种不同的方法可以选择,包括 Docker 部署和二进制部署。这里介绍使用二进制文件和 systemd 启动 Vault 的方法。

首先,我们需要下载 Vault 的二进制文件,并将其放置在服务器上的任何位置。然后,我们需要在服务器上创建一个名为“vault”的用户,并将 Vault 的可执行文件移动到该用户的主目录中。

接下来,我们需要创建一个 systemd 单元文件,以便我们能够使用 systemd 启动 Vault。以下是一个示例 systemd 单元文件:

[Unit]
Description=Vault service
After=network.target

[Service]
User=vault
Group=vault
PIDFile=/var/run/vault.pid
ExecStart=/home/vault/vault server -config=/etc/vault/vault.hcl
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target

请注意,ExecStart 行指定要运行的 Vault 可执行文件的位置,以及配置文件的位置。我们还需要将配置文件放置在 /etc/vault/vault.hcl 的位置。

以下是一个示例 Vault 配置文件:

ui = true

disable_mlock = true

storage "mysql" {
  connection_url = "mysql://dbuser:dbpass@tcp(127.0.0.1:3306)/vault"
  table          = "vault"
}

listener "tcp" {
  address       = "0.0.0.0:8200"
  tls_disable   = 1
}

这个配置文件告诉 Vault 使用 MySQL 作为其存储后端,并在端口 8200 上监听来自任何 IP 地址的请求。我们也可以通过 ui = true 来启用 Vault Web UI。

现在我们启动 Vault:

$ sudo systemctl start vault

检查 Vault 是否正在运行:

$ sudo systemctl status vault

如果一切正常,Vault 将正在运行,并且您可以通过执行以下命令来停止它:

$ sudo systemctl stop vault
使用 PHP 访问 Vault API

我们已经在服务器上安装并配置了 Vault,现在我们需要在 PHP 中使用其 API 获取和更新敏感数据。

首先,我们需要在 PHP 代码中包含 Vault 的 PHP 客户端库。可以通过 Composer 安装这个库:

$ composer require hashicorp/vault

接下来,我们需要在代码中创建一个 Vault 客户端实例,如下所示:

require_once __DIR__ . '/vendor/autoload.php';

use \GuzzleHttp\Client as GuzzleHttpClient;
use \GuzzleHttp\Exception\RequestException;
use \GuzzleHttp\Psr7\Request as GuzzleHttpRequest;
use \Hashicorp\Vault\Api\Identity;
use \Hashicorp\Vault\Description\Auth;

$client = new GuzzleHttpClient(['base_uri' => 'http://localhost:8200']);
$vault = new Identity($client);
$vault->setToken('my-token');

在上面的代码中,我们创建了一个 GuzzleHttp 客户端实例,用于与 Vault API 进行通信。然后,我们使用此客户端实例创建了一个 Identity 类型的 Vault 实例,并设置了我们的访问令牌。

现在我们可以通过 Vault 实例来获取和更新敏感数据:

try {
    // Write a new secret to Vault
    $path = 'secret/data/my-secret';
    $data = [
        'foo' => 'bar',
        'baz' => 'biz',
    ];
    $response = $vault->write($path, ['data' => $data]);

    // Read the secret from Vault
    $response = $vault->read($path);
    $secret = $response->getData();
    echo $secret['data']['foo']; // bar
    echo $secret['data']['baz']; // biz
} catch (RequestException $e) {
    echo $e->getMessage();
}

在上面的代码中,我们首先向 Vault 写入一个新的秘密,然后从 Vault 读取该秘密。注意,我们使用 try-catch 块来处理任何可能的请求异常。

结论

Vault 是一个非常有用的工具,用于安全地存储和访问敏感数据。在生产环境中,我们需要对其进行部署,并使用其 API 来获取和更新数据。通过上述步骤,我们可以快速设置和使用 Vault。