stechstudio/laravel-env-security

为不同的部署环境安全地管理 .env 文件

2.3.1 2024-04-02 14:34 UTC

README

Latest Version on Packagist Software License Total Downloads Build

此包帮助您管理不同部署环境的 .env 文件。每个 .env 文件都经过安全加密并保存在您的应用程序版本控制中。当您部署应用程序时,适当的特定环境的 .env 文件将被解密并移动到适当位置。

这部分灵感来自 Marcel 的优秀凭证包。如果您想在一个 JSON 文件中管理凭证,让 Laravel 处理加密/解密,并且只有一个部署环境,那么这个包可能更适合您的需求。

我们的包在以下方面有所不同

  1. 我们希望直接与 .env 文件一起工作,并使解密的 .env 文件出现在 Laravel 已经期望的位置。应用程序就像通常那样使用 .env 变量。
  2. 我们需要管理多个环境(如 qa、uat、生产)的 .env 文件。此包允许您管理任何数量的特定环境 .env 文件。
  3. 我们希望利用 AWS Key Management Service 等服务来处理加密/解密,并可选择将来添加其他加密驱动程序(如 ansible)或秘密管理服务(如 AWS Secrets Manager)。

注意

Laravel v9.32.0 引入了新的 env:encryptenv:decrypt 命令,这与本包中的命令冲突。我们在 v2 中已将我们的命令移动到 env:storeenv: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 环境变量。但是,您可以通过提供一个自定义解析器来提供自己的回调函数。将此放在您的 AppServiceProviderboot 方法中

\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:Encryptkms: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_PROJECTGOOGLE_KMS_KEY_RINGGOOGLE_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密钥权限的账户凭证。

是的,它是一路到底的乌龟

有几种处理此问题的方法,所有这些都取决于环境和部署过程。

  1. 如果您正在使用AWS EC2,您可以分配IAM角色,以便授予实例访问您的KMS密钥的权限。
  2. 对于AWS,您可以在服务器上放置一个~/.aws/credentials文件,无论您的宿主是什么,以提供必要的AWS权限。
  3. 对于GCP,您的项目ID和凭证将自动发现
  4. 许多部署服务,如Laravel ForgeLaravel Envoyer,都提供了指定环境变量的方式,您可以使用这些变量提供凭证。
  5. 当然,您也可以手动通过SSH连接到新服务器,并将必要的环境变量放入一个临时的.env文件中,这些变量将在首次部署时被覆盖。