A common question that I am asked about Extended Events relates to what kind of permissions are required in order to use this awesome feature. In this article, I am going to compare and contrast the permissions required for Profiler as well as Extended Events.
Extended Events changed a lot with how to monitor your server. One of those changes is a slightly different set of permissions to be able to perform various different tasks. Before I dive into what the security landscape is with XEvents, let’s take a peek at what we have to do in order to be able to use Profiler.
If you try to launch a profiler session as a standard login with what should be a typical user type account with restricted access, you will encounter something like the following.
Yes, according to the message you need to be a sysadmin (nobody reads past that first part so they always miss the alternative). So, let’s test things out. I will create a login called TraceUser and attempt to do tasks related to running a Profiler or Server Side type of trace. I will also use this same login when testing the permissions for Extended Events.
USE [master] GO CREATE LOGIN [TraceUser] WITH PASSWORD=N'traceuser', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO EXECUTE AS LOGIN = 'TraceUser'; SELECT * FROM sys.traces t GO REVERT; GO
I included a quick test script after creating the login to confirm that the user does indeed have restricted access. The test script will produce the following message.
Msg 8189, Level 14, State 6, Line 8
You do not have permission to run ‘SYS.TRACES’.
This is the same net result as if I were to attempt to run a Profiler session – it’s just faster to get to the result. As we can see, the TraceUser login does not have the requisite permission to do anything with traces (profiler or server side).
Now, I will take this just a step further and try to add permissions to validate the minimum permissions needed.
USE [master] GO GRANT ALTER TRACE TO [TraceUser]; GO EXECUTE AS LOGIN = 'TraceUser'; SELECT * FROM sys.traces t GO REVERT; GO
Running this test script now will yield a result of all traces that are currently setup on the server. So, in my case that would be just a result showing the Default Trace and nothing else since I have not put any other traces on the server. I can also confirm the exact permissions granted to TraceUser do not actually exceed what I just granted.
SELECT * FROM fn_my_permissions(NULL, 'SERVER'); GO
Or is it?
SELECT * FROM fn_my_permissions(NULL, 'Database'); GO
After running that in the master database I will see that granting the “Alter Trace” permission has an extra side effect of granting “Showplan” to the user.
For Extended Events, we have something a little different and a little more (just a little) granular.
Wow! That is quite the permissions escalation, right? Well, it’s not significantly different in some regards to what we see with Profiler. Taking it a step further, XEvents is more in tune with a lot more internals for SQL Server than Profiler. Little things like looking at DMVs or getting the current status for things like Hekaton or Availability Groups, which tie deeper into the engine, will require more permissions. That said, view server state or even these permissions levels is not the end of the world. There are work arounds to the permissions issues. Before I give the work arounds, lets look at the permissions.
Using the TraceUser login I created earlier in this article, I am going to start testing XEvent permissions.
USE master; GO REVOKE ALTER TRACE TO [TraceUser]; GO EXECUTE AS LOGIN = 'TraceUser'; SELECT * FROM sys.traces t GO SELECT * FROM sys.dm_xe_objects t GO SELECT * FROM fn_my_permissions(NULL, 'SERVER'); GO SELECT * FROM fn_my_permissions(NULL, 'Database'); GO REVERT; GO
The first step I took in this script was to revoke the “Alter Trace” permission. Then I queried both sys.traces and sys.dm_xe_objects along with running my permissions checks. The attempt to query the two views produces the following messages.
Msg 8189, Level 14, State 6, Line 34
You do not have permission to run ‘SYS.TRACES’.
Msg 300, Level 14, State 1, Line 36
VIEW SERVER STATE permission was denied on object ‘server’, database ‘master’.
Msg 297, Level 16, State 1, Line 36
The user does not have permission to perform this action.
From the permissions checks, I can also confirm that this login has barely the ability to connect to SQL Server.
I will now grant permissions little by little to see what happens.
USE [master] GO GRANT ALTER ANY EVENT SESSION TO TraceUser; GO EXECUTE AS LOGIN = 'TraceUser'; SELECT * FROM sys.traces t GO SELECT * FROM sys.dm_xe_objects t GO SELECT * FROM fn_my_permissions(NULL, 'SERVER'); GO SELECT * FROM fn_my_permissions(NULL, 'Database'); GO REVERT; GO
Here is the sum of the differences.
The “Alter ..Event Session” permissions should be expected since that is what I explicitly added. That said, the permission, while enough to create an event session does not yield enough permissions to do anything with viewing the session data or looking into the dmvs or catalog views. In fact, if you have a recent enough version of SSMS, the XE Profiler feature will cause SSMS to crash if you try to “launch” a session via the Profiler GUI with only the “Alter Any Event” permission.
That said, I can run the following script to create a new Event Session.
As we can see, the permissions are adequate to create a session via TSQL and it does not cause SSMS to crash. This would be another consideration if using the XE Profiler (and even if you are going to allow non DBAs to create XE Traces) in addition to what I noted recently in this article – here. Truth be told, the traditional GUI for XE also will not allow users to access the Extended Events node if they have “Alter Any Event” or lower permissions – you must use TSQL to alter sessions. The caveat being that only the XE Profiler feature causes SSMS to crash (I tried it 6 times in a row with consistent results).
So, if “Alter Any Event” is only going to get us partially there, let’s go ahead and grant the view server state permission.
USE [master] GO GRANT VIEW SERVER STATE TO TraceUser; GO EXECUTE AS LOGIN = 'TraceUser'; SELECT * FROM sys.traces t GO SELECT * FROM sys.dm_xe_objects t GO SELECT * FROM fn_my_permissions(NULL, 'SERVER'); GO SELECT * FROM fn_my_permissions(NULL, 'Database'); GO REVERT; GO
Due to the nature of sys.traces, I still do not have permissions to view that data. So that is a good thing. On the other hand, I can now query all of my XE related views (you can read more about those in my 60 day series). And I now can see that I have the following permissions.
And now I can do all sorts of fun stuff from the XE GUI.
That basically lays out the required permissions for both Profiler and Extended Events. In either case, I view both of these as tools for the trusted DBA. Outside of the DBA team, there are select other individuals who may think they need the access and then there are others who really could use the access to the tools but should not really be granted full sysadmin access. At times, you may not even want those individuals to have anywhere near “view server state” access because there is a chance that individual could see something they are not permitted to see. What do we do with that?
This is when we figure out a way to circumvent the restrictions. Don’t view this as a hack to the system or a way to violate trust. Rather these are methods to help think outside the box and work together as a cohesive team.
Method 1 is a solid solution. That said, it does have a high management overhead. Aaron Bertrand has offered a solution and it is a secure solution. Aaron has found a way to work with Trustworthy databases, views, and logins to help provide a workable solution while still securing the event session data. You can read his article here.
Method 2 is also a secure solution and does require a bit more communication but less management and upkeep than method 1. I like to save the event data to file. Working with the person that would like to be able to review the data, I can create an appropriate XE Session that will be highly unlikely to capture anything they should not see. In addition, I do not need to grant that person any elevated permission on the production server. Once the trace is complete, I can copy the event files to a dev server where that person has elevated access. Then they can merge the XEL files (I show how to do that in the 60 day series) and review the data at their leisure.
Method 3 is similar to the previous method but it requires more work similarly to method 1. This last method, I can grant the user specific access to read data from a specific table in a specific database. I then setup an automated process to dump the data into that table or I can manually load it for the user. Again, the permissions here are very limited in scope and the person has nothing more than the ability to Select from a pre-defined table in a pre-defined database.
I don’t see the permissions for Extended Events as a limitation, rather they seem appropriate based on what XE does and the extensive nature of the tool. I recommend you work with XE for a bit and see what you can come up with to help improve your efficiency and the efficiency of our team.