데이터 API 엔드포인트 보호

완료됨

최신 데이터베이스 솔루션은 다양한 API 엔드포인트를 통해 데이터를 노출하므로 애플리케이션은 기존 SQL 쿼리를 작성하지 않고도 정보에 액세스할 수 있습니다. GraphQL, REST 및 MCP(모델 컨텍스트 프로토콜) 엔드포인트는 각각 고유한 보안 고려 사항을 제공합니다. 이러한 엔드포인트를 적절하게 보호하면 데이터를 보호하는 동시에 최신 애플리케이션에 필요한 유연성을 사용할 수 있습니다.

이러한 엔드포인트는 웹 및 모바일 애플리케이션의 기본 데이터 액세스 계층 역할을 하는 경우가 많습니다. 적절한 보안 제어가 없으면 중요한 데이터를 노출하거나, 무단 수정을 허용하거나, 서비스 거부 공격의 대상이 될 수 있습니다.

엔드포인트 유형 및 위험 이해

GraphQL 엔드포인트는 유연한 쿼리 기능을 제공하여 클라이언트가 필요한 데이터를 정확하게 요청할 수 있도록 합니다. 이러한 유연성은 클라이언트가 의도하지 않은 데이터를 노출하거나 과도한 리소스를 사용할 수 있는 복잡한 쿼리를 생성할 수 있기 때문에 보안 문제를 만듭니다.

REST 엔드포인트는 미리 정의된 리소스 및 작업을 사용하여 보다 구조화된 패턴을 따릅니다. 보안은 인증, 특정 엔드포인트에 대한 권한 부여 및 입력 유효성 검사에 중점을 둡니다. REST API는 보안 패턴이 잘 설정될 만큼 오랫동안 유지되어 왔습니다.

MCP 엔드포인트를 사용하면 AI 모델 및 에이전트가 데이터베이스와 상호 작용하여 컨텍스트를 제공하고 작업을 실행할 수 있습니다. 이러한 엔드포인트는 AI 시스템이 사용자 사용자가 하지 않는 작업을 시도할 수 있고, 프롬프트 삽입 공격이 AI 동작을 조작할 수 있기 때문에 신중한 보안 고려가 필요합니다.

Azure SQL Database에 연결하는 세 가지 API 엔드포인트 유형인 유연한 스키마 기반 쿼리를 위한 GraphQL, 미리 정의된 CRUD 작업에 대한 REST, AI 에이전트 상호 작용을 위한 MCP를 각각 인증 및 권한 부여 계층과 비교하는 다이어그램.

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와 같은 InternalNotesCostPrice 민감한 열을 제외하는 방법을 확인해 보세요. 인증된 사용자도 해당 필드에 액세스할 수 없습니다.

팁 (조언)

심층 중첩된 쿼리를 통해 서비스 거부 공격을 방지하기 위해 쿼리 깊이 및 복잡성 제한을 구현합니다. 데이터 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에서 관리형 프라이빗 엔드포인트 사용

이러한 네트워크 컨트롤은 심층 방어를 추가하여 애플리케이션 수준 보안이 무시되더라도 공격자가 권한이 없는 네트워크에서 데이터베이스에 연결할 수 없도록 합니다.