데이터 API 엔드포인트 보호
최신 데이터베이스 솔루션은 다양한 API 엔드포인트를 통해 데이터를 노출하므로 애플리케이션은 기존 SQL 쿼리를 작성하지 않고도 정보에 액세스할 수 있습니다. GraphQL, REST 및 MCP(모델 컨텍스트 프로토콜) 엔드포인트는 각각 고유한 보안 고려 사항을 제공합니다. 이러한 엔드포인트를 적절하게 보호하면 데이터를 보호하는 동시에 최신 애플리케이션에 필요한 유연성을 사용할 수 있습니다.
이러한 엔드포인트는 웹 및 모바일 애플리케이션의 기본 데이터 액세스 계층 역할을 하는 경우가 많습니다. 적절한 보안 제어가 없으면 중요한 데이터를 노출하거나, 무단 수정을 허용하거나, 서비스 거부 공격의 대상이 될 수 있습니다.
엔드포인트 유형 및 위험 이해
GraphQL 엔드포인트는 유연한 쿼리 기능을 제공하여 클라이언트가 필요한 데이터를 정확하게 요청할 수 있도록 합니다. 이러한 유연성은 클라이언트가 의도하지 않은 데이터를 노출하거나 과도한 리소스를 사용할 수 있는 복잡한 쿼리를 생성할 수 있기 때문에 보안 문제를 만듭니다.
REST 엔드포인트는 미리 정의된 리소스 및 작업을 사용하여 보다 구조화된 패턴을 따릅니다. 보안은 인증, 특정 엔드포인트에 대한 권한 부여 및 입력 유효성 검사에 중점을 둡니다. REST API는 보안 패턴이 잘 설정될 만큼 오랫동안 유지되어 왔습니다.
MCP 엔드포인트를 사용하면 AI 모델 및 에이전트가 데이터베이스와 상호 작용하여 컨텍스트를 제공하고 작업을 실행할 수 있습니다. 이러한 엔드포인트는 AI 시스템이 사용자 사용자가 하지 않는 작업을 시도할 수 있고, 프롬프트 삽입 공격이 AI 동작을 조작할 수 있기 때문에 신중한 보안 고려가 필요합니다.
GraphQL 엔드포인트 보호
Microsoft Fabric의 Azure SQL Database 및 SQL 데이터베이스는 데이터 API 작성 기 및 Microsoft Fabric의 GraphQL API를 통해 GraphQL을 지원합니다. 이러한 엔드포인트를 보호하려면 인증, 권한 부여 및 쿼리 컨트롤이 포함됩니다.
인증 요구 사항을 구성하는 방법은 다음과 같습니다.
{
"runtime": {
"rest": { "enabled": false },
"graphql": {
"enabled": true,
"path": "/graphql",
"allow-introspection": false
}
},
"authentication": {
"provider": "AzureAD",
"jwt": {
"audience": "api://my-graphql-api",
"issuer": "https://login.microsoftonline.com/{tenant-id}/v2.0"
}
}
}
allow-introspection: false 설정을 확인합니다. 프로덕션 환경에서 공격자가 스키마 구조를 발견하지 못하도록 인터스펙션을 비활성화합니다. 인터스펙션 쿼리는 사용 가능한 모든 형식, 필드 및 관계를 표시합니다.
다음으로, 엔터티 수준 권한을 구현하여 데이터에 액세스할 수 있는 역할을 제어합니다.
{
"entities": {
"Customer": {
"source": "dbo.Customers",
"permissions": [
{
"role": "authenticated",
"actions": ["read"]
},
{
"role": "admin",
"actions": ["*"]
}
]
},
"Order": {
"source": "dbo.Orders",
"permissions": [
{
"role": "authenticated",
"actions": ["read"],
"fields": {
"include": ["OrderID", "OrderDate", "Status"],
"exclude": ["InternalNotes", "CostPrice"]
}
}
]
}
}
}
엔터티가 Order와 같은 InternalNotes 및 CostPrice 민감한 열을 제외하는 방법을 확인해 보세요. 인증된 사용자도 해당 필드에 액세스할 수 없습니다.
팁 (조언)
심층 중첩된 쿼리를 통해 서비스 거부 공격을 방지하기 위해 쿼리 깊이 및 복잡성 제한을 구현합니다. 데이터 API 작성기에서는 과도한 쿼리 복잡성에 대한 기본 제공 보호를 포함합니다.
보안 REST 엔드포인트
데이터 API 작성기 또는 사용자 지정 구현의 REST 엔드포인트에는 인증 및 엔드포인트별 권한 부여가 필요합니다. 예제는 다음과 같습니다.
{
"entities": {
"Product": {
"source": "dbo.Products",
"rest": {
"enabled": true,
"path": "/products"
},
"permissions": [
{
"role": "anonymous",
"actions": [
{ "action": "read", "policy": { "database": "@item.IsPublic eq true" } }
]
},
{
"role": "inventory-manager",
"actions": ["create", "read", "update"]
},
{
"role": "admin",
"actions": ["*"]
}
]
}
}
}
익명 액세스에 대한 데이터베이스 정책을 확인하시겠습니까? 결과를 퍼블릭 제품으로만 필터링합니다. 그런 다음 역할 기반 권한은 각 역할이 수행할 수 있는 작업을 제어합니다.
저장 프로시저를 사용하여 빌드된 사용자 지정 REST 엔드포인트의 경우 데이터베이스 수준에서 보안을 구현합니다.
CREATE PROCEDURE api.GetCustomerOrders
@CustomerID int
AS
BEGIN
-- Verify the caller has access to this customer
IF NOT EXISTS (
SELECT 1 FROM dbo.CustomerAccess
WHERE CustomerID = @CustomerID
AND UserPrincipal = ORIGINAL_LOGIN()
)
BEGIN
THROW 50401, 'Unauthorized access to customer data', 1;
RETURN;
END
SELECT OrderID, OrderDate, TotalAmount
FROM dbo.Orders
WHERE CustomerID = @CustomerID;
END;
MCP 엔드포인트 보안
MCP(모델 컨텍스트 프로토콜) 엔드포인트를 사용하면 AI 도우미 및 에이전트가 데이터베이스와 상호 작용할 수 있습니다. AI 시스템이 신뢰할 수 없는 사용자 입력을 처리할 수 있으므로 MCP에는 추가적인 보안 주의가 필요합니다.
MCP 서버 인증을 구성하는 방법은 다음과 같습니다.
{
"mcpServers": {
"sqlDatabase": {
"transport": "stdio",
"authentication": {
"type": "azure-identity",
"scope": "https://database.windows.net/.default"
},
"security": {
"allowedOperations": ["read"],
"deniedTables": ["dbo.Passwords", "dbo.APIKeys"],
"maxRowsReturned": 1000
}
}
}
}
핵심은 MCP 엔드포인트가 수행할 수 있는 작업을 제한하는 것입니다.
- 쓰기 액세스가 필요하지 않은 경우 작업을 읽기 전용으로 제한
- 자격 증명 또는 중요한 구성이 포함된 테이블에 대한 액세스를 명시적으로 거부합니다.
- 큰 쿼리를 통해 데이터 반출을 방지하도록 결과 집합 크기를 제한합니다.
- 보안 모니터링을 위한 모든 MCP 작업 기록
또한 AI 생성 쿼리의 유효성을 검사하여 프롬프트 삽입 방어를 구현하려고 합니다.
CREATE PROCEDURE mcp.ExecuteQuery
@QueryDescription nvarchar(max),
@GeneratedQuery nvarchar(max) OUTPUT
AS
BEGIN
-- Validate the generated query doesn't access restricted objects
IF @GeneratedQuery LIKE '%sys.%' OR @GeneratedQuery LIKE '%INFORMATION_SCHEMA%'
BEGIN
THROW 50403, 'Access to system objects not permitted', 1;
RETURN;
END
-- Ensure query is read-only
IF @GeneratedQuery LIKE '%INSERT%' OR @GeneratedQuery LIKE '%UPDATE%'
OR @GeneratedQuery LIKE '%DELETE%' OR @GeneratedQuery LIKE '%DROP%'
BEGIN
THROW 50403, 'Write operations not permitted', 1;
RETURN;
END
-- Execute the validated query
EXEC sp_executesql @GeneratedQuery;
END;
중요합니다
유효성 검사 없이 AI 생성 쿼리를 신뢰하지 마세요. 악의적인 패턴을 차단하지 않고 허용된 테이블 및 작업에 대한 허용 목록을 구현합니다.
네트워크 보안 구현
엔드포인트 유형에 관계없이 네트워크 계층을 보호합니다.
-- Azure SQL: Configure firewall rules
-- Deny all public access, allow only specific IPs or virtual networks
EXECUTE sp_set_firewall_rule
@name = 'AllowAppService',
@start_ip_address = '10.0.0.1',
@end_ip_address = '10.0.0.255';
Private Link 또는 서비스 엔드포인트를 사용하여 Microsoft 네트워크에서 트래픽을 유지합니다.
- API 엔드포인트를 호스팅하는 App Services에 대한 가상 네트워크 통합 구성
- Azure SQL Database에 프라이빗 엔드포인트 사용
- Microsoft Fabric에서 관리형 프라이빗 엔드포인트 사용
이러한 네트워크 컨트롤은 심층 방어를 추가하여 애플리케이션 수준 보안이 무시되더라도 공격자가 권한이 없는 네트워크에서 데이터베이스에 연결할 수 없도록 합니다.