白”雪姫”の雑なエンジニアブログ

ダイアリーがなくなってしまったため、エンジニアブログとして再出発

APIGatewayとLambdaを使って決済システムのAPIを作る話・・・の予告

タイトルは仰々しく書いてますが、一般的な構成です。

また、今回は構成図とかを乗せられませんので、さわりだけ。(ちょっとバタバタしてちゃんとした記事かけなくてごめんなさい) 決済システムに於ける提供API

これをAPIGatewayとLambdaだけで処理しちゃおう

そんな話です。

使うのはタイトルにあるとおりAPI Gateway

接続するプログラムはLambda

フロントがHTTPSのみに絞れるという大きな点があります。

この辺りで構成を行います。

また、決済時に発生するトランザクションデータと呼ばれる、データを保存する必要があります。

データ保存は決済APIとは別のVPCに保存をしたい。

という要望もありました。 そこで、登場してもらったのがVPC LambdaRDS Proxyです

実は、このあたりでかなりと言って良いほどの苦労をしました。 問題になった点

  1. WAFを有効化すると通信データが遅い
  2. Lambdaが起動するまでに決済先に対してのタイムアウトを起こすときがある
  3. Lambdaがコールドスタンバイであるがゆえに、決済APIの応答に少し時間がかかる
  4. ログの出力形態を以前から話を出している認証に合わせる必要がある。
  5. 開発責任者的に・・・・CI/CDを使いたい

この辺りの問題が後からあとから出てくる形でした・・・・。

こんな話でも良ければ、次の記事からは書きたいなと思っています。

とあるセキュリティ認証の要件に合わせたマネジメントWAFの設定~後編~

この記事は、前編を読んでくださった方向けの続きの記事です。
お読みになった上で、ご覧ください。

前回記事で、OWASP ZAP TOP10の1・2・5・7・9・(10)の対策のうち
2番のメイン対策・(10)番の付随対策の位置づけであるBot対策を説明しました。
残っている部分だけを前記事から引用します。

1. インジェクション対策(SQLInjection)
5. Broken Access Control(アクセス設定の不備)
7. Cross-Site Scripting(XSS)
9. Using Components with Known Vulnerabilities(既知の脆弱性対策)

についての説明記事です。

  • Admin protection

こちらは、5・7番への対策です。
5番におけるプログラム設定の不備、7番の管理画面のURIが判明した場合認証攻撃などをされるので、対策に役に立ちます。
名前だけで見たら、”管理者の保護”と読み取れますが、ルールの説明には以下です。

Contains rules that allow you to block external access to exposed admin pages. This may be useful if you are running third-party software or would like to reduce the risk of a malicious actor gaining administrative access to your application.

コンテンツ内の管理者ページへのアクセスを制御します。サードパーティソフトウェアもしくは悪意のある者の管理アクセスを制御するのに役に立つ
という事です。
つまり、管理者アクセスそのものを制限することで対策を行いましょう。というものです。
詳細はLearn Moreも確認してください。

  • Core rule set

9番及び前編で記載したTOP10ひいてはOWASPで推奨される全ての対策になりますが、ルール名に記載の通りプログラムの中心部で使われるであろう想定から作られるの対策となるので一部対策が甘いところがあるので「このルール入れればじゃあ良いじゃん」なんてことは思わないようにしてください。

中心にあるもののルールセットというのが、言い方としては正しいですが、内容は以下の様に英語で記載されてます。

Contains rules that are generally applicable to web applications. This provides protection against exploitation of a wide range of vulnerabilities, including those described in OWASP publications. 

何か、見た用語が出てきましたね。OWASPというワードとvulnerabilitiesという言葉です。
簡単に書きますと作成されたアプリケーションはフレームワークなどを使われてると思いますが、それの中心となるプログラムに対しての「脆弱性」や「OWASP」の対策が講じられているか、講じられていない場合、WAFの方で一時的に対処しましょう
というものです。

既知の脆弱性の対策方法でも有りますので、9番の対策をします。

Linuxにある固有脆弱性、攻撃者に公開されては困るファイル内容などを対策します。
プログラムで公開される可能性があるので、その対策です。
説明文は以下です。

Contains rules that block request patterns associated with exploitation of vulnerabilities specific to Linux, including LFI attacks. This can help prevent attacks that expose file contents or execute code for which the attacker should not have had access.

と、先に私が、日本語記載した物そのままでした・・・。詳細はLearnMoreを読んで頂いた方がより良い理解が出来るかとおもいます。

1番と9番の対策です。
SQLインジェクション対策のために実装します。
それ以外にもデータベース、SQLに対する脆弱性などの対策もできます。

説明は次の通りです。

Contains rules that allow you to block request patterns associated with exploitation of SQL databases, like SQL injection attacks. This can help prevent remote injection of unauthorized queries.

非認証なオペレーションも対策してくれる様です。

ここまでつらつらと書きましたが以上が対策に設定するルールです。

ルールは本執筆中はこのように並んでいます。

Free rule groups

OWASPの順番で並べてみます。

OWASP TOP10の内容 AWS WAFのルール 備考
1.インジェクション対策 SQL database
2.アクセス制御の不備(認証情報の漏洩) Bot Control
5.Broken Access Control(アクセス設定の不備) Bot Control,Admin protection
7.Cross-Site Scripting(XSS) Admin protection
9.Using Components with Known Vulnerabilities(既知の脆弱性対策) Core rule set,SQL database
Insufficient Logging and Monitoring(不十分なログと監視設定) Bot Control あくまで付随対策なのでプログラム(開発)側でしっかり対策が必要


順番について
ルールの適応に関して、ここまで記載してきましたが、WAFのルールには適用される順番があります。
AWS WAFではもう1つ気にすることがあります。
通過させるルールの順番です。

一通りルールを選択が終わり、次へとすると、ルールの適用する順番を聞かれます。

rule priority

ここで、考えるのは、パケットが来た時にどういった順番で動作をするのかです。

パケットを受け取ると、まずはアプリケーションを通過、その後、アプリケーションのミドルウェアを通過、OSを通過、とOSI参照モデルの下の方へいきます。
つまり、フロントで受け取る順番から対策をしてくという必要があります。

紹介したルールは

  • BotRule
  • Admin protection
  • Core rule set
  • Linux operation system
  • SQL database

対策順番はOSが一番最後になりますので

  1. BotRule
  2. Admin protection
  3. Core rule set
  4. SQL database
  5. Linux operation system

が、正解です。

悩ましいと思われるのは、
Admin protectionとCore rule setですが、
URLの様な見える物、権限を取られたら困る物から適用していくことになります。

Admin等の固有URI等が見えますし、権限上の管理権限等が付与されている場合もあります。
そのため、
Botの対策後Adminを対策、Core ruleによるプログラムの対策、SQLの対策後、OSの対策
というのが理想な対策かと言われています。

設定後は、ログの確認をして、完了です。
CloudWatch Logsを確認して見ます。

log-sample

こんな感じに出てきます。

要件に満ちているかを確認するため、以下に完全貼り付けをします(重要情報は、***にて潰しますが)

{
    "timestamp": 1706422856469, <strong>←UnixTimeによる時間</strong>
    "formatVersion": 1,
    "webaclId": "arn:aws:wafv2:us-east-1:********:global/webacl/test/133cfd57-461a-4011-bd47-eb9cfaacaaec", <strong>←どのACLか</strong>
    "terminatingRuleId": "Default_Action",
    "terminatingRuleType": "REGULAR",
    "action": "BLOCK", <strong>←許可か拒否か</strong>
    "terminatingRuleMatchDetails": [],
    "httpSourceName": "****",<strong>←Source Protocol</strong>
    "httpSourceId": "*******",
    "ruleGroupList": [
        {
            "ruleGroupId": "AWS#AWSManagedRulesAdminProtectionRuleSet",
            "terminatingRule": null,
            "nonTerminatingMatchingRules": [],
            "excludedRules": null,
            "customerConfig": null
        },
        {
            "ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet",
            "terminatingRule": null,
            "nonTerminatingMatchingRules": [],
            "excludedRules": null,
            "customerConfig": null
        },
        {
            "ruleGroupId": "AWS#AWSManagedRulesSQLiRuleSet",
            "terminatingRule": null,
            "nonTerminatingMatchingRules": [],
            "excludedRules": null,
            "customerConfig": null
        },
        {
            "ruleGroupId": "AWS#AWSManagedRulesLinuxRuleSet",
            "terminatingRule": null,
            "nonTerminatingMatchingRules": [],
            "excludedRules": null,
            "customerConfig": null
        }
    ],
    "rateBasedRuleList": [],
    "nonTerminatingMatchingRules": [],
    "requestHeadersInserted": null,
    "responseCodeSent": null,
    "httpRequest": {
        "clientIp": "******",<strong>←SrcIP</strong>
        "country": "**", <strong>←SrcCountry</strong>
        "headers": [
            {
                "name": "User-Agent",
                "value": "Wget/1.17.1 (linux-gnu)"
            },
            {
                "name": "Accept",
                "value": "*/*"
            },
            {
                "name": "Accept-Encoding",
                "value": "identity"
            },
            {
                "name": "Host",
                "value": "*****" ←DstHost
            },
            {
                "name": "Connection",
                "value": "Keep-Alive"
            }
        ],
        "uri": "/******", <strong>←アクセスしたURI</strong>
        "args": "REDACTED",
        "httpVersion": "HTTP/1.1",
        "httpMethod": "REDACTED",
        "requestId": "tCwsXZBRpUZy_JHczpC6U0CL30m_C6U2FCDaluiXTJWmakHqEBUm_w=="
    },
    "ja3Fingerprint": "81bacd5d10832264bc04b9041be2a088"
}

なお、UnixTimeでしかログ上では表示されないので、CloudWatchLogsの時間を参照にするとアクセスしてきた時間を見る方が解析はしやすいかと思います。
また、見づらいですが、どのルールが拒否したのか等も記載されています。
前編で紹介したログにも準拠します。

長くなりましたが、設定は以上です。
ありがとうございました。

とあるセキュリティ認証の要件に合わせたマネジメントWAFの設定~前編~

技術系は久々の投稿になりますね。
白"雪姫"です。

今回のお話は、セキュリティ方面です。
登壇出来たこともあり、どんなことをしてたのかを一般的な範囲で書けるようになったので
苦労してたことを思い出しながらちょもちょも書いていこうと思います。
その殆どは、AWSかもしれませんが・・・・・(笑)

さて、本題に入りましょう。
今回は、AWS WAFで苦労した点についてお伝えします。
aws.amazon.com

まず、AWS WAFとは、AWSマネージドの Web Application Firewallのサービスです。
Applicationとつくように、OSI参照モデル7層であるアプリケーション層への脅威を緩和するためのサービスです。

このAWS WAFは、2015年にリリースされた物をバージョン1、その後、2019年末頃にリリースされたものがバージョン2です。
そんなAWS WAFを使用したいと、当時対応していたプロジェクトに入っていた、セキュリティ認証のコンサルタントに入っていた方に相談をしたところ、
「OWASP ZAP TOP10に準拠したルールだったら認めるけども、それ以外なら、どういうルールなのかしっかり理解して提示できる資料が必要、またログの出力とかも確認させて欲しい」
と言われました。
その時は、バージョン1のものでこちらが提供されていました。
が、記事の公開年を見ていただくと分かりますが2017年になります。
いくら公式といえど、少し古いです。

当然バージョン2も出て、だいぶ浸透してきている時期になります。
調べてみても2020年で当該アップデートは終了する。なんて注意書きも書いてありますね。
今回はできる限り、バージョン1で利用していた無料ルールをMarketPlaceの高額ルールを使わないでやるというのが目標になっていました。

また、この記事を執筆しているときと要件も少し変わってますので、最新にされたい方は私の記事を参考に最新の攻撃手法などを調べるようにしてください。

当時の認証規格のWAFの要件には以下がありました。
「最新の情報を常に取り入れ、それを適用、正常に動作していることを確認すること」

また、先述のとおりログを取る必要があり、ログの取得要件は次の通り。
「いつ(Date)・どこから(SrcIP)・どこに(DstIP)・プロトコルTCP/UDP等)・許可拒否・URI・拒否した場合はどのルールなのか」

そして、ログの保存要件があります。
「取得したログは、1年間保持し、少なくとも3ヶ月分は即時に取り出せるようにしておくこと」

この時点でお気づきの方はお気づきかもしれません。

許可のルールを通過させてたら膨大なログ、出るよね・・・・?と。

このシステムはそこまでアクセスも来るような物ではなかったので、CloudWatch Logsで事足りたので、CloudWatch Logsに出力して保存期間を1年としました。
アクセス数が多かったり、取りこぼしを防がないとならないと言った要件がある場合は、Kinesis Data Firehoseを利用してください。

元のお話に戻りまして・・・。
先にログ要件を片付けましょう。AWS WAFは設定でログが出せるようになっています。
マネジメントコンソールのにログイン後、WAF & Shield
左ペインのWeb ACLsから該当するWEB ACLを選択して右ペインのLogging and metricsにて設定します。

WAF-Logging-settings

このとき、ログストリームを新しく作るのですが、その際は必ず aws-waf-logs-から始まるように作成してください。
当時の私はこの制約を知らず、丸々1日ログが出ない?なんで?と時間を溶かしました。

また、Redacted fieldsというオプションがあります。
ここで先程のログ要件を満たすように設定をするので、以下のオプションを選択します。

・HTTP method
URI Path
・Single header

Redacted fields

必要な設定を行い、ログ取得の準備ができました・・・!!

ここで冒頭で紹介しましたOWASPの概略を確認します。
概略は以下のサイトにあります。
www.synopsys.com

プログラマ(開発者)向けなので、私のようなインフラエンジニアは読まなくても良いよみたいなことを言われていたためきちんと理解をしている訳では無いのですが、重点的な対策を行う必要があるのはTOP10のものが該当するそうです。のちに後悔してめちゃくちゃ読みまくってますが・・・。
また、その時その時の流行に合わせて内容も変わります。現在必要な物は必ず確認しておくと良いでしょう。

そして、本記事のもとになったプロジェクトの当時のTOP10は、次の通りです。

  1. インジェクション対策(SQLInjection)
  2. アクセス制御の不備(認証情報の漏洩)
  3. 機密情報の保護
  4. XML External Entites(XXE)
  5. Broken Access Control(アクセス設定の不備)
  6. セキュリティ設定のミス
  7. Cross-Site Scripting(XSS)
  8. Insecure Deserialization(安全ではないデシリアライゼーション)
  9. Using Components with Known Vulnerabilities(既知の脆弱性対策)
  10. Insufficient Logging and Monitoring(不十分なログと監視設定)

となります。

これら上記の10項目のうち、WAFで対策設定が可能なものは、1・2・5・7・9の5項目です。

10番に関しては先に記載したAWS WAFの設定で追加対策という形となりますが、基本対策はプログラマ(開発)側にて行う必要があります。

必要となるルールは、

  • Paid rule groups内のBot Control
  • Free rule groups内のAdmin protection・Core rule set・Linux operation system・SQL database

です。

次にRulesです。
設定方法は先程のWeb ACLから行い、Rulesの所のAdd rulesから"Add Managed rule gorups"を選択します。

Add managed rule groups

まず必ず入れるのはBotコントロールです。
AWS Managed rule groupsのPaid rule groupsの中にあるBot Controlです。
説明を引用します。(詳しくは設定時のLearn Moreなどをご覧ください。)

Provides protection against automated bots that can consume excess resources, skew business metrics, cause downtime, or perform malicious activities. Bot Control provides additional visibility through Amazon CloudWatch and generates labels that you can use to control bot traffic to your applications.

ん???何言ってるかわからないって?
このルールは、企業アクセスが通常アクセスでは無いbotのアクセスを可視化、遮断しますよ。というものです。
これが必要な理由は、このシステムをbotサーチなどで発見されたくないためです。パブリック公開されていますが、大量にアクセスされても困るシステムですので。

設定したルールは、2番と5番の対策にも繋がる形となります。

残りの対策はどのルールがどの対策かを詳細記載していきますが、長くなってきてしまったので次の記事にさせてもらおうかなと思います。

AWS勉強会に登壇をしてまいりました。

少し間が空いてしまいましたね。
こんにちは。白"雪姫"です。

タイトルの通り、AWS勉強会に参加してまいりました。
当方にとっては初登壇となりました。

というのも、今までの立場上、構成など(ごく一般的な構成でも)がお話し出来ませんでした。

転職後からようやく、こういったことを発表する機会を頂けたので、実際の登壇という物を経験させていただきました。

参加した勉強会はAWS Cafeteria私の所属しているゆめみ社、CyberAgent、Classmethodの3社合同で開いた勉強会です。

オフライン50人は多くないよ。
と言われてたけど、セミナールームの規模と人数で見てると、かなり多かったです。

ゆめみ陣営はそうそうたるメンバーでしたが、めちゃくちゃド緊張でした。。
終わったときには汗だくでした。

フィードバックだったり色々頂いてます。
質問も頂きました。とても嬉しかったです。

前置きと感想はここまでとさせていただきまして、私の登壇内容です。
資料の方はこちら
speakerdeck.com


簡単に書きますと、
今までそのガッチガチに硬くて、そういったことすらできないし、AWSの利用可能なサービスも限られてる。
だけど、ゆめみに入ってAWSを改めてやり始めてどう思ったのかを発表させてもらいました。

結論としては、本当に、情報収集を続けること(AWSで言えばWaht'sNewとか)と自由な状態を言うのは、凄く視野を広げてくれるということです。

個人的には他の勉強会とかにも参加していきたいなと改めて思った次第でした。
それでは。

今年を振り返る

今年を振り返る。
1月〜3月
プライベートで引越しがあり
本職の方も仕事がかなりおちついてきた時期。

4〜6月
本格的に社内のコード化、環境周りで色々整理がついて・・・
な状態。取りに行ってもアプリ側の機能改善に追われてて・・・・
な時期だった

7月〜9月
転職を考えて、友人周りに相談、そして転職を決める。

10月〜12月
これまでの経験を業務に生かしつつIaCを本格的に利用し始めて格闘中
また、資格も順次取得。

こうやってみると、なんだかんだで「躍進した年」なきがする。

この年で躍進なんて言葉使うなんて思わなかったけど、実績や実行、その先にあるものを見据えて動ける様になってきたのもとても嬉しかった。


特に、引越し、転職
と実施した後、自分自身のモチベーションがなぜか爆上がりしてたのも大きいです。

一時期下がりまくってしまって何も手をつかなくなってしまった程でしたが、何となく何となく
でやってきましたが、ここにきて色々やりたいなと思える1年の心機一転でした。

では。