Kontekst wykonywania dla GitHub Copilot w SQL Server Management Studio

GitHub Copilot w programie SQL Server Management Studio (SSMS) wykonuje zapytania i polecenia w kontekście logowania. W tym artykule wyjaśniono domyślny model wykonywania oraz sposób użycia bazy danych do określenia określonego użytkownika bazy danych CONSTITUTION.md lub identyfikatora logowania SQL w celu ustawienia kontekstu wykonywania dla bazy danych.

Domyślny kontekst wykonywania

Wszystkie zapytania, które GitHub Copilot w programie SSMS generuje i wykonuje, zarówno w trybie Ask, jak i w trybie Agent, są uruchamiane przy użyciu konta użytkownika lub loginu użytych do nawiązania połączenia z bazą danych.

Uwaga / Notatka

Tryb agenta GitHub Copilot w programie SQL Server Management Studio (SSMS) jest obecnie w wersji zapoznawczej.

Copilot nie ma oddzielnych uprawnień i nie ma podwyższonego poziomu dostępu. Jeśli użytkownik lub login nie ma dostępu do tabeli, Copilot również nie może uzyskać do niej dostępu.

Ważna

System zatwierdzania w trybie agenta nie jest granicą zabezpieczeń. Potwierdza ona intencję przed każdą akcją, ale nie ogranicza tego, co Copilot może zrobić poza uprawnieniami już przyznanymi do logowania. Rzeczywistą granicę bezpieczeństwa stanowi mechanizm egzekwowania uprawnień w programie SQL Server. Zastosuj zasadę najmniejszych uprawnień: przyznaj użytkownikom tylko uprawnienia SELECT, EXECUTE i inne uprawnienia, których potrzebują do konkretnych obiektów, do których powinni mieć dostęp.

Określ kontekst działania GitHub Copilot za pomocą pliku CONSTITUTION.md

Baza danych CONSTITUTION.md umożliwia właścicielom bazy danych określenie użytkownika bazy danych lub identyfikatora logowania SQL, które ma zastosowanie do wszystkich interakcji GitHub Copilot dla tej bazy danych zarówno w trybie zapytań, jak i agenta. Jest on przechowywany jako właściwość rozszerzona na poziomie bazy danych. Ma najwyższy priorytet każdej instrukcji dla tej bazy danych: zastępuje wszystkie AGENTS.md instrukcje na poziomie obiektu. Po skonfigurowaniu program SSMS używa konta EXECUTE AS, aby uruchamiać zapytania wygenerowane przez Copilot przy użyciu tego określonego konta.

Zalogowany użytkownik SSMS musi mieć uprawnienie IMPERSONATE do wyznaczonego użytkownika Copilot. Bez tego uprawnienia Copilot nie może wykonywać zapytań, a funkcja nie działa dla tego użytkownika. To zachowanie jest wykonywane zgodnie z projektem: zamiast dyskretnie wracać do własnych uprawnień użytkownika (co może być nadmiernie szerokie), system wymusza zasadę najniższych uprawnień. Administratorzy powinni nadać uprawnienie IMPERSONATE na koncie wykonywania usługi Copilot wszystkim użytkownikom, którzy potrzebują dostępu do usługi Copilot. Mogą również użyć braku tego przyznania, aby zablokować użycie Copilot dla określonych użytkowników lub ról.

Aby określić użytkownika bazy danych lub login SQL używany przez usługę GitHub Copilot podczas wykonywania zapytań, dodaj właściwość agentExecuteAsUser do sekcji YAML front matter w pliku CONSTITUTION.md dla bazy danych. agentExecuteAsUser należy dodać do pierwszej części CONSTITUTION.md, aby został rozpoznany przez GitHub Copilot.

właściwość nagłówka agentExecuteAsUser

---
agentExecuteAsUser: <database user or SQL login>
---

Właściwość agentExecuteAsUser akceptuje nazwę użytkownika bazy danych lub nazwę logowania SQL Server. Po ustawieniu tej właściwości GitHub Copilot używa określonej tożsamości podczas wykonywania zapytań względem tej bazy danych.

  • Zakres jest przeznaczony dla poszczególnych baz danych. Każda baza danych może mieć własną CONSTITUTION.md z różną wartością agentExecuteAsUser.
  • Poszczególne instrukcje AGENTS.md na poziomie obiektu nie mogą nadpisywaćagentExecuteAsUser. Kontekst wykonywania konstytucji ma pierwszeństwo przed całą bazą danych.

Dodać agentExecuteAsUser do CONSTITUTION.md

Zapisz instrukcję CONSTITUTION.md jako właściwość rozszerzoną w bazie danych przy użyciu polecenia sp_addextendedproperty. @name musi mieć wartość CONSTITUTION.md, a pole @value zawiera pełną treść konstytucji, w tym blok metadanych YAML.

W poniższym przykładzie ustawiono agentExecuteAsUser jako użytkownika raportującego o niskich uprawnieniach (ReportingUser) i dodano standard kodowania:

USE SalesDB;

EXECUTE sp_addextendedproperty
    @name = N'CONSTITUTION.md',
    @value = N'---
agentExecuteAsUser: ReportingUser

---
Any T-SQL generated for this database must comply with organizational standards.
Queries must not use SELECT *. Always use explicit column lists.
Avoid queries that modify data unless explicitly requested by the user.';

GitHub Copilot odczytuje konstytucję bazy danych, gdy użytkownik otworzy sesję GitHub Copilot dla tej bazy danych. W tym przykładzie GitHub Copilot używa ReportingUser jako kontekstu wykonywania zapytań względem tej bazy danych.

Sprawa przednia z organem konstytucji

Nagłówek YAML i treść w formacie Markdown występują razem w tej samej wartości CONSTITUTION.md. Materia wstępna jest oddzielona znacznikami --- na początku zawartości. Wszystko po znaczniku zamykającym --- jest traktowane jako treść instrukcji i służy jako wskazówki we wszystkich interakcjach z Copilotem.

USE SalesDB;

EXECUTE sp_addextendedproperty
    @name = N'CONSTITUTION.md',
    @value = N'---
agentExecuteAsUser: GHCP_DB_User

---
## Database Constitution: SalesDB

This database stores customer orders, product catalog, and revenue data.

### Coding standards
- Always use explicit column lists. Do not use SELECT *.
- Use schema-qualified object names (e.g., Sales.Orders, not Orders).
- Wrap multi-statement scripts in a transaction with TRY/CATCH error handling.

### Restricted operations
- Do not generate TRUNCATE TABLE statements.
- Do not generate DROP statements without an existence check.
- Revenue calculations must use SUM(NetAmount) from Sales.Transactions, excluding rows where RefundFlag = 1.';

Użytkownik bazy danych a login SQL

Właściwość agentExecuteAsUser przyjmuje albo użytkownika bazy danych, albo login SQL Server. Skorzystaj z poniższych wskazówek, aby wybrać, co jest najbardziej odpowiednie dla danego środowiska:

Użytkownik bazy danych Logowanie sql
Scope Specyficzne dla jednej bazy danych Tożsamość dla całego serwera
Kiedy stosować Kiedy chcesz ustawić uprawnienia na poziomie bazy danych Jeśli chcesz ustawić uprawnienia dla tożsamości na poziomie serwera
Recommendation Oferuje bardziej szczegółową kontrolę Użyj, gdy wymagana jest tożsamość na poziomie serwera

W przypadku większości wdrożeń określenie użytkownika bazy danych zapewnia najbardziej szczegółową kontrolę. Utwórz dedykowanego użytkownika bazy danych o niskim poziomie uprawnień dla GitHub Copilot i przyznaj mu tylko uprawnienia wymagane do oczekiwanych interakcji Copilot w tej bazie danych.

Przykład: tworzenie dedykowanego użytkownika bazy danych z ograniczonymi uprawnieniami

/* Create a database user that is not mapped to a SQL login */
USE SalesDB;

CREATE USER GHCP_DB_User WITHOUT LOGIN;

/* Grant only the permissions Copilot needs */
GRANT SELECT ON SCHEMA::Sales TO GHCP_DB_User;
GRANT SELECT ON SCHEMA::Reporting TO GHCP_DB_User;
GRANT EXECUTE ON SCHEMA::Sales TO GHCP_DB_User;

/* Do not grant DDL permissions unless schema modification is expected */

Następnie ustaw wartość agentExecuteAsUser: GHCP_DB_User w polu CONSTITUTION.md dla bazy danych SalesDB.

Najlepsze rozwiązania

  • Użyj dedykowanego konta o niskim poziomie uprawnień: Utwórz określonego użytkownika bazy danych lub identyfikator logowania dla GitHub Copilot zamiast ponownego użytku istniejącego użytkownika. Takie podejście minimalizuje ryzyko błędnego przypisania uprawnień użytkownikom GitHub Copilot, jeśli nazwa użytkownika lub login są używane do innego celu.

  • Przyznawaj tylko to, co jest potrzebne: Przejrzyj typowe scenariusze użycia rozwiązania Copilot dla Twojej bazy danych i przyznawaj tylko niezbędne uprawnienia. Zacznij od dostępu tylko do odczytu (SELECT) i celowo dodaj uprawnienia modyfikacji.

  • Unikaj kont z wysokimi uprawnieniami: nie ustawiaj wartości agentExecuteAsUsersa, dboani żadnego konta z wysokimi uprawnieniami, chyba że przypadek użycia jawnie go wymaga.

  • Regularnie przeprowadzaj inspekcję: okresowe przeglądanie uprawnień agentExecuteAsUser konta w miarę zmiany wymagań dotyczących bazy danych i zespołu.

  • Pamiętaj o granicy wykonywania: Ustawienie agentExecuteAsUser określa, jakiej tożsamości używa Copilot, ale egzekwowanie uprawnień w SQL Server stanowi rzeczywistą granicę zabezpieczeń. Upewnij się, że określone konto ma tylko wymagane minimalne uprawnienia.

Aktualizowanie lub usuwanie agentaExecuteAsUser

Aby zmienić agentExecuteAsUser wartość lub zaktualizować inne części konstytucji, użyj polecenia sp_updateextendedproperty:

USE SalesDB;

EXECUTE sp_updateextendedproperty
    @name = N'CONSTITUTION.md',
    @value = N'---
agentExecuteAsUser: New_GHCP_User

---
Updated constitution content here.';

Aby całkowicie usunąć instrukcję CONSTITUTION.md , użyj polecenia sp_dropextendedproperty:

USE SalesDB;

EXECUTE sp_dropextendedproperty @name = N'CONSTITUTION.md';

Po usunięciu GitHub Copilot uruchamia zapytania przy użyciu danych logowania połączonego użytkownika i nie ma zastosowania żadne ograniczenie na poziomie bazy danych.

Weryfikowanie bieżącej konstytucji

Aby sprawdzić, czy dla bazy danych ustawiono instrukcję CONSTITUTION.md, zapytaj Copilot:

Does this database have a constitution set?

Możesz też wysłać zapytanie bezpośrednio do właściwości rozszerzonych:

USE SalesDB;

SELECT name,
       CAST (value AS NVARCHAR (MAX)) AS ConstitutionContent
FROM sys.extended_properties
WHERE class = 0
      AND name = N'CONSTITUTION.md';