Minimal database permissions for the agent plug-in mssql.vbs

This article contains supplementary information to Werk #14678.

LAST TESTED ON CHECKMK 2.2.0P1

Table of Contents

English Version

Preface

Due to a bug in the agent plugin for Microsoft SQL (mssql.vbs), it was possible that services that referred to a specific database actually displayed and stored data from another database.

Specifically, this error could occur in the following services:

While fixing the bug in the agent plugin, we noticed that the authentication method set in the plugin (be it System Authentication or Database User Credentials) very often did not have sufficient rights to collect data at all.

Due to this constellation, it could happen with an update to Checkmk 2.1.0p19 or higher that numerous MSSQL services then correctly become critical (CRIT), because the agent plugin has no access to the corresponding databases.

Manual intervention by the database administrators is essential here. In the following, we describe the minimum necessary rights and how you can set them up in Microsoft SQL:

The necessary permissions and what they mean

SQL Server 2014 and newer

As of SQL Server 2014, the used login also requires the server permission CONNECT ANY DATABASE. This permission only allows to establish a connection to the database - nothing else. However, it has the great advantage that future database on the server is also automatically covered by it.

In Microsoft SQL Server Management Studio you can grant this permission using the view Object Explorer. Go to Security > Logins and of the properties of the login you are using in the configuration of the agent plug-in. Under Securables, you will find the explicit permission Connect Any Database, which you have to grant.

Screenshot showing permissions for Connect any database set to Grant.

Of course, you can also use the following query to do the same:

GRANT CONNECT ANY DATABASE TO [NT AUTHORITY\SYSTEM]


In the documentation of SQL Server, you can also find a short paragraph about this permission: https://learn.microsoft.com/en-us/sql/t-sql/statements/grant-server-permissions-transact-sql?view=sql-server-ver16#remarks

Note: In our tests, the securables VIEW SERVER STATE and CONNECT SQL were usually already preselected for the login NT-AUTHORITY\SYSTEM. These permissions still need to be checked, if necessary.

SQL Server before 2014

In older versions of Microsoft SQL Server, the above-mentioned server permission "Connect to any database" does not exist. Therefore, it is necessary to assign the role public to each database individually.

MSSQL Jobs

  1. In addition to the above, some extra permissions are needed to monitor MSSQL jobs.  If you come across this error message in the agent output, then please add the following permissions 

    <<<mssql_jobs:sep(09)>>>
    MSSQLSERVER ERROR: The SELECT permission was denied on the object 'sysschedules', database 'msdb', schema 'dbo'. (SQLState: 42000/NativeError: 229).
    use msdb;
    go;
    GRANT SELECT ON OBJECT::msdb.dbo.sysjobschedules TO checkmk;
    GRANT SELECT ON OBJECT::msdb.dbo.sysjobs TO checkmk;
    GRANT SELECT ON OBJECT::msdb.dbo.sysjobservers TO checkmk;
    GRANT EXECUTE ON OBJECT::msdb.dbo.agent_datetime TO checkmk;
    GRANT SELECT ON OBJECT::msdb.dbo.sysjobactivity TO checkmk;
    go;



Deutsche Version

Dieser Artikel enthält ergänzende und weiterführende Informationen zu Werk #14768.

Vorwort

Durch einen Bug im Agentenplugin für Microsoft SQL (mssql.vbs) konnte es dazu kommen, dass in Services, die sich auf eine bestimmte Datenbank bezogen, tatsächlich Daten aus einer anderen Datenbank angezeigt und gespeichert wurden.

Konkret konnte dieser Fehler in den folgenden Services auftreten:

Bei der Behebung des Bugs im Agentenplugin, ist bei unseren Tests aufgefallen, dass die im Plugin eingestellte Methode zur Authentifizierung (sei es System Authentication oder Database User Credentials) sehr häufig nicht über ausreichende Rechte verfügte um die korrekten Daten überhaupt einzusammeln.

Durch diese Konstellation kann es bei einem Update auf Checkmk 2.1.0p19 - oder darüber hinaus - dazu kommen, dass eine Vielzahl an MSSQL-Services dann korrekterweise kritisch (CRIT) werden, weil das Agentenplugin keinen Zugang zu den entsprechenden Datenbanken hat.

Hier ist ein manueller Eingriff durch die Datenbankadministratoren unabdingbar. Im Folgenden beschreiben wir die minimal notwendigen Rechte und wie Sie diese in Microsoft SQL einrichten können:

Die notwendigen Rechte und was diese bedeuten

SQL Server 2014 und neuer

Ab SQL Server 2014 benötigt die verwendete Anmeldung zusätzlich noch die Serverberechtigung Verbindung mit beliebiger Datenbank herstellen (CONNECT ANY DATABASE). Diese Berechtigung erlaubt lediglich eine Verbindung zur Datenbank aufzubauen - sonst nichts. Sie hat aber den großen Vorteil, dass auch zukünftige Datenbank auf dem Server automatisch von ihr erfasst wird.

In Microsoft SQL Server Management Studio können Sie diese Berechtigung über den Object Explorer erteilen. Öffnen Sie dazu Sicherheit > Anmeldungen und öffnen Sie die Eigenschaften der Anmeldung, welche Sie für das Agentenplugin konfiguriert haben. Unter Sicherungsfähige Elemente finden Sie die explizite Berechtigung Verbindung mit beliebiger Datenbank herstellen, welche Sie erteilen müssen.

Screenshot, der die auf Gewähren gesetzten Connect Any Database -Berechtigungen zeigt.

Selbstverständlich können Sie diese Berechtigung auch per Query erteilen:

GRANT CONNECT ANY DATABASE TO [NT AUTHORITY\SYSTEM]

In der Dokumentation von SQL Server finden Sie zu dieser Berechtigung ebenfalls einen kurzen Absatz: https://learn.microsoft.com/de-de/sql/t-sql/statements/grant-server-permissions-transact-sql?view=sql-server-ver16#remarks

Hinweis: In unseren Tests waren die sicherungsfähigen Elemente Serverstatus anzeigen (VIEW SERVER STATE) und SQL verbinden (CONNECT SQL) für die Anmeldung namens NT-AUTORITÄT\SYSTEM im Regelfall bereits vorausgewählt. Diese Berechtigungen gilt es gegebenenfalls noch zu prüfen.

SQL Server vor 2014

In älteren Versionen von Microsoft SQL Server gibt es die oben angesprochene Serverberechtigung Verbindung mit beliebiger Datenbank herstellen nicht. Deshalb ist es hier notwendig jeder Datenbank einzeln die Rolle öffentlich zuzuweisen.


Related Articles