Skip to main content
Tweeted twitter.com/StackDBAs/status/946037119583244288
I updated the question with another one reguarding impersonating of non-existing login
Source Link
sepupic
  • 11.2k
  • 17
  • 27

The versions affected are SQL Server 2005, 2008, 2008 R2.

If we grant CONNECT SQL to public server role, any AD account can log in to server. So we'll have all the AD members on the server without any corresponding login.

This is not documented anywhere, and it's not reproducible on SQL Server 2000 or starting with SQL Server 2012, i.e. if we do the same on 2012, any AD account trying to log in will receive the 18456 error

Login failed for user ...

with the reason

Could not find a login matching the name provided

That's fine and that is expected, but for what reason 2005 - 2008 R2 behave differently?


UPDATE I want also to ask the community about the behavior that is still presented at least on SQL Server 2012: Let's have an AD account that is not mapped to the server, so it cannot access the server because there is no login for it, niether for any Windows Group he is member of. Now I execute the code:

    exceute as login = 'myDom\myAcc';

    select *
    from sys.fn_my_permissions(null, 'server')

The first interesting thing is that I CAN impersonate the login that does not exists. The second thing is this non existing login HAS a server-level permission VIEW ANY DATABASE.

When I was on SQL Server 2008 R2 I thought it's normal, only undocumented, because ALL THE AD PRINCIPALS ARE MEMBERS OF PUBLIC (so it was sufficient to grant CONNECT SQL to public and all the AD members could access the server)

On SQL Server 2012 granting CONNECT SQL to public does not allow to the whole AD to log in, so I thought it was a bug fixed.

But how then can I impersonate smth that does not exist and from what this non existing login inherits a permission?

Or maybe I can ask this way:

It's clear that non existing login inherits his VIEW ANY DATABASE permission from public server role, but why then he does not inherit CONNECT SQL if I grant it to public? Is it consistent behavior? Was it more consistent prior to 2012? Or maybe it was just a bug introduced with SQL Server 2005 and fixed only in the half?

The versions affected are SQL Server 2005, 2008, 2008 R2.

If we grant CONNECT SQL to public server role, any AD account can log in to server. So we'll have all the AD members on the server without any corresponding login.

This is not documented anywhere, and it's not reproducible on SQL Server 2000 or starting with SQL Server 2012, i.e. if we do the same on 2012, any AD account trying to log in will receive the 18456 error

Login failed for user ...

with the reason

Could not find a login matching the name provided

That's fine and that is expected, but for what reason 2005 - 2008 R2 behave differently?


UPDATE I want also to ask the community about the behavior that is still presented at least on SQL Server 2012: Let's have an AD account that is not mapped to the server, so it cannot access the server because there is no login for it, niether for any Windows Group he is member of. Now I execute the code:

    exceute as login = 'myDom\myAcc';

    select *
    from sys.fn_my_permissions(null, 'server')

The first interesting thing is that I CAN impersonate the login that does not exists. The second thing is this non existing login HAS a server-level permission VIEW ANY DATABASE.

When I was on SQL Server 2008 R2 I thought it's normal, only undocumented, because ALL THE AD PRINCIPALS ARE MEMBERS OF PUBLIC (so it was sufficient to grant CONNECT SQL to public and all the AD members could access the server)

On SQL Server 2012 granting CONNECT SQL to public does not allow to the whole AD to log in, so I thought it was a bug fixed.

But how then can I impersonate smth that does not exist and from what this non existing login inherits a permission?

The versions affected are SQL Server 2005, 2008, 2008 R2.

If we grant CONNECT SQL to public server role, any AD account can log in to server. So we'll have all the AD members on the server without any corresponding login.

This is not documented anywhere, and it's not reproducible on SQL Server 2000 or starting with SQL Server 2012, i.e. if we do the same on 2012, any AD account trying to log in will receive the 18456 error

Login failed for user ...

with the reason

Could not find a login matching the name provided

That's fine and that is expected, but for what reason 2005 - 2008 R2 behave differently?


UPDATE I want also to ask the community about the behavior that is still presented at least on SQL Server 2012: Let's have an AD account that is not mapped to the server, so it cannot access the server because there is no login for it, niether for any Windows Group he is member of. Now I execute the code:

    exceute as login = 'myDom\myAcc';

    select *
    from sys.fn_my_permissions(null, 'server')

The first interesting thing is that I CAN impersonate the login that does not exists. The second thing is this non existing login HAS a server-level permission VIEW ANY DATABASE.

When I was on SQL Server 2008 R2 I thought it's normal, only undocumented, because ALL THE AD PRINCIPALS ARE MEMBERS OF PUBLIC (so it was sufficient to grant CONNECT SQL to public and all the AD members could access the server)

On SQL Server 2012 granting CONNECT SQL to public does not allow to the whole AD to log in, so I thought it was a bug fixed.

But how then can I impersonate smth that does not exist and from what this non existing login inherits a permission?

Or maybe I can ask this way:

It's clear that non existing login inherits his VIEW ANY DATABASE permission from public server role, but why then he does not inherit CONNECT SQL if I grant it to public? Is it consistent behavior? Was it more consistent prior to 2012? Or maybe it was just a bug introduced with SQL Server 2005 and fixed only in the half?

I updated the question with another one reguarding impersonating of non-existing login
Source Link
sepupic
  • 11.2k
  • 17
  • 27

The versions affected are SQL Server 2005, 2008, 2008 R2.

If we grant CONNECT SQL to public server role, any AD account can log in to server. So we'll have all the AD members on the server without any corresponding login.

This is not documented anywhere, and it's not reproducible on SQL Server 2000 or starting with SQL Server 2012, i.e. if we do the same on 2012, any AD account trying to log in will receive the 18456 error

Login failed for user ...

with the reason

Could not find a login matching the name provided

That's fine and that is expected, but for what reason 2005 - 2008 R2 behave differently?


UPDATE I want also to ask the community about the behavior that is still presented at least on SQL Server 2012: Let's have an AD account that is not mapped to the server, so it cannot access the server because there is no login for it, niether for any Windows Group he is member of. Now I execute the code:

    exceute as login = 'myDom\myAcc';

    select *
    from sys.fn_my_permissions(null, 'server')

The first interesting thing is that I CAN impersonate the login that does not exists. The second thing is this non existing login HAS a server-level permission VIEW ANY DATABASE.

When I was on SQL Server 2008 R2 I thought it's normal, only undocumented, because ALL THE AD PRINCIPALS ARE MEMBERS OF PUBLIC (so it was sufficient to grant CONNECT SQL to public and all the AD members could access the server)

On SQL Server 2012 granting CONNECT SQL to public does not allow to the whole AD to log in, so I thought it was a bug fixed.

But how then can I impersonate smth that does not exist and from what this non existing login inherits a permission?

The versions affected are SQL Server 2005, 2008, 2008 R2.

If we grant CONNECT SQL to public server role, any AD account can log in to server. So we'll have all the AD members on the server without any corresponding login.

This is not documented anywhere, and it's not reproducible on SQL Server 2000 or starting with SQL Server 2012, i.e. if we do the same on 2012, any AD account trying to log in will receive the 18456 error

Login failed for user ...

with the reason

Could not find a login matching the name provided

That's fine and that is expected, but for what reason 2005 - 2008 R2 behave differently?

The versions affected are SQL Server 2005, 2008, 2008 R2.

If we grant CONNECT SQL to public server role, any AD account can log in to server. So we'll have all the AD members on the server without any corresponding login.

This is not documented anywhere, and it's not reproducible on SQL Server 2000 or starting with SQL Server 2012, i.e. if we do the same on 2012, any AD account trying to log in will receive the 18456 error

Login failed for user ...

with the reason

Could not find a login matching the name provided

That's fine and that is expected, but for what reason 2005 - 2008 R2 behave differently?


UPDATE I want also to ask the community about the behavior that is still presented at least on SQL Server 2012: Let's have an AD account that is not mapped to the server, so it cannot access the server because there is no login for it, niether for any Windows Group he is member of. Now I execute the code:

    exceute as login = 'myDom\myAcc';

    select *
    from sys.fn_my_permissions(null, 'server')

The first interesting thing is that I CAN impersonate the login that does not exists. The second thing is this non existing login HAS a server-level permission VIEW ANY DATABASE.

When I was on SQL Server 2008 R2 I thought it's normal, only undocumented, because ALL THE AD PRINCIPALS ARE MEMBERS OF PUBLIC (so it was sufficient to grant CONNECT SQL to public and all the AD members could access the server)

On SQL Server 2012 granting CONNECT SQL to public does not allow to the whole AD to log in, so I thought it was a bug fixed.

But how then can I impersonate smth that does not exist and from what this non existing login inherits a permission?

Source Link
sepupic
  • 11.2k
  • 17
  • 27

Unexplainable behavior of SQL Server under Windows Authentication

The versions affected are SQL Server 2005, 2008, 2008 R2.

If we grant CONNECT SQL to public server role, any AD account can log in to server. So we'll have all the AD members on the server without any corresponding login.

This is not documented anywhere, and it's not reproducible on SQL Server 2000 or starting with SQL Server 2012, i.e. if we do the same on 2012, any AD account trying to log in will receive the 18456 error

Login failed for user ...

with the reason

Could not find a login matching the name provided

That's fine and that is expected, but for what reason 2005 - 2008 R2 behave differently?