ApacheでリバースプロキシしてかつLDAP連携してshibに認証をかけた話

shibには認証機能は無いのですが、認証をつける必要が出てきたりします。

固定パスワードによるBasic認証であればexpress.basicAuthを使えばいいらしいというのはわかったので対応してpull requestでも出すかーとか思ってました。

で、でもですね、誰がどういうクエリを投げたのかロギングしたいなんていう独自要件が出てきましてこりゃLDAP連携が必要だなあという話になりました。

なので、ApacheでリバースプロキシしてかつLDAP連携してshibに認証かけたりなんかしました。

どんな感じでやるかというとこんな感じです。
mod_authnz_ldapを使ったときのユーザ名の扱いについて - たごもりすメモ

こうすればバックエンド側のshibでx-forwarded-userヘッダにユーザ名が渡ってきます。

あとはこいつをロギングすればOK。

log4jsなんていうモジュールがあるので

npm install log4js

したら

var log4js = require('log4js');
log4js.configure({
    appenders: [
        {
            "type": "file",
            "category": "query",
            "filename": "logs/query.log",
            "pattern": "-yyyy-MM-dd"
        },
    ]
});

という感じにして下記を app.jsのapp.post('/execute', function(req, res)の直後にでも書きます。

var logger = log4js.getLogger('query');
logger.info(req.headers['x-forwarded-user'] + " " + req.body.querystring);

そうすると、こんな感じのログが出ます。

[2014-01-22 17:24:11.618] [INFO] query - wyukawa select count(*) from accesslog where ymd='20140121'

あとついでにforeverをつかってデーモン化してみました。

npm install forever -g

してpackage.jsonを下記のような感じにします。

     "scripts" : {
        "start": "NODE_PATH=lib forever --minUptime 1000 --spinSleepTime 1000 -a -l forever.log -o logs/shib.out -e logs/shib.err start app.js",
        "stop": "NODE_PATH=lib forever stop app.js"
     }

で、下記で起動します。

npm start

止めたい時は下記のようにします。

npm stop

見よう見まねでNode.jsやってるので変なことしてたら教えてくれると嬉しいです。