Microsoft의 설명서를 올바르게 읽고 Azure Functions가 활용하는 웹 개발 패러다임에 대해 작업 한 경험이있는 친구와의 대화에 따라 Azure Functions는 인터넷에서 잠재적으로 개방형 엔드 포인트라는 것을 이해합니다. 주제에 대한 보안 포럼 및 스택 오버플로 질문을 간략히 읽어 보면 보안 포럼의 두 가지 옵션을 이해할 수 있습니다.
컨텍스트 / 내 Azure 함수는 무엇을합니까? SFTP 소스에서 SQL 엔드 포인트까지 공급 업체 데이터의 ETL과 관련된 Blob 컨테이너를 관리합니다.이 ETL은 파일 전송 및 소스 데이터의 장기 콜드 스토리지를 위해 중간 Blob 컨테이너를 활용합니다. Azure 함수는 SQL 끝점에로드 된 후 한 컨테이너에서 보관 컨테이너로 Blob을 이동합니다. Blob 컨테이너를 관리하는 데 Azure Function이 필요한 이유는 무엇입니까?
다음은 함수 중 하나의 예입니다.
using System.IO;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Net.Http;
using System.Net;
using Microsoft.WindowsAzure.Storage.Blob;
using System.Collections.Generic;
using System.Text;
namespace AFA_ArchiveBlob
{
public static class HttpTrigger_BlobInput
{
[FunctionName("HttpTrigger_BlobInput")]
public static async Task<HttpResponseMessage> Run(
//public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = "{name}")] HttpRequest req,
string name,
ILogger log,
[Blob("{name}/blobname",FileAccess.ReadWrite,Connection = "AzureWebJobsStorage")] CloudBlobContainer myCloudBlobContainer
)
{
//Execution Logged.
log.LogInformation($"HttpTrigger_BlobInput - C# HTTP trigger function processed a request.");
//Run the query against the blob to list the contents.
BlobContinuationToken continuationToken = null;
List<IListBlobItem> results = new List<IListBlobItem>();
do
{
var response = await myCloudBlobContainer.ListBlobsSegmentedAsync(continuationToken);
continuationToken = response.ContinuationToken;
results.AddRange(response.Results);
}
while (continuationToken != null);
//Query the names of the blobs. Todo: can this be a single line linq query select instead?
List<string> listBlobNames = new List<string>();
foreach (CloudBlockBlob b in results)
{
listBlobNames.Add(b.Name);
}
//Serialize the list of blob names to json for passing to function caller via return statement
var jsonReturn = JsonConvert.SerializeObject(listBlobNames);
log.LogInformation("Returning the following JSON");
log.LogInformation(jsonReturn);
return new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(jsonReturn, Encoding.UTF8, "application/json")
};
}
}
}
첫째, 키를 사용하는 것이 편리 할 수 있지만 공식 문서 에서는 프로덕션 시나리오에서 기능 엔드 포인트를 보호하기 위해 키를 사용하지 말라고 조언합니다.
보안을 위해 Azure Active Directory를 사용하는 것이 더 나은 선택이 될 것입니다. 여기에 설명 된대로 프로덕션에서 HTTP 끝점 보안
구현 방법
두 가지 가능한 접근 방식이 있습니다.
1. 간단한 접근 방식 : 호출 애플리케이션이 특별히 Azure 논리 앱인지 확인
Azure Function 앱에 대해 Azure Active Directory 인증을 사용하도록 설정합니다. Express 설정을 사용하기 만하면됩니다 (새 Azure AD 앱 만들기).
논리 앱에 대해 관리 서비스 ID를 활성화합니다.
논리 앱과 연결된 관리 서비스 ID에 대한 appid를 찾습니다. Azure Portal> Azure Active Directory> 엔터프라이즈 애플리케이션> 모든 애플리케이션> 관련 서비스 주체로 이동합니다 ( 여기 에 다른 SO 게시물의 스크린 샷을 통해 자세히 설명 됨 ).
여기에 설명 된대로 Managed Service Identity를 사용하여 논리 앱을 Azure 함수에 인증합니다. 논리 앱 .. 에서 관리되는 ID로 인증합니다 . 액세스되는 리소스가 Azure 함수가됩니다.
이제 함수 코드 appid
에서 액세스 토큰의 클레임이 appid
for 논리 앱 과 정확히 일치 하는지 확인할 수 있습니다 (즉, 논리 앱이 함수를 호출하는 앱입니다). 그렇지 않으면 Unauthorized 예외로 호출을 거부 할 수 있습니다.
2.보다 선언적인 접근 방식 : Azure 함수 앱에 대해 애플리케이션 권한을 정의하고 함수를 호출하는 클라이언트의 인증 토큰에이 권한 / 역할이 있는지 확인합니다.
이 접근 방식은 Azure 함수를 호출 할 수있는 모든 애플리케이션에 할당해야하는 애플리케이션 권한을 정의하므로 좀 더 선언적입니다.
Azure Function 앱에 대해 Azure Active Directory 인증을 사용하도록 설정합니다. Express 설정을 사용하기 만하면됩니다 (새 Azure AD 앱 만들기).
이제 Azure Active Directory> 앱 등록> 함수 앱에 대한 앱 등록> 매니페스트로 이동합니다.
다음과 같이 json을 사용하여 새 애플리케이션 역할을 추가합니다.
"appRoles": [
{
"allowedMemberTypes": [
"Application"
],
"displayName": "Can invoke my function",
"id": "fc803414-3c61-4ebc-a5e5-cd1675c14bbb",
"isEnabled": true,
"description": "Apps that have this role have the ability to invoke my Azure function",
"value": "MyFunctionValidClient"
}]
논리 앱에 대해 관리 서비스 ID를 활성화합니다.
위의 접근 방식 1에서 이미 설명한대로 논리 앱과 연결된 관리 형 서비스 ID에 대한 appid를 찾습니다.
이 관리 형 서비스 ID에 앱 권한을 할당합니다.
New-AzureADServiceAppRoleAssignment -ObjectId <logicappmsi.ObjectId> -PrincipalId <logicappmsi.ObjectId> -Id "fc803414-3c61-4ebc-a5e5-cd1675c14bbb" -ResourceId <yourfunctionaadapp.ObjectId>
위의 접근 방식 1에서 이미 설명한대로 Managed Service Identity ..를 사용하여 논리 앱을 Azure 함수에 인증합니다.
이제 함수에서받은 인증 토큰에서 role
클레임 컬렉션에 이름이 지정된 역할이 포함되어 있는지 확인할 "MyFunctionValidClient"
수 있습니다. 그렇지 않으면 Unauthorized 예외로 호출을 거부 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다