在没有全域授权的情况下访问 Google Workspace Admin SDK?
Access the Google Workspace Admin SDK with out domain-wide delegation?
我正在尝试使用 NodeJS 编写一个服务器应用程序,它访问我们 Google Workspaces (G-Suite) 帐户的 Admin-SDK。到目前为止我找到的所有教程都描述了以下过程:
- 在控制台中设置项目并启用所需的 API,例如 Admin SDK API。
- 在 GCP 项目中创建一个服务帐户。
- 为服务帐户启用 G Suite 全域委派
- 创建 G-Suite 管理员帐户。我们称它为
admin@mycompany.com
- 在向 API 发出请求时使用服务帐户模拟管理员帐户。
因此访问目录 API 可能看起来像这样:
const serviceAccountEmail = "gcp-service-account@gcp-project.iam.gserviceaccount.com";
const privateKey = "-----BEGIN PRIVATE KEY-----....";
const scopes = ['https://www.googleapis.com/auth/admin.directory.group'];
const adminEmail = "admin@mycompany.com";
const auth = new google.auth.JWT(
serviceAccountEmail,
null,
privateKey,
scopes,
adminEmail,
);
const admin = await google.admin({
version: 'directory_v1',
auth,
});
以下注释显示在服务帐户的 Enable G Suite Domain-wide Delegation
复选框旁边:
Allows this service account to be authorized to access all users' data on a G Suite domain without > manual authorization on their parts. Learn more
也许我理解不正确,但这不是非常宽容并且严重违反了最小特权原则吗?我知道我的应用程序需要作为 admin@mycompany.com
管理员帐户进行身份验证,但是有没有办法将其限制为仅此帐户而不是 “G Suite 域上的所有用户数据”.
根据向服务帐户委派全域权限,服务帐户只能访问与该帐户共享的任何内容:
an administrator of the G Suite domain can authorize an application to access user data on behalf of users in the G Suite domain.
这意味着服务帐户仅可以访问应用程序正在模拟的帐户中的数据。
您对自己的安全帐户负责
例如,您可以实施检查以允许模拟特定组织单位的帐户,但所有这些检查都必须在应用程序级别完成。
例如,使用您的服务帐户,您可以检查模拟帐户属于哪个组织单位。如果检查成功,您可以继续使用域范围的委托服务帐户模拟此帐户并执行所需的操作。
单独来看,域范围内的委派确实是一项非常强大的功能,它允许应用程序访问您组织的整个 G Suite 帐户中的用户数据。作为超级管理员帐户,您有责任正确、安全地管理它。
参考资料
当超级管理员单独启用范围时,最小权限原则得到部分实施。
但如您所料,这对用户数据无效,因为该应用程序可以访问并可以模拟任何用户。所以答案是否定的,您不能将其限制为单个电子邮件。
对我来说似乎太过分了,因为有些电子邮件非常敏感,您不应该能够冒充它们。
我正在尝试使用 NodeJS 编写一个服务器应用程序,它访问我们 Google Workspaces (G-Suite) 帐户的 Admin-SDK。到目前为止我找到的所有教程都描述了以下过程:
- 在控制台中设置项目并启用所需的 API,例如 Admin SDK API。
- 在 GCP 项目中创建一个服务帐户。
- 为服务帐户启用 G Suite 全域委派
- 创建 G-Suite 管理员帐户。我们称它为
admin@mycompany.com
- 在向 API 发出请求时使用服务帐户模拟管理员帐户。
因此访问目录 API 可能看起来像这样:
const serviceAccountEmail = "gcp-service-account@gcp-project.iam.gserviceaccount.com";
const privateKey = "-----BEGIN PRIVATE KEY-----....";
const scopes = ['https://www.googleapis.com/auth/admin.directory.group'];
const adminEmail = "admin@mycompany.com";
const auth = new google.auth.JWT(
serviceAccountEmail,
null,
privateKey,
scopes,
adminEmail,
);
const admin = await google.admin({
version: 'directory_v1',
auth,
});
以下注释显示在服务帐户的 Enable G Suite Domain-wide Delegation
复选框旁边:
Allows this service account to be authorized to access all users' data on a G Suite domain without > manual authorization on their parts. Learn more
也许我理解不正确,但这不是非常宽容并且严重违反了最小特权原则吗?我知道我的应用程序需要作为 admin@mycompany.com
管理员帐户进行身份验证,但是有没有办法将其限制为仅此帐户而不是 “G Suite 域上的所有用户数据”.
根据向服务帐户委派全域权限,服务帐户只能访问与该帐户共享的任何内容:
an administrator of the G Suite domain can authorize an application to access user data on behalf of users in the G Suite domain.
这意味着服务帐户仅可以访问应用程序正在模拟的帐户中的数据。
您对自己的安全帐户负责
例如,您可以实施检查以允许模拟特定组织单位的帐户,但所有这些检查都必须在应用程序级别完成。
例如,使用您的服务帐户,您可以检查模拟帐户属于哪个组织单位。如果检查成功,您可以继续使用域范围的委托服务帐户模拟此帐户并执行所需的操作。
单独来看,域范围内的委派确实是一项非常强大的功能,它允许应用程序访问您组织的整个 G Suite 帐户中的用户数据。作为超级管理员帐户,您有责任正确、安全地管理它。
参考资料
当超级管理员单独启用范围时,最小权限原则得到部分实施。
但如您所料,这对用户数据无效,因为该应用程序可以访问并可以模拟任何用户。所以答案是否定的,您不能将其限制为单个电子邮件。
对我来说似乎太过分了,因为有些电子邮件非常敏感,您不应该能够冒充它们。