netcat-traditional

Debian wheezy を入れて,Proxy 越しに ssh をしようとしたら,それまでの .ssh/config では通らなかった.

nc: invalid option -- 'x'
nc -h for help
ssh_exchange_identification: Connection closed by remote host

理由は,netcat-traditional というパッケージが入っていて,nc コマンドに proxy を指定する -x オプションがないから.
netcat-openbsd とかを入れればOK

バッチファイルで logrotate

なんか昔に sh で組んだけど,sh が使える普通の環境なら logrotate.d 使えばいいと気付いて,実際には使ってなかった.
(hadacchi_blog : logrotateをするスクリプト)
win で使いたくなって,cygwin はもはや使ってないので,バッチファイルで作った.

使い方は,以下を logrotate.bat とした時,

logrotate.bat hogehoge.ext

エラー処理してないので,利用時は自分で注意してね.

@echo off

setlocal enabledelayedexpansion

for %%i in (%*) do (
  set file=%%~ni
  set ext=%%~xi
  set /a num=0
  :LOOP
    if exist !file!.!num!!ext! ( set /a num+=1 ) else goto ENDLOOP
  goto LOOP
  :ENDLOOP
  set /a num-=1
  for /l %%n in (!num!,-1,0) do (
    set /a tonum=%%n+1
    ren !file!.%%n!ext! !file!.!tonum!!ext!
    if errorlevel 1 ( goto ERR )
  )
  copy !file!!ext! !file!.0!ext!
  if errorlevel 1 ( goto ERR )
)
exit

:ERR
pause

「インターネットオプション」をショートカットに登録

これに限らないんだけど,コントロールパネルにある機能をショートカットに登録する方法.
インターネットオプションの場合…

  • c:\windows\system32\inetcpl.cplへのショートカットを作成する.

標準のアイコンも,cplファイルの中にある.
他の機能とかは,@IT:Windows TIPS -- Knowledge:コントロール・パネル・アイテムをコマンドラインから呼び出す を参照のこと.

apache のエラーログを真面目に読んでみた

最近、サイト運営の時間がとれず、放置していたので、たまにはログをチェックしようかと三が日からログを読んでいた。
ログは error.log (うちのサーバの場合、ログファイルはvhost毎に変えてるので、標準のログファイル名で書いておく。以下同様。) を眺めて、サイトのコンテンツ絡みの場合は、man もしくは google 先生、明らかにアタックの場合は該当アクセスの IP アドレスを /var/log 内全検索するなどして、分析した。
分かったのは、思ったより脆弱性の入ったサーバやスクリプトが巷には溢れていて、下に列挙していない file does not exist に、大量にそのキーワードが含まれているということ。
自分が入れているツールへのアタックかも、と感じたら、その IP でログの全検索をかけることと、そのツールが最新版か確認することはした方がよさそうだ。

んでわ、さっそく。

PHP Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0
PHP Fatal error: Unknown: Failed opening required 'FILEPATH' (include_path='.:FILEPATHES') in Unknown on line 0
2行でセット。
旧サイトの投稿スクリプトのパーミッションを 000 にしていたために、出ていた。
パーミッションを変更したら(投稿フォームを無効化してから)、直った。
Directory index forbidden by Options directive: FILEPATH
index ファイルを設置してなくて、Indexes をセットしてないディレクトリへのアクセスがあったログ。
index.htm を置けば OK。
no acceptable variant: FILEPATH
コンテンツネゴシエーションに失敗。具体的には、MultiView の設定に絡むファイルしかなかった。
だが、telnet アクセスで再現しなかったので、切り分けはこれ以上はできなかった。うーむ…
アクセスログによれば、Majestic-12 とかいうプロジェクトの bot らしい。
File does not exist シリーズ
ほとんどが、旧コンテンツのメタタグとかで読み込む設定にしていた旧faviconなど。
あといくつかが、色々な脆弱性へのアタック。目についたのだけ、ピックアップする。
File does not exist: FILEPATH/w00tw00t.at.blackhats.romanian.anti-sec:)
phpMyAdmin の脆弱性アタック。
この辺りが詳しい → phpMyAdminを狙った攻撃観察 - ろば電子が詰まっている
そんな軟派なものは入れていないので、関係なし。
w00tw00t.at.hogehoge 自体は、他にも色んな種類があるらしいので、他のアクセスが出てきたらそれはそれで注意が必要ぽい。
File does not exist: FILEPATH/notify-NotifyUser_NONE_071217
なんか日本語サイトだと、楽天とか伊藤忠のイントラネットから web アクセスする時に、業務と関係ないサイトにアクセスする時に使う proxy が notify-NotifyUser1 だってネタがひっかかる。
ただ、web サーバにそんなファイルアクセスを起こす意味が分からないので、なんか違うんじゃないかという気がしている。
なおうちへのアクセスでは、AhrefsBot/5.0 という bot によるものらしい。ポートスキャンという説もあるが、うちのサイトでは、web クローラとしての動作のみが記録されていた。外側の FW で落ちているだけかも知れない。
client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
これは DFind のアタックを受けた痕跡らしい。
DFind については、この辺を見たらいいのかな… → Hacktool.DFind | シマンテック 日本
んで、対策は色々と書かれているんだけど、だいたい多いのは iptables の string モジュールで文字列マッチをしてパケットをドロップさせろ、というもの。
(参照: Blocking w00tw00t scans - Myatu's, GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1)
日本語のサイトでは、400 が返ってたら心配ないよ、って書かれてて、多分その元ネタは後者の参照ページあたりだと思うのだけど、なんで you should not worry about it なのかが、見付けられなかった。
少なくとも Hacktool.DFind が正しいのであれば、apache と関係ない SQL サーバへのアタックも含まれているのだから、apache のログだけ見て心配しなくて良い理由が不明。
いちおう、サーバの外側の FW で弾いた上で、サーバ内のソフトウェア FW でも弾くようにしているので、apache 以外のログには残っていないのだと信じたい。
script not found or unable to stat シリーズ
4割が、過去に google calendar に登録していたが現在ではもう登録していない URL へのもの。
他は、色々な php システムのバグへのアタックくさい。
Invalid URI in request GET HTTP/1.1 HTTP/1.1
なんか、アタックの最初に "GET HTTP/1.1 HTTP/1.1" をつけてくるツールがあるっぽい。
google の連文節検索(という名前は私が勝手につけたが、よーはハイフンで単語を繋げる検索)で、http-1.1-http-1.1 として検索すれば、大量のログが出てくるので、自分のログと類似のものを探せばよい。
このログが理解できなくて、telnet してたら自鯖の設定ミス(ServerTokens を設定していない)のために HTTP ヘッダに OS と apache のバージョンが流れていることに気付いたので、修正した。
ServerSignature を未設定または Off にすると、エラーレスポンスの末尾の OS や apache バージョンが入ったシグネチャが消えるので安心していたら、HTTP レスポンスで返していたとは…
ちゃんとヘッダまで確認していなかった自分の甘さに反省。
PHP Notice:
Undefined variable: comment_field_name in FILEPATH/comment_form.tpl.php on line 64
多分、P_BLOG のバグ。reply.php の中で、エラーメッセージ内の .tpl.php を呼ぶ前に、add.php とかみたく $comment_field_name をセットしていないのが原因。

Windows7 x64 で NIC 再起動

私の使っている PC は、まれに NIC に刺さっているケーブルを認識しなくなる。
対向の SW やケーブルを変更しても起こるので、PC 自体の問題だろうと思うのだが、原因はよく分からない。
発生頻度も数ヶ月に1回レベルなので、原因が掴みにくい。

それはそれとして、発生頻度が少ないので放置しているものの、長期間、その PC の前に座れない時に遠隔から操作しようとすると、この事象はとても怖い。
なので、被害を最小限に食い止めるため、こんな小細工を弄してみた。

タスクスケジューラで NIC を定期的に再起動する。

この問題が起こった時の解決方法は簡単で、NIC をネットワークデバイスの管理画面から無効/有効と再起動してやれば良い。
これをコマンドラインで実行するのは簡単で、devcon.exe という Windows 標準のコマンドラインを叩けば良い。

> devcon disable %HARDWARE_ID%
> devcon enable %HARDWARE_ID%

ここで、%HARDWARE_ID% は、devcon hwids =net などで表示されるお目当ての NIC のハードウェア ID のうち、一番長いもので良いらしい。
devcon.exe を使って NIC を無効化/有効化する - k3k1::log

Windows 7 x64 で devcon を使う

ところが、Windows 7 x64 ではこれが思い通りに動かない。
調べてみると、Windows 7 x64 用の devcon が標準でインストールされていないためで、Microsoft download center からもダウンロードできないため、どこかから調達する必要があるらしい。
"Disable failed No devices disabled" devcon.exe | How to disable devices from command prompt ~ Techytips

タスクスケジューラで実行

このコマンドを bat ファイルにして実行すると、権限不足でうまく行かない。
タスクスケジューラで実行する場合は、「最上位の特権で実行する」をチェックしておくと良い。

Windows 8 使い始めた

tips を色々と追記していくよ。

ファイルを消す時に確認ダイアログを出す
ごみ箱を右クリックして「プロパティ」→ 削除の確認メッセージを表示する、にチェック
各種ショートカット
ほとんど生きてます。Win+D,E,L,R,Pause あたりをよく使う。 Win → exe名入力 → Ctrl+Shift+Enter で管理者権限で実行も生き。
スタートメニューからよく呼び出していたメニューの出し方
コンパネ → Win+R control Enter ネットワーク設定 → Win network 「設定」「ネットワーク接続の表示」 シャットダウン → Win+R shutdown /p Enter リブート → Win+R shutdwon /r /t 0 Enter
デフォルトのIMEを変更
コンパネ → 言語 → 「規定の入力方式の上書き」

SKKFEP

記事を書いたつもりが、なんか残ってなかったので改めて書いておく。
バイナリは、ここから DL → co Programs
skk-fepとも.

  1. setup.js を起動
  2. IE の窓から「インストール」をクリック
  3. 何度か出る UAC を全部 OK
  4. (個人的にはなくても良い気がしてきている)「カタカナ辞書」にチェックを入れてアップデート
  5. skkuser.txt をユーザ辞書フォルダに入れて「辞書の更新」
  6. 「設定>詳細」を次のように編集して上書き保存。(設定名がころころ変わるので、注意)
    • 配列 → 0 (英語キーボード)
    • 区切 → 1 (コロン、セミコロンの全角入力,なくてもいいかな…)
    • 句点 → 2 (ピリオド)
    • 読点 → 2 (カンマ)
    • 改行 → 1 (Enter入力で決定+改行)
    • 疑似 → 1 (入力モードをカーソルの色で表示する機能をエミュレート)
    • cy → ち
  7. 「コマンド」からコマンドプロンプトを上げて、> rule r
  8. puttyとかでサーバーサイドに uim-fep+uim-skk とか準備している場合,ローカルのskk-fepを殺さないといけなので,> rule putty.exe m5
  9. 「閉じる」で完了だが、IME 全部置き換えるためにログオフ→ログオンを推奨。

特定ドメインでアクセスされた場合のみ、移転後ページへのリンクを張った移転メッセージを表示

前使っていたドメインから現在のドメインへリダイレクトをしていたが、どうにもアクセスが完全には途絶えていないらしい。
んで、リダイレクトしているホストやリファラから、古いドメインへリンクしているサイトを特定するために、また移転したよメッセージを表示するために、ワンクッションはさむことにした。←ほぼ検索エンジンか更新されていない掲示板等であることが判明したので,rewriteはやめた
なんとなくのイメージだけで作業開始したものの、実際に作業してみるとハマりポイントがいくつかあったため、メモに残す。

やったこと

  • 旧ドメイン配下の任意ページ(存在の有無によらず)へのアクセスがあった場合、移転メッセージを提示する。
  • 同居する他のドメイン名で80番ポートにアクセスが飛んだ時は、明らかに存在するはずのルートへのリクエストのみ403を返し、他のリクエストの場合は404を返す。
  • 移転メッセージには、http[s]://新ドメイン/元リクエストのパス?元リクエストのQUERY_STRING へのリンクを貼っておく。
  • アクセスログを mysql に残す。

ハマりポイント

任意ページへのアクセスの受け方
分かりにくいけど,これはもう使ってない方法.
任意ページへのアクセスを、上の処理を行なうスクリプトへ元のGET文字列も含めて飛ばすのは意外と難しい。
.htaccess を使って、Rewrite でリクエストを書き換えると簡単にできる。ただし REFERER はこの時点で死ぬので、REFERER を取りたい場合は他の手段を講じる必要がある。
具体的な記述は、例えば

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(old\.domain\.com)(:80)?
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ http://redirect.domain.com/?$1 [QSA,R=301,L]

といった感じ。
QSA は QUERY_STRING を最後に付与する指示。

php での HTTP ヘッダの返し方
php で HTTP ヘッダを返して、特定のアクセスの場合に 404 とか 403 を返す方法はいくつかある。
詳しくは php 公式ページのリファレンスを見るとして、私の環境では次のコードがうまく動いた。
あらゆる出力 (HTML の DOCTYPE や XML 宣言を含む) より前に記述しないと意味がないことに注意。

header("HTTP",true,404);
header("Content-type: text/html; charset=iso-8859-1");
include('./404.php');

404.php は、httpd の 404 ドキュメントを模したファイルで、上の .htaccess を用いた場合は QUERY_STRING に アクセスパスがついてくるので、展開して使えば、それっぽく表示できる。
apache2 の場合、404 や 403 はブラウザの設定に依らず charset が iso-8859-1 で返っていたので、ヘッダに入れた。

今時のmysql

なんか php 公式のリファレンスに mysql は古いから mysqli を使え、と書かれていたので、使うことにしたが、ちょっと梃摺った。

$mysqli = new mysqli("DBHOST", "DBUSER", "DBPASS", "DBNAME");
$mysqli->query($query);

mysqli では、特段の理由がない限りはセッションの close をしないらしい。
$query は使いたい SQL をそのまま書いたもの。

いざ文書にしてみると、迫力のない tips だな。
他にも元アクセスのパターンによって何度か print デバッグしないといけないと思うけど、頑張れ!

VMware で CD-ROM boot (ゲストOS再インストール)

VMware を標準で使っていると、OS インストール後は仮想ドライブに起動イメージを入れてゲスト OS を起動しても OS インストール画面に入ることができない。
これは、CD-ROM ドライブの起動ディスクとしての優先度が低いためであるので、BIOS から優先度を上げてやらなければならない。
ところが、VMware は標準では、BIOS に入るための F2 の受け付け時間が全くなく、現実には入力することができない。
また、リセットやリブートする毎にゲスト OS のフォーカスが外れて VMware のウィンドウにフォーカスが合ってしまうため、PC の起動時によくやる「最初から F2 を押しておく」も通用しない。

そこで、ゲスト OS の .vmx ファイルに、BIOS 設定画面に強制的に入る boot.forceSetupOnce = "TRUE" を追記するか、
BIOS のブートまでの遅延を設定する bios.bootDelay = "5000" を追記するなどの方法で対処する。

ubuntu とか centos で resolv.conf が勝手に書き換えられるのを止める

最近は linux を使っていても PC 起動のタイミングで resolv.conf が勝手に書き換えられるようになってしまった。
普通にインストールすると /etc/resolv.conf は symlink なのだが、通常ファイルに置き換えてもダメ。
昔は dhclient.conf の書き換えで直っていたのだが、最近はそれも効かなくなり苦労していた。

[ Fedora ] resolv.conf が勝手に書き換えられていた - NetworkManager を無効にする: Fomalhaut of Piscis Australis
がドンピシャの記事だったので、メモる。
CentOS の場合は載っているが、一応転載しつつ、ubuntu の場合も書いておく。

CentOS の場合: # yum erase NetworkManager
ubuntu の場合: # apt-get purge network-manager

注意
このままだと、resolv.conf も interfaces も設定しなければならないので、この状態で遠隔操作のままリブートしないこと!!
interfaces は最近、編集する機会が減り、検索結果にも出にくくなってきた気がする。
eth0 inet static とかで検索したら出るよ。

なお、 ubuntu だと記事の CentOS のように network-manager-pptp とか関連っぽいものは消えてくれなかった。
記事では erase を使っている辺りに憎しみを感じるが、大変よく分かります。