2017年12月8日金曜日

ガゲァスAdvent Calender 8日目

ガゲマックシャッフラーをセキュアにする

前回の投稿で「APIキーをヘッダに入れて叩きたいが,IFTTT側が未対応でできなかった。」という旨の投稿をした。

今回はカスタムオーソライザーを使ってAPIに認証機構をつける。

認証機構となるLambda関数を作る

認証機構となるLambda関数を作る。

コードは以下のような感じ。

# アクセストークンを適当に生成して貼り付ける
correct_access_token = '***'

def generate_policy(principalId, effect, resource):
    authResponse = {}
    authResponse['principalId'] = principalId
    
    policyDocument = {};
    policyDocument['Version'] = '2012-10-17'
    policyDocument['Statement'] = []
    
    statementOne = {}
    statementOne['Action'] = 'execute-api:Invoke'
    statementOne['Effect'] = effect
    statementOne['Resource'] = resource
    
    policyDocument['Statement'] = [statementOne]
    
    authResponse['policyDocument'] = policyDocument
    
    return authResponse

def lambda_handler(event, context):
    # TODO implement
    access_token = event['queryStringParameters']['access_token']
    if access_token == correct_access_token:
        authResponse = generate_policy('user', 'Allow', event['methodArn'])
    else:
        authResponse = generate_policy('user', 'Deny',  event['methodArn'])
    return authResponse

IAMロールの設定

ここで少し嵌ったのだが,ロールの「信頼関係」にAPI Gatewayが指定されていないとLambda関数が実行できないらしい。

IAMのロールから信頼関係タブを開き,信頼関係の編集を行う。

"Service""apigateway.amazonaws.com"を追加する。

API Gatewayにオーソライザーを追加する

API Gatewayにオーソライザーを追加する。

タイプはLambda関数,IDソースにはクエリ文字列,"access_token"などと追加する。

後はリソースタブからメソッドリクエスト画面で,認証に先程作ったカスタムオーソライザーを指定する。

IFTTT側の設定

エンドポイントのURLに"access_token=***"を付けてアクセスするよう変更する。

結論

懸念事項だったセキュリティが少し堅牢になった(はず)。

セキュリティに配慮できる高度クラウド文字列シャッフル人材なので完全週休2日制,年収1千万円の職がほしい。

謝辞

本記事の一部はAmazon Web Serviceの無料利用枠で書かれた。

0 件のコメント:

コメントを投稿