主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

ブログ移転計画

                
 しばらく更新できてなかったが、自分でブログエンジンを書いて移行しようかと考えている。以前にそういうものはPython+GAEで作ったが、もうGAEからはおさらばしたい。新しい環境はASP.NET MVC + MongoDB on Linux。Dockerも利用を考えている。

 とりあえずDockerでNginX、ASP.NET MVC、MongoDBをsupervisordで管理するものを用意した。あとはコードを書いていくだけだ。

1604090026063.jpg

Dockerfile
FROM matoba/aspmvc

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 && \
echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.2 main" | tee /etc/apt/sources.list.d/mongodb-org-3.2.list && \
apt-get update && \
apt-get install -y mongodb-org && \
apt-get -y install nginx && \
apt-get install -y supervisor

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN rm /etc/nginx/sites-enabled/default
ADD nginx.conf /etc/nginx/conf.d/
RUN /etc/init.d/nginx reload
RUN mkdir -p /data/db

COPY . /app
WORKDIR /app
COPY mongod.conf /etc/mongod.conf

EXPOSE 80
ENTRYPOINT /usr/bin/supervisord -c supervisord.conf


nginx.conf
server {
listen 80 default;
server_name example.org;
access_log /var/log/nginx/example.log;

location / {
proxy_pass http://127.0.0.1:5004;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}


mongod.conf
processManagement:
fork: false
net:
bindIp: 127.0.0.1
port: 27017
storage:
dbPath: /data/db
systemLog:
destination: file
path: "/var/log/mongodb/mongod.log"
logAppend: true
storage:
journal:
enabled: true


supervisord.conf
[supervisord]
nodaemon = true

[program:nginx]
command = nginx

[program:mongodb]
command = mongod --config /etc/mongod.conf
user = root
autostart = true
autorestart = true

[program:aspmvc]
command = dnx -p project.json web

DockerでSQLインジェクションを試せるイメージを用意する

                
 今となってはいろいろ対策の手が打たれているが、それでも知識もなくWebアプリを作るとうっかりできてしまうことがあるSQLインジェクション。どんな立場からどんな攻撃ができうるかを示すために、脆弱性を持ったWebアプリを作ってみようと考えた。
 それを使って脆弱性をつついてもらうデモにしたい。つついてもらったらデータベースに変更が入る。そうしたら別の人に試してもらうにはリセットが必要となる。もろもろの環境リセットが簡単にできるとデモとして最高。そういうわけでDockerイメージとして脆弱性を持ったWebアプリをすぐ実行できるものを用意する。


 Webアプリ部分はどんなものにするか。とりあえずすごく簡単なものにしておく。アクセスしてきたクライアントにフォームを返す。フォームに名前を入力してPostする。フォームに入力された名前がデータベースにあれば、実行されたクエリ文とその名前が表示される。入力された名前がデータベースになければエラー文が表示される。以上のものをPythonで書いた。
1601241839287.jpg
1601241839493.jpg
1601241840245.jpg
 「John」とポストするだけなら問題ない。「John"; SELECT * FROM employees;DROP TABLE employees;"」などとポストされるとJohnの登録されていたテーブルが落ち、以降はJohnと入力してもデータベースにそもそもテーブルがないためエラーとなる。


Dockerfileは以下。
FROM ubuntu

RUN apt-get update && apt-get -y install nginx && \
apt-get install -y supervisor && \
apt-get install -y python3-pip && \
pip3 install gunicorn && \
pip3 install tornado

RUN apt-get install -y mysql-server

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN rm /etc/nginx/sites-enabled/default
ADD hello.conf /etc/nginx/conf.d/
RUN /etc/init.d/nginx reload

ADD * /usr/
WORKDIR /usr/
RUN dpkg -i mysql-connector-python-py3_2.1.3-1ubuntu14.04_all.deb
RUN /etc/init.d/mysql start && \
mysql < init.sql

EXPOSE 80
CMD /usr/bin/supervisord -c supervisord.conf

 Python製Webアプリ、MySQL、NginXはsupervisordでコントロールにした。PythonのMySQLConnectorはpipインストール設定が手間だったのでdebパッケージを落としてきてdpkgコマンドインストールにした。

 その他ファイルの設定はGithubにて公開中。
https://github.com/hMatoba/SQLInjection-DockerSample

 上記のDockerfileがあるディレクトリでビルドを実行する。
> docker build -t matoba/sql_injection ./
 
 ついでにどこからでもダウンロードできるようにプッシュしておく。
> docker push matoba/sql_injection

 イメージをダウンロードし、そこからコンテナを立ち上げて試してみる。
> docker pull matoba/sql_injection
> docker run -d -p 80:80 --name sql_inj matoba/sql_injection
1601241927297.jpg


 動いているので問題なし。あとはデータベースを含めたWebアプリ部分をもうちょっとまともにする。今のままでも試すことはできるが、かなり最低限に絞っているので試した人のインパクトは小さいだろう。
 Dockerのおかげで、いつでも使い捨てができる手軽なSQLインジェクションの脆弱性を持ったWebアプリデモが簡単に用意できるようになった。
 

JavaScript: Githubで公開しているライブラリをBowerにプッシュ

                
tags: JavaScript
 Githubで公開しているJavaScriptライブラリに、Bowerへプッシュしてくれないかとリクエストが来た。それを機にBowerへプッシュしてみたので簡単に流れを。

 Bowerとは・・・フロントエンド、つまりクライアントサイドのライブラリ管理ツールらしい。ざっくり言えばUbuntuでのapt、Pythonでのpip、Nodejsでのnpmのようなものだろうか。
https://msdn.microsoft.com/ja-jp/magazine/mt573714.aspx

 Bowerへプッシュする。

 まずNodejsをインストールし、npmコマンドを使えるようにする。そうしたらbowerをnpmでインストールする。
> npm install -g bower
 bowerをインストールしたらbowerコマンドが使えるようになっているはずである。コマンドプロンプトにbowerと打って実行できなければ、bowerがインストールされている場所を指定する必要がある。npmのパッケージの一つとしてインストールされるので、そこを探してみると見つかるかもしれない。ぼくの環境では結局以下のようになった。
> c:\nodepackages\bower --version
bowerコマンドがちょい長いので以下ではbowerと省略する。

 bowerコマンドが使えるようになったら、次はGithubに上げているファイルにbower.jsonを追加する。これはライブラリがどんなものかを説明する情報ファイルである。説明している人はちらほらいるので実例を一つ以下に。
{
"name": "piexifjs",
"description": "Read and write exif.",
"main": "piexif.js",
"authors": [
"hMatoba"
],
"license": "MIT",
"keywords": [
"jpeg",
"exif"
],
"homepage": "https://github.com/hMatoba/piexifjs",
"moduleType": [],
"ignore": [
"**/*",
"!piexif.js",
"!bower.json"
]
}

 ignoreを設定しないと、不要なファイルまでもろもろユーザーにインストールされてしまうことになる。それなら一つ一つ含めないファイルを指定するより、必要ファイル以外は含めないでと指定するほうが楽である。
 上記のbower.jsonをパッケージのルートに置く。そうしたらあとはbowerコマンドを打つだけである。
> bower register <my-package-name> <git-endpoint>
これでbowerにプッシュが完了するので、bowerコマンドでパッケージインストールが可能になる。
> bower install <package>

小型ファイルサーバ

                
tags:
WP_20160110_23_38_51_Pro.jpg

 Raspberry Piが最近持て余し気味で、2.5インチHDDも一つ余ってた。なのでsambaを使ってRaspberry Piをファイルサーバにした。以前はHDDケースが3.5インチも共有のでかいものだったので小型と言えない大きさだった。今回は2.5インチHDD専用のケースを買ってきた。おかげで厚さを考えなければ無線ルータより小さいスペースに収まっている。
 こういうことをする一つの手っ取り早い手段はNASを買ってしまうことだ。けどそれは数万ぐらいするので手軽とは言い難い。ルータがUSBでHDDをつなぐことで簡易NASとして使えるようになるものもある。けど日本製のそれなりのものでも大抵はHDDのフォーマットとしてNTFSが使えない。海外メーカーのそれなりのものでNTFSを扱っているものはあるが、これまた手軽とは言い難い。日本製のそれなりのルータを持っていてそれを買い替える必要がなければ、今回のようにRaspberryPiでやってしまってもコスト的には結局トントンぐらいになる。RaspberryPiの設定を苦にしないならという条件は付くが。
 とりあえずこれでHDDをPCに物理的接続をしなくても、ネットワークに接続すれば見られるようになった。便利。

今年やろうかなと思うこととか

                
tags:
 大きく分けて二つ。JavaScriptでいろいろやるのとASP.NET MVC。

 JavaScriptではNode.jsに注目している。ドキュメントの最初のサンプルがたしかNode.jsだけで、ApacheなどいらずにWebサーバーになっている。思いついたプロトタイプを手早く作るのがだいぶ楽かも。Python + GAEでやっていたところはNode.js + Herokuでいける。IoTもやりやすそう。
 今年はRaspberry Pi2を買ってIoTをつついてみたいと考えている。WebサーバーがNode.js単独でいける上、Windows 10にて導入されたUWPアプリのAPIに、Node.jsからフルに触れるようだ。
https://blogs.windows.com/buildingapps/2015/05/12/bringing-node-js-to-windows-10-iot-core
 Webサーバーいける、IoTもいける、となると個人的な工作をするにはいろいろと楽しめそう。いざとなればECMAScriptルーツのC#への書き換えも他言語よりは楽だろう。蛇には冬眠に入ってもらうか……。
 Node.jsの欠点としてはCPUにヘヴィーな処理をやっていくのには向かないというところ。
 今のところNode.jsのドキュメントは全然読んでいないが、Node.jsで使えるライブラリをなぜか一本公開してある。テストも書いてあって数人ばかりフォークしているような状態。しかしとりあえず基礎からやってHerokuに一本行ってみる……ことからだろうか。


 もうひとつはASP.NET MVC。それなりの規模のWebアプリの開発にMVCフレームワークをおさえておきたいという考えがあったので、好きなC#でなおかつクロスプラットフォームでいけるASP.NET MVCを選択した。.NETなら互換性を破壊するような言語使用の変更は巷で話題のスクリプト言語より少ないようにも思うし、セキュリティアップデートも言語仕様の変更とは別れて配布なはず。アップデートをあてたら動かなくなったとかはほぼない、あっても軽微な修正で済む……はず。
 ASP.NET MVCはLinux対応のベータやらなんやらの段階ですでに動くものは出てきている。二つ持っているブログのうちどちらかをASP.NET MVCに移植し、適当なLinuxサーバあたりを借りつつのっけたい。ちなみにDockerに構築してサーバにDockerイメージを丸投げで動かすのもありかと考えている。


 今のところやりたいと考えているものは大別して二つ。だけど必要性、興味、さまざまなソフトウェアの更新や新規リリースを見ながらいくつか増えていくとも思う。


 ……あとは欲しいPCが出てきた。HPのSpectre Limited EditionとVaio Pro mk2。とりあえずどっちも堅牢。
 Spectreは、個人的にイマイチなデザインが多いHPにあって抜群のデザイン。金属が表出している部分に銅色を持ってくるとか渋い。重さ1.5kg程度でイマドキのモバイルと比べると重いがまあ許容範囲だろう。
 mk2は軽いし、ハードの内部アクセスが可能になっているのでSSDやメモリの換装ができそう。こっちは天板デザイン以外ほぼ文句がない。天板のVaioロゴがもっと控えめだったら完璧好みだった。
プロフィール

h

Author:h

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon