不動の鳥の勉強記録

時間があるときに勉強したことをメモします。

VirtualBoxでAnsible環境を整える-構成設計編

VirtualBoxの使い方等をマスターしようと思います。とりあえず長くなりそうなので何個かの記事に分けていきたいと思います。仮想環境を作るときにVirutualBoxかDockerの2択になりそうだったのですが、私が利用している環境がWindows 10 home 64bitとなっており、OSのエディションがDockerの要件を満たしていないのでVirtualBoxを選択しました。

■記事の最終目標

最終的なゴールはAnsibleの実験がしたいので3つゲストOSを構築していきたいと思います。記事の構成としては1つの記事だと長くなりそうなので下記構成で作っていきたいと思います。

■構成設計

何かやるときにとりあえず作っちゃおうが今までのスタンスなのですが、構成設計をしておくことで後工程で躓いたり元に戻ったりしないので、先にしておきます。ここではサーバとネットワークの設計をしておきます。

〇サーバの設計

今回は3台のゲストOSを作成し、用途としては1台はAnsibleの管理用サーバ、残り2台をAnsibleのスクリプトでいろいろ実験するサーバとしたいと思います。また、OSはCentOSの最新版(CentOS 7)にしたいと思います。Windows Server系もちょっと気になりますが、今後必要になった場合に実験したいと思います。

〇ネットワークの設計

今回の要件は下記2つです。

  • ゲストOS間でAnsibleのためのssh接続ができること
  • ホストOSからファイル転送のためAnsible用のゲストOSへscp接続ができること

これらを実現するには、VirtualBoxのネットワーク設定を考えます。

  1. 案:ブリッジアダプターを利用する。
    一つの方法として3台ともブリッジアダプターで構成すると、3台のゲストOSはそれぞれがホストOSと同じネットワークのIPアドレスを割り当てられます。メリットとしては、同じネットワーク間であるのでなんでもござれで通信できるのと、ポートフォワーディングなど細かいVirtualboxの設定が不要となりそうな点がメリットです。デメリットは同じネットワークなのでもし不具合が起きた場合に、同じネットワーク内の他マシンも影響を受けてしまう点が挙げられます。今回はAnsibleの実験をしたく、ホストの設定は正しく行いますが同じネットワーク内の他マシンにAnsibleのスクリプトの影響が出るのは避けたいのでこの案は採用しません。

  2. 案:NATネットワークを構成する。
    NATネットワークを構築すると、同じNATネットワーク設定のゲストOS同士の通信が可能となります。また、ポートフォワーディングを行うことで、ホストOSからゲストOSへの通信も可能となります。また、ポートフォワーディングが設定されていないゲストOSへは外部からアクセスできないようになっているので動作試験もしやすそうです。そのため、今回はNATネットワークを構成し、Ansible用のゲストOSへのポートフォワーディング設定を行うことでネットワークの要件を満たしたいと思います。

ここまできたらNATネットワークの設計とポートフォワーディングの設定を考えます。 ホストOSでnetstatコマンドを実行しホストOSのポート利用状況を確認します。確認したところ22番ポートを利用しているプログラムは見つからなかったので、ホストOSの22番ポートの通信を、Ansible用のゲストOSの22番ポートにポートフォワーディング設定を行います。また、NATネットワークについては、接続するサーバの台数が確保できるレンジのサブネット等であれば問題ないと思いますので、デフォルトのままで構築します。

〇構成設計まとめ

ここまでで今回の構成が整いましたので自分でわかるように絵にまとめたのが下記となります。ホストOSのIPはDHCP設定で時々変わるので第4オクテットはxxxとしています。ここまでで今回作成する構成がまとまりました。次の記事でこの構成に従ってVirtualBoxを操作しながら作っていきたいと思います。ゲストOSのIPアドレスを固定化したいのですが、NATネットワークではVirtualBoxDHCP設定を使うので固定化はできなさそうでした。参考に記載のベストプラクティスというので、NATとホストオンリーアダプターの組み合わせを行うことでIP固定できるそうです。

サーバ構成

ホスト名 IPアドレス OS 用途
AnsibleControl 10.0.2.xxx CentOS 7.x Ansible管理用サーバ
CentOS01 10.0.2.yyy CentOS 7.x Ansible実験用サーバ#1
CentOS02 10.0.2.zzz CentOS 7.x Ansible実験用サーバ#2

f:id:hiyo-ac:20190504181158p:plain
構成図

ポートフォワーディング設定

名称 プロトコル ホストIP ホストポート ゲストIP ゲストポート
AnsibleSSH TCP 192.168.0.xxx 22 10.0.2.xxx 22

おわりに

記事を書きながら操作しているので、後続の過程でうまくいかなかった時は内容を修正することがありますのでご容赦ください。また、内容に誤りなどありましたらコメントにてご指摘お願いします。

■参考

これらの記事がとても参考になりました。製作者の皆様に感謝です。

初心者がセキュリティコンテストに取り掛かるための第一歩を考える

GWも前半戦終了で、後半戦突入しました!そろそろ休みに飽きてきたひよです。GWの勉強として以前から気になっていたセキュリティコンテストの本を購入し一通り読み終わったので、実際にセキュリティコンテストに参加するためにどうしたらいいか考えようと思います。

■はじめに

いつまでかわかりませんが、GW中はAmazonKindle本で下記2つのセキュリティコンテストの本がお買い得です。40%オフなので興味ある方はこのタイミングにで買って積んでおくのおすすめします。これらの本の読書感想とまずどこから取り組んだらいいのかまとめておこうと思います。SECCON2019は難しそうだけど、SECCON Beginnersがあったら参加してみたい心持です。その時に役に立てばよいなと思います。

セキュリティコンテストチャレンジブック CTFで学ぼう!情報を守るための戦い方

セキュリティコンテストチャレンジブック CTFで学ぼう!情報を守るための戦い方

セキュリティコンテストのためのCTF問題集

セキュリティコンテストのためのCTF問題集

■読書感想

セキュリティコンテストの問題は大きく下記5つのセクションがあるようです。

どのセクションにも共通するのが、何もツールを持たないで挑むべからずということでした。バイナリ解析ではデバッガを駆使したり、pwnでは逆アセンブルしてみたりとツールがないと何も進みません。この点はプログラミングの問題とは違っているところだなと実感しました。

各セクションの個人的な感想を記載すると…

  • バイナリ解析およびpwnは、アセンブリの解析およびメモリの番地を操作するような内容となっていて、学生時代から苦手意識がある分野なので読むのにすごい時間がかかりました。ただ、バッファオーバーフローでシェルを乗っ取る仕組みとかがわかったので勉強になりました。これらの問題が起きないようにちゃんと実装しているプログラマは高いスキルが求められるので、スキルの低いプログラマが作ったプログラムは脆弱性が生まれそうだなと感じました。

  • ネットワークはほんとうにWiresharkでした。拡張子がpcapのものはWiresharkで開けということを覚えました。これさえ頭の片隅にあれば解析には着手ができそうです。また、分割して送られてくるパケットをまとめてダウンロードする機能は便利ですね!これでプロミスキャスモードがあると、平文では何も送れません。

  • Web問題とSQLインジェクションは、よく問題になる点なので攻撃手法の例があって参考になりました。利用しているMWの製品やバージョン情報からアタック仕掛ける手法があって、それらの情報は隠さないとダメなんだなと実感しました。よくあるのはMWインストール後のデフォルトページにバージョンが表示されてい、絶対にやっちゃいけないので、GW明けに出社したら差し替え/対応すること上長に相談必須です。

まとまりはありませんがこんな感じになります。一人ですべてのセクションの問題を解くには、幅広い分野の知識が必要になるため勉強にはうってつけです。これらの本には例となるプログラムとその動作が記載してあるので、仕組みを理解することはできるでしょう。ただし一回では身に付きにくいので、苦手分野の問題は復習したほうがいいと思います。

■セキュリティコンテストに臨むにあたって

初心者が第一歩を踏み出すには考えてみました。大きくは下記3つ準備できたらばっちりだと思います。ただこれらの準備をするにも労力が必要になるので、趣味の領域かもしれません。

  • 実験環境の準備する
  • 解析ツールのレパートリーや使い方をマスターする
  • 実際の問題を解きつつ回答を理解する

まず、バイナリ解析などのセキュリティコンテストの問題では解析対象のファイルをダウンロード等して入手することができます。ただこれらのファイルを自分のマシンで実行すると自分のマシンに不具合が起きる可能性がなきにしもあらずです。そのためVirtualBoxなどで解析用の壊れてもいい環境を用意しておくことが望ましいです。また、ファイルについても実行形式があるので、その実行形式で実行できる環境があるのは強味です。

次にWiresharkなど解析を行う際の定番ツールの使い方は押さえておく必要があります。また、バイナリ解析等ではファイルのセキュリティ構造を調査するための調査シェルなどがGithubにあるようなので、自分の使いやすい解析ツールを探したり、自分で作ったりして使い方をマスターしておくと解析しやすいと思いました。これらの本の中でもいくつか紹介してくれているので、それらのツールをマスターしておくのは最低限かと思います。

最後に、やはり実際の問題を解いて勘所をつかむというのは大事だと思います。いろいろな方がセキュリティコンテストが終わった後に、write-upの記事を書いてくれているのでどうやって解くのかとても参考になります。つい先日行われたSECCON 令和CTFも多くのWriteupの記事があり勉強になります。PDFファイルは複数の画像から構成されているため、隠れている画像を抽出するとか知ってたらすぐわかる問題ですが、知らなかったら時間がかかります。

■おわりに

セキュリティコンテストに参加するのはきっと楽しいのですが、なかなかハードルが高いように感じています。ただ準備すればいいことなどは見えてきたので、SECCON Beginnersがあったら参加して、来年のセキュリティコンテストは参加してみたいと思っています。チーム戦なのでチーム組んでくれるメンバ探さないといけないのですがね。

本記事について誤りなどありましたらコメント欄にて指摘お願いします。また、セキュリティコンテスト上級者の方はアドバイスなどありましたら、そちらもコメント欄でぜひぜひ教えてください!

netshとMicrosoft Message Analyzerでパケット解析を行う

いつの間にかGWに突入してます。ひよです。会社は連休だけど休んだ分の仕事はなくならないので、役に立つ勉強をこの期間にやろうと思ってます。そのあとはKindleCTFの本が安かったので、その本で技術力の底上げを目論んでいます。

はじめに

パケットキャプチャするならWiresharkなど有名なツールが世間には多く出回っています。みなさんWireshark使われているのではないでしょうか。今回はWiresharkがインストールできない環境でパケット解析しなければならない要件だったので、Windows標準機能で頑張ってみたいと思います。netshでのキャプチャ取得はいろいろな方のブログ等ありますので、知っている人は飛ばしていただいていいかと思います。Micorosoft Message Analyzerはワンポイント新しい発見があればと思います。

■環境

■アウトライン

  1. netshでキャプチャを取得する。
  2. Message Analyzerでパケット解析する。

1. netshでキャプチャを取得する。

netshはWindows標準のパケットキャプチャでWindows Server 2008以降であればインストールされているはずです。今回の要件ではパケットキャプチャソフトを対象サーバにインストールできなかったのでnetshで情報を収集します。 まずは、管理者権限でコマンドプロンプトを起動します。特に難しいことせず何でも取得するには、下記コマンドを実行することでキャプチャが開始されます。

netsh trace start capture=yes

実際に実行した画面が下記となります。ログインしているユーザのホームディレクトリ配下にトレースファイルが保存されます。デフォルトのファイルサイズは250MBでログは循環で保存していることがわかります。ファイルサイズなどを変更する場合はオプションで変更ができます。

f:id:hiyo-ac:20190429230424p:plain
capture1

次に後続の工程でパケットキャプチャできているか確認するため、はてなブログ(hatenablog.com)に対して、DNS名前解決でIP調べること、pingでICMPパケットを作成すること、curlでhttp通信を作成して観察します。

  • DNSでIP調べる※DNSサーバ情報は隠しています。

f:id:hiyo-ac:20190429230933p:plain
capture2
IPアドレスの特定ができました。

f:id:hiyo-ac:20190429231024p:plain
capture3
pingタイムアウトしているので、echoの応答は行わない設定になっているものと思います。※yahoo.co.jpなどは応答があるので、はてなブログの設定と思います。echo応答がないパターンを観察できそうです。

  • curlでhttp通信を行う

f:id:hiyo-ac:20190429231450p:plain
capture4
nginxの応答が来ているので、httpリクエスト自体は成功していそうです。

このように実験はできたので、パケットキャプチャを停止します。上記情報が循環されずにトレースファイルに残っていることを祈るばかりです。停止する場合は下記コマンドを実行します。

netsh trace stop

実際の実行画面は下記となり、トレースファイルは拡張子が、.etlのものとなります。追加情報としてWindowsのログ一式が.cabファイルとして生成されます。

f:id:hiyo-ac:20190429231657p:plain
capture5
.etlのファイルはおよそ4MBだったので循環されずに残っていそうです。

2. Message Analyzerでパケット解析する。

netshで作成したファイルは、.etl形式で保存されます。この形式のファイルを開くためにMicrosoft Message Analyzerを利用します。Microsoft Message Analyzerをインストールされていない場合は、こちらからダウンロードしてインストールしてください。今回のゴールは、1で実施したはてなブログ(hatenablog.com)へのping通信とcurl通信のパケットをトレースファイルから見つけることまでとします。実際はその通信がどうだったのか迄調べる必要がありますが別途勉強が必要なので次回あったら記事作成します。

まずはMessage Analyzerを起動し、先ほどのトレースファイルを開きます。

f:id:hiyo-ac:20190429232955p:plain
capture6
今回調査したいのは特定の宛先(hatenablog.com)への通信がどうなっているかを調べたく、このままだと宛先のIPアドレスが表示されていないので表示のレイアウトを変更します。 レイアウト変更は、「Layout」>「Network」>「Network monitor」を選択します。
f:id:hiyo-ac:20190429233739p:plain
capture7
「Network monitor」を選択すると、ページ中ほどに表示されている情報が変わり宛先の情報が表示される「Destination」というカラムが出現しわかりやすくなります。
f:id:hiyo-ac:20190429234253p:plain
capture8
そうしましたら、あとはページ上部のFilterを記載するテキストエリアにフィルタ条件を設定します。 今回は、hatenablog.comへの通信を確認したいので宛先のIPアドレスの情報をフィルタ条件として入力して、「Apply」をクリックします。
f:id:hiyo-ac:20190429234826p:plain
capture9
ページ中ほどの情報が調べたいもののみとなりました。 上位4つのICMPはタイムアウトしたpingの情報となり、MessageNumberが590がcurlコマンドの情報となり特定ができました!

おわりに

Microsoft Message Analyzerについてはあまり参考になるサイトもなく、リファレンスも英語なのでいきなり使いこなすのは難しいと個人的に思いました。本記事がみなさんのお役に立てたら幸いです。本記事について不明点や誤りなどありましたらコメントお願いします。

ゴルフについて考える

最近会社の人からとてもゴルフを勧められているひよです。クラブももらってしまったことから頑張ろうと思ってます。そのためゴルフについて思いついたままのエッセイ書きます。あと、いままではてな記法で記事を書いていたのですが、これからはMarkdownにしようと思います。

■はじめに

個人的にゴルフって始めるときになかなかハードル高いと感じています。その理由は下記2つです。

  • これから新しいことを始めるときの第一歩を出す力がなくなってしまった。(意志力)
  • コースに出たりするのにいろいろとお金がかかりそう。(経済力)

これらをどうにかしたいなと思ったときに1つ目の理由は、強く誘ってくれる人がいるからその人についていけばいいので簡単だ!と最初は思っていました。ただ、数回打ちっぱなし場に行ってみて気が付いたのは、なかなか上達している感じがわかない。どれだけ練習すればいいんだろうかというモチベーションを保つのがやっぱり大変だ。

2つ目の理由については、せっかく副業が流行っている世の中でプログラミングなどの力もそこそこついているので、やる気になれば副業もできるのじゃないか?と安易な考えで収入源を増やせばいいかと思ったりした。

そこで、せっかくならゴルフについて自分のモチベーションを維持しつつ収入になるような何かができないかと考えてみました。

■ゴルフ業界について

少子高齢化と経済の不況を理由にゴルフ人口はどんどん減っているとの統計がでています。ゴルフ人口推移の情報では、2010年にはおよそ800万人いたゴルフ人口は、2016年ではおよそ600万人まで減っています。ただゴルフ事業を展開している株式会社平和のセグメントごとの売り上げ高を見てると700億円程度の規模はあり、売り上げ高の推移横ばいとなっていますので市場規模的には小さくはないかと思います。ただし2030年にはゴルフ人口は280万人程となる推測だそうです。

■ターゲット層について

ゴルフ人口についてもっと調べていくと、2016年時点では600万人のゴルフ人口のうち、およそ70%を40代以上の世代が占めていました。そのため30代以下の人々は180万人となります。

今回ターゲットとしたいのはゴルフをやってみたい若い人および、ゴルフやってみたけどラウンドに出ていない人を対象としたいと考えています。

その母数をアンケート回答結果から計算してみると、

・20代及び30代でラウンド未経験者で意向ありは約8%

・20代及び30代でゴルフ未経験者で意向ありは約25%

はいるそうです。ラウンド未経験者は180万人のうちの8%なので、14.4万人。

ゴルフ未経験者は2018年の日本の人口ピラミッドから出すと、20代および30代の総人口は1,397万人、ゴルフ人口が180万人で意向ありが25%なので、304万人となります。

 

■収入の得方について

インターネットのWebサイトとかだとアフィリエイトの広告が画面上のどこかにあったりします。そのためアフィリエイト報酬で収入を得ようと考えたときに下記サイトを見つけました。

ゴルフのアフィリエイトをする方法・ASPで取り扱いがあるのはどこ? - ゼロからはじめるアフィリエイト

アフィリエイトも種類は、ゴルフ場予約、ゴルフスクール、ゴルフ用品と大きくこの3つがあるようです。先のターゲット層としているのが、ゴルフを始めた初心者とするとゴルフスクールのアフィリエイトは相性がよさそうです。また、アフィリエイト報酬の単価ではゴルフ場予約よりもゴルフスクールのほうが報酬額が高いので利益もでやすそう。私も一度無料体験に行ったことがあるので、行ってみてよかったら契約してくれるはず!と思います。ゴルフスクールの契約成功率はきっとその時にいた受付のお姉さんの話術次第なので、そういう方がいるところだと成功率も上がりそうですが運次第ですかね。

■費用について

何か作るときには機材等が必要になるわけです。今回は簡単なWebアプリケーションを作るとすると…アプリ開発費、仮想サーバレンタル費、DNS登録料などなどがかかります。アプリ開発費は私のボランティアとして行えば0円なのでよいとして、仮想サーバレンタル費およびDNS登録料は年間で1万円程度はかかりそうです。ゴルフスクールの報酬がいくらかわかりませんが、1000円/件とし、ターゲットの母数が300万人でアフィリエイト成功率を仮に0.01%とすると、30万円しか稼げる見込みがありません。

それで年間1万円運用費がかかり、5年継続すると25万円の儲けしかないようです。

■おわりに

私の身近の出来事がゴルフだったので題材にし、インターネットの情報からターゲットとか規模とか計算してみましたが、ターゲットを絞りに行くと一発あてるのは厳しそうですね。世間に私がほしいアプリがない理由がわかった気がします。

またインターネットを探していたら、株式会社リクルートライフスタイル様がアンケートを行って分析した資料が見つかりました。アンケート結果なども自分の考えと同じなので世間的に自分の考えは大衆意見なのだと共感が持ててよかったです。よくよく調べると2013年のアンケートなのでちょっと古い気もします。

本記事についてコメント等ありましたらいただけると嬉しいです。

参考

bcryptを使ってパスワードをハッシュ値に変換する

会員認証アプリケーションを作成する際、たいていの場合は会員認証にIDとパスワードを用いて認証を行います。
教科書ではパスワードは平文で保管してはいけないと記載があり、
ハッシュ値に変換するなどの手法を紹介しています。
そこで今回はNode.jsでハッシュ値に変換するbcryptの使い方を勉強しました。

■はじめに:パスワードはハッシュ値にするだけでいいの?

私が大学生の時の授業ではとりあえずMD5関数を利用してハッシュ値にしておけ!みたいな時代でしたが、
最近はレインボー攻撃というものが登場しているとのことです。
この攻撃では入手したハッシュ値をあらかじめメッセージをハッシュ値に変換しておいたテーブルとぶつけ、
ハッシュ値にする前のメッセージを入手する手法とのことです。
この対策として下記2つの対応方法がありました。

・saltを付与する

 ハッシュ値にするメッセージをm、ハッシュ値の関数をh(x)、saltをsとしたときに、
 ハッシュ値=h(m||s)として、saltを追加したメッセージをハッシュ化することで、
 元のメッセージの解析を難しくする手法とのことです。
 saltをどうするべきか(メッセージの前に付与する?後ろに付与する?saltはユーザごとに作成すべき?など)は、
 いろいろな方法がありますが、計算機の進化でハッシュ値計算も時間がかからなくなってしまってきているので、
 しないよりした方がいいよ!という観点で深く考えすぎないほうがいいかと思います。
 「パスワードにはsalt(塩)を振って使いましょう」という文句が覚えやすそうです。

・ストレッチングする

 ストレッチングは関数でハッシュ値にした結果を、さらに関数でハッシュ値にするという手法です。
 何回関数を実行したらいいか?については、多くした方が解析が困難ですが毎回ログイン認証のたびに、
 数十回も関数を実行しているとCPUを多く消費するのでサーバスペックと相談です。

■bcryptを使ってみる

 今回の記事の本題です。Node.jsでbcryptを使ってみます。
 bcryptのページは下記となり、bcryptを使用するだけでsaltを付与することとストレッチングを行えます。
 www.npmjs.com
 Nodeのバージョンによって互換性があるので、今回の記事は下記環境で行います。
 

・環境

 OS: Windows 10 home 64bit
 Node: v10.15.0
 bcrypt: 3.0.3

・bcryptをインストールする

 まずはbcryptをインストールします。

 npm install bcrypt --save

 上記コマンドを実行しても私の環境ではERRが発生インストールできませんでした。
 どうやら依存関係が整っていないらしく、
Installation Instructions · kelektiv/node.bcrypt.js Wiki · GitHub
に従い、管理者権限でpowershellを起動し下記コマンドを実行します。

 npm install --global --production windows-build-tools

 再度bcryptをインストールします。問題なく成功しました。

 npm install bcrypt --save
・bcryptを使ってハッシュ値を作成する

 サンプルのスクリプトを用いて確認します。
 今回は後続ステップでbcryptで生成したハッシュ値を使うので同期メソッドを利用しています。
 非同期が推奨のようですが、DBにハッシュ値にしたパスワードを格納する際は、
 非同期メソッドでハッシュ値を作成したときにコールバックに記載するなどしないと、
 データがなくて登録処理失敗することが予想されます…

/* bcrypt-sample.js */
'use strict'

const bcrypt = require('bcrypt');
const saltRounds = 10; // ストレッチングの回数
const myPlaintextPassword = 's0/\/\P4$$w0rD';
const someOtherPlaintextPassword = 'not_bacon';

// ハッシュ値を生成する
var hash = bcrypt.hashSync(myPlaintextPassword, saltRounds);

console.log("myPlaintextPassword: " + myPlaintextPassword);
console.log("someOtherPlaintextPassword: " + someOtherPlaintextPassword);
console.log("hash: " + hash);

//ハッシュ値を比較する
console.log("compare : '" + myPlaintextPassword + "' with '" + hash + "', result: " + bcrypt.compareSync(myPlaintextPassword, hash));
console.log("compare: '" + someOtherPlaintextPassword + "' with '" + hash + "', result: " + bcrypt.compareSync(someOtherPlaintextPassword, hash));

 上記スクリプトを実行します。

$node bcrypt-sample.js
myPlaintextPassword: s0//P4$$w0rD
someOtherPlaintextPassword: not_bacon
hash: $2b$10$YRZKU2MoISXVNNWSNdVLiuQ4H0cnMpIijbAF99v2Wk907nNBEJMpy
compare : 's0//P4$$w0rD' with '$2b$10$YRZKU2MoISXVNNWSNdVLiuQ4H0cnMpIijbAF99v2Wk907nNBEJMpy', result: true
compare: 'not_bacon' with '$2b$10$YRZKU2MoISXVNNWSNdVLiuQ4H0cnMpIijbAF99v2Wk907nNBEJMpy', result: false

このようにハッシュ値が生成されていることと、比較結果が確認できます。
bcryptで生成されたハッシュ値の文字数は60となり、
'$2b$10$YRZKU2MoISXVNNWSNdVLiuQ4H0cnMpIijbAF99v2Wk907nNBEJMpy'
の見方について先頭から…
 $2b$:暗号化のバージョン
 $10$:ストレッチングの回数
 YRZKU2MoISXVNNWSNdVLiu:salt
 Q4H0cnMpIijbAF99v2Wk907nNBEJMpy:ハッシュ値
となります。

毎回実行するたびにsaltが変更になるため、hashが変更になってしまうので…
DBに格納するときや参照するときは念のため気を付けた方がよさそうです。
 

■終わりに

IDとパスワードでセキュリティを確保しようというのは、難しい時代になってきたと感じました。
Y社は認証技術の黒帯の方もいるぐらいですし、認証技術は日々あれやこれやとユーザを守るために進歩してますね。
自分たちで認証手法を確立する技術力を持っていたらいいですが、それなりのセキュリティを確保したい場合は既存ライブラリを使うのが早そうです。

内容に誤り等ありましたらご指摘お願いします。

以上。

Node.jsでMySQL 8.0へ接続する

2019年一つ目の記事は、Node.jsでMySQLのDBへ接続するプログラムについてです。
いろいろな方がすでに記事を投稿されていますが、学んだことはアウトプットするのが今年の目標なので、
いつか見返す時のために記事にして残しておきます。
新年なので、環境系のフレームワークはとりあえず全部最新にしていきたいと思います。
何か問題があったらバージョン落とします。

■環境

 OS: Windows 10 Home 64bit
 DB: MySQL Server 8.0 Community Edition
 node: v10.15.0
 npm: 6.4.1
 mysql: 2.16.0
 

■アウトライン

 1. DBにテーブルを作成する
 2. MySQLに接続するためのドライバをインストールする
 3. DBに接続しSELECTするスクリプトを作成する

早速まとめていきたいと思います。

1. DBにテーブルを作成する。

簡単なテーブルを一つMySQLに作成します。
このテーブルにデータを入れたり、選択したりしていきます。

-- スキーマを作成する。
CREATE DATABASE `nodesample` DEFAULT CHARACTER SET utf8 ;

-- スキーマ内にテーブルを作成する。
USE nodesample;

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- サンプルに1件レコードを挿入する。
INSERT user(name, age) VALUES ('太郎', '30');
2. MySQLに接続するためのドライバをインストールする

MySQLへの接続のモジュール(ドライバ)としてmysqlが有名とのことで早速インストールします。
www.npmjs.com

コマンドプロンプトを開いて次のコマンドを実行します。

npm install mysql

しばらくたつとインストールが完了します。
package-lock.jsonをみると今回インストールしたmysqlは、2.16.0でした。

3. DBに接続しSELECTするスクリプトを作成する

mysqlのページを参考にとりあえずDBに接続するスクリプトを作成します。

/* sample.js */
'use strict'

const mysql = require('mysql');
const connection = mysql.createConnection({
    host: '127.0.0.1',
    user: 'nodeuser',
    password: 'nodeuser',
    database: 'nodesample',
});

// Connectionを定義する
connection.connect();

let sql = 'select * from nodesample.user';
connection.query(sql, (err, rows, fields) => {
    if (err) throw err;
    console.log('userテーブル: ', rows);
});

connection.end();

で次のコマンドで試してみるとエラーが発生しました。

node sample.js
D:\workspace\MySQL-Sample\sample\sample.js:17
    if (err) throw err;
             ^

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    at Handshake.Sequence._packetToError (D:\workspace\MySQL-Sample\sample\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
    at Handshake.ErrorPacket (D:\workspace\MySQL-Sample\sample\node_modules\mysql\lib\protocol\sequences\Handshake.js:124:18)
    at Protocol._parsePacket (D:\workspace\MySQL-Sample\sample\node_modules\mysql\lib\protocol\Protocol.js:278:23)
    at Parser.write (D:\workspace\MySQL-Sample\sample\node_modules\mysql\lib\protocol\Parser.js:76:12)
    at Protocol.write (D:\workspace\MySQL-Sample\sample\node_modules\mysql\lib\protocol\Protocol.js:38:16)
    at Socket.<anonymous> (D:\workspace\MySQL-Sample\sample\node_modules\mysql\lib\Connection.js:91:28)
    at Socket.<anonymous> (D:\workspace\MySQL-Sample\sample\node_modules\mysql\lib\Connection.js:502:10)
    at Socket.emit (events.js:182:13)
    at addChunk (_stream_readable.js:283:12)
    at readableAddChunk (_stream_readable.js:264:11)
    --------------------
    at Protocol._enqueue (D:\workspace\MySQL-Sample\sample\node_modules\mysql\lib\protocol\Protocol.js:144:48)
    at Protocol.handshake (D:\workspace\MySQL-Sample\sample\node_modules\mysql\lib\protocol\Protocol.js:51:23)
    at Connection.connect (D:\workspace\MySQL-Sample\sample\node_modules\mysql\lib\Connection.js:118:18)
    at Object.<anonymous> (D:\workspace\MySQL-Sample\sample\sample.js:13:12)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)

■エラーメッセージ

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server;

でグーグルを検索すると、Node.jsでMySQL 8.0へ接続しようとするときにみなさん発生しているようです。
一番参考になったのが下記ページの次のコメントでログイン時のパスワード認証が変更になっているのが、
mysqlで対応していないそうです。
node.js - MySQL 8.0 - Client does not support authentication protocol requested by server; consider upgrading MySQL client - Stack Overflow

This is because caching_sha2_password is introduced in MySQL 8.0, but the Node.js version is not implemented yet. You can see this pull request and this issue for more information. Probably a fix will come soon!

そのため、ログインユーザのパスワードをMySQL Wrokbenchから変更します。
※アカウント名とパスワードが同一なのはサンプルのためなので、普段は絶対にしないようにしましょう。

ALTER USER 'nodeuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'nodeuser';
FLUSH PRIVILEGES;

これで再度サンプルスクリプトを実行してみるとレコードを選択することができました。

node sample.js
userテーブル:  [ RowDataPacket { id: 1, name: '太郎', age: 30 } ]

■終わりに

今回RDBMSMySQLを選択したのは、将来的にAWS Auroraへの移植を考えてSQL Server以外の製品を選択してみました。
SQL ServerはEnterprise版は2コアでいいお値段するので、SQL Serverを選択する理由はあまりなくなってきてしまいました。ただ、プレミアサポートなどのサポート体制があるのは強味ですね。

以上。

2018年の振り返りと来年を考える

2018年は新しいことに挑戦しようとしたひよです。
一年の振り返りと来年のことを考えようと思います。

■2018年振り返り
 今の職場は危険を感じていたのでいろいろと挑戦を行うことと、
 自分のしたいこと探しをしていましたが、実らなかったので来年は改善をしたいと思います。

〇お仕事に関わること
 ・VUIアプリ開発した
  Google HomeやAlexaが2017年の終わりにでました。
  VUIの時代になるかもしれない?とのことで、
  趣味でGoogle HomeアプリおよびAlexaスキルを開発してみました。

 ・セキュリティの勉強した
  セキュリティ分野の求人が増える可能性があるため、
  情報処理安全確保支援士を取得しました。
  ただ、今の職場は資格は何も評価されないので何かするためのアイテムにしたい。

 ・IoTの勉強をした
  IoTが流行りになってくるため、センサデバイスの操作の勉強と、
  世間一般の知識を身に着けるための検定試験を受験しました。

 ・転職サイトに登録してみた
  転職サイトに登録しました。キャリアカウンセラーと一度お話してみたところ、
  今の職歴だと高い賃金は得られないときっぱり言われてしまいました。
  上流工程の経験がないと高い給料は得られないようです。


〇プライベートに関すること
 ・旅行した
  3月に滋賀県および京都府へ旅行しました。
  日本はよいところだと再認識し、都会もいいけれど落ち着いた町も素敵だと感じました。

 ・大学生時代の親友が結婚した
  大学生時代からの付き合いがある友人が今年結婚しました。
  30歳になる歳のため相手探しをしなきゃいけないと焦りだしました。
  「With」を始めてみました。

 ・ゴルフのお誘いを受けた
  協力会社の方から強いゴルフの勧誘をいただきました。
  なんだかんだで片手以上の回数は打ちっぱなしに行きました。楽しいけれど上達はなかなか難しい。

 ・同級生と会う機会が増えた
  学生時代の友人と遊びに行くことが多くなりました。
  釣りに行ったり、栃木に遊びに行ったり、上述のゴルフを一緒にやったり楽しい出来事増えました。

■2019年の計画
 プライベートとお仕事それぞれざっくり考えたいと思います。
 目標をもって進めていけば叶うと思うので進めていきます。
 アウトプットを増やしていきたいと思います。

〇お仕事に関わること
 ・クラウドの勉強をする
  エンジニアとして過ごしたい気持ちもあり、常に勉強はしていきたい。
  ということで、AWS認定資格は取得する。

 ・上流工程へ参画する
  業務部門との要件調整はとても大変なお仕事ですが、
  今後のキャリアアップのためには必要なことなので、
  そのような機会があれば挑戦していきたい。

 ・転職も視野にいれる
  来年の景気と、勤めている会社をとりまく情勢は厳しいものとなっていくと思います。
  外もしっかり見て自分の将来を考えていきたいと思います。

〇プライベートに関わること
 ・海外を見に行く
  来年の9月で10年パスポートが期限切れとなるので、海外に行きます。
  特に英語圏の国にいきたい。

 ・出会いの場を広げる
  「With」等のアプリを継続していきたいと思います。
  よい相手が見つかると嬉しい。

以上。
一年間お世話になりました。来年もよろしくお願いします。