gpt4 book ai didi

google-cloud-platform - 有没有办法为我的 Google Cloud Functions HTTP 端点创建防火墙规则?

转载 作者:行者123 更新时间:2023-12-02 09:14:50 25 4
gpt4 key购买 nike

只是想检查一下这是否在已经可用的路线图中,而我刚刚错过了这些。在为一个重要项目构建我的函数时,我想应用一些防火墙规则来限制我的一些谷歌云函数(HTTP 端点触发器)的网络访问,原因是多方面的(安全性,避免垃圾邮件引起的突然收费的高价请求等)

这是可用的还是正在准备中?如果没有,您将如何限制对特定功能的访问以仅允许少数 Google 计算引擎、其他 GCF 和其他 Google 云服务(Firestore、Storage、PubSub)。

最佳答案

您应该查看的不仅仅是防火墙规则,而是使用 访问 token 对您对云功能的请求进行身份验证。

Here there is a good example on how to do this

基本上,您将创建一个 HTTP 触发的云函数。

首先创建一个bucket,我的叫做 auth-123 。然后放到一个 Cloud shell 并定义项目名称和bucket作为环境变量:

jordim@yrmv-191108:~$ export BUCKET=auth-123
jordim@yrmv-191108:~$ export PROJECT=yrmv-191108

创建几个服务帐户
jordim@yrmv-191108:~$ gcloud iam service-accounts create alpha-account --
display-name "Account 1"
jordim@yrmv-191108:~$ gcloud iam service-accounts create beta-account --display-name "Account 2"
Created service account [beta-account].

现在来创建函数!在您的云 shell 上的文件夹中,首先创建一个包含依赖项的 package.json:
jordim@yrmv-191108:~/cloudfunction$ cat > package.json
{
"dependencies": {
"googleapis": "21.2"
}
}

现在函数本身:
const Google = require('googleapis');
const BUCKET = 'auth-123'; // Replace with name of your bucket

/**
* Cloud Function.
*
* @param {Object} req Cloud Function request context.
* @param {Object} res Cloud Function response context.
*/
exports.secureFunction = function secureFunction(req, res) {
var accessToken = getAccessToken(req.get('Authorization'));
var oauth = new Google.auth.OAuth2();
oauth.setCredentials({access_token: accessToken});

var permission = 'storage.buckets.get';
var gcs = Google.storage('v1');
gcs.buckets.testIamPermissions(
{bucket: BUCKET, permissions: [permission], auth: oauth}, {},
function (err, response) {
if (response && response['permissions'] && response['permissions'].includes(permission)) {
authorized(res);
} else {
res.status(403).send("The request is forbidden.");
}
});



function authorized(res) {
res.send("The request was successfully authorized.");
// The code to execute goes here! :)
}
}


function getAccessToken(header) {
if (header) {
var match = header.match(/^Bearer\s+([^\s]+)$/); //We are looking for an HTTP request with the content Bearer: + a token
if (match) {
return match[1];
}
}

return null;
}

在这种情况下,我们正在检查发起请求的帐户是否具有 storage.buckets.get 权限,但只需更改变量权限即可将其更改为任何其他权限。

然后部署函数:
jordim@yrmv-191108:~/cloudfunction$ gcloud beta  functions deploy secureFunction --stage-bucket $BUCKET --trigger-http

现在您有一个云函数,它只有在收到来自授权帐户的请求时才会触发其内容。让我们为之前创建的帐户制作 token :
   jordim@yrmv-191108:~/cloudfunction$ gcloud iam service-accounts keys create --iam-account alpha-account@$PROJECT.iam.gserviceaccount.com ./alpha-account.json
jordim@yrmv-191108:~/cloudfunction$ export ALPHA_ACCOUNT_TOKEN=$(GOOGLE_APPLICATION_CREDENTIALS=./alpha-account.json gcloud auth application-default print-access-token)


jordim@yrmv-191108:~/cloudfunction$ gcloud iam service-accounts keys create --iam-account beta-account@$PROJECT.iam.gserviceaccount.com ./beta-account.json
created key [4a9251d7611e74da8b4565657b52b7c940606630] of type [json] as [./beta-account.json] for [beta-account@yrmv-191108.iam.gserviceaccount.com]
jordim@yrmv-191108:~/cloudfunction$ export BETA_ACCOUNT_TOKEN=$(GOOGLE_APPLICATION_CREDENTIALS=./beta-account.json gcloud auth application-default print-access-token)

我们现在在 json 上有 auth token ,并且还将它们导出为 env var 以便于测试。让我们授予 ALPHA 用户权限而不授予 BETA 用户权限:
jordim@yrmv-191108:~/cloudfunction$ gsutil acl ch -u alpha-account@$PROJECT.iam.gserviceaccount.com:R gs://auth-123

现在来测试:
jordim@yrmv-191108:~/cloudfunction$ curl https://us-central1-yrmv-191108.cloudfunctions.net/secureFunction -H "Authorization: Bearer $ALPHA_ACCOUNT_TOKEN"
The request was successfully authorized.

jordim@yrmv-191108:~/cloudfunction$ curl https://us-central1-yrmv-191108.cloudfunctions.net/secureFunction -H "Authorization: Bearer $BETA_ACCOUNT_TOKEN"
The request is forbidden

您可以将此逻辑应用于您的任何云功能,除非请求在其 header 上带有有效 token ,否则用于拒绝它的资源量是最少的。

关于google-cloud-platform - 有没有办法为我的 Google Cloud Functions HTTP 端点创建防火墙规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48182967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com