在 Azure Migrate 中设置最低特权帐户

Azure Migrate设备是一种轻型工具,可发现本地服务器并将其配置和性能数据发送到Azure。 它还执行软件清单、执行无代理依赖项分析,并检测SQL Server或 MySQL Server 的 Web 应用和实例等工作负荷。

若要使用这些功能,请在设备配置管理器中添加服务器和来宾凭据。 遵循最低特权原则有助于确保设置安全高效。

重要

除了为Azure Migrate设备配置最低特权凭据之外,请确保在Azure中为用户分配适当的Azure Migrate内置角色。 这些角色提供发现、评估和迁移活动所需的最低权限。 了解详细信息。

发现 VMware 资产

若要发现 VMware 资产中运行的服务器的基本设置,需要以下权限。

vCenter 帐户权限

发现服务器元数据

  • 若要在 VMware 环境中发现基本服务器配置,需要以下权限:
    • 只读:使用系统内置的只读角色或创建该角色的副本。
  • 若要发现服务器元数据并启用软件清单、依赖项分析和性能评估,需要以下权限:
    • 只读:使用系统内置的只读角色或创建该角色的副本。
    • 访客操作:将访客操作权限添加到只读角色。

VMware 服务器的作用域发现

  • 若要发现特定的虚拟机(VM),请在各个 VM 上分配读取权限。
  • 若要发现文件夹中的所有 VM,请在文件夹级别分配读取权限,并打开“ 传播到子 级”选项。
  • 若要启用软件清单、依赖项分析和性能评估,请在 vCenter 帐户上分配访客操作权限,并且具有读取权限。
  • 授予对托管虚拟机的所有父对象(例如主机、群集、主机文件夹、群集文件夹和数据中心)的只读访问权限。 无需将这些权限应用于所有子对象。
  • 在 vSphere 客户端中,检查在 主机和群集视图和VM 和模板 视图的父对象上是否设置了读取权限。

无代理迁移

若要执行无代理迁移,请确保Azure Migrate设备使用的 vCenter 帐户在所有必需级别具有权限:数据中心、群集、主机、VM 和数据存储。 在每个级别应用权限以避免复制错误。

vSphere 特权名称 特权用途 必选 API 特权名称
浏览数据存储 允许用户浏览 VM 日志文件以排查快照创建和删除问题 Datastores Datastore.Browse
低级别文件操作 允许在数据存储浏览器中进行读取、写入、删除和重命名操作,以排查与快照创建和删除相关的问题。 Datastores Datastore.FileManagement
更改配置 - 切换磁盘更改跟踪 允许用户启用或禁用虚拟机磁盘的更改跟踪,以获取快照之间发生变化的数据块。 虚拟机 VirtualMachine.Config.ChangeTracking
更改配置 - 获取磁盘租约 允许通过 VMware vSphere 虚拟磁盘开发包 (VDDK) 使用磁盘租赁操作来读取 VM 的磁盘 虚拟机 VirtualMachine.Config.DiskLease
预配 - 允许只读磁盘访问 允许只读磁盘访问:在 VM 上打开磁盘以使用 VDDK 读取磁盘 虚拟机 VirtualMachine.Provisioning.DiskRandomRead
配置 - 允许磁盘访问 允许在 VM 上打开磁盘,以使用 VDDK 读取磁盘 虚拟机 VirtualMachine.Provisioning.DiskRandomAccess
预配 - 允许虚拟机下载 允许虚拟机下载以读取 VM 文件、获取日志和排查故障 根主机或 vCenter Server VirtualMachine.Provisioning.GetVmFiles
快照管理 允许在 VM 上发现、软件清单和依赖项映射 虚拟机 VirtualMachine.State.*
访客操作 允许创建和管理用于复制的 VM 快照 虚拟机 VirtualMachine.GuestOperations.*
交互电源关闭 允许在迁移到Azure期间关闭 VM 虚拟机 VirtualMachine.Interact.PowerOff

来宾发现已安装的软件、依赖项和工作负载

为了有效地发现目标服务器上的软件、应用程序依赖项和工作负载,Azure Migrate工具需要来宾操作系统(OS)凭据。 这些凭据使设备能够安全地连接到服务器,并收集详细的清单和性能数据。

快速来宾发现

若要快速发现软件清单、服务器依赖项和数据库实例,需要以下权限:

用例 发现的元数据 凭据类型 确保权限安全
快速来宾发现 软件清单

服务器依赖项(有限数据)

数据库实例清单
Windows

Linux
本地来宾用户帐户

任何非 Sudo 来宾用户帐户

Note

可以使用 Windows 客户机或非 Sudo 权限的 Linux 用户帐户来获取依赖项映射数据。 但是,使用最低权限账户时,你可能不会收集某些使用更高权限运行的进程的信息(如进程名称或应用名称)。 这些进程在单服务器视图中的计算机下显示为 “未知 ”。

深入的来宾发现

若要深入发现软件清单、服务器依赖项和 Web 应用(如 .NET 和 Java Tomcat),需要以下权限:

用例 发现的元数据 凭据类型 所需的权限
深入的来宾发现 软件清单

服务器依赖项(完整数据)

数据库实例清单

.NET和 Java Tomcat 等 Web 应用
Windows 管理员
深入的来宾发现 软件清单

服务器依赖项(完整数据)

数据库实例清单

.NET和 Java Tomcat 等 Web 应用
Linux 若要标识服务器依赖项,需要以下 Sudo 权限: /usr/bin/netstat 和 /usr/bin/ls。

如果 netstat 不可用,则需要在 ss 上具有 Sudo 权限。

对于 Java Web 应用的发现(Tomcat 服务器),用户应对所有 Catalina 主目录拥有读取和执行(r-x)权限。

使用以下命令,找出所有 catalina 家庭:ps -ef \| grep catalina.home。

下面是设置最低特权用户的示例命令: setfacl -m u:<username>:rx <catalina/home/path>

发现Hyper-V庄园

若要查找在Hyper-V资产中运行的服务器的基本设置,需要某些权限。 在所有Hyper-V主机上,创建属于这三个组的一部分的本地用户:

  • Hyper-V管理员
  • 性能监控工具用户
  • 远程管理用户

使用 script 准备 Hyper-V 主机。

若要深入发现Hyper-V资产并执行软件清单和依赖项分析,需要来宾帐户凭证。

发现物理服务器和云服务器

若要发现和评估托管在其他公有云中的物理服务器或服务器,Azure Migrate设备需要具有最低特权访问权限的凭据。 这些凭据允许设备连接和收集必要的数据,而无需过度公开敏感系统权限。

快速服务器发现

若要快速发现软件清单、服务器依赖项和数据库实例,需要以下权限:

用例 发现的元数据 凭据类型 详细信息
快速服务器发现 软件清单

无代理依赖项分析(有限数据)

数据库和 Web 应用的工作负荷清单
Windows 按照以下步骤作
快速服务器发现 软件清单

无代理依赖项分析(完整数据)

数据库和 Web 应用的工作负荷清单
Linux 按照以下步骤作

Windows服务器

若要快速发现Windows服务器,请创建属于以下用户组的Windows用户帐户:

  • 远程管理用户
  • 性能监控工具用户
  • 性能日志用户

来宾用户帐户需要有权访问 Control Panel 中 WMI Control 项中的 CIMV2 命名空间及其子命名空间。 若要设置访问权限,请使用以下步骤:

  1. 在目标Windows服务器上,转到 Start 菜单,搜索 Run,然后选择它。

  2. 在 “运行 ”对话框中,键入 wmimgmt.msc 并按 Enter 键。

  3. 在 wmimgmt 控制台中,右键单击 WMI 控件(本地),然后选择“ 属性”。

  4. 在 “WMI 控件(本地)属性 ”对话框中,选择“ 安全 ”选项卡。

  5. 展开命名空间树中的 根 文件夹,然后选择 CIMV2 命名空间。

  6. 选择 “安全性 ”以打开 “ROOT\CIMV2 安全 ”对话框。

  7. 在 “组或用户名 ”部分中,选择“ 添加 ”以打开 “选择用户或组 ”对话框。

  8. 搜索用户帐户,将其选中,然后选择 “确定 ”以返回到 ROOT\CIMV2 安全对话框。

  9. 在 “组或用户名 ”部分中,选择来宾用户帐户。 验证是否允许以下权限:

    • 启用帐户
    • 远程启用

    显示来宾用户权限的屏幕截图。

  10. 选择 “应用” 以启用在用户帐户上设置的权限。

  11. 添加新来宾用户后重启 WinRM 服务。

Linux 服务器

若要快速发现 Linux 服务器:

  1. 创建用户帐户;例如, AzMigrateLeastprivuser.

  2. 通过在/etc/sudoers文件中添加以下行,仅对用户授予执行所需命令的sudo权限:

    AzMigrateLeastprivuser ALL=(ALL) NOPASSWD: /usr/sbin/dmidecode, /usr/sbin/fdisk -l, /usr/sbin/fdisk -l *, /usr/bin/ls -l /proc/*/exe, /usr/bin/netstat -atnp, /usr/sbin/lvdisplay ""
    Defaults:AzMigrateLeastprivuser !requiretty
    
    

深入服务器检测

若要深入发现软件清单、服务器依赖项和 Web 应用(如 .NET 和 Java Tomcat),需要以下权限:

用例 发现的元数据 凭据类型 要配置的命令
深入服务器检测 深入发现 Web 应用,例如 .NET 和 Java Tomcat

无代理依赖项分析(完整数据)
Windows

Linux
需要管理员权限。

若要发现 Tomcat 服务器上的Java Web 应用,用户帐户需要对所有 Catalina 主目录具有读取和执行权限(r-x)。

使用以下命令,找出所有 catalina 家庭:ps -ef \| grep catalina.home。

下面是设置最低特权用户的示例命令: setfacl -m u:<username>:rx <catalina/home/path>

数据库发现

要启动工作负荷发现,需要准备软件清单。 若要启用它,请确保添加来宾凭据。 发现 SQL 和 MySQL 数据库的权限适用于所有设备类型:VMware、Hyper-V 和物理服务器。

发现SQL Server实例和数据库

在单个SQL Server实例上创建最低特权帐户。 使用 Windows 身份验证并仅分配所需的权限。

Windows 身份验证

-- Create a login to run the assessment.
use master;
DECLARE @SID NVARCHAR(MAX) = N'';
CREATE LOGIN [MYDOMAIN\MYACCOUNT] FROM WINDOWS;
SELECT @SID = N'0x'+CONVERT(NVARCHAR, sid, 2) FROM sys.syslogins where name = 'MYDOMAIN\MYACCOUNT'
IF (ISNULL(@SID,'') != '')
  PRINT N'Created login [MYDOMAIN\MYACCOUNT] with SID = ' + @SID
ELSE
  PRINT N'Login creation failed'
GO    

-- Create a user in every database other than tempdb, model, and secondary AG databases (with connection_type = ALL) and provide minimal read-only permissions.
USE master;
EXECUTE sp_MSforeachdb '
  USE [?];
  IF (''?'' NOT IN (''tempdb'',''model''))
  BEGIN
    DECLARE @is_secondary_replica BIT = 0;
    IF CAST(PARSENAME(CAST(SERVERPROPERTY(''ProductVersion'') AS VARCHAR), 4) AS INT) >= 11
    BEGIN
      DECLARE @innersql NVARCHAR(MAX);
      SET @innersql = N''
        SELECT @is_secondary_replica = IIF(
          EXISTS (
              SELECT 1
              FROM sys.availability_replicas a
              INNER JOIN sys.dm_hadr_database_replica_states b
              ON a.replica_id = b.replica_id
              WHERE b.is_local = 1
              AND b.is_primary_replica = 0
              AND a.secondary_role_allow_connections = 2
              AND b.database_id = DB_ID()
          ), 1, 0
        );
      '';
      EXEC sp_executesql @innersql, N''@is_secondary_replica BIT OUTPUT'', @is_secondary_replica OUTPUT;
    END
    IF (@is_secondary_replica = 0)
    BEGIN
      CREATE USER [MYDOMAIN\MYACCOUNT] FOR LOGIN [MYDOMAIN\MYACCOUNT];
      GRANT SELECT ON sys.sql_expression_dependencies TO [MYDOMAIN\MYACCOUNT];
      GRANT VIEW DATABASE STATE TO [MYDOMAIN\MYACCOUNT];
    END
  END'
GO

-- Provide server-level read-only permissions.
use master;
GRANT SELECT ON sys.sql_expression_dependencies TO [MYDOMAIN\MYACCOUNT];
GRANT EXECUTE ON OBJECT::sys.xp_regenumkeys TO [MYDOMAIN\MYACCOUNT];
GRANT EXECUTE ON OBJECT::sys.xp_instance_regread TO [MYDOMAIN\MYACCOUNT];
GRANT VIEW DATABASE STATE TO [MYDOMAIN\MYACCOUNT];
GRANT VIEW SERVER STATE TO [MYDOMAIN\MYACCOUNT];
GRANT VIEW ANY DEFINITION TO [MYDOMAIN\MYACCOUNT];
GO

-- Provide msdb-specific permissions.
use msdb;
GRANT EXECUTE ON [msdb].[dbo].[agent_datetime] TO [MYDOMAIN\MYACCOUNT];
GRANT SELECT ON [msdb].[dbo].[sysjobsteps] TO [MYDOMAIN\MYACCOUNT];
GRANT SELECT ON [msdb].[dbo].[syssubsystems] TO [MYDOMAIN\MYACCOUNT];
GRANT SELECT ON [msdb].[dbo].[sysjobhistory] TO [MYDOMAIN\MYACCOUNT];
GRANT SELECT ON [msdb].[dbo].[syscategories] TO [MYDOMAIN\MYACCOUNT];
GRANT SELECT ON [msdb].[dbo].[sysjobs] TO [MYDOMAIN\MYACCOUNT];
GRANT SELECT ON [msdb].[dbo].[sysmaintplan_plans] TO [MYDOMAIN\MYACCOUNT];
GRANT SELECT ON [msdb].[dbo].[syscollector_collection_sets] TO [MYDOMAIN\MYACCOUNT];
GRANT SELECT ON [msdb].[dbo].[sysmail_profile] TO [MYDOMAIN\MYACCOUNT];
GRANT SELECT ON [msdb].[dbo].[sysmail_profileaccount] TO [MYDOMAIN\MYACCOUNT];
GRANT SELECT ON [msdb].[dbo].[sysmail_account] TO [MYDOMAIN\MYACCOUNT];
GO

-- Clean up
--use master;
-- EXECUTE sp_MSforeachdb 'USE [?]; DROP USER [MYDOMAIN\MYACCOUNT]'
-- DROP LOGIN [MYDOMAIN\MYACCOUNT];
--GO

SQL Server身份验证

--- Create a login to run the assessment.
use master;
-- NOTE: SQL Server instances that host replicas of Always On availability groups must use the same SID for the SQL Server login.
  -- After the account is created in one of the members, copy the SID output from the script and include this value when executing against the remaining replicas.
  -- When the SID needs to be specified, add the value to the following @SID variable definition.
DECLARE @SID NVARCHAR(MAX) = N'';
IF (@SID = N'')
BEGIN
  CREATE LOGIN [evaluator]
      WITH PASSWORD = '<provide a strong password>'
END
ELSE
BEGIN
  DECLARE @SQLString NVARCHAR(500) = 'CREATE LOGIN [evaluator]
    WITH PASSWORD = ''<provide a strong password>''
    , SID = ' + @SID
  EXEC SP_EXECUTESQL @SQLString
END
SELECT @SID = N'0x'+CONVERT(NVARCHAR(100), sid, 2) FROM sys.syslogins where name = 'evaluator'
IF (ISNULL(@SID,'') != '')
  PRINT N'Created login [evaluator] with SID = '''+ @SID +'''. If this instance hosts any Always On Availability Group replica, use this SID value when executing the script against the instances hosting the other replicas'
ELSE
  PRINT N'Login creation failed'
GO

-- Create a user in every database other than tempdb, model, and secondary AG databases (with connection_type = ALL) and provide minimal read-only permissions.
USE master;
EXECUTE sp_MSforeachdb '
  USE [?];
  IF (''?'' NOT IN (''tempdb'',''model''))
  BEGIN
    DECLARE @is_secondary_replica BIT = 0;
    IF CAST(PARSENAME(CAST(SERVERPROPERTY(''ProductVersion'') AS VARCHAR), 4) AS INT) >= 11
    BEGIN
      DECLARE @innersql NVARCHAR(MAX);
      SET @innersql = N''
        SELECT @is_secondary_replica = IIF(
          EXISTS (
            SELECT 1
            FROM sys.availability_replicas a
            INNER JOIN sys.dm_hadr_database_replica_states b
              ON a.replica_id = b.replica_id
            WHERE b.is_local = 1
              AND b.is_primary_replica = 0
              AND a.secondary_role_allow_connections = 2
              AND b.database_id = DB_ID()
          ), 1, 0
        );
      '';
      EXEC sp_executesql @innersql, N''@is_secondary_replica BIT OUTPUT'', @is_secondary_replica OUTPUT;
    END

    IF (@is_secondary_replica = 0)
    BEGIN
        CREATE USER [evaluator] FOR LOGIN [evaluator];
        GRANT SELECT ON sys.sql_expression_dependencies TO [evaluator];
        GRANT VIEW DATABASE STATE TO [evaluator];
    END
  END'
GO

-- Provide server-level read-only permissions.
USE master;
GRANT SELECT ON sys.sql_expression_dependencies TO [evaluator];
GRANT EXECUTE ON OBJECT::sys.xp_regenumkeys TO [evaluator];
GRANT EXECUTE ON OBJECT::sys.xp_instance_regread TO [evaluator];
GRANT VIEW DATABASE STATE TO [evaluator];
GRANT VIEW SERVER STATE TO [evaluator];
GRANT VIEW ANY DEFINITION TO [evaluator];
GO

-- Provide msdb-specific permissions.
USE msdb;
GRANT EXECUTE ON [msdb].[dbo].[agent_datetime] TO [evaluator];
GRANT SELECT ON [msdb].[dbo].[sysjobsteps] TO [evaluator];
GRANT SELECT ON [msdb].[dbo].[syssubsystems] TO [evaluator];
GRANT SELECT ON [msdb].[dbo].[sysjobhistory] TO [evaluator];
GRANT SELECT ON [msdb].[dbo].[syscategories] TO [evaluator];
GRANT SELECT ON [msdb].[dbo].[sysjobs] TO [evaluator];
GRANT SELECT ON [msdb].[dbo].[sysmaintplan_plans] TO [evaluator];
GRANT SELECT ON [msdb].[dbo].[syscollector_collection_sets] TO [evaluator];
GRANT SELECT ON [msdb].[dbo].[sysmail_profile] TO [evaluator];
GRANT SELECT ON [msdb].[dbo].[sysmail_profileaccount] TO [evaluator];
GRANT SELECT ON [msdb].[dbo].[sysmail_account] TO [evaluator];
GO

-- Clean up
--use master;
-- EXECUTE sp_MSforeachdb 'USE [?]; BEGIN TRY DROP USER [evaluator] END TRY BEGIN CATCH PRINT ERROR_MESSAGE() END CATCH;'
-- BEGIN TRY DROP LOGIN [evaluator] END TRY BEGIN CATCH PRINT ERROR_MESSAGE() END CATCH;
--GO

有关如何大规模设置具有最低特权的自定义 SQL 帐户的信息,请参阅 预配具有最小特权的自定义帐户,以便SQL Server发现和评估。

发现 MySQL Server 实例和数据库

若要发现 MySQL 数据库,请将 MySQL 数据库凭据添加到设备。

确保与添加的 MySQL 凭据对应的用户具有以下权限:

  • 针对 information_schema 表的权限
  • 针对 mysql.users 表的权限

为了 MySQL 的发现,请确保允许设备的 IP 或域访问,配置必要的防火墙规则和 MySQL 用户权限。 还应将 my.cnf 中的 bind-address 设置为允许外部连接(如果需要)。

使用以下命令向 MySQL 用户授予必要的权限:

GRANT USAGE ON *.* TO 'username'@'ip';
GRANT PROCESS ON *.* TO 'username'@'ip';
GRANT SELECT (User, Host, Super_priv, File_priv, Create_tablespace_priv, Shutdown_priv) ON mysql.user TO 'username'@'ip';
GRANT SELECT ON information_schema.* TO 'username'@'ip';
GRANT SELECT ON performance_schema.* TO 'username'@'ip';