Life_march_23

先週振り返り

引き続き、ものすごく仕事が忙しくてやばかった。
でも進んできた感があるので、この調子でがんばろう。
(先週と同じ

週末振り返り

3連休だった。
その割に大したことはしなかった。
自由が丘でうさぎカフェに行って初めてうさぎとすごく触れ合った。
うさぎはすごく現金なやつで、餌をあげるときしかきてくれなかった。 いつか猫カフェに行きたい。

偉大な目標

全く進んでない

完成してないゲーム

全く進んでない..

勉強途中経過

進んでない

  • rails tutorial 6 まで

読書途中経過

進んだ

  • ネットワークはなぜつながるのか?(2章)
  • とある本2章まで読んだ

積んでる

  • 詳解UNIXプログラミング第8章まで読んだ
  • オペレーティングシステム 6章まで読んだ
  • Webエンジニアのためのデータベース技術[実践]入門 7章まで読んだ
  • DDD ショートバージョン
  • http://www.infoq.com/jp/minibooks/domain-driven-design-quickly
  • ミクシィ公認 スマホアプリ開発実践ガイド[iOS/Android両対応] [Kindle版]
  • 論語入門

まだ積んでないけど読む

  • nginxの本

読み終えた

  • (2014/3/1)chef-solo 入門
    • ザーッと目を通し直したらほぼ理解出来てたので読み終えたことにする
  • (2014/3/1)パーフェクトルビー
    • 手を動かしながら ver
  • (2014/2/16)(さらっと)日経Linux 2月号
  • (2014/2/8)プログラマの数学
  • (2014/2/6)(一周目、さらっと)[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン
  • (2014/1/26)マスタリングTCP/IP 入門第5版 とりあえず読み切った
  • (2014/1/13)読む筋トレ
  • (2014/1/8)ザ・コーチ 最高の自分に出会える「目標の達人ノート」

Memo_before_migrate

memo

before_migrate は、migrate しようがしまいが呼ばれる。

3月ももう半ば

先週振り返り

引き続き、ものすごく仕事が忙しくてやばかった。
でも進んできた感があるので、この調子でがんばろう。

不摂生

不摂生がたたってついに体に異常をきたし始めたのでそろそろ
控えようと思う。

週末振り返り

プチ旅行

三浦半島の先にある三浦海岸というところで河津桜の祭りがあるとのことで
春を先取りしてきた。
おどろくべきことに、すでに桜は散り始めていて、ピークは2週間前くらいのように感じた。
もちろん桜だけではもったいないので、三崎口というつぎの駅辺りでよくとれるらしい

紀川さんで マグロを寿司でいただいてきた。
そこで頼んだ特上ずしは、すごく美味しかった。
トロがうますぎて別でさらに注文してしまった。
そして、梅酒がとても美味しかった。ある種、梅酒目当てでも寄れるくらいおいしかった。

クライアント認証について再び勉強

あとで書くけど、クライアント認証やサーバのオレオレ認証局などについて再勉強した。
すごく理解が深まった感がある。

来週は

4日しかないし、不摂生しないように頑張る。

勉強途中経過

進んでない

  • rails tutorial 6 まで

読書途中経過

進んだ

  • ネットワークはなぜつながるのか?(2章)

積んでる

  • 詳解UNIXプログラミング第8章まで読んだ
  • オペレーティングシステム 6章まで読んだ
  • Webエンジニアのためのデータベース技術[実践]入門 7章まで読んだ
  • DDD ショートバージョン
  • http://www.infoq.com/jp/minibooks/domain-driven-design-quickly
  • ミクシィ公認 スマホアプリ開発実践ガイド[iOS/Android両対応] [Kindle版]
  • 論語入門

まだ積んでないけど読む

  • nginxの本

読み終えた

  • (2014/3/1)chef-solo 入門
    • ザーッと目を通し直したらほぼ理解出来てたので読み終えたことにする
  • (2014/3/1)パーフェクトルビー
    • 手を動かしながら ver
  • (2014/2/16)(さらっと)日経Linux 2月号
  • (2014/2/8)プログラマの数学
  • (2014/2/6)(一周目、さらっと)[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン
  • (2014/1/26)マスタリングTCP/IP 入門第5版 とりあえず読み切った
  • (2014/1/13)読む筋トレ
  • (2014/1/8)ザ・コーチ 最高の自分に出会える「目標の達人ノート」

クライアント認証をもう一度やる@nginx

TOC

概要

前回は、資料のようにやればできるって感じだったけど、
理解して一つづつもう一度やってみたかったのでもう一度やってみた。

やったこと

基本的には以下のサイトにしたがってすすめた。
こちらのサイト
基本的に前回の記事では、CA(.sh) という、
openssl の ca を扱うのに便利な付属スクリプトは使っていなかったんだけど、
今回のは CA(.sh) を使ってすすめた。
というか、ほとんどやったことは上記のサイト通りなので、上記のサイト通りやると良いとおもう。
解説もものすごく丁寧にされているので。
なので、自分がやったことの補足だけ書いていく。

補足

config による直接的な制限

まず、背景として、vimtaku, hogetaku というユーザにそれぞれクライアント認証したい。
それで、それぞれのクライアントの鍵はサーバで作成する。

なので、サーバ側で

  • クライアント用(vimtaku,hogetaku二人別々)の公開鍵と秘密鍵を作り、
  • csr をだし、
  • それを ca が 署名して、
  • pfx に変換して

最終的に、配りたい対象ユーザのブラウザに渡すかんじになった。

client認証はしていて、さらに config レベルで、アクセスを制限したい場合には、 ssl.conf に

<Location />
SSLRequire (    %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
            and ( \
                  %{SSL_CLIENT_S_DN_CN} eq "vimtaku" \
                  or %{SSL_CLIENT_S_DN_CN} eq "hogetaku" \
                ) \
            )
</Location>

などと書けば設定できる。

他にも条件は書けそうなので、パラメータに関してはこちらを参考に。

デバッグとしては

CustomLog logs/ssl_request_log \
  "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x %{SSL_CLIENT_S_DN_O}x %{SSL_CLIENT_S_DN_CN}x %{SSL_CLIENT_S_DN}x \"%r\" %b"

としてログだすとよいかもしれない。

revoke による証明書の失効

config ではなく、 revoke で、たとえば hogetaku が会社辞めたとかで配った証明書を失効させる方法として、

cd /etc/pki/CA
cp serial crlnumber
openssl ca -gencrl -revoke  /etc/pki/CA/certs/hogetaku.ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com.crt -config /etc/pki/tls/openssl-client.cnf
cd /etc/pki/CA/crl/
openssl ca -gencrl -out crl.pem

として、

そして
/etc/httpd/conf.d/ssl.conf に、

SLCACertificateFile /etc/pki/CA/cacert.pem

の下くらいに

SSLCARevocationCheck chain
SSLCARevocationFile /etc/pki/CA/crl/crl.pem

を追加した。

それで、サーバを再起動すれば、revoke した証明書を持つクライアントはアクセスできなくなる(400)。

ちなみに revoke は /etc/pki/CA/newcerts/内のファイル か /etc/pki/CA/newcerts/certs 内のファイルのどちらでもよさそう。

nginx による、SSL 設定とクライアント認証

はっきり言ってなんの問題もない

sudo yum -y install nginx

/etc/nginx/conf を編集。

server {
        listen       443;
        server_name  localhost;

        ssl                  on;
        ssl_certificate      /etc/pki/CA/certs/ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com.crt.pem;
        ssl_certificate_key  /etc/pki/CA/private/ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com.key;
        ssl_verify_client on;
        ssl_client_certificate /etc/pki/CA/cacert.pem;
        ssl_crl /etc/pki/CA/crl/crl.pem;

        ssl_session_timeout  5m;

        ssl_protocols  SSLv2 SSLv3 TLSv1; 
        ssl_ciphers  HIGH:!aNULL:!MD5; 
        ssl_prefer_server_ciphers   on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }

大体、 apache と同じような設定を行えば使用できる。

ちなみに

revoke したのをやっぱ辞めたいって場合は
/etc/pki/CA/index.txt の
R の行の R を V にして、 その次の次のカラムの 時間を 消してから、
openssl ca -gencrl -out crl.pem
してやればよい。

所感

複雑だけど、さすがに2週連続で日曜日使えばだいたいわかる。
でももっと奥深く知るにはちゃんと本を読むべきだと思う。

dev

Ruby の WEBRick のワンライナーでサーバが立つかすぐ確認する

ワンライナー

ruby -e "require 'webrick'; server = WEBrick::HTTPServer.new( {:BindAddress => '0.0.0.0', :Port => 80}); trap(:INT){server.shutdown}; server.start;"

普通の方

require 'webrick'
server = WEBrick::HTTPServer.new({:BindAddress => '0.0.0.0', :Port => 80})
trap(:INT){server.shutdown}
server.start

3月2週目

先週振り返り

ものすごく仕事が忙しくてやばかった。
rails に慣れてきた感は出てきたが、まだまだ大変だ。

病院行きたいけど忙しいからなかなか行けないんだよなぁ。

週末振り返り

vimplugin 書いたし、ちょっと今後やりそうなことの技術調査ができたし、
気になっていたこともわかってよかった。

困っていること

くっそ忙しくてちょっと余裕がない。
まぁでもいまはちょっとやるしかないのでがんばる。

最近の gem

gem ‘default_value_for’ これデフォルト値いい感じに埋めれてなんか便利だった

勉強途中経過

進んでない

  • rails tutorial 6 まで

読書途中経過

進んだ

  • ネットワークはなぜつながるのか?(1章)

積んでる

  • 詳解UNIXプログラミング第8章まで読んだ
  • オペレーティングシステム 6章まで読んだ
  • Webエンジニアのためのデータベース技術[実践]入門 7章まで読んだ
  • DDD ショートバージョン
  • http://www.infoq.com/jp/minibooks/domain-driven-design-quickly
  • ミクシィ公認 スマホアプリ開発実践ガイド[iOS/Android両対応] [Kindle版]
  • 論語入門

まだ積んでないけど読む

  • nginxの本

読み終えた

  • (2014/3/1)chef-solo 入門
    • ザーッと目を通し直したらほぼ理解出来てたので読み終えたことにする
  • (2014/3/1)パーフェクトルビー
    • 手を動かしながら ver
  • (2014/2/16)(さらっと)日経Linux 2月号
  • (2014/2/8)プログラマの数学
  • (2014/2/6)(一周目、さらっと)[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン
  • (2014/1/26)マスタリングTCP/IP 入門第5版 とりあえず読み切った
  • (2014/1/13)読む筋トレ
  • (2014/1/8)ザ・コーチ 最高の自分に出会える「目標の達人ノート」

Amazon Linux に Phpmyadmin を入れてクライアント認証する

TOC

概要

amazon linux で phpmyadmin(httpd) を入れてクライアント認証するパターンになったのでやってみた。

下準備

## apache と phpmyadmin が入る
sudo yum --enablerepo=epel install phpmyadmin
## mod_ssl
sudo yum install mod24_ssl
sudo yum install openssl-devel

DB の設定をあれこれする

sudo vim /etc/phpMyAdmin/config.inc.php

phpmyadmin のアクセス制限,今回は クライアント認証する前提なので全開放

sudo vim /etc/httpd/conf.d/phpMyAdmin.conf

とりあえず全開放

## L16 あたりに
Require all granted
## L26 あたりに
Allow from 0.0.0.0
/etc/httpd/conf.d/virtualhost.conf
<Directory "/phpmyadmin">
    Options ExecCGI
    AllowOverride all
    Order Allow,Deny
    Allow from all
    RewriteEngine On
    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/%{REQUEST_URI} [R,L]
    LogLevel alert rewrite:trace3
</Directory>

クライアント認証

については この資料 がものっすごい参考になる。
というかこのままやれば良い。

p12 のインストールについて

Google Chrome はキーチェーンに入れたら行けた。
Vimperator(Firefox) についてはブラウザに pom.p12 を入れたら行けた。

参考文献

phpmyadmin についてはこれが非常に役に立つ。
http://sanketdangi.com/post/56623052533/phpmyadmin-on-amazon-ec2-manage-amazon-rds
クライアント認証に関しては
https://github.com/mechamogera/MyTips/wiki/Apache%E3%81%A7%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E8%AA%8D%E8%A8%BC%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B

dev

Vim-operator-mdurl という Vim Plugin 書いた

はじめに

この記事は Vim Advent Calender 2013 の 98 日目 の記事になります。

背景

Vimmer のみなさんが blog を書くなら普通に vim で markdown を書いていることと思います。
例に違わず僕も markdown で blog を書いているんですが、非常に不満に思っていたことがありました。
それは url を書くときそれを[]() で囲わなきゃならなかったことです。
まぁ書き慣れりゃ楽なんですけど最初は()[] なのか []() なのかわからなくて逆になって辛いみたいな
ことが起こっていました。
http://example.com みたいな url があった時に,
簡単に http://example.com とできるような plugin が欲しかったのです。
正直言うと幾つか方法があって, 保存時に変換とかもやりようによっちゃあるんですが
僕はおせっかいが嫌なので自分で変換できる operator が欲しかったのです。

概要

http://example.com という文字列を

[http://example.com](http://example.com)

と簡単に変換できる operator plugin を書きました。
また, blog を書くときに参考資料とかに url を memo で書いていて,
それを

[ここのリンク](http://example.com)

みたいなふうに
作りたいというのがよくあったので, yank している url を 文字列にリンク展開できるようにもしました。

成果物

https://github.com/vimtaku/vim-operator-mdurl

使用方法

0. (option) vim-textobj-url をインストール

なくてもいいんだけど、あったら多分便利だと思います。

NeoBundle 'mattn/vim-textobj-url'

1. vim-operator-mdurl を インストール

.vimrc に

NeoBundle 'vimtaku/vim-operator-mdurl'

2. .vimrc に map を書く

設定例)

map L <Plug>(operator-mdurl)
map M <Plug>(operator-mdurlp)

3. 使う

http://example.com とかの文字列の何処かで LiW とかするとできます。
http://example.com を yank しておいて hoge とかの文字列上で Miw とかすると、
hoge になります。

0 の手順で url のテキストオブジェクトプラグインを入れておいたら LiW とかの W の部分が
デフォルトでは u で統一できて楽。

直接関係ないけど、text-obj-user の .vimrc の設定について

vim-textobj-user では map を変えられます。
textobj-wiw ですでに u は使っていたので
text-obj-url のデフォルトの u(i|a) とかぶると嫌なので以下の様に書きました。

xmap ah  <Plug>(textobj-url-a)
omap ah  <Plug>(textobj-url-a)
xmap ih  <Plug>(textobj-url-i)
omap ih  <Plug>(textobj-url-i)

xmap au  <Plug>(textobj-wiw-a)
omap au  <Plug>(textobj-wiw-a)
xmap iu  <Plug>(textobj-wiw-i)
omap iu  <Plug>(textobj-wiw-i)

所感

最近は vim に注力出来ていなかったけど、ずっと書きたかった plugin がかけて良かったです。
もし良かったら使ってみてください。
VAC 2013 にも参加できてとりあえず良かったです。
バグはちょろちょろ直していきます。

vim

Devise に入門してみる

背景

devise を知るには warden を知るべしと思ったので warden を勉強した。
大体 warden はわかったので warden の仕組みをかぶせた認証エンジンである
devise を触ってみる。

では早速、以下メモ。

/Users/mac/try_devise/try_devise% be rails g devise:install
      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { :host => 'localhost:3000' }

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root :to => "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

  4. If you are deploying on Heroku with Rails 3.2 only, you may want to set:

       config.assets.initialize_on_precompile = false

     On config/application.rb forcing your application to not access the DB
     or load models when precompiling your assets.

  5. You can copy Devise views (for customization) to your app by running:

       rails g devise:views

===============================================================================

bundle exec rails g devise User
予めcreate database しておく
bundle exec rake db:migrate

すると出来上がる。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(255) NOT NULL DEFAULT '',
  `encrypted_password` varchar(255) NOT NULL DEFAULT '',
  `reset_password_token` varchar(255) DEFAULT NULL,
  `reset_password_sent_at` datetime DEFAULT NULL,
  `remember_created_at` datetime DEFAULT NULL,
  `sign_in_count` int(11) NOT NULL DEFAULT '0',
  `current_sign_in_at` datetime DEFAULT NULL,
  `last_sign_in_at` datetime DEFAULT NULL,
  `current_sign_in_ip` varchar(255) DEFAULT NULL,
  `last_sign_in_ip` varchar(255) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `index_users_on_email` (`email`),
  UNIQUE KEY `index_users_on_reset_password_token` (`reset_password_token`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

config/routes.rb に行が追加されている。

devise_for :users

localhost:3000 にアクセスすると

/users/にものすごくたくさんいろいろできている。

login した後の、 users/edit とか

独自の view を使うには

独自の view を使うには、
scope (admin モデルと user モデルがいる場合に使用)のロジックを使う方法と、
view を単純に上書きする方法がある。
当然、用途に応じて admin と user のモデルを使うんなら scope を使えば良い。
単純にひとつだけなら、 view を上書きする方法が良い。

view を上書きする方法では、
be rails generate devise:views して、
devise/sessions/new.html.erb
を編集などすれば良い。

scope を使う方法では、
config/initializers/devise.rb に
config.scoped_views = true
を追加して、
be rails generate devise:views users
すれば、
users/sessions/new.html.erb
などが使われるようになる。

所感

全然入門できてない。続きはまた書く。

Devise を知るにはまず Warden を知るが良い

背景

devise という gem があるが、warden をベースにした認証の仕組みだということだった。
devise を知るには、まず warden を知らなければなるまい。
そう思った俺は warnden を rack ベースでいじってみることにした。

warden とは

これのこと。
https://github.com/hassox/warden
wiki が充実していたのでかなりわかりやすかった。
https://github.com/hassox/warden/wiki

とりあえずやってみる、以下メモ書き。

config.rb

require 'rack'
require 'pp'
require 'warden'

class Application

  def call(env)
    request = Rack::Request.new(env)
    response = if request.path_info = '/'
                 body = "#{request.request_method}: Hello! #{request.params['name']}!"
                 Rack::Response.new(body, "200", {'Content-Type' => 'text/plain'})
               else
                 Rack::Response.new('Not Found', "404", {'Content-Type' => 'text/plain'})
               end
    response.finish
  end

end


app = Rack::Builder.new do
  use Rack::Session::Cookie, :secret => "replace this with some secret key"

  use Warden::Manager do |manager|
    manager.default_strategies :password, :basic
    #manager.failure_app = BadAuthenticationEndsUpHere
  end

  run lambda { |env| Application.new().call(env) }
end

run app

基本的に, default_strategies で定義した順に行われて、一つでも成功したら成功になる模様。

cookie セットされている

試しに nil を返した時。

明らかに error ハンドラがないぞッて感じのエラーが出ているので、
雰囲気でBadAuthenticationEndsUpHere クラスを足してみる。

class BadAuthenticationEndsUpHere
  def self.call(env)
    p env
    p "BadAuthenticationEndsUpHere"
    Rack::Response.new('Not Found', "404", {'Content-Type' => 'text/plain'})
  end
end

思い通りだ。 error ハンドラとして BadAuthenticationEndsUpHere クラスが呼ばれた。

それでは、正しく期待している serialize_from_session が動くように User.get を定義する。

def get(id)
    ## 永続化されたものから引いてうまく引けたと過程して返す
    return User.new(id)
  end

1回目、とりあえずログインされるはず。

サーバのデバッグログ

“Authenticate!!!!!!!!!!!!”
“serialize into session!!!!!!!!!!!!”

ログから、セッションに値が仕込まれた模様。

2回目、セッションから値を引いてみる。
あれ、ミス。。あ、 serialize_from_session が読んでるのは User.get(id) だから class method だった。。
修正して再チャレンジ。

ちゃんときたっぽい!

デバッグログ

“Authenticate!!!!!!!!!!!!”
“serialize from session!!!!!!!!!!!!”
127.0.0.1 - - [01/Mar/2014 18:54:54] “GET /?password=hoge HTTP/1.1” 200 13 0.0022

get されている模様!

これで user にアクセスできる。

p "warden user is "
p env['warden'].user

ドキュメントを読むと、
Warden::Strategies で定義した #valid? に関しては、定義されてようがなかろうが呼ばれるらしい。

試しにこの時点で #valid? で nil を返すと次の strategy にチャレンジがうつった。
すべての strategy で失敗したら、 failure_app が呼ばれる。

特筆すべきは、ここで呼ばれるのが /unauthenticated だということだ。
この url http://localhost:9292/?password=hoge を叩くと
127.0.0.1 - - [01/Mar/2014 19:01:45] “GET /unauthenticated?password=hoge HTTP/1.1” 404 9 0.0012
がデバッグログに表示されている。

class BadAuthenticationEndsUpHere
  def self.call(env)
    p "in BadAuthenticationEndsUpHere!!!!!!!!!!!!"
    request = Rack::Request.new(env)

    p "request.path_info is "
    p request.path_info

    Rack::Response.new('Not Found', "404", {'Content-Type' => 'text/plain'})
  end
end

をデバッグとして試しに書いてみた。
やはり、内部的に path_info を unauthenticated に書き換えているようだ。
これは lib/warden/manager.rb のあたりを見ればわかる。
def process_unauthenticated(env, options={})

def call_failure_app(env, options = {})
で実際にそのように書かれている。
と思ったら
https://github.com/hassox/warden/wiki/Failures
ここにめっちゃそのように書いてあった。

halt! や success など便利なメソッドが strategy で使える模様。
https://github.com/hassox/warden/wiki/Strategies 詳細はコチラを参照。

このような認証の仕組みが rack で使えて、 認証自体が strategy パターンになっているので
いい感じに他の人が作った strategy を使えるようになっている。

https://github.com/hassox/warden/wiki/Setup#advanced-setup-with-scopes
これを見ると、warden は、認証の scope を分けられるようになっている。
それぞれの認証で、違うロジックを定義して、認証できるようだ。
特に指定がない場合は、 env[‘warden’] は user として認証する。
しかし、これは上書きができるようだ。
default の設定上書きとは別に、明示的にスコープを指定することもできる。

env['warden'].authenticate! :scope => :api

callback

"serialize into session!!!!!!!!!!!!"
"after_set_user caled!"
"auth is"
Warden::Proxy:70106638122900 @config={:default_scope=>:default, :scope_defaults=>{}, :default_strategies=>{:_all=>[:password, :basic]}, :intercept_401=>true, :failure_app=>BadAuthenticationEndsUpHere}
"logout called!!!!!!!!!!!"
"in BadAuthenticationEndsUpHere!!!!!!!!!!!!"
"request.path_info is "
"/unauthenticated"
127.0.0.1 - - [01/Mar/2014 19:55:10] "GET /unauthenticated?password=hoge HTTP/1.1" 404 9 0.0025

これも結構参考になる。
https://gist.github.com/lukesutton/107966

所感

warden 大体わかった。