AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 37379
Accepted
Jeff Sacksteder
Jeff Sacksteder
Asked: 2013-03-23 12:21:53 +0800 CST2013-03-23 12:21:53 +0800 CST 2013-03-23 12:21:53 +0800 CST

Limitar direitos de conexão no SQL Server

  • 772

Eu tenho um aplicativo para implantar na produção que usa a segurança do 'sistema de honra'. Ou seja, todos os usuários se conectam ao banco de dados usando uma credencial de usuário/senha SQL e o próprio aplicativo gerencia as permissões. A última parte não me incomoda tanto quanto o fato de que o objeto de conexão contém credenciais incorporadas e pode ser copiado livremente. Estou tentando encontrar uma maneira de limitar as conexões a um conjunto mais limitado de clientes. Posso criar regras de firewall para limitar por IP, claro. Existe alguma maneira de 'pré-qualificar' logins SQL por conta de máquina ou associação de domínio?

sql-server sql-server-2012
  • 2 2 respostas
  • 9072 Views

2 respostas

  • Voted
  1. Kin Shah
    2013-03-23T12:55:28+08:002013-03-23T12:55:28+08:00

    Como Thomas mencionou, isso pode ser feito usando o LOGON Trigger. Abaixo está o script que irá ajudá-lo

    /*
    
    http://www.sqlservercentral.com/scripts/Security/69558/
    Credit: Gregory A. Ferdinandsen
    [email protected]
    --Revision 1.0, 8 Feb 10
    --Requires SQL 2005 SP2 or higher
    */
    if not exists (select 1 from master..sysdatabases where name = 'SQL_Audit')
     begin
     create database SQL_Audit
      end
    USE [SQL_Audit]
    GO
    
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    SET ANSI_PADDING ON
    GO
    
    CREATE TABLE [dbo].[BlackList](
    [SRV_Rule] [int] IDENTITY(1,1) NOT NULL,
    [HostName] [varchar](64) NULL,
    [IP_Address] [varchar](15) NULL,
    [LoginName] [varchar](128) NULL,
    [AppName] [varchar](256) NULL,
    [RestrictionEnabled] [bit] NULL,
    [Description] [varchar](2048) NULL,
    CONSTRAINT [PK_BlackList] PRIMARY KEY CLUSTERED 
    (
    [SRV_Rule] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    SET ANSI_PADDING OFF
    GO
    
    ALTER TABLE [dbo].[BlackList] ADD CONSTRAINT [DF_BlackList_RestrictionEnabled] DEFAULT ((0)) FOR [RestrictionEnabled]
    GO
    
    ---------------------------------------------------------------------
    ---------------------------------------------------------------------
    USE [SQL_Audit]
    GO
    
    
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    SET ANSI_PADDING ON
    GO
    
    CREATE TABLE [dbo].[Violations](
    [ViolationNum] [int] IDENTITY(1,1) NOT NULL,
    [PostDate] [datetime] NOT NULL,
    [LoginName] [varchar](128) NULL,
    [IPAddress] [varchar](15) NULL,
    [HostName] [nvarchar](64) NULL,
    [ServerName] [varchar](96) NULL,
    [AppName] [nvarchar](256) NULL,
    [ViolationType] [varchar](512) NULL,
    CONSTRAINT [PK_Violations] PRIMARY KEY CLUSTERED 
    (
    [ViolationNum] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    SET ANSI_PADDING OFF
    GO
    
    ALTER TABLE [dbo].[Violations] ADD CONSTRAINT [DF_Violations_PostDate] DEFAULT (getdate()) FOR [PostDate]
    GO
    ---------------------------------------------------------------------
    ---------------------------------------------------------------------
    --(c) Gregory A. Ferdinandsen
    [email protected]
    --Revision 1.0, 8 Feb 10
    --Requires SQL 2005 SP2 or higher
    
    --
    --Change with <<Execute as 'Domain\SQL'>> for a valid service account that has sa rights
    --
    --Information on Logon Triggers: http://msdn.microsoft.com/en-us/library/bb326598.aspx
    --
    USE Master
    go
    
    CREATE Trigger [trg_LoginBlackList]
     on all Server 
    
     as
    begin
    
     declare @data XML
    declare @User as varchar(128)
    declare @HostName as varchar(64)
    declare @IPAddress as varchar(15)
    declare @AppName as nvarchar(256)
    declare @SPID as int
    declare @SrvName as nvarchar(96)
    declare @PostTime as datetime
    declare @LogMsg as varchar(1024)
    
    set @data = EVENTDATA()
    set @User = @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(128)')
    set @IPAddress = @data.value('(/EVENT_INSTANCE/ClientHost)[1]', 'nvarchar(15)')
    set @SPID = @data.value('(/EVENT_INSTANCE/SPID)[1]', 'int')
    set @SrvName = @data.value('(/EVENT_INSTANCE/ServerName)[1]', 'nvarchar(96)')
    set @PostTime = @data.value('(/EVENT_INSTANCE/PostTime)[1]', 'datetime')
    set @HostName = Cast(Host_Name() as nvarchar(64))
    set @AppName = Cast(App_Name() as nvarchar(256))
    
    --Check to see if the blacklist table exists, if the table does not exist, exit the Trigger, as otherwise all user would be locked out.
    
    if Not Exists (select * from SQL_Audit.INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'BlackList')
    begin
    return;
    end
    
    
    --#1
    --If a user connects from a given work station and with a given UserName, they will be dissconected
    --This user need to be set up in SQL_Audit..Blacklist with a user name and a host name, no IP Address is necesary
    --This is the prefered method of blacklisting, as DHCP could reak havoc on any IP restrictions
    If(Exists(Select * from SQL_Audit.dbo.BlackList where LoginName = @User and HostName = @HostName and RestrictionEnabled = 1))
    begin
    --Any data modifications made up to the point of ROLLBACK TRANSACTION are rolled back
    --The current trigger continues to execute any remaining statements that appear after the ROLLBACK statement. 
    --If any of these statements modify data, the modifications are not rolled back.
    --http://technet.microsoft.com/en-us/library/bb153915.aspx
    rollback
    
    insert into SQL_Audit..Violations
    (PostDate, LoginName, IPAddress, HostName, ServerName, AppName, ViolationType)
    values (@PostTime, @User, @IPAddress, @HostName, @SrvName, @AppName, 'LoginName, HostName')
    
    --Exit trigger without evaluating any further conditions
    return;
    end
    
    --#2
    --If a user connects from a given IP Address and with a given UserName, they will be dissconected
    --This user need to be set up in SQL_Audit..Blacklist with a user name and a IP Address, no HostName is necesary
    If(Exists(Select * from SQL_Audit.dbo.BlackList where LoginName = @User and IP_Address = @IPAddress and RestrictionEnabled = 1))
    begin
    --Any data modifications made up to the point of ROLLBACK TRANSACTION are rolled back
    --The current trigger continues to execute any remaining statements that appear after the ROLLBACK statement. 
    --If any of these statements modify data, the modifications are not rolled back.
    --http://technet.microsoft.com/en-us/library/bb153915.aspx
    rollback
    
    insert into SQL_Audit..Violations
    (PostDate, LoginName, IPAddress, HostName, ServerName, AppName, ViolationType)
    values (@PostTime, @User, @IPAddress, @HostName, @SrvName, @AppName, 'LoginName, IP Address')
    
    --Exit trigger without evaluating any further conditions
    return;
    end
    
    --#3
    --If a user connects from a given Blacklisted IP Address, regardless of the host name or SQL Server User
    --This IPAddress need to be set up in SQL_Audit..Blacklist with only an IP Address, no other information is needed
    --This will block all connections from the designated IP Address
    If(Exists(Select * from SQL_Audit.dbo.BlackList where IP_Address = @IPAddress and LoginName is NULL and HostName is NULL and RestrictionEnabled = 1))
    begin
    --Any data modifications made up to the point of ROLLBACK TRANSACTION are rolled back
    --The current trigger continues to execute any remaining statements that appear after the ROLLBACK statement. 
    --If any of these statements modify data, the modifications are not rolled back.
    --http://technet.microsoft.com/en-us/library/bb153915.aspx
    rollback
    
    insert into SQL_Audit..Violations
    (PostDate, LoginName, IPAddress, HostName, ServerName, AppName, ViolationType)
    values (@PostTime, @User, @IPAddress, @HostName, @SrvName, @AppName, 'IP Address')
    
    --Exit trigger without evaluating any further conditions
    return;
    end
    
    --#4
    --If a user connects from a given Blacklisted Workstation, regardless of the IP Address or SQL Server User
    --This Client need to be set up in SQL_Audit..Blacklist with only a value for HostName, no other information is needed
    --This will block all connections from the designated Host
    If(Exists(Select * from SQL_Audit.dbo.BlackList where HostName = @HostName and LoginName is NULL and IP_Address is NULL and RestrictionEnabled = 1))
    begin
    --Any data modifications made up to the point of ROLLBACK TRANSACTION are rolled back
    --The current trigger continues to execute any remaining statements that appear after the ROLLBACK statement. 
    --If any of these statements modify data, the modifications are not rolled back.
    --http://technet.microsoft.com/en-us/library/bb153915.aspx
    rollback
    
    insert into SQL_Audit..Violations
    (PostDate, LoginName, IPAddress, HostName, ServerName, AppName, ViolationType)
    values (@PostTime, @User, @IPAddress, @HostName, @SrvName, @AppName, 'HostName')
    
    --Exit trigger without evaluating any further conditions
    return;
    end
    
    --#5
    --If a particular application connects to SQL Server, regardless of IP Address, UserName, or HostName, the session is terminated
    If(Exists(Select * from SQL_Audit.dbo.BlackList where AppName = @AppName and HostName is NULL and LoginName is NULL and IP_Address is NULL and RestrictionEnabled = 1))
    begin
    --Any data modifications made up to the point of ROLLBACK TRANSACTION are rolled back
    --The current trigger continues to execute any remaining statements that appear after the ROLLBACK statement. 
    --If any of these statements modify data, the modifications are not rolled back.
    --http://technet.microsoft.com/en-us/library/bb153915.aspx
    rollback
    
    insert into SQL_Audit..Violations
    (PostDate, LoginName, IPAddress, HostName, ServerName, AppName, ViolationType)
    values (@PostTime, @User, @IPAddress, @HostName, @SrvName, @AppName, 'ApplicationName')
    
    --Exit trigger without evaluating any further conditions
    return;
    end
    
    --#6
    --If a particular application connects to SQL Server, with a given UserName (i.e. service account cannot connect with SSMS)
    If(Exists(Select * from SQL_Audit.dbo.BlackList where AppName = @AppName and LoginName = @User and RestrictionEnabled = 1))
    begin
    --Any data modifications made up to the point of ROLLBACK TRANSACTION are rolled back
    --The current trigger continues to execute any remaining statements that appear after the ROLLBACK statement. 
    --If any of these statements modify data, the modifications are not rolled back.
    --http://technet.microsoft.com/en-us/library/bb153915.aspx
    rollback
    
    insert into SQL_Audit..Violations
    (PostDate, LoginName, IPAddress, HostName, ServerName, AppName, ViolationType)
    values (@PostTime, @User, @IPAddress, @HostName, @SrvName, @AppName, 'ApplicationName, UserName')
    
    --Exit trigger without evaluating any further conditions
    return;
    end
    end;
    
    GO
    
    SET ANSI_NULLS OFF
    GO
    
    SET QUOTED_IDENTIFIER OFF
    GO
    
    ENABLE TRIGGER [trg_LoginBlackList] ON ALL SERVER
    GO
    
    • 12
  2. Best Answer
    Thomas Stringer
    2013-03-23T12:30:10+08:002013-03-23T12:30:10+08:00

    Você pode conseguir isso por meio de um gatilho de logon . Em seu gatilho de logon, você pode ter a lógica para fazer as verificações necessárias que está procurando (como o nome da máquina). Infelizmente, não acredito que haja uma maneira de obter a associação de domínio do usuário se você estiver utilizando a autenticação do SQL Server.

    Você pode usar a função EVENTDATA para ver se pode extrair outras informações para determinar se a conexão deve ou não ser permitida. Se você não deseja que esse logon específico seja bem-sucedido, pode testar condicionalmente e emitir um arquivo ROLLBACK.

    • 8

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve