ixnode / php-vault
安全PHP Vault
Requires
- php: ^7.4 || ^8.0
- ext-json: *
- ext-sodium: *
- adhocore/cli: ^0.9.0
Requires (Dev)
- phpstan/phpstan: ^0.12.83
- phpunit/phpunit: ^9
README
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许可证。