2017-01-03 3 views
1

Je dispose d'un service Windows (.NET) qui s'exécute en tant qu'utilisateur de domaine et qui dispose des autorisations complètes sur les ressources de base de données et le système de fichiers requis. Le service appelle une procédure qui appelle une instruction d'insertion en bloc dans SQL Server.Erreur d'autorisation à l'aide de SQL Server et de la sécurité intégrée

Le service est exécuté avec la sécurité intégrée, le compte a été accordé la connexion en tant que droits de service. Cependant, je suis confronté à un problème d'autorisation lorsque le service s'exécute sur un autre serveur que celui où se trouve SQL Server.

Le serveur d'applications s'appelle Srv01 et le serveur db est Sql01. Le processus génère un fichier pdf et appelle l'insertion en bloc à l'aide d'une procédure dans Sql01. Lorsque j'installe le service Windows dans Srv01, je reçois l'erreur suivante:

Cannot bulk load because the file "//Srv01/Output/Letter.pdf" could not be opened. Operating system error code 5(Access is denied.). 

Le partage réseau a les autorisations pour tout le monde. J'essaie juste de faire fonctionner cela et de renforcer la sécurité plus tard.

Lorsque j'exécute le même service, avec le même utilisateur de domaine dans le même serveur que la base de données, à savoir Sql01, le processus fonctionne correctement.

Nous exécutons: Windows Server 2012, SQL Server 2012 Enterprise et le service est écrit en .NET 4.5. J'ai essayé de regarder dans les politiques de sécurité locales sur le serveur sql et le serveur d'application, mais sans aucun résultat. Oui, j'ai également redémarré le serveur d'applications (mais pas le DB).

+0

Ressemble à un problème de double saut: l'authentification de srv01 à sql01 fonctionne, mais lorsque sql01 tente d'emprunter l'identité du compte pour accéder au partage sur srv01, il échoue. Il y a beaucoup de choses qui peuvent mal tourner ici; [ce site] (https://www.roelvanlisdonk.nl/2009/05/22/microsoft-sql-2005-bulk-insert-kerberos-double-hop-and-operating-system-error-code-5-access -is-denied /) décrit un scénario en détail. –

+0

Merci @JeroenMostert. Cet article était utile, mais les forums qu'il désignait étaient inaccessibles. J'ai finalement compris! Il était lié aux noms principaux de service et à l'authentification Kerberos. Je vais écrire une plus grande entrée comme réponse. – Candide

Répondre

0

J'ai finalement compris cela, et je vais partager les conclusions suivantes:

  1. installer la configuration Kerberos outil pour SQL Server 2012 et assurez-vous tous les SPN sont correctement configurés. URL: https://www.microsoft.com/en-us/download/details.aspx?id=39046 Si cet outil vous donne des erreurs lors de la connexion au SQL Server, vérifiez les groupes locaux (probablement Administrateurs), vous pouvez avoir un utilisateur supprimé apparaissant avec un UUID, et le supprimer. Redémarrez l'outil et corrigez tous les problèmes.

  2. Configurez SPN pour le service Windows. La syntaxe est:

    Setspn [service_class]/[FQDN]: port DOMAIN_NAME \ domain_user

    Notez que vous devez utiliser le nom de domaine complet dans le réseau, uniquement IP ne fonctionne pas. Le port est facultatif. En outre, à partir de [service_class] peut seulement être d'une liste de mots clés sélectionnés. Liste se trouve ici: https://technet.microsoft.com/en-us/library/cc772815(WS.10).aspx (crédit va à: https://serverfault.com/questions/350782/can-someone-please-explain-windows-service-principle-names-spns-without-oversi)

    Dans mon cas, j'ai utilisé la classe serveur http (pourquoi pas de raison d'une classe de service personnalisé ne fonctionne pas pour moi!)

    setspn -a http/Srv01.mydomain.com MYDOMAIN \ monutilisateur

  3. Ensuite, allez dans les propriétés Active Directory des deux utilisateurs utilisateur de domaine SQL Server et utilisateur du domaine Windows Service. Allez dans l'onglet Délégation, et "Faites confiance à cet utilisateur pour la délégation à n'importe quel service (Kerberos uniquement)".

  4. Enfin, redémarrez le service Windows (j'ai redémarré le service SQL Server juste pour être certain). Surveillez les connexions à partir du serveur sur lequel le service est installé:

    Sélectionnez session_id, net_transport, client_net_address, auth_scheme de sys.dm_exec_connections OÙ client_net_address = 'XXX.XXX.XXX.XXX'

Vous devriez voir Kerberos pour les connexions provenant du serveur d'applications. Cela a également résolu le problème avec les autorisations de fichiers.