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と番号を登録しておけば、 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の内容でやりました。 資料は気が向いたらどこかにアップします。 »

about me

Twitter : @328__ Github : 328 Qiita : 328 セキュリティ屋さん ときどきインフラやったりコーディングしたり。 License CredlyとAccredibleに記載 Credly: https://www.youracclaim.com/users/yuya-asato Accredible: https://www.credential.net/profile/yuyaasato406655/wallet 触れた技術とか Cloud AWS / Azure / GCP / Heroku / Twilio Infra Ansible / Terraform / Docker / KVM / VMWare Capistrano Monitoring Zabbix / CloudWatch / Grafana Programming C / Ruby / PHP / Python / Javascript / Shell Script / Objective-C / Swift(2.x,3.x) Framework Serverless Framework / Ruby on Rails(5. »

2017振り返り

なんとなく今年の振り返りでもやろうかなと思ったので TwitterやFacebook、その他SNSに散らばってた情報を拾い集めて、 今年やったことや触れた技術、買ったものとかをまとめてみる。 ※ 記事が書いてるうちにだんだんめんどくさくなって適当になってるところとかもあります^^; 1月 専門学校の臨時講師 依頼が来たので、学生さん相手にいろいろお話をする。(2月まで) 教科書通りにクラウドとはなんぞやってお話から 仕事でそこそこ利用してたAWSの話だったり、 AnsibleやDocker、自動化のお話とかもいくつか。 セキュリティのお話もちょっとだけしてたのだけれど、 ちょうどWordpress7.0あたりの脆弱性が話題になった頃だったので 学生向けに再演してみて、これは1日でうん万件やられるよねとか、 こんなんあったりするから身近で使ってるものは IPAとかJVNとかNVDとかJPCERTとかこういうサイト見たりしてアンテナ張って、 アップデートが必要なソフトは早めにやろうね!ってお話をしたりとかしてました。 Expect rubyでexpect使ってスイッチの設定投入の自動化やってみたりするも 対話形式めんどくさいのでやっぱり、API用意されてるならそっちから投入したほうがいいって結論に。 AnsibleとかCiscoのスイッチの設定投入とかできるようになってるぽいけど、中身どうなっているのだろうか。 気になってはいたけど、そこまで調べる元気はなかった。 JANOG 39 現地に行けないので、ストリーミング配信を見る DDoSのお話とか, DNSのKSK rolloverのお話を聞いたりとか Sphinx ドキュメントをWordやExcelで書かずに、 Markdownで書けて、gitでバージョン管理できるいい感じのツールを求めてて Sphinxを触ってみた。 結構使いやすかった記憶はあるけど、 飽き性なので1週間くらい触って終わる。 ドキュメントは1本書いた。 iOS Objective-C WKWebView WKWebViewでネイティブの機能との連携周りのコードを書いてました。 GoogleやFacebookの認証情報をローカルストレージに保存するようなの書いてたりしたような記憶がある。 WKWebViewは裏側でJavascriptを実行できたっけ。 そんなことをやって画面上のデータを抽出してDBに書き込んだりとかしてました。 2月 Re:dash BIツール, Re:dashを触り始める。 SQL全然かけなくて挫折するものの、 やってくうちにSQLは書けるようになった気がする。 LEFT, INNER JOINくらいは全然。 PostgreSQLの独自関数とか触るように。 Insomnia curlでPOSTパラメータをこねこねしながらREST API叩くのも結構しんどくて、 いいツールないかなと探してたら先輩に教えて貰った。 プロジェクト単位で管理できるので結構良かった。 今年はTwilio使うことが多かったので、APIパラメータの検証とかやっててすごく重宝した。 会社の椅子が変わる バランスボールの生活が始まる。 Rails Railsは学生時代にちょろっと書いてたり、 入社半年くらいでもそこそこ書いてたけど、 個人開発でRailsでWebアプリを書くことに。(5月くらいまで) 認証周りはだいぶハマって, Device Cancancan Rolify, Google認証でだいぶつまづいたような。 »

WebsockifyでのTCPProxy検証

websockifyは、websocket通信をTCPに変換してくれるツールです。 websockify/novnc - Github とあるソフトウェアがWebsocket通信に対応してなくて、 どうにかこうにかWebsocket経由で動かしたい…ということがあったので Websockifyで遊んでみたのと、サンプルでソースが動作しなかったのでちょっと書き加えたり telnet以外のTCP通信で動作させたらちょいとハマったのでその時のメモです。 サンプル検証 上記のリポジトリ内でwstelnet.htmlというサンプルコードがありましてブラウザからwebsocket経由でtelnet接続ができます。 環境構成図 全て同一セグメント内に配置してます。 サーバは全てCentOS7で作成しています。 環境構築 クライアント側 git clone https://github.com/novnc/websockify cd websockify open wstelnet.html telnetが動作するサーバ yum -y install telnet telnet-server systemctl start telnet.socket websockifyが動作するサーバ yum install gcc gcc-devel make git git clone https://github.com/novnc/websockify cd websockify make ./run 9999 192.168.0.20:23 サンプルソースの動作チェック クライアントのブラウザからIP とPort入れてconnnectをクリックしても動きませんでした…^^; Chromeの開発ツールを見てみると arr.shift is not a function エラーを吐いてました。 websockify/include/wstelnet.jsの61行目でarrをconsole.logで出力してみたところ Uint8Arrayと出力されました。 shiftってUint8Arrayには利用できないんですよね…. var x = [1,2,3,4,5] console. »