powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL 2019 меняется логин после выполнения CLR процедуры
11 сообщений из 11, страница 1 из 1
SQL 2019 меняется логин после выполнения CLR процедуры
    #39992945
Drunik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день, коллеги!

подскажите, вдруг кто уже сталкивался с таким.

Microsoft SQL Server 2019 (RTM-CU6) (KB4563110) - 15.0.4053.23 (X64)
Jul 25 2020 11:26:55
Copyright (C) 2019 Microsoft Corporation
Express Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 18363: ) (Hypervisor)

самый свежий что сейчас есть.
соединяемся через SSMS, делаем запрос:

SELECT SYSTEM_USER

получаем - User1

далее вызываем CLR-процедуру в которой делается новое соединение с сервером, примерно так:

SqlConnectionStringBuilder _Builder = new SqlConnectionStringBuilder();
_Builder.ApplicationName = "CLR";
_Builder.DataSource = GetServerName(ACurrConnection);
_Builder.InitialCatalog = ACurrConnection.Database;

_Builder.IntegratedSecurity = true;
_Builder.Enlist = false;
_Builder.PersistSecurityInfo = false;
_Builder.ConnectTimeout = 10;
SqlConnection _Con = new SqlConnection(_Builder.ToString());
_Con.Open();
return _Con;

процедура ничего в базу не пишет, имперсонаций не делает, просто выполняет несколько запросов и возвращает управление.

опять делаем запрос:
SELECT SYSTEM_USER

получаем - sa.

ни на каких других серверах и версиях SQL от 2008 до 2017 ничего подобного не повторяется, всё проверил. Либо что-то сильно поменялось в SQL 2019 либо это какой-то косяк - прогуглил всё что мог - ничего подобного не нашёл. Может кто чего знает? Заранее признателен.
...
Рейтинг: 0 / 0
SQL 2019 меняется логин после выполнения CLR процедуры
    #39993002
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Drunik,

перед запуском вашей ХП
покажите вывод:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select 'db' as [token], * from sys.user_token
union
select 'srv', * from sys.login_token;


exec ваша процедура

select 'db' as [token], * from sys.user_token
union
select 'srv', * from sys.login_token;
...
Рейтинг: 0 / 0
SQL 2019 меняется логин после выполнения CLR процедуры
    #39993023
Drunik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прикладываю ниже.
проверил более внимательно на разных серверах и сам код CLR-процедуры.
Выснилось, что на SQL Server 2017 (RTM-GDR) (KB4505224) логин после вызова этой же процедуры не меняется, а на Microsoft SQL Server 2017 (RTM-CU21) (KB4557397) меняется.
На Microsoft SQL Server 2016 (SP2-CU11-GDR) (KB4535706) - меняется.
На всех 2014-х версиях что были доступны не меняется.
Процедура везде одинаковая.
В самой процедуре вызывается другая sql-процедура которая делает WITH EXEC AS OWNER - это не доглядел, но после вызова процедуры контекст должен меняться на исходный - тогда бы не работало нигде. Вобщем что-то пока всё сложно, ковыряю дальше.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
token principal_id sid                                                                                                                                                                          name                                                                                                                             type                                                                                                                             usage
----- ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
db    0            0x010500000000000904000000731D6F70B3BF1142820A0404FBFD6A61                                                                                                                   public                                                                                                                           ROLE                                                                                                                             GRANT OR DENY
db    53           0x3A17CED4B367C24C9834825A6B5537FF                                                                                                                                           user1                                                                                                                       SQL USER                                                                                                                         GRANT OR DENY
db    16384        0x01050000000000090400000000000000000000000000000000400000                                                                                                                   db_owner                                                                                                                         ROLE                                                                                                                             GRANT OR DENY
srv   2            0x02                                                                                                                                                                         public                                                                                                                           SERVER ROLE                                                                                                                      GRANT OR DENY
srv   315          0x3A17CED4B367C24C9834825A6B5537FF                                                                                                                                           user1                                                                                                                       SQL LOGIN                                                                                                                        GRANT OR DENY

(затронуто строк: 5)


token principal_id sid                                                                                                                                                                          name                                                                                                                             type                                                                                                                             usage
----- ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
db    1            0x01                                                                                                                                                                         dbo                                                                                                                              SQL USER                                                                                                                         GRANT OR DENY
srv   1            0x01                                                                                                                                                                         sa                                                                                                                               SQL LOGIN                                                                                                                        AUTHENTICATOR
srv   1            0x01                                                                                                                                                                         sa                                                                                                                               SQL LOGIN                                                                                                                        GRANT OR DENY
srv   2            0x02                                                                                                                                                                         public                                                                                                                           SERVER ROLE                                                                                                                      GRANT OR DENY
srv   3            0x03                                                                                                                                                                         sysadmin                                                                                                                         SERVER ROLE                                                                                                                      GRANT OR DENY

(затронуто строк: 5)

...
Рейтинг: 0 / 0
SQL 2019 меняется логин после выполнения CLR процедуры
    #39993035
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Drunik,

у вас в процедуре используется имперсонация:
наличие токена с типом AUTHENTICATOR это доказывает
Код: sql
1.
srv   1            0x01     sa   SQL LOGIN   AUTHENTICATOR



сделайте после вызова
Код: sql
1.
select ORIGINAL_LOGIN() as [original], SUSER_NAME() as [cur_login], USER_NAME() as [usr];
...
Рейтинг: 0 / 0
SQL 2019 меняется логин после выполнения CLR процедуры
    #39993042
Drunik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
Drunik,

у вас в процедуре используется имперсонация:
наличие токена с типом AUTHENTICATOR это доказывает
Код: sql
1.
srv   1            0x01     sa   SQL LOGIN   AUTHENTICATOR



сделайте после вызова
Код: sql
1.
select ORIGINAL_LOGIN() as [original], SUSER_NAME() as [cur_login], USER_NAME() as [usr];



Я это и не отрицаю, только имперсонация делается на в самой CLR-процедуре, а в той sql-процедуре которую она вызывает.
Тот же самый скрипт, выполненный на указанных выше версиях серверов отрабатывает нормально - имперсонации не происходит - результат запроса до и после вызова CLR-процедуры идентичен.
...
Рейтинг: 0 / 0
SQL 2019 меняется логин после выполнения CLR процедуры
    #39993047
Drunik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
приложил 2 картинки из профайлера - на 1-й видно создание нового коннекта из под CLR процедуры, потом выполнение хранимой процедуры, имперсонация, возрат к исходному состоянию после вызова. На 2-й картинке заканчивается выполнение CLR-процедуры и слудеющий запрос из SSMS сразу же выполняется от имени sa.
...
Рейтинг: 0 / 0
SQL 2019 меняется логин после выполнения CLR процедуры
    #39993049
Drunik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2-я картинка
...
Рейтинг: 0 / 0
SQL 2019 меняется логин после выполнения CLR процедуры
    #39993054
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Drunik,

похоже, что сборки разные. Посмотрите на исполняемые команды.
...
Рейтинг: 0 / 0
SQL 2019 меняется логин после выполнения CLR процедуры
    #39993057
Drunik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
убрал из процедуры, которая вызывается из под CLR процедуру строку

WITH EXEC AS OWNER

и всё, логин меняться перестал. Но я не понимаю что это такое. Мало ли что я указываю внутри процедуры - после выхода з неё всё должно восстанавливаться как было - почему это происходит на одних серверах и не происходит на других?
Подозреваю нужно делать более чистый эксперимент - вызывать какую-то совсем пустую процедуру из под CLR с указанием в этой процедуре WITH EXEC AS OWNER и смотреть что будет. Вернусь с этой темой чуть позже.
...
Рейтинг: 0 / 0
SQL 2019 меняется логин после выполнения CLR процедуры
    #39993087
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Drunik,

у вас нерепрезентативно представлен набор данных по трассе,

включите события:
SecurityAudit:Audit Login
Security Audit: Audit Logout
Security Audit: Audit Database Principal Impersonation Event
Security Audit: Audit Server Principal Impersonation Event
Stored Procedures: RPC:Completed
Stored Procedures: RPC:Starting
Stored Procedures: SP:Completed
Stored Procedures: SP:Starting
Stored Procedures: SP:StmtCompleted
TSQL: Exec Prepared SQL
TSQL: SQL:Batch Completed
TSQL: SQL:StmtStarting
TSQL: SQL:StmtCompleted

и для них колонки в порядке:
SPID, ApplicationName, LoginName, ObjectName, TextData, Database ID, Transaction ID


я у себя такой тест провел:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{

    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void ImplTestCLR(string srv, string db)
    {
        var b = new SqlConnectionStringBuilder()
        {
            ApplicationName = "CLR", DataSource = srv, InitialCatalog=db, IntegratedSecurity=true, Enlist=false, PersistSecurityInfo=false, ConnectTimeout=10
        };

        using (var cn = new SqlConnection(b.ToString()))
        {
            cn.Open();
            using (var cmd = new SqlCommand("imp_test", cn) { CommandType = CommandType.StoredProcedure})
            {
                cmd.ExecuteNonQuery();
            }
        }
    }
}


Код: sql
1.
2.
3.
4.
5.
6.
create or alter procedure [imp_test]
with execute as owner
as
declare @t table (id int)
insert into @t values (1);
go



это выполняется в контексте пользовательской сессии SQL LOGIN
Код: sql
1.
2.
3.
4.
5.
6.
declare @srv sysname = @@SERVERNAME, @db sysname = DB_NAME();

select original_login() as [org], suser_name() as [cur], user_name() as [usr];
exec [ImplTestCLR] @srv, @db;

select original_login() as [org], suser_name() as [cur], user_name() as [usr];




у меня на Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Express Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 18362: )
все нормально возвращается в контекст пользователя
...
Рейтинг: 0 / 0
SQL 2019 меняется логин после выполнения CLR процедуры
    #39993121
Drunik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff,

сделал всё как вы написали - если хотите приложу картинки - но там не будет ничего нового - не хочу забивать эфир, даже событий имперсонации в профайлере не видно, хотя логин меняется.
Поэкспериментировал с процедурой, которая вызывается из CLR и обнаружил что такую реакцию вызывает даже не
WITH EXEC AS OWNER
а REVERT ниже по коду этой процедуры - т.е. выглядел примерно так:

ALTER PROCEDURE dbo.alsDisconnect
WITH EXEC AS OWNER
AS
BEGIN

EXEC AS CALLER
..
REVERT

стоит убрать из процедуры REVERT - и всё работает нормально.
Продолжаю эксперименты.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL 2019 меняется логин после выполнения CLR процедуры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]