MTエンジニアブログ
ぴろり上西
2011年02月02日
前回の記事で、MovableType は入力されたパスワードの最初の 8 文字しか利用していないことが判明しました。まぁ、8 文字のパスワードであれば、英数大文字小文字、記号を織り交ぜて、そこそこ安全なパスワードを設定できますが、やはり、入力された文字列を全て使って認証を行って欲しいものです。
そこで、MovableType のパスワード システムをジャック(?)して、入力された文字列全てを使って認証を行えるようにするプラグインを書いてみました。このプラグインを導入することで、パスワードに使える文字列の長さに制限がなくなります。パスワードよりも更に長く複雑なパスフレーズを利用することも可能になりますので、セキュリティ強度の向上にご利用ください。
注意
このプラグインを導入すると、システム管理者を含む既存のユーザ全てがログインできなくなります。ダウンロードパッケージに同梱のシェルスクリプトを利用して、個別のユーザ毎にパスワードを再設定してください。しかし、既存の全ユーザに対してパスワードの再設定が必要になりますので、新規案件などのクリーンインストール状態から運用を始められるのがラクチンです。なお、中途で導入された場合、プラグイン導入以降に新規作成されるユーザについては、問題なく運用することができます。
また、このプラグイン導入後は、プラグイン管理画面からこのプラグインを決して無効化しないでください。再び全てのユーザがログインできなくなり、パスワードの再設定を行わないといけません。
ダウンロード
BetterPassword.0.00_01.zip
インストール
ダウンロードパッケージを展開して得られたファイルを plugins 以下にコピーしてください。プラグインの設定項目などはありません。plugins フォルダにコピーした瞬間から、パスワードシステムが上書きされますので、上記注意のようにログインができなくなります。
パスワードの再設定
既存ユーザのパスワードを再設定するためのシェルスクリプトを同梱しています。シェルから、以下のようにコマンドを実行してください。
perl set-passwd username password
username は存在するユーザのログインID、password は再設定するパスワードです。
その他いろいろ
- crypt 関数の替わりに Digest::MD5 を利用しています
- このプラグインはブログウェアです。無償でご利用頂けますが、感想、要望などをあなたのブログで記事として紹介頂けると幸いです。
- 個人利用または商用利用に関わらず無償でご利用いただけます。
- 無保証ですので、十分にテストしてから運用してください。
- 本プラグインをご利用される方は必ずプラグインご利用の際の注意事項をお読みください。
- MT5で動作確認済みです。
ぴろり上西
2011年02月01日
Amazon のパスワードを長い間変えていない人は、とりあえず今すぐ変えましょう!
Amazonのセキュリティの欠陥は、パスワードの8文字以降を認識しないというものだそうです。
例えば、パスワードが「password1234567890」でも「passwordpizza」でも、最初の8文字が「password」で同じなので、同じものと認証されてしまうとのこと。
それ何て crypt 関数? と思いましたが、Amazon が Perl で構築されているという話もあるので、あながち間違っていないのかも知れません。
どういうことかというと、Web サービスなどでは、サービス側がユーザのパスワードを平文でそのまま保持せず、何らかの暗号化(一方向関数とかいろいろあるんだけれど、ここでは暗号化と呼びます)を施した上で、パスワードを保存するのが普通の設計です。そうしないと、万が一顧客情報が漏れたりした時に、パスワードが丸見えだと不正ログインされてしまいますからね。その暗号化の処理において、Perl で使われているのが crypt という関数なんです。
ところが、この crypt 関数には、入力されたデータの最初の 8 文字しか使わない、という変な仕様(?)があります。そのため、どれだけ長いパスワードを使っていても、上記の記事のようにパスワードの 9 文字以降が無視されてしまうのです。サービス内部の実装によっては、長いパスワードを使っているから安心、というわけではないのです。
さてさて、ここからが MovableType のお話になるわけですが。実は MovableType も、パスワードの暗号化処理には crypt 関数を使っています。...嫌な予感がしますね。ソースコードを見ると、素直に上記の処理がコーディングされています。早速、実験してみましょう。使ったのは最新の MovableType 5.04 です。
まず、適当にユーザーを作成し、パスワードを「password123」に設定します。ここで、パスワードは全部で 11 文字ありますね? 一度、ログアウトしたら、ログインし直してみましょう。
| パスワード | ログイン |
| password123 | 成功。まぁ当たり前。 |
| pass | 失敗。まぁ当たり前。 |
| password1234567890 | 成功。あれ!? |
| passwordhogehoge | 成功。あれれ!?? |
| password | 成功。あれれれ!??? |
...とまぁ、なかなか香ばしい結果になってしまいました。というわけで、MovableType でもパスワードは入力された最初の 8 文字しか認識しないということがわかりました。セキュリティ要件の厳しいお客様だと、問題になったりしませんかね? 何らかの対策がされることに期待したいところです。とりあえず、パスワードは 8 文字の範囲内でOKなので、英数大文字小文字、記号を入り交えて設定されることを強くオススメします。
やまかわ
2011年01月31日
こんにちは山川です。
今日はOSXのコネタです。
最近私はVirtualBox上のLinuxで開発環境を構築し、開発ディレクトリをNFSでanonymousでexportしてMacからmountした上で、Carbon Emacs+cperl-mode他諸々適当に拾ってきた.emacs上で開発する、というスタイルにしています。
これはかなり快適で満足度が高い感じなのですが一点問題があり、OSXからmount先をlsするとファイルの所有者が65534:65534という風に素のGIDとUIDが見えてしまい、なんとなくキモいことになっていました。
-rwxr-xr-x 1 65534 65534 405 1 31 11:11 mt-add-notify.cgi
-rwxr-xr-x 1 65534 65534 394 1 31 11:11 mt-atom.cgi
-rwxr-xr-x 1 65534 65534 20004 1 31 11:11 mt-check.cgi
-rwxr-xr-x 1 65534 65534 403 1 31 11:11 mt-comments.cgi
-rw-r--r-- 1 65534 65534 1647 1 31 11:11 mt-config.cgi-original
実用上問題ないのでしばらく放置していたのですが、だんだん気になってきたのでここらでnfsnobodyを作ってみようと思ったもののどうやらadduserとかそのたぐいのコマンドはOSXには存在しないようです。
とりあえずまあUnix的に考えて/etc/passwdを見てみると、標準ではもちろんnfsnobodyユーザーは居ません。また以下のような文面が頭に入っています。
##
# User Database
#
# Note that this file is consulted directly only when the system is running
# in single-user mode. At other times this information is provided by
# Open Directory.
#
# This file will not be consulted for authentication unless the BSD local node
# is enabled via /Applications/Utilities/Directory Utility.app
#
# See the DirectoryService(8) man page for additional information about
# Open Directory.
##
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
なんか/etc/passwdは使われないみたいです。んーそういえばOpen Directoryなるものでユーザー管理されてたなーというのをここで思い出します。で、ここで書かれている /Applications/Utilities/Directory Utility.appを実行しようと試みてみますがそんなものは存在しませんといわれます。ということでググってServer Faultのトピックを拾ってみたところ、dsclというやつでいけるみたいです。ふむふむ。というわけで以下を実行してみます。
sudo dscl . -create /Users/nfsnobody
sudo dscl . -create /Users/nfsnobody UserShell /sbin/nologin
sudo dscl . -create /Users/nfsnobody RealName "NFS anonymous user"
sudo dscl . -create /Users/nfsnobody UniqueID 65534
sudo dscl . -create /Users/nfsnobody PrimaryGroupID 65534
sudo dscl . -create /Groups/nfsnobody
sudo dscl . -create /Groups/nfsnobody PrimaryGroupID 65534
sudo dscl . -create /Groups/nfsnobody RealName "NFS anonymous group."
sudo は必要かどうかわかりませんがとりあえずつけましたが、どうやらこれで問題なくlsの結果でUIDのところがnfsnobodyに見えるようになりました。
-rwxr-xr-x 1 nfsnobody nfsnobody 405 1 31 11:11 mt-add-notify.cgi
-rwxr-xr-x 1 nfsnobody nfsnobody 394 1 31 11:11 mt-atom.cgi
-rwxr-xr-x 1 nfsnobody nfsnobody 20004 1 31 11:11 mt-check.cgi
-rwxr-xr-x 1 nfsnobody nfsnobody 403 1 31 11:11 mt-comments.cgi
-rw-r--r-- 1 nfsnobody nfsnobody 1647 1 31 11:11 mt-config.cgi-original
ちなみに以下のような感じで現在のOpenDirecotryのエントリを見ることができます。
# ユーザー一覧
$ dscl . -list /Users
# ユーザー情報取得
$ dscl . -read /Users/nfsnobody
ついでになりますが、Linux上でNFSでexportする際、以下のようにしないとうまいことOSXからmountできません。これはOSXがNFS mount時に1024番より上のポートを利用するためみたいです。mount時にオプションを指定すればinsecureは必要ないみたいですが、とりあえずこれで動かしています。あと、UIDやGIDをあわせるのが面倒だったのでクライアントからのアクセスがすべてnfsnobodyとして扱われるようにall_squashを利用しています。
# /etc/exports
/opt/www 192.168.0.0/255.255.0.0(rw,sync,insecure,all_squash)
今回はNFSを使ってみましたが、sshfsとかでも良かったかなーという気もしなくもありません
ぴろり上西
2011年01月26日
URI 文字列からスキーマとドメイン部分を除去してごにょごにょしたい! というシーンで。まぁ、脊髄反射的にプラグインを書いたりしちゃうわけですが、regex_replace モディファイヤを使うと簡単にごにょごにょできますよ、と。
<MTUnless regex_replace="/https?://[^/]+/g","">
http://www.skyarc.co.jp/hoge.txt → /hoge.txt
https://www.skyarc.co.jp/fuga.txt → /fuga.txt
</MTUnless>
regex_replace の引数はスラッシュで囲むわけですが、その中のスラッシュはエスケープしなくてもいいんですな(´・ω・`) なんだか気持ち悪いけど。
ぴろり上西
2011年01月21日
こんにちは。社長の趣味か否かは定かではありませんが、昨年から開発陣の使用する PC が、次第に Windows マシンから Mac に移行しつつあります。WIndows だと XAMPP を入れたり ActivePerl を入れたり、と環境を作るのが大変だったりしますが、Mac の場合だと、最初から Apache やらが入っていて、結構本番サーバ(Linux)に近い環境が最初から揃っているのがありがたいですね。そんなこんなで、キーアサインの違いに苦労しながら、Mac で開発しているんですが。先日、ダイナミック パブリッシングを使う機会がありまして。普段はスタティックなプラグインばかりを書いていて、ダイナミック パブリッシングなんて、もう完全に忘れていたんですが。
Error: pdo error: [-1: Connection attempt failed: SQLSTATE[HY000] [2002] No such file or directory] in PCONNECT(mysql:host=localhost, 'root', '****', mt_5)
データベースに接続できていないみたいです(´・ω・`)
$ vi mt-config.cgi
#DBHost 127.0.0.1
DBHost localhost
よくわからないままに、mt-config.cgi を編集したら、接続できるようになりました。localhost と 127.0.0.1 で同じことだと思うんですがね。リロード。
...エラー(´・ω・`)
mktime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead
次は PHP のランタイムエラーが(´・ω・`) なんかタイムゾーンが設定されていないぞー的な感じです。
$ vi /etc/php.ini
date.timezone = Asia/Tokyo
やっと動くようになりました。Mac 上でダイナミックパブリッシングなんて奇特な人の参考になれば幸いです。