연습 - 비밀을 사용하여 웹후크 페이로드 보호

완료됨

이 연습에서는 비밀을 사용하여 웹후크 페이로드를 보호하고 Azure Function을 사용하여 페이로드가 실제로 GitHub에서 있는지 확인하는 방법을 알아봅니다.

Azure Function에 대한 키 가져오기

  1. Azure Portal에서 모듈의 첫 번째 연습에서 만든 함수 앱으로 돌아갑니다.

  2. 왼쪽 메뉴 창의 함수 아래에서 함수를 선택합니다. “함수 앱”의 함수 창이 나타납니다.

  3. 만든 HttpTrigger1을 선택합니다. ‘함수’에 대한 TimerTrigger1 창이 나타납니다.

  4. 왼쪽 탐색 창의 개발자에서 코드 + 테스트를 선택합니다. ‘함수’의 코드+ 테스트 창이 나타납니다.

  5. 함수의 index.js JavaScript 파일에서 crypto js 라이브러리에 대한 참조를 파일 시작 부분의 module.exports 문 위에 추가합니다.

    const Crypto = require('crypto');
    
  6. 상단 메뉴 모음에서 저장을 선택합니다. 창 하단에 로그 창이 나타납니다.

  7. 왼쪽 메뉴 창의 개발자에서 함수 키를 선택합니다. ‘함수’의 함수 키 창이 나타납니다.

  8. 열 아래에서 값 표시 링크를 선택합니다.

  9. 클립 보드에 복사 아이콘을 선택하고 다음 단계에서 사용할 수 있도록 이 키를 저장합니다.

  10. 왼쪽 탐색 창의 개발자에서 코드 + 테스트를 선택합니다. ‘함수’의 코드+ 테스트 창이 나타납니다.

  11. 코드 블록에서 context.log 문 다음에 다음 코드를 추가합니다. 기본 키<>를 클립보드에 복사한 기본 키로 바꿉니다.

    const hmac = Crypto.createHmac("sha1", "<default key>");
    const signature = hmac.update(JSON.stringify(req.body)).digest('hex');
    

    이 코드는 GitHub와 같은 메커니즘을 사용하여 키의 해시를 컴퓨팅합니다.

  12. 요청 헤더의 x-hub-signature 형식과 일치하도록 키의 시작 앞에 sha1=을 추가하는 다른 const를 추가합니다. 사용자의 함수에 다음 코드를 추가합니다.

    const shaSignature = `sha1=${signature}`;
    
  13. 다음 코드를 추가하여 요청 헤더에서 GitHub 서명을 검색합니다.

    const gitHubSignature = req.headers['x-hub-signature'];
    
  14. 두 문자열을 비교합니다. 일치하는 경우 요청을 다음과 같이 처리합니다.

    if (!shaSignature.localeCompare(gitHubSignature)) {
        // Existing code
        if (req.body.pages[0].title) {
            ...
        }
        else {
            ...
        }
    }
    
  15. 문자열이 일치하지 않는 경우 서명이 일치하지 않음을 보낸 사람에게 알리는 메시지와 함께 HTTP 401(권한 없음) 응답을 반환합니다.

    if (!shaSignature.localeCompare(gitHubSignature))
    {
        ...
    }
    else {
        context.res = {
            status: 401,
            body: "Signatures don't match"
        };
    }
    
    

    완료된 함수는 다음과 같이 표시됩니다.

    const Crypto = require('crypto');
    
    module.exports = async function (context, req) {
        context.log('JavaScript HTTP trigger function processed a request.');
    
        const hmac = Crypto.createHmac("sha1", "<default key>");
        const signature = hmac.update(JSON.stringify(req.body)).digest('hex');
        const shaSignature =  `sha1=${signature}`;
        const gitHubSignature = req.headers['x-hub-signature'];
    
        if (!shaSignature.localeCompare(gitHubSignature)) {
            if (req.body.pages[0].title) {
                context.res = {
                    body: "Page is " + req.body.pages[0].title + ", Action is " + req.body.pages[0].action + ", Event Type is " + req.headers['x-github-event']
                };
            }
            else {
                context.res = {
                    status: 400,
                    body: ("Invalid payload for Wiki event")
                }
            }
        }
        else {
            context.res = {
                status: 401,
                body: "Signatures don't match"
            };
        }
    };
    
  16. 상단 메뉴 모음에서 저장을 선택합니다. 로그 창이 연결됨! 문과 함께 표시됩니다.

웹후크 비밀 업데이트

  1. GitHub 포털에서 GitHub 계정으로 전환합니다.

  2. 리포지토리를 선택합니다.

  3. 위쪽 메뉴 모음에서 설정을 선택합니다. 설정 창이 나타납니다.

  4. 사이드바에서 웹후크를 선택합니다. 웹후크 창이 나타납니다.

  5. 웹후크 옆에 있는 편집을 선택합니다.

  6. 비밀 텍스트 상자에 이 연습에서 앞서 저장한 함수의 기본 키를 입력합니다.

  7. 페이지의 맨 아래로 스크롤하여 웹후크 업데이트를 선택합니다. 웹후크/웹후크 관리 창이 나타납니다.

웹후크 및 Azure Function 테스트

  1. 최근 배달 탭을 선택합니다.

  2. 줄임표(...) 단추를 선택하여 최신(최상위) 배달 항목을 선택합니다.

  3. 다시 배달을 선택합니다. 나타나는 페이로드를 다시 배달할까요? 대화 상자에서 예, 이 페이로드를 다시 배달합니다를 선택합니다.

    이 작업은 Wiki 페이지를 다시 편집하는 것을 시뮬레이션합니다.

  4. 줄임표(...) 단추를 선택하여 최신(최상위) 배달 항목을 선택합니다.

  5. 헤더 섹션에 x-hub-signature가 표시됩니다. 응답 코드가 200으로 표시됩니다. 이는 요청이 성공적으로 처리되었음을 나타냅니다.

    Request URL: https://testwh123456.azurewebsites.net/api/HttpTrigger1?code=aUjXIpqdJ0ZHPQuB0SzFegxGJu0nAXmsQBnmkCpJ6RYxleRaoxJ8cQ%3D%3D
    Request method: POST
    content-type: application/json
    Expect:
    User-Agent: GitHub-Hookshot/16496cb
    X-GitHub-Delivery: ce122460-6aae-11e9-99d4-de6a298a424a
    X-GitHub-Event: gollum
    X-Hub-Signature: sha1=<hash of default key>
    

잘못된 서명 테스트

  1. GitHub 포털의 웹훅 페이지에서 설정 탭을 선택합니다.

  2. 비밀 테스트 상자에서 비밀 변경을 선택합니다.

  3. 임의 문자열을 입력하고 아래로 스크롤한 다음 웹후크 업데이트를 선택합니다.

    웹후크에서 사용되는 키가 더 이상 Azure Function에서 필요한 것과 일치하지 않습니다.

  4. 최근 배달 탭을 선택합니다.

  5. 줄임표(...) 단추를 선택하여 최신(최상위) 배달 항목을 선택합니다.

  6. 다시 배달을 선택하고, 표시되는 페이로드 다시 배달 대화 상자에서 예, 이 페이로드를 다시 배달합니다를 선택합니다.

  7. 이번에는 응답 코드가 401로 표시됩니다. 이는 요청에 권한이 없음을 나타냅니다.

  8. 줄임표 단추(...)를 선택하여 최신(최상위) 배달 항목(‘다시 배달’)을 선택합니다.

  9. 응답 탭을 선택하고 본문 섹션에서 “서명이 일치하지 않음” 메시지가 표시되는지 확인합니다.