ixnode/php-vault

安全PHP Vault

资助包维护!
Ko Fi

v1.3.0 2022-01-04 23:17 UTC

This package is auto-updated.

Last update: 2024-09-05 05:22:43 UTC


README

CI workflow PHP PHPStan LICENSE

PHPVault是一个PHP库,可以创建、读取、加密和解密环境文件(所谓的dotenv文件)。例如,.env是一个普通文件,.env.enc是一个加密文件等。在您的项目中,您可以自动将加密的环境变量从.env.enc加载到getenv()$_ENV$_SERVER中。这些dotenv文件中的对应键值对使用非对称加密方法(公钥密码学)进行加密和解密。私钥仅在生产系统上用于解密dotenv值。另一方面,公钥可以安全地存入仓库,并用于加密新值。

配置和代码的严格分离是软件开发的基本原则,并基于十二要素应用方法。这样做的一种方法是将这些数据存储到单独的配置文件中,如上面提到的dotenv文件。这些文件通常未加密,但通常包含非常敏感的数据,如数据库访问和API密钥。因此,绝不能将这些文件存入代码仓库!由于这些文件通常位于项目内部,仍然存在不小心发生这种情况的风险。

PHPVault方法保留了分离的原则,并更进一步:它加密了普通dotenv文件,并允许它们被存入代码仓库。要在生产系统上解密和使用数据,只需交换私钥即可。这种方法非常适合提供安全和自动化的部署流程(如CI/CD等)。

要开始,只需运行

$ composer require ixnode/php-vault

这需要Composer,一个PHP的依赖管理器。

命令行命令vendor/bin/php-vault

所有操作的基础是命令行工具vendor/bin/php-vault。任何时候都可以显示帮助信息

$ vendor/bin/php-vault --help
PHPVault command line interpreter.
PHPVault, version v1.0.7

Commands:
  decrypt-file  df    Decrypts a given file. Requires a private key.
  display       d     Displays the environment variables from given file.
  display-env   de    Displays the environment variables from server.
  encrypt-file  ef    Encrypts a given file. Requires a public key.
  generate-keys gk    Generates and displays a private and public key.
  info          i     Shows information.
  set           s     Sets or updates a new variable. Needs a public key.

Run `<command> --help` for specific help
$ vendor/bin/php-vault --version
v1.0.7

在开发系统中

通常,您需要在这个环境中使用公钥。以下是一些示例。有几种方法可以将公钥传递给php-vault解释器。以下是从.keys目录加载密钥(使用--public-key)。

生成密钥

$ vendor/bin/php-vault generate-keys --persist

The key pair is written to folder ".keys"

Never add the private key to the repository!
  • 注意!:
    • 请确保将私钥安全地保存在生产系统上(.keys/private.key)。
      • 如果您已经将私钥文件.keys/private.key保存并提交给管理员用于生产系统,请删除该私钥文件。
    • 在开发系统和本地系统上使用公钥(.keys/public.key)。

创建环境文件

  • 添加键值对DB_USER=secret.user,描述为"DB Configs"
  • 添加键值对DB_PASS=secret.pass
  • 添加键值对DB_HOST=secret.host
  • 添加键值对DB_NAME=secret.name
  • 使用公钥(使用--public-key → 从.keys/public.key读取)。
# Create file .env.enc
$ vendor/bin/php-vault set .env.enc DB_USER secret.user "DB Configs" --public-key --create
# Adds values to .env.enc
$ vendor/bin/php-vault set .env.enc DB_PASS secret.pass --public-key
$ vendor/bin/php-vault set .env.enc DB_HOST secret.host --public-key
$ vendor/bin/php-vault set .env.enc DB_NAME secret.name --public-key

显示环境文件

  • 显示的内容是加密的。
  • 无需任何密钥。
$ vendor/bin/php-vault display .env.enc --load-encrypted
...

在生产系统上

通常,在此环境中您需要私钥。以下是一些示例。有几种方法可以将私钥传递给php-vault解释器。以下是从.keys目录(--private-key)加载密钥。

显示加密文件

  • 使用私钥(--private-key → 从.keys/private.key读取)。
$ vendor/bin/php-vault display .env.enc --load-encrypted --display-decrypted --private-key
+---------+-------------+-------------+
| Key     | Value       | Description |
+---------+-------------+-------------+
| DB_USER | secret.user | DB Configs  |
| DB_PASS | secret.pass |             |
| DB_HOST | secret.host |             |
| DB_NAME | secret.name |             |
+---------+-------------+-------------+

解密加密文件

  • 请勿将生成的解密文件.env添加到仓库中!
  • 使用私钥(--private-key → 从.keys/private.key加载)。
$ vendor/bin/php-vault decrypt-file .env.enc --private-key

The file was successfully written to ".env".

显示未加密的解密文件

  • 无需任何密钥。
$ vendor/bin/php-vault display .env --display-decrypted
+---------+-------------+-------------+
| Key     | Value       | Description |
+---------+-------------+-------------+
| DB_USER | secret.user | DB Configs  |
| DB_PASS | secret.pass |             |
| DB_HOST | secret.host |             |
| DB_NAME | secret.name |             |
+---------+-------------+-------------+

使用PHPVault类

从给定文件加载私钥

<?php

require 'vendor/autoload.php';

use Ixnode\PhpVault\PHPVault;

/* Path to private key and .env.enc */
$pathToPrivateKey = __DIR__.'/.keys/private.key';
$pathToEncryptedEnv = __DIR__.'/.env.enc';

/* - Initiate PHPVault Core.
 * - Load private key.
 * - Load the encrypted env file.
 */
$phpVault = new PHPVault();
$phpVault->loadPrivateKeyFromFile($pathToPrivateKey);
$phpVault->importEncryptedEnvFile($pathToEncryptedEnv);

/* Usage */
$dbUser = getenv('PHPVAULT_DB_USER');
$dbPass = getenv('PHPVAULT_DB_PASS');
$dbHost = getenv('PHPVAULT_DB_HOST');
$dbName = getenv('PHPVAULT_DB_NAME');

从服务器环境变量PRIVATE_KEY加载私钥

有关设置环境变量的选项,请参阅此处

<?php

require 'vendor/autoload.php';

use Ixnode\PhpVault\PHPVault;

/* Path to private key and .env.enc */
$pathToEncryptedEnv = __DIR__.'/.env.enc';

/* - Initiate PHPVault Core and use the PRIVATE_KEY environment variable.
 * - Load the encrypted env file.
 */
$phpVault = new PHPVault();
$phpVault->importEncryptedEnvFile($pathToEncryptedEnv);

/* Usage */
$dbUser = getenv('PHPVAULT_DB_USER');
$dbPass = getenv('PHPVAULT_DB_PASS');
$dbHost = getenv('PHPVAULT_DB_HOST');
$dbName = getenv('PHPVAULT_DB_NAME');

运行测试

这部分只有在直接检出项目进行开发时才可用

$ git clone https://github.com/ixnode/php-vault.git && cd php-vault
$ composer install

PHPUnit测试

$ composer run tests
> phpunit tests
PHPUnit 9.5.4 by Sebastian Bergmann and contributors.

...............................................................  63 / 154 ( 40%)
............................................................... 126 / 154 ( 81%)
............................                                    154 / 154 (100%)

Time: 00:00.136, Memory: 8.00 MB

OK (154 tests, 274 assertions)

静态代码分析(PHPStan)

$ composer run analyse
> phpstan analyse src --level max --no-progress

 [OK] No errors

> phpstan analyse tests --level max --no-progress

 [OK] No errors

持续集成

运行@analyse@tests

$ composer run ci

安全

如果您在此软件包中发现安全漏洞,请向Björn Hempel发送电子邮件至bjoern@hempel.li。所有安全漏洞都将得到及时处理。您可以在此查看我们的完整安全策略。

许可证

PHPVault遵循MIT许可证。