Compartilhar via

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

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

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

发现 VMware 资产

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

vCenter 帐户权限

发现服务器元数据

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

VMware 服务器的作用域发现

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

无代理迁移

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

vSphere 特权名称 特权用途 必选 API 特权名称
浏览数据存储 允许用户浏览 VM 日志文件以排查快照创建和删除问题 Datastores Datastore.Browse
低级别文件操作 允许在数据存储浏览器中进行读取、写入、删除和重命名操作,以排查与快照创建和删除相关的问题。 Datastores Datastore.FileManagement
更改配置 - 切换磁盘更改跟踪 允许用户启用或禁用 VM 磁盘的更改跟踪,以拉取快照之间更改的数据块 虚拟机 VirtualMachine.Config.ChangeTracking
更改配置 - 获取磁盘租约 允许 VM 上的磁盘租用作使用 VMware vSphere 虚拟磁盘开发工具包(VDDK)读取磁盘 虚拟机 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 来宾或 Linux 非 Sudo 用户帐户来获取依赖项映射数据。 但是,对于某些使用更高权限运行的进程,你可能不会收集进程信息(如进程名称或应用名称)。 这些进程在单服务器视图中的计算机下显示为 “未知 ”。

深入的来宾发现

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

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

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

数据库实例清单

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

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

数据库实例清单

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

如果 netstat 不可用,则需要对 Sudo 权限 ss

对于 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 管理员
  • 性能监控工具用户
  • 远程管理用户

使用 脚本 准备 Hyper-V 主机。

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

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

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

快速服务器发现

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

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

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

数据库和 Web 应用的工作负荷清单
Windows 需要遵循的步骤
快速服务器发现 软件清单

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

数据库和 Web 应用的工作负荷清单
Linux 需要遵循的步骤

Windows 服务器

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

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

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

  1. 在目标 Windows 服务器上,打开 “开始 ”菜单,搜索 “运行”,然后选择它。

  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),需要具有以下权限:

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

无代理依赖项分析(完整数据)
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 发现,请配置必要的防火墙规则和 MySQL 用户权限,确保允许设备的 IP 或域。 还应将 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';