307 Temporary Redirect

HTTPのステータスコード3xxといえば、Redirectionなのですが、 300,301,302,303,304,305,306,307といろいろあります。 302,303,304はよく見かけるのですが 最近、HTTPのステータスコードを見かけて気になったので 307を調べたのでそのときのメモ。 w3c.orgのサイトでは、307はTemporary Redirectionとなっている。 HTTP/1.1 Status Code Definitions - w3.org これなにかというと、サーバからリダイレクト要求が行われた時に、メソッドと本文が変更されないことが保証されるものです。 たとえばHTTPサーバAに何かしらのデータをPOSTしたときに, HTTPサーバBへのリダイレクト要求(307)を返したとします。それを受け取ったHTTPクライアントは、HTTPサーバAにPOSTしたデータと同じものをHTTPサーバBへPOSTします。 よくあるサイトの1つとして、更新処理をするとトップ画面に遷移する的なものがあり、302が多いのですが、302はリダイレクト先にアクセスする際のメソッドを変更してはならない(GETだったらGET, POSTだったらPOSTでリダイレクト先にリクエストする)ものなのですが、その実装を守っていないクライアントがあって303,307が追加されたようです。 HTTPステータスコード – 302 Foundと303 See Otherと307 Temporary Redirectの違いについて / cyano 307の挙動を確認 307の挙動を見たいので下記のコードをPHPで作成しました。 このコードを配置したサーバに対してPOSTメソッドでアクセスし307が返却された場合に、POSTメソッドと本文を保持したままリダイレクト先にPOSTメソッドでアクセスします。 リダイレクト元 リダイレクト先 303の挙動を確認 ちなみにPOSTメソッドでアクセスして303が返却されると、リダイレクト先はGETメソッドでアクセスします。 リダイレクト元 リダイレクト先 雑感 307はメソッドと本文を変更することが禁止されているため、リダイレクト元と同様のリクエストをリダイレクト先に送信することができます。 303はリダイレクト元にPOSTでアクセスすると、リダイレクト先ではGETメソッドでアクセスします。 ※ ただしHTTPクライアントが実装できてるかどうかは別の話です。 ちなみにcurlで303リダイレクトすると、リダイレクト先も本文つかないけどPOSTメソッドでアクセスしちゃうし、 BurpSuiteのRepeaterだと307はリダイレクト先をGETメソッドでアクセスしちゃう。。。 HTTPクライアント全てが303,307を意図した挙動で動作させるわけでもないみたい。 (実装が悪いのか僕の使い方が悪いのかはわかんないけど) おしまい。 »

Mac AppStoreのキャッシュを削除する

新年あけましておめでとうございます。 昨年はアウトプットの場をLTや登壇をメインにしていたので、ブログの投稿数はだいぶ少なめでしたが、今年はブログでのアウトプットも頑張っていきたいと思ってます。 実は、最近まで手持ちのMacをElCapitain(10.11)でずっと利用していました。 アップデート後、スリープ復帰後にBluetoothとWifiの接続が切れて一定時間使えない、特定のアプリケーションが動かない等いろいろ問題を抱えていたので上げるに上げ切れず… しかし、Docker for Macのアップデート後、10.12以降でないと動作しない問題が発覚し致し方なくMojave(10.14)までアップデートを実施することに。 加えてXcodeのアップデートも実施していましたが、途中誤ってMacをスリープさせてしまい、以降アップデートのプログレスバーが進まなくなりました。 再起動して再度ダウンロードしても、プログレスバーが動作せず、Wiresharkでパケットdumpしてもダウンロードが進んでる様子が無い… のでおそらくダウンロードキャッシュが壊れてるのではないかと推測。 思い切って、ダウンロードキャッシュを削除することに。 Terminalからコマンドを入力しディレクトリを開く $ open $TMPDIR../C/com.apple.appstore/ 数字の羅列があるディレクトリ内にflyingIconがあるので確認して、削除したいアプリケーション(今回はXcode)のアイコンであればディレクトリごと削除する。 そしてAppStoreを再起動して、再度アップデートを開始する。 これで再度ダウンロードができる。 しかし、最初からのダウンロードになるのでXcodeとか6GBくらいあるアプリだと結構辛い。 参考 Clear Mac App Store Temp Cache to Fix Some Download Issues - OXSDaily AppleDeveloperForums »

[Mac]GoogleChromeのXSSAuditorを無効化する

GoogleChromeで脆弱性診断をやってる時や、やられサイトの作成をしてる時に XSSのテストをしていると止められてしまうため何か良い方法はないかとググってたら ちゃんとやり方があった。 $ open Google\ Chrome.app --args --disable-xss-auditor XSSAuditorを無効化するオプションをつけて起動するだけでOKでした。 »

jythonでtimestampを取得する方法

久々の投稿です。 最近は、脆弱性診断がメインで以前のようにコード書いたり、 インフラをがっつりやることは減りましたが楽しくやってます。 脆弱性診断ではBurpSuiteを主に利用しているのですが、 標準の機能では診断が困難な場合はExtensionの作成が必要になります。 例えば、HTTPリクエストヘッダにシグネチャを追加しなければならなかったりとか… ですね。 シグネチャに現時刻のタイムスタンプが使われていて、シグネチャを再生成する必要があったのですが、 JythonでExtensionを作成する際にハマったのでそのときのメモ。 Python2.7で現時刻のtimestampを取得する際はこう書いてました。 >>> from datetime import datetime >>> datetime.now().strftime('%s') '1538760310' しかし、Jython2.7で上記のコードを動かすと’%s’がまんま出力されます。 >>> from datetime import datetime >>> datetime.now().strftime('%s') '%s' あらら… と思ってJythonのドキュメントをみると’%s’が無いんですね。 8.1.7. strftime() Behavior - jython.org じゃあPythonにはあったのか?とPython2.7のドキュメント見ても無いんですね。 8.1.7. strftime() Behavior - docs.python.org いつから使えるようになっていたのだろうか。dateコマンドでは’+%s’があるのでPythonでも使えるだろうと思い雰囲気で使ってました。 jythonで’%s’が使えなくて困ってたので、timeライブラリを読み込んでmktimeで処理することに >>> from datetime import datetime >>> import time >>> str(int(time.mktime(datetime.now().timetuple()))) '1538761554' 一度intで囲んでるのは、mktimeするとfloat型で出てくるため。 ドキュメント読めば最初からハマらなかったんですが、’%s’使えないとは盲点だった。 おしまい。 »

unicodeとutf-8を変換するAlfred Workflowを書いた

最近、転職と一人暮らしの生活が始まり いろいろ大変だったのですが、 落ち着いたので久々にブログを書く。 お仕事はセキュリティ関連なのですが、 通信を見ると日本語のメッセージがunicodeで流れてくることもしばしばあって CLIやWebアプリで変換して読んでたりしてました。 通信を見るツールと画面を行ったり来たりするのも結構しんどくて どうにかしたいけど、 そのツールが日本語弱いので プラグイン書いて頑張るのもなあと思い そこで、普段から使ってる Alfredでunicodeとutf-8の変換ができるプラグインを書きました。 Alfredは、Macで使えるランチャーで 有料版を買うとExtensionの使用が可能になります。 実際に作ったのは下記です。 uto8 - 328 全てランチャー完結するので、画面の切り替えが発生せず いい感じに作業ができるようになりました。 ちなみに unicodeからutf-8, utf-8からunicodeの相互変換と クリップボードへのコピーも可能です。 おしま。 参考 PHPでユニコードエスケープ - はて日記 »

ngrokを利用して開発環境をグローバルに公開する

ngrokを利用して開発環境をグローバルに公開する 1年前くらいから利用してたんですが、最近また調べてたので メモ書きとして残す。 ngrokはNATやFW以下にあるローカル環境を、 インターネット越しアクセスが可能にできるサービスです。 開発環境で作成したWebアプリケーションを、 ちょっとだけインターネット越しに誰かに見せたい時とか、 APIの検証でどうしてもグローバルに出さないといけない場合 (例えばTwilioでローカル環境のTwimlを読ませたい時とか)があって ちょっと見せたいだけなのに、 AWSにインスタンス立て公開するのも少し面倒なので どうやろうか悩んでいた時にngrokを見つけました。 ngrokはbrewで入れたりできるので導入はすごく簡単です。 v1のときは無料でsubdomainを固定化できたんですが、 v2から有料オプションになっちゃったようで少し残念です。 あとは、扱えるセッション数が限られているので、 2人で同時アクセスしたりすると片方弾かれたりします。 それだけ聞くと不便な感じもしますが、 特定の人にちょっとだけ閲覧できるURLを作成して公開する分にはとても便利です。 インストール方法とか、扱い方とかはいろんなサイトで紹介されてるし 公式サイトのDocsにも載ってるので割愛しますが、 ngrokコマンド実行時にregionの指定だけやっておいたほうがいいです。 それか、~/.ngrok2/ngrok.ymlに記述しておく。 $ ngrok http 2280 --region=ap ドキュメントにも書いてあるんだけど、デフォルトはusになっています。 なので、全ての通信がus経由になってしまうため ngrokから発行されたURLからアクセスするともっさり感すごいです。 ちなみに今は、us, eu, ap, auの4リージョン選べるようです。 あとは、企業ネットワークから使う場合は ちゃんとセキュリティポリシーの確認をしましょう。 あとでセキュリティチームに怒られる可能性もあります。 あとは、開発環境のデバッガーをうっかり 上げたまま公開するのも注意が必要です。 過去にCakePHPでDebugKitを有効にしたまま公開しちゃって 環境変数に埋め込んだキーを取っ替える作業が 発生したりしたこともあったので…^^; »

Twilio Copilot使ってSMSの再送処理を減らした話

先日参加したJAWS DAYSでTwilioUGの方々とお話する機会があって、 TwilioのCopilotの事例がまだ少ないとのことだったので、書いてみる。 ブログでは、Twilioの話題を出したことは無いんですが、 Twilioを使ったSMS配信サービスと音声発信のサービスやってます。 SMSだけで言えば毎月5,000 ~ 7000件くらい、 音声発信もだいたい5,000件くらいでしょうか。 当初、SMS配信サービスを作った時に、 SMSのfromをTwilioで購入した電話番号にしていました。 利用数が増えるにつれ、「fromを文字列にしたい」という要望が出てきました。 他サービスでは、fromを番号ではなく英文字の送信者番号として送信しているものがあり、 どうしたら良いのかと考えていました。 SMSには「Alphanumeric Sender ID」というものがあり、これを使えば 実現できるものだと分かったため、さっそく実装を始めました。 これが2017年3月くらいだったかな。 テストの段階で気づいたんですが、Alphanumeric Sender IDだと受信できない端末?キャリア?も多く、 APIでPOSTするタイミングで、エラーコードの「21612」が返されることがありました。 error 21612 - twilio Alphanumeric Sender IDで送りたいのだけれど、 SMS配信のサービスやってるのに 相手に届かないのはサービスとして困るので 英文字の送信者番号で送れなかった場合は、 Fromを番号で送信リトライするという処理も入れていました。 リトライを処理を入れてから、 数ヶ月様子を見てどれぐらいエラーコード「21612」が返されてるかを確認していました。 下記は、とある1ヶ月間での統計です。 SMSをAlphanumeric Sender IDで送信できた数 : 3500件 SMSを電話番号で送信できた数 : 1500件 (リトライ処理で送信した数) この数字を見ると、だいたい30%近くのリトライ処理をやっています。 キャリア別で見ると、リトライ処理をしている番号は auと沖縄セルラーの番号が半数超えていました。 auと沖縄セルラーが多いのは地域事情だと思いますが、 それにしても他キャリアに比べてSender IDで送れない場合が多かった。 1500件のリトライ処理もそこそこ多くて、この辺りをなんとかしたいなあと思ってました。 真面目に自分で実装するなら、Alphanumeric Sender IDで送信できなかったものをDBなりでリスト化しておいて 送信のたびにリストをチェックして、番号で送るかAlphanumeric Sender IDを利用するかを決定すれば実装できそうです。 ToとFromをマッピングしたテーブルを用意しておく感じですね。 ただ、日に日に増えてくるデータからマッピングを自分たちでやるのはヤダなあという感じもしてて、 どこかに任せたいと考えていたところ、Copilotに出会いました。 Copilotは、複数の番号をまとめて管理しSMSを効率良く配信できる機能を備えています。 サービスとして特にリアルタイム性を求める配信はしてないのでそこに魅力を感じてはなかったんですが、 Alphanumeric Sender IDと番号を登録しておけば、 »

JAWS DAYS 2018に参加してきました(LTもしたよ)

先週末は下記のイベントにスカラシップで参加しました。 JAWS DAYS 2018 | テーマは「no border」2018年3月10日(土)にTOC五反田メッセ(東京)にて開催 JAWS DAYS とは JAWS DAYSは主催JAWS-UG、後援AWSJで行われるJAWS-UG最大のイベントで、全国のJAWS-UGメンバーが中心となりボランティアベースでイベントの企画・準備をし、AWSに関する幅広いテーマのセッションが行われています。 参加登録1900名ぐらいあったそうです。 めちゃめちゃ大きいイベントでした! セッション AWSクラスタに捧ぐウェブを衛っていく方法論と死なない程度の修羅場の価値〜OWASPとTop10とminiHardening〜 2017年に新しくなったOWASP TOP10を活用していこうというお話とセキュリティ演習のお話でした。 セキュリティ要件をどうすればいいか悩んでいる方にとってもOWASP TOP 10は良い判断材料になるとのこと。 セキュリティは運用フェーズでやると高コストになるので、 ちゃんと設計の段階から考えて作りましょうとかそういう話もありました。 確かに開発やってると、運用段階でセキュリティのことを考えると辛くて 直すのにとても苦労しましこともあります。 そういうのも減らすためにも、ちゃんと設計開発の段階から セキュリティのことを考える必要があるなと感じています。 OWASP TOP 10読み終わったので、活用していきたいと思います。 セッションの後半はMiniHardeningの内容でした。 セキュリティの演習環境をAWSでどうやって実現するか、 また演習ではどういうことをやっているのかを部紹介してもらいました。 本家Hardeningのカジュアル版であるMiniHardeningの裏側の話が聞けて良かったです。 実は私も2017年12月に行われたセキュリティミニキャンプ沖縄でセキュリティ演習環境を提供したことがあるあったので、今回のお話は大変貴重でした。 特に侵入テストの申請の時にIPアドレスやインスタンスIDが変わる環境においてどうやって申請したらいいのか、私も悩んでた時期があって、どうやってその辺の申請をやっているのか気になっていました。私も悩んでAWSサポートに相談交えながらも申請出したこともあり、非常に親近感のある内容でした。 AWS Technical Evangelists Special talk session -スペシャルトークセッション AWSとユーザーコミュニティが生み出すNo borderな未来- AWSは2017には1430のアップデートをしているらしい。すごい…! これだけ多い新サービス、新機能のキャッチアップをどうしたら良いかという疑問に対し、 全ては不可能だから、自分の好きなものから始めたら良くて、 とにかくみんなで知見を共有することでした。 AWS認定も、とにかくドキュメントを読み込むことと、 アーキテクチャの事例を学ぶことが大事だそう。 新サービスがたくさん出てても全てが全く新しい技術というわけでもないし、 学んだことは絶対どこかで生きてくるんだろうなっていう感じでした。 英語のセッションも、レシーバーから通訳が流れてきてたので非常に助かりました。 AWS × 形式手法で人知を超えたセキュリティを手に入れろ IAMポリシーを結構書くようになって、 シミュレータと挙動が違くてうんざりしてたこともあったり 結構、経験と勘、雰囲気で書いてることもあって悩みがあって Alloyなども使ってみるなど、結構学ぶものが多かったです。 AWS のマネージドサービスを使ったセキュリティ強化のための自動化では、 WAFを利用して攻撃を自動ブロックする話や、GuardDutyでの驚異検出など サービスを守るためのセキュリティツールをフル活用していた感じでした。 コンテナを守る技術 2018 コンテナの基礎知識からProductionで運用するまでの 主にセキュリティ周りのノウハウをまるっと色々とご紹介していました。 »

EC2インスタンスから自宅のGoogleHomeに発言させる

google-home-notifier - Github を利用すると、 「OK. Google.」のトリガーを不要にし喋らせたい内容をサーバからPUSHできる。 ただ、自宅にサーバ用途にできそうなPCもないのでどうしようかと迷ったので AWSのEC2インスタンスを使うことにした。 ただ、GoogleHomeのポートをグローバルに公開するのもなかなか危険なので VPCと自宅のFortigateでサイト間VPN接続を行うことにした。 全体構成 AWS側はVPCを作って、インスタンスを立てただけ。 自宅側はプロバイダの制約により、FortigateでPPPoE接続ができないため、 ホームルータのNAT配下に設置。 ただし、ホームルータの機能にDMZパススルー機能があるため FortigateのWAN1に接続に利用するIPアドレス 192.168.172.2 をパススルーのIPとして登録しておく。 AWSのVPN接続は、IPSecを2本張るので、BGPによる経路交換も必要となる。 (基本は1本しか使わないと思うんだけど) GlobalIPが変更になったらIPSec切れちゃうでしょとか思うですが、 契約してからここ5年くらい経つけど、GlobalIPは一度も変わってない。 auひかりの仕様では動的グローバルIPを割りあてるよって書いてあるけど、 ホームルータが認証情報を持っているのか、ハードウェアを交換しない限りはIPアドレスは変わらなさそう。 GoogleHomeは事前にWifiに接続しておいてIPアドレスを確認しておく。 AWS側作成 TerraformでVPCネットワーク部分だけを作成してみた。 書いた後に気づいたけど、ルートテーブルに自宅側のルーティング情報をルートテーブルに書いてなかったので、VPN構築後に手動追加した。 インスタンスも手動追加するので、Terraformでは記載していない。 インスタンス作成 CentOS7のAMIからインスタンスを生成, 作成したVPCネットワークに所属させる。 yarn, node, google-home-notifierのインストールを行う 自宅側 AWSでVPN接続の作成後、画面からサンプルコンフィグを落とせるのでダウンロード。 自宅のFortiOSは5.2系なのだけれどサンプルのままじゃ通らないコンフィグがあるので注意。 VPN接続の作成時に自宅側のグローバルIPアドレスを入力するため、 サンプルコンフィグではlocal-gwにグローバルIPアドレスが記述されているが、 ここはFortigateのWAN1のIPアドレス192.168.172.2に変更する必要がある。 後は、VDOMも今回は使わないので、コンフィグはこんな感じに。 コンフィグを入力してしばらくすると接続が完了する。 接続状況はAWSのVPN接続の詳細画面でアップになっているかを確認する。 実際に喋らせてみる サーバ側に用意したプログラム(ほぼサンプル)。 下記を実行すると、GoogleHomeが「こんばんは」と喋ってくれる。 const googlehome = require('google-home-notifier') const language = 'ja'; googlehome.ip('192.168.1.112', language); googlehome.notify('こんばんは。', function(res) { console.log(res); }); 雑感 自宅にサーバ置いてないので、意外と大掛かりな構成になってしまったけど、この構成ならAWSからでも発言させたい内容はPUSHできるので、自宅にサーバを置かないと決めてる方でもいけそう。(Fortiは使うし、グローバルIPは固定だけど) 本当はEC2インスタンス立てずにLambdaでやりたいけど、google-home-notifierってLambdaいけるかは分かってないので、この辺りも動作検証したい 料金見積もりしたらVPN接続とインスタンス台で毎月30ドルくらいかかっちゃうので、思ったよりはコスト高かった…(笑) AWSのVPN接続は作成か終了しかないのだけれど、「停止」も欲しいなって思った(需要あんのかな) Amazon Echo届いたので、明日からはAlexaスキル作って遊びたいと思います。 »

JAWS-UG沖縄 AWS re:Invent 2017新サービスおさらい に参加してきた

新年明けましておめでとうございます。 2018年はたくさんのイベントに参加したり、 自分のためになるような記事やTipsを たくさん残せるように頑張りたいなと思ってます。 JAWS-UG沖縄 AWS re:Invent 2017新サービスおさらい に参加してきたのでその時のメモ。 re:Invent 2017 行ってきました報告 - 栄野川さん 海外旅行時のTips含め, re:Inventでの様子とか。 re:Inventのアプリが便利でキーノートの翻訳とかもあったらしい。 一度は海外イベントの雰囲気も味わいたいなって思いました。 AWS re:Invent 2017 新サービスおさらい - 與儀さん IVS CTO Night & Day】AWS re:Invent 2017 振り返り - slideshare 上記のスライドを参考におさらいをしました。 2016年もそうだったんだけど、サービス増えすぎてすごい…. EMSとFargateは使ってみたいのでそのうち検証する。 Amazon Time Sync Serviceもすごい。閏秒対策もできてて無料で利用できる。 閏秒は毎回悩む問題だけど、自分で考えなくてよくなるので良いよね。 今回Apache Active MQ互換のAmazon MQもでたんだけど、 個人的にはSQSのFIFOキューを東京リージョン対応を望んでます。 Rekognition との関わりについて - 宮里さん 自社サービスの課題解決にRekognitionを利用した話。 基本構成は、S3のFile PUTをトリガーにLambdaからRekognition呼び出して結果をDynamoDBに書き出す感じ。 当時は15人しか認識できないので、集合写真は分割して対応するなど涙ぐましい努力が。 最近では、画像内の顔を最大100個まで対応できるようになったので大抵のものには対応できそう。でも、MAX100人ってすごい…! LT LT募集してたので、私もLTしました。 ネタは、「セキュリティミニキャンプの演習環境をAWSで作成した話」なんですが、 内容はほぼほぼOWASP OKINAWA#6の内容でやりました。 資料は気が向いたらどこかにアップします。 »