你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

为 Azure Migrate 发现和评估创建最低特权 PostgreSQL 帐户(预览版)

本文介绍如何使用 Azure Migrate 中的发现和评估所需的最低权限创建自定义 PostgreSQL 帐户。

在开始发现之前,使用 PostgreSQL 帐户配置 Azure Migrate 设备以连接到 PostgreSQL 实例。 若要避免使用超级用户帐户,可以创建一个仅具有收集元数据以用于发现和评估所需的权限的自定义帐户。 在 PostgreSQL 发现和评估的设备配置中添加此自定义帐户。 可以使用本文档中提供的最小特权帐户预配实用工具来简化设置。

先决条件

  • 正在运行且可访问的 PostgreSQL 服务器。
  • 超级用户对 PostgreSQL 实例的访问权限。
  • Azure Migrate 项目设置。

所需的最低权限

若要确保 Azure Migrate 中的安全性和符合性,请仅创建具有必要权限的 PostgreSQL 用户,以最大程度地降低未经授权的访问或意外更改的风险。

根据 Azure Migrate 要求,所需的最低权限包括:

数据库级权限

  • CONNECT:访问数据库
  • pg_read_all_settings:读取服务器配置参数
  • pg_read_all_stats:访问数据库统计信息
  • pg_monitor:监视数据库性能指标

SQL 脚本实现

将以下内容保存为 CreateUser.sql

-- PostgreSQL Script to Create a Least-Privilege User for Azure Migrate
-- Usage: Replace :username and :password with actual values when executing.
-- Parameters:
--   :username - The username for the new user
--   :password - The password for the new user

-- Check if the user already exists
SELECT CASE
    WHEN EXISTS (SELECT 1 FROM pg_roles WHERE rolname = :'username')
        THEN 'User ' || :'username' || ' already exists, skipping creation'
    ELSE
        'User ' || :'username' || ' does not exist, proceeding with creation'
END AS user_check;

-- Only proceed if user doesn't exist
SELECT NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = :'username') AS should_create \gset
\if :should_create

BEGIN;

-- Create the user with minimal privileges
CREATE USER :"username" WITH PASSWORD :'password' LOGIN
    NOSUPERUSER NOCREATEDB NOCREATEROLE NOREPLICATION NOBYPASSRLS;

-- Grant CONNECT privilege on all non-template databases
SELECT 'GRANT CONNECT ON DATABASE ' || quote_ident(datname) || ' TO ' || :'username' || ';'
FROM pg_database WHERE datistemplate = false; \gexec

-- Grant required monitoring and read permissions
GRANT pg_read_all_settings TO :"username";
GRANT pg_read_all_stats TO :"username";
GRANT pg_monitor TO :"username";

-- Log the user creation
SELECT 'Azure Migrate user ' || :'username' || ' created successfully with least privileges.' AS result;

COMMIT;

\endif

-- Usage instructions:
--   Replace :username and :password with actual values using psql variables:
--   psql -v username=myuser -v password=mypassword -f CreateUser.sql

注释

此用户只有 Azure Migrate 发现和评估所需的最低权限。

  • 用户无法创建数据库、角色或复制。
  • 始终使用强密码并遵循组织的安全策略。

使用说明

按照以下步骤使用提供的 SQL 脚本:

  1. 将脚本另存为 CreateUser.sql
  2. 使用 psql 变量将用户名和密码的占位符替换为所需的值。

执行脚本

使用具有超级用户权限的 PostgreSQL 命令行工具(psql)运行脚本。 请使用实际值替换占位符:

psql -h <hostname> -p <port> -d <database> -U <superuser> \
    -v username=<<Az Migrate username>> \
    -v password='your_secure_password' \
    -f CreateUser.sql

验证用户创建

若要确认用户是否已创建并分配正确的权限,请运行以下查询:

-- Check if the user exists and review key attributes
SELECT usename, usecreatedb, usesuper, userepl
FROM pg_catalog.pg_user
WHERE usename = '<<Az Migrate username>>';

结果应显示falseusecreatedbusesuper以及userepl

验证授予的基于角色的权限

通过运行以下查询检查用户是否具有必要的监视角色。 这可确保帐户仅具有 Azure Migrate 操作所需的权限。

-- Verify the user exists
SELECT rolname
FROM pg_roles
WHERE rolname = '<<Az Migrate username>>';
-- Check membership in monitoring roles
SELECT r.rolname AS granted_role
FROM pg_auth_members m
JOIN pg_roles r ON m.roleid = r.oid
WHERE m.member = (SELECT oid FROM pg_roles WHERE rolname = '<<Az Migrate username>>');

运行这些查询后,你应会看到用户存在,并且只拥有 Azure Migrate 发现和评估所需的权限。

注意事项

仅对 Azure Migrate 使用最低特权 PostgreSQL 帐户、定期查看权限、轮换凭据、监视活动,并在不再需要时禁用该帐户。

  • 请将 <<Az Migrate username>><PASSWORD> 分别替换为你选择的用户名和强密码(用于最低权限用户)。
  • 使用超级用户权限运行脚本,因为创建用户和分配角色需要提升的访问权限。
  • 在执行脚本之前,请确认 PostgreSQL 实例正在运行且可访问。
  • 在生产使用之前,在开发或过渡环境中测试脚本。
  • 遵循组织的安全最佳做法,了解密码复杂性和管理。
  • 执行脚本后,查看授予的权限,以确保它们满足安全要求。
  • 如果遇到问题,请参阅 PostgreSQL 文档 ,或联系数据库管理员以获取支持。