none
Como criar linked server com restrição de acesso? RRS feed

  • Pergunta

  • Boa tarde pessoal!

    Criei uma stored procedure no SQL Server para integrar dois sistemas através de um linked server que acessa um banco de dados em Oracle 9i.

    Até o momento fiz o linked server com login e senha embutido e tudo está funcionando normalmente, ou seja a integração está acontecendo sem grandes problemas, mas percebi hoje que da forma como criei o linked server qualquer usuário que tenha acesso ao SQL Server poderá acessar os dados do Oracle através dele.

    Como faço pra restringir o acesso na criação de linked server? Eu li a documentação do MSDN mas não entendi muito bem o funcionamento disso.

    Por exemplo, tenho um usuário que chama userteste e quero que somente esse usuário tenha acesso ao linked server.

    É possível fazer isso? O que é preciso configurar pra que funcione dessa forma?

    Agradeço desde já a ajuda!

    Abraço.

    sexta-feira, 6 de novembro de 2009 17:52

Respostas

  • Zeck,

    Vamos refazer o linked server.

    User o script abaixo para criar o mesmo:

    EXEC sp_addlinkedserver
    	@server='OracleServer', /* nome do linked server */
    	@srvproduct='ORACLE', /* Product name do data source */
    	@provider='MSDAORA', /* OLE DB provider */
    	@datasrc='ORCL' /* Nome da Instância */
    GO
    
    EXEC sp_addlinkedsrvlogin
    	@rmtsrvname = 'OracleServer',
    	@useself = false,
    	@locallogin = 'UserLocal',
    	@rmtuser = 'UserRemoto',
    	@rmtpassword = 'Senha'
    GO

    Enquanto isso vou pesquisar um pouco mais sobre a mensagem de erro...


    Abraço!!


    Classifiquem as respostas. O Fórum agradece!!
    • Marcado como Resposta Zeck Supernova segunda-feira, 9 de novembro de 2009 19:30
    segunda-feira, 9 de novembro de 2009 19:23
  • Boa tarde galera!

    Resolvi o problema através da própria SP_AddLinkedSRVLogin, pois ela tem um atributo chamado @locallogin, definindo esse cara o SQL Server restringe o acesso ao linked server somente para esse usuário especificado.

    sp_addlinkedsrvlogin
    @rmtsrvname = 'LINK_TESTE',
    @useself = 'false',
    @locallogin = userteste, --DEFINE O USUÁRIO LOCAL DO LINKED SERVER
    @rmtuser = 'teste',
    @rmtpassword = 'teste'

    Obrigado pela força aí!

    Abraço.

    • Marcado como Resposta Zeck Supernova segunda-feira, 9 de novembro de 2009 19:30
    segunda-feira, 9 de novembro de 2009 19:30

Todas as Respostas

  • Zeck

    Funciona assim, vc pode criar um linked server com a forma de autenticacao "Current Security Context" ai somente usuario com login nos dois server teria acesso (testei no SQL), mas todos os logins existentes dos dois servers teriam acesso.

    o que vc pode fazer é criar um synonym e dar grant somente no usuario desejado, ai ao inves de usar o linked server seus ususarios devem usar o synonym

    CREATE SYNONYM Syn_teste
    FOR link_teste.master.sys.tables
    GO
    
    grant select on Syn_teste to teste
    go
    select * from Syn_teste
    


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    sexta-feira, 6 de novembro de 2009 18:21
  • Olá Zeck,

    Você deve estar utilizando nesse momento a opção "Be made using this security context:" em Security (Propriedades do Linked Server) e deve ter informado um usuário e uma senha para conectar no Oracle.

    Se você quiser limitar o acesso a alguns usuários apenas, informe em "Local server login to remote server login mappings:" e adicione um mapeamento do login que pode acessar (no SQL) para o login que tem acesso (no Oracle). Estes são os dados:
    - Local Login: Você vai informa o login local que pode acessar, no exemplo é userteste
    - Remote User: Informe o login que existe no Oracle.
    - Remote Password: Coloque a senha do login do Oracle.

    Dessa forma, somente quando estiver logado no SQL Server com userteste, será possível acessar o Oracle via este Linked Server.

    Além disso, em "For a login not defined in the list above, connections will" selecione "Not be made". Assim, se outro usuário tentar acessar, ele nem vai tentar conectar no Oracle.


    Qualquer dúvida, estamos aqui.

    Abraço!!

    Classifiquem as respostas. O Fórum agradece!!
    sexta-feira, 6 de novembro de 2009 19:28
  • Zeck,

    O uso dos sinôminos é bem interessante, mas é um recurso disponível somente para o 2005 e 2008.


    Em relação as orientações de Alexandre, eu particularmente trabalho com este tipo de estratégia e modelo de segurança.


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    segunda-feira, 9 de novembro de 2009 13:06
  • Bom dia Alexandre, obrigado pelo retorno!

    Realmente meu linked server estava com a opção "Be made using this sercurity context:".

    Efetuei o procedimento como você descreveu, marquei a opção "Not be made" e defini o usuário local, usuário remoto e senha remota, mas não deu certo, pois quando tento acessar o Oracle pelo linked server retorna o erro:

    Pelo Enterprise Manager ao expandir as tabelas: Error 7416: Access to the remote server is denied because no login-mapping exists.

    Pelo Query Analyser:

    select * from openquery(linked_teste, 'select * from prjctb_pjc')

    Server: Msg 7399, Level 16, State 1, Line 1
    OLE DB provider 'MSDAORA' reported an error. 
    [OLE/DB provider returned message: ORA-12560: TNS:erro de adaptador de protocolo]
    OLE DB error trace [OLE/DB Provider 'MSDAORA' IDBInitialize::Initialize returned 0x80004005:   ].


    Sabe me dizer o que pode ser?
    Tenho que configurar alguma coisa?

    Obrigado!
    segunda-feira, 9 de novembro de 2009 13:31
  • Olá Zeck,

    Bom, pelo Enterprise, a mensagem está correta. Você deve estar logado com um usuário que não está mapeado no Linked Server.

    Resta saber se no Query Analyzer, você fez o login com o usuário do Linked Server. Mas, essa mensagem "ORA-12560: TNS:erro de adaptador de protocolo" indica que existe problema no TNSNAMES (arquivo de configuração com os servidores Oracle). Por ser um erro genérico, fica complicado saber exatamente qual o seu problema.

    Mas tente verificar se esta thread lhe ajuda:


    Abraço!!

    Classifiquem as respostas. O Fórum agradece!!
    segunda-feira, 9 de novembro de 2009 15:30
  • Zeck,

    Você consegui se conectar a este outro servidor através do Query Analyzer para que possamos fazer um teste?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    segunda-feira, 9 de novembro de 2009 16:59
  • Zeck,

    Um teste que você pode fazer para verificar se o TNSNAMES está correto é executar no prompt o seguinte comando: TNSPING ServidorOracle

    Esse ServidorOracle é exatamente o que você colocou no linked server.

    Se der problema no acesso, é pq falta algo na configuração do TNSNAMES.ORA


    Depois retorne aqui.


    Abraço!!!

    Classifiquem as respostas. O Fórum agradece!!
    segunda-feira, 9 de novembro de 2009 17:51
  • Boa tarde pessoal.

    Respondendo aí as perguntas.

    Alexandre VM: Resta saber se no Query Analyzer, você fez o login com o usuário do Linked Server.
    Junior Galvão MVP: Você consegui se conectar a este outro servidor através do Query Analyzer para que possamos fazer um teste?

    Sim, fiz o login com o userteste mesmo, isso é que está estranho pois o permissionamento tá correto, local login tá userteste, loguei com ele no Query Analyser, login e senha remotos estão corretos também, pois utilizo eles pra logar via SQL Plus no Oracle e funciona normalmente.

    A configuração do TNS está OK, tanto é que se se eu definir no security context do linked server o usuário e senha remotos tudo volta a funcionar normalmente.
    TNSPING tá OK também, até o SQL Plus tá rodando normal, o lance tá pegando no linked server mesmo.

    Fiquei sem saída agora, porque pelo que vocês me explicaram é até uma coisa simples de se fazer. Tenho no Oracle um usuário teste, configurei no linked server exatamente isso, usuário local = userteste, usuário remoto = teste e senha remota = ****.

    Tentei inclusive incluir antes do usuário remoto o nome do esquema, ficando teste\teste, depois tentei teste.teste, mas de qualquer forma o problema acontece.

    Se alguém souber o que é agradeço, mas já to perdendo as esperanças.

    Valeu galera!

    segunda-feira, 9 de novembro de 2009 18:15
  • Zeck,

    Vamos refazer o linked server.

    User o script abaixo para criar o mesmo:

    EXEC sp_addlinkedserver
    	@server='OracleServer', /* nome do linked server */
    	@srvproduct='ORACLE', /* Product name do data source */
    	@provider='MSDAORA', /* OLE DB provider */
    	@datasrc='ORCL' /* Nome da Instância */
    GO
    
    EXEC sp_addlinkedsrvlogin
    	@rmtsrvname = 'OracleServer',
    	@useself = false,
    	@locallogin = 'UserLocal',
    	@rmtuser = 'UserRemoto',
    	@rmtpassword = 'Senha'
    GO

    Enquanto isso vou pesquisar um pouco mais sobre a mensagem de erro...


    Abraço!!


    Classifiquem as respostas. O Fórum agradece!!
    • Marcado como Resposta Zeck Supernova segunda-feira, 9 de novembro de 2009 19:30
    segunda-feira, 9 de novembro de 2009 19:23
  • Boa tarde galera!

    Resolvi o problema através da própria SP_AddLinkedSRVLogin, pois ela tem um atributo chamado @locallogin, definindo esse cara o SQL Server restringe o acesso ao linked server somente para esse usuário especificado.

    sp_addlinkedsrvlogin
    @rmtsrvname = 'LINK_TESTE',
    @useself = 'false',
    @locallogin = userteste, --DEFINE O USUÁRIO LOCAL DO LINKED SERVER
    @rmtuser = 'teste',
    @rmtpassword = 'teste'

    Obrigado pela força aí!

    Abraço.

    • Marcado como Resposta Zeck Supernova segunda-feira, 9 de novembro de 2009 19:30
    segunda-feira, 9 de novembro de 2009 19:30
  • Legal Zeck!!

    Qualquer coisa retorna aqui.


    Abraço!!

    Classifiquem as respostas. O Fórum agradece!!
    segunda-feira, 9 de novembro de 2009 19:49