AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 122757
Accepted
Jefferson B. Elias
Jefferson B. Elias
Asked: 2015-12-03 23:52:07 +0800 CST2015-12-03 23:52:07 +0800 CST 2015-12-03 23:52:07 +0800 CST

我应该在 msdb 中删除 MS_DataCollectorInternalUser 吗?

  • 772

从 SQL Server 2008 开始,有一个用户msdb名为MS_DataCollectorInternalUser. 此用户没有与此关联的登录名,可以被视为孤儿用户。

删除孤儿用户是一种安全最佳实践。

MS_DataCollectorInternalUser不能仅使用 TSQL 命令删除,因为DROP USER它已将数据库权限授予IMPERSONATE名为dc_admin.

我们不使用 SQL Server 的数据收集器功能。

你有什么建议?

sql-server security
  • 2 2 个回答
  • 2637 Views

2 个回答

  • Voted
  1. Remus Rusanu
    2015-12-04T00:14:49+08:002015-12-04T00:14:49+08:00

    MS_DataCollectorInternalUser不是孤立用户。是没有登录的用户,另类的野兽。我建议您更新您的安全实践,您可能已经删除了其他有效的非孤立用户。除非您有特定的安全公告引用删除或修改此用户的理由,否则您应该保留它。

    • 1
  2. Best Answer
    Heisenberg
    2015-12-04T00:47:46+08:002015-12-04T00:47:46+08:00

    我找不到来自 Microsoft 网站的参考,但根据Alfred Songy的博客文章。 MS_DataCollectorInternalUser与数据收集器有关。它是故意创建的没有 SQL 登录的用户帐户,并且没有登录创建的用户显然无法连接到数据库,因此我没有看到安全风险。我的建议是不应该删除删除,修改系统数据库中的任何内容不是一个好主意。:)

    下面的这个查询有助于识别孤立的 SQL Server 用户。

    select DB_NAME() [database], name as [user_name], type_desc,default_schema_name,create_date,modify_date from sys.database_principals 
    where type in ('G','S','U') 
    and authentication_type<>2 -- Use this filter only if you are running on SQL Server 2012 and major versions and you have "contained databases"
    and [sid] not in ( select [sid] from sys.server_principals where type in ('G','S','U') ) 
    and name not in ('dbo','guest','INFORMATION_SCHEMA','sys','MS_DataCollectorInternalUser')
    

    在我们知道我们将删除哪些用户之后,考虑到需要首先删除与模式和数据库角色的关联,可以使用以下脚本删除孤立用户。

    use [master]
    go
    create proc dbo.sp_Drop_OrphanedUsers
    as
    begin
     set nocount on
     -- get orphaned users  
     declare @user varchar(max) 
     declare c_orphaned_user cursor for 
      select name
      from sys.database_principals 
      where type in ('G','S','U') 
      and authentication_type<>2 -- Use this filter only if you are running on SQL Server 2012 and major versions and you have "contained databases"
      and [sid] not in ( select [sid] from sys.server_principals where type in ('G','S','U') ) 
      and name not in ('dbo','guest','INFORMATION_SCHEMA','sys','MS_DataCollectorInternalUser')  open c_orphaned_user 
     fetch next from c_orphaned_user into @user
     while(@@FETCH_STATUS=0)
     begin
      -- alter schemas for user 
      declare @schema_name varchar(max) 
      declare c_schema cursor for 
       select name from  sys.schemas where USER_NAME(principal_id)=@user
      open c_schema 
      fetch next from c_schema into @schema_name
      while (@@FETCH_STATUS=0)
      begin
       declare @sql_schema varchar(max)
       select @sql_schema='ALTER AUTHORIZATION ON SCHEMA::['+@schema_name+ '] TO [dbo]'
       print @sql_schema
       exec(@sql_schema)
       fetch next from c_schema into @schema_name
      end
      close c_schema
      deallocate c_schema   
    
      -- alter roles for user 
      declare @dp_name varchar(max) 
      declare c_database_principal cursor for 
       select name from sys.database_principals
       where type='R' and user_name(owning_principal_id)=@user
      open c_database_principal
      fetch next from c_database_principal into @dp_name
      while (@@FETCH_STATUS=0)
      begin
       declare @sql_database_principal  varchar(max)
       select @sql_database_principal ='ALTER AUTHORIZATION ON ROLE::['+@dp_name+ '] TO [dbo]'
       print @sql_database_principal 
       exec(@sql_database_principal )
       fetch next from c_database_principal into @dp_name
      end
      close c_database_principal
      deallocate c_database_principal
    
      -- drop roles for user 
      declare @role_name varchar(max) 
      declare c_role cursor for 
       select dp.name--,USER_NAME(member_principal_id)
       from sys.database_role_members drm
       inner join sys.database_principals dp 
       on dp.principal_id= drm.role_principal_id
       where USER_NAME(member_principal_id)=@user 
      open c_role 
      fetch next from c_role into @role_name
      while (@@FETCH_STATUS=0)
      begin
       declare @sql_role varchar(max)
       select @sql_role='EXEC sp_droprolemember N'''+@role_name+''', N'''+@user+''''
       print @sql_role
       exec (@sql_role)
       fetch next from c_role into @role_name
      end
      close c_role
      deallocate c_role   
    
      -- drop user
      declare @sql_user varchar(max)
      set @sql_user='DROP USER ['+@user +']'
      print @sql_user
      exec (@sql_user)
      fetch next from c_orphaned_user into @user
     end
     close c_orphaned_user
     deallocate c_orphaned_user
     set nocount off
    end
    go
    -- mark stored procedure as a system stored procedure
    exec sys.sp_MS_marksystemobject sp_Drop_OrphanedUsers
    go
    

    以下是对 SQL Server 实例中的所有数据库执行它的方法:

    USE [master]
    GO
    EXEC sp_msforeachdb 'USE [?]; EXEC sp_Drop_OrphanedUsers'
    

    另一个有用的链接可以解决您的问题

    希望我的回答有帮助!

    • 0

相关问题

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 存储过程可以防止 SQL 注入吗?

  • 死锁的主要原因是什么,可以预防吗?

  • 保护数据库密码

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve