在 laravel 中写入 oauth 密钥文件的安全位置

Posted

技术标签:

【中文标题】在 laravel 中写入 oauth 密钥文件的安全位置【英文标题】:Safe location to write oauth key files in laravel 【发布时间】:2021-04-25 04:43:14 【问题描述】:

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

我经历了this 和this。虽然 S3 选项听起来很合理,但我仍然想要一种更安全的方式,并希望从 AWS 中签出 Secret Manager。

由于 laravel 护照 provides the option to load keys from a custom folder,我想我可以使用 AWS php SDK to retrieve a secret key 并将其写入 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');

【问题讨论】:

【参考方案1】:

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

因此,通常您会将应用程序数据存储在您的实例之外。对于秘密,例如您的密钥,好的位置可能是 SSM Parameter Store 或 Secrets Manager (SM)。

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

【讨论】:

因为我在 authserviceprovider 启动期间生成文件,所以每次通过代码管道部署新版本时都会生成这些文件。我尝试部署这种方法并且效果很好。我考虑将它们存储在内存中,但无法弄清楚如何? loadKeysFrom 函数需要一个包含 2 个文件 oauth-*.keys 的文件夹路径,这可以在 PHP 内存中完成吗?我以为你指的是php://memoryphp.net/manual/en/wrappers.php.php

以上是关于在 laravel 中写入 oauth 密钥文件的安全位置的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Passport:部署到 aws 后缺少密钥

_LIR__与Laravel 5.5和OVH共享主机不一致

在 C 中读取和写入 rsa 密钥到 pem 文件

laravel 5.5 oauth2.0 跨域问题解决方案

OAuth(访问令牌)与 API 密钥

laravel oauth2.0 文件上传报错