首页 > 解决方案 > 在 laravel 中写入 oauth 密钥文件的安全位置

问题描述

我正在将我的 laravel 应用程序部署到 AWS Elastic Beanstalk,并且遇到了持久化 laravel 护照的 oauth 密钥的问题。

我经历了这个这个。虽然 S3 选项听起来很合理,但我仍然想要一种更安全的方式,并希望从 AWS 中签出秘密管理器。

由于 laravel passport提供了从自定义文件夹加载密钥的选项,我想我可以使用AWS PHP SDK 来检索密钥并将其写入storage/app/oauth-public.keystorage/app/oauth-private.key让护照从那里加载。

这种方法在部署到 beanstalk 后运行良好,但该storage/app文件夹是生成文件的安全位置oauth.*.key吗?还是有更好的方法/更安全的地方?

以下是我的开机功能Providers/AuthServiceProvider.php

public function boot()
{
    $this->registerPolicies();
    Passport::routes();
    Passport::tokensExpireIn(now()->addDays(5));

    // load keys from aws secret manager if they don't exist
    if(!file_exists(storage_path().'/app/oauth-public.key') && !file_exists(storage_path().'/app/oauth-private.key')) {
        $keys = json_decode($this->getPassportKeys());
        $public_key = implode("\n", explode('\n', $keys->PASSPORT_PUBLIC_KEY));
        Storage::put('oauth-public.key', $public_key);
        $private_key = implode("\n", explode('\n', $keys->PASSPORT_PRIVATE_KEY));
        Storage::put('oauth-private.key', $private_key);
    }
    Passport::loadKeysFrom(storage_path().'/app');
}

标签: phplaravelamazon-web-servicesamazon-elastic-beanstalklaravel-passport

解决方案


通常,您在 AWS 上的应用程序应该是无状态的。这意味着不应将任何数据存储在实例上,因为它们可以随时因活动扩展、可用区重新平衡或其他活动而被替换。

因此,通常您会将应用程序数据存储在您的实例之外。对于密钥(例如您的密钥)而言,合适的位置可能是SSM Parameter StoreSecrets Manager (SM)。

您已经在使用 SM,在我看来这很好。如果您将它们本地存储在storage/app此文件夹中,则在您部署新版本的应用程序时将被删除。因此,您必须确保始终从 SM 获得密钥。您也可以考虑将文件存储在内存中,而不是存储在硬盘上。这将允许您更快地获取它们,而无需从本地存储中读取它们。


推荐阅读