stechstudio / laravel-env-security
为不同的部署环境安全地管理 .env 文件
Requires
- php: ^5.6|^7.0|^8.0
- aws/aws-sdk-php: ^3.0
- google/cloud-kms: ^1.7
- illuminate/support: ^5.6|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- orchestra/testbench: ^7.0|^8.0|^9.0
- phpunit/phpunit: ^9.0
This package is auto-updated.
Last update: 2024-09-02 15:36:51 UTC
README
此包帮助您管理不同部署环境的 .env 文件。每个 .env 文件都经过安全加密并保存在您的应用程序版本控制中。当您部署应用程序时,适当的特定环境的 .env 文件将被解密并移动到适当位置。
这部分灵感来自 Marcel 的优秀凭证包。如果您想在一个 JSON 文件中管理凭证,让 Laravel 处理加密/解密,并且只有一个部署环境,那么这个包可能更适合您的需求。
我们的包在以下方面有所不同
- 我们希望直接与 .env 文件一起工作,并使解密的 .env 文件出现在 Laravel 已经期望的位置。应用程序就像通常那样使用 .env 变量。
- 我们需要管理多个环境(如 qa、uat、生产)的 .env 文件。此包允许您管理任何数量的特定环境 .env 文件。
- 我们希望利用 AWS Key Management Service 等服务来处理加密/解密,并可选择将来添加其他加密驱动程序(如 ansible)或秘密管理服务(如 AWS Secrets Manager)。
注意
Laravel v9.32.0 引入了新的
env:encrypt
和env:decrypt
命令,这与本包中的命令冲突。我们在 v2 中已将我们的命令移动到env:store
和env:fetch
。
安装和设置
先决条件
如果您打算启用压缩,您必须安装并启用 Zlib 压缩扩展。
安装包
composer require stechstudio/laravel-env-security
添加 composer 钩子
在您的 composer.json 文件中添加 php artisan env:fetch
作为安装后钩子。您可能已经有了一个 post-install-cmd
部分,添加新的命令,使其看起来像这样
"scripts": {
"post-install-cmd": [
...
"php artisan env:fetch"
]
生成配置(可选)
默认配置基于环境变量(例如:驱动程序、存储环境、目标文件、aws、gcp)。如果您需要自定义它,可以通过运行以下命令发布配置
php artisan vendor:publish --provider="STS\EnvSecurity\EnvSecurityServiceProvider" --tag="config"
设置服务提供程序(Laravel 的旧版本)
如果您正在使用低于 5.5 的 Laravel 版本,您需要手动将服务提供程序添加到您的 config/app.php
文件中
'providers' => [ ... STS\EnvSecurity\EnvSecurityServiceProvider::class, ]
配置设置
环境解析
为了在部署时能够解密正确的问题,您需要告诉它如何确定环境。
默认情况下,它将查找一个 APP_ENV
环境变量。但是,您可以通过提供一个自定义解析器来提供自己的回调函数。将此放在您的 AppServiceProvider
的 boot
方法中
\EnvSecurity::resolveEnvironmentUsing(function() { // return the environment name });
这样,您可以根据主机名、EC2 实例标签等解析环境。然后,根据您返回的环境名称解密正确的 .env 文件。
密钥名称解析
通常我们期望您在.env文件中指定密钥名称。然而,您可能希望根据环境指定不同的密钥。如果您为不同的环境设置了不同的受限AWS IAM凭证,这将允许您确保每个.env文件只能在相应的环境中解密。
当然,您自己的本地IAM凭证仍然需要完全访问所有密钥,这样您就可以在本地编辑每个.env文件。
为了解析密钥名称,提供如下回调函数
\EnvSecurity::resolveKeyUsing(function($environment) { return "myapp-$environment"; });
请注意,您的解析器将收到已解析的环境名称,您可以使用它来确定要返回哪个密钥名称。
驱动程序
AWS密钥管理服务
AWS KMS是一种托管服务,它使您能够轻松创建和控制用于加密数据的加密密钥,并使用经过FIPS 140-2验证的硬件安全模块来保护密钥的安全性。
要在您的.env文件中使用此驱动程序,请设置ENV_DRIVER=kms
。
在AWS控制台中创建您的加密密钥。确保您的AWS IAM用户具有对此密钥的kms:Encrypt
和kms:Decrypt
权限。
复制密钥ID,并将其存储为AWS_KMS_KEY
到您本地的.env文件中。当您设置特定环境的.env文件时,确保在每个.env文件中包含此AWS_KMS_KEY
。
Google Cloud密钥管理服务
Google KMS安全地管理Google Cloud Platform上的加密密钥和机密。Google KMS与Google HSM的集成使得创建由FIPS 140-2 Level 3设备保护的密钥变得简单。
要在您的.env文件中使用此驱动程序,请设置ENV_DRIVER=google_kms
。
在Google Cloud控制台中创建您的密钥环和密钥。确保您的Google IAM用户具有此密钥的Cloud KMS CryptoKey Encrypter/Decrypter
角色。
复制项目、密钥环和密钥,并将它们存储为GOOGLE_KMS_PROJECT
、GOOGLE_KMS_KEY_RING
和GOOGLE_KMS_KEY
到您的本地.env文件中。当您设置特定环境的.env文件时,确保在每个.env文件中包含这些密钥。
用法
创建/编辑.env文件
运行php artisan env:edit [name]
,其中[name]
是您希望创建或编辑的环境。这将打开文件以供您编辑。修改文件中的内容,保存并退出。
使用EDITOR
环境变量来设置您首选的编辑器。
解密您的.env文件
现在您可以使用php artisan env:fetch [name]
运行它,这将解密您编辑的密文文件,并将明文写入您的.env文件,替换其中任何内容。现在如果您查看您的.env文件,应该会看到您的编辑。
如果没有提供环境[name]
,则环境将由您自己的自定义解析回调或APP_ENV
环境变量确定。
加密并保存当前的.env文件
有时您可能希望将当前的.env文件加密并保持原样。
运行php artisan env:store [name]
进行此操作,其中name
是要创建的加密环境文件的名称。如果您不提供名称,则将使用当前的APP_ENV
环境名称。
首次部署
当您阅读这份文档时,您可能想知道第一次部署将如何进行。为了解密存储所有敏感凭证的.env配置,此包需要具有访问KMS密钥权限的账户凭证。
是的,它是一路到底的乌龟。
有几种处理此问题的方法,所有这些都取决于环境和部署过程。
- 如果您正在使用AWS EC2,您可以分配IAM角色,以便授予实例访问您的KMS密钥的权限。
- 对于AWS,您可以在服务器上放置一个
~/.aws/credentials
文件,无论您的宿主是什么,以提供必要的AWS权限。 - 对于GCP,您的项目ID和凭证将自动发现。
- 许多部署服务,如Laravel Forge或Laravel Envoyer,都提供了指定环境变量的方式,您可以使用这些变量提供凭证。
- 当然,您也可以手动通过SSH连接到新服务器,并将必要的环境变量放入一个临时的.env文件中,这些变量将在首次部署时被覆盖。