ひとこと

― 今日のひとこと ―
気付けば前回更新してから2年以上経ってた
(2023.10.25)

2015年11月14日土曜日

システム監査ポリシーをプログラムで編集したい

Windows Server 2012をいじっていて、監査ポリシーの設定について調べたこと。
ちなみに僕が編集したかったのは「詳細なファイル共有」「ログオン」「ログオフ」あたりで、成功の監査を有効にできないか模索した。


■監査ポリシーの設定がしばらくすると元に戻る・・・なにこれ・・・
secpol.mscのGUIで変更した内容はそのまま残るのに、
auditpolコマンドで変更した場合はなぜかしばらくして無効化されるという事態が発生。
しかもauditpolコマンドで変更した内容はsecpol.mscの画面には反映されない。
なぜだ?

→secpol.mscに表示されるのはセキュリティポリシーではなくグループポリシーだった!
(参考:https://support.microsoft.com/en-us/kb/2573113)

なにそれ。secpol.mscのウィンドウタイトルは「ローカル セキュリティポリシー」なのに。
ややこしいんだよ・・・
つまりsecpol.mscのGUIでセキュリティポリシーを変更したと思っていたが実はグループポリシーを変更していて、auditpolコマンドではセキュリティポリシーを編集していたってことだな。

ちなみにグループポリシーに上書きされるタイミングは「OS起動」「一定時間経過」など。
(参考:https://technet.microsoft.com/ja-jp/library/cc179176.aspx)

■セキュリティポリシーとグループポリシーの違いは?
まず適用の優先度が違うらしい。
セキュリティポリシーよりグループポリシーの設定が優先されるとか。
そしてグループポリシーはネットワークの管理者により一元管理できるもので、
セキュリティポリシーは各端末で個別に設定できるものとかなんとか。
セキュリティポリシーがグループポリシーに上書きされるのを防ぐこともできるらしいが、
正直よくわかってない。少なくともコマンドやプログラムでそうするのは難しそうだ。

プログラムでポリシーを変更したいなら、
要は端末に記録されたグループポリシーの設定を変えればいいってことだよね。
セキュリティポリシーだけ変えても上書きされるからね。


■グループポリシーを自動変更する方法
まず、ポリシーを変更する方法として4つの手段を試してみた。

①auditpolコマンドでサブカテゴリを編集
→auditpol.exe /set /subcategory:"詳細なファイル共有" successful:enableとかそんな感じのコマンドで直接編集したがグループポリシーに無慈悲な上書きを受け失敗。

②seceditコマンドで設定ファイルをインポート
→設定ファイルをエクスポートして好き勝手編集した後インポートするという企て。セキュリティポリシーしか変更できないと気付き頓挫。

③auditpolコマンドで設定ファイルをインポート
→auditpol /backup /file:{ファイル名}で設定ファイルをエクスポートして思うさま編集した後/resotreでインポートするという計画。これもグループポリシーに上書きされ失敗。

④gpupdateコマンドで設定ファイルを反映
→結論から書くと成功。やったぜ!手順は後述


■gpupdateでの設定ファイル反映の手順
もちろん管理者権限を使います。システム権限で実現できるかどうか確認してない。

1.まず現在の設定をエクスポートする。auditpol /backup /file:{ファイル名}
2.エクスポートした設定ファイルをプログラムで編集する。
設定ファイルはCSV形式。編集したいサブカテゴリのGUIDをキーにして1行ずつチェックしていき、
合致するGUIDを持つ行の「InclusionSetting」と「SettingValue」の列の値を、
それぞれ「成功」「1」に書き換える。
3.グループポリシーを上書きする。
グループポリシーの設定ファイルは↓のパスに格納されている。
%SYSTEMROOT%\system32\GroupPolicy\Machine\Microsoft\Windows NT\Audit\Audit.csv
このaudit.csv削除または移動し、2で編集したファイルを新たに格納する。
4.グループポリシーを強制反映する。gpupdate /force

これでグループポリシー(ローカルグループポリシー)を思うがままに編集できた。

(実装した後に気付いたんだけど、1はauditpolでエクスポートなんかしなくてもグループポリシーのファイルをコピーしてくればよかったんだよな。)

注意すべきこと。グループポリシーとセキュリティポリシーの設定ファイルの位置。
グループポリシーは上述の通りだがセキュリティポリシーは↓
C:\Windows\security\audit\audit.csv

どちらもaudit.csvなんだよな。ややこしい・・・
しかもそれぞれで言語が違う。動作に影響はないみたいだけどほんと統一感ないよな

ちなみにauditpolでサブカテゴリを直接編集したりすると、セキュリティポリシーのファイルだけが更新される。
その後gpupdateを実行するとグループポリシーのファイルでセキュリティポリシーのファイルが上書きされていた。



(2015.12.11追記)
auditpol /backupではなくグループポリシーのaudit.csvを編集してgpupdateするようにしてみたけどうまく動いた。
ただ、そことは直接は関係ないが問題が1点発覚。

OSインストールしたばかりであるなど、gpedit.mscなどのツールで1度もグループポリシーを編集していない状態だと、上記プログラムを実行すると「グループポリシーはうまく変更できているがセキュリティポリシーが変更されない」というおかしなことになるのだ。
gpedit.mscやsecpol.mscの画面上は変更されているように見えても、auditpol /get /subcategory"詳細なファイル共有"などで確認すると「監査なし」となっている。

それというのも、ツールで編集するまではグループポリシーのaudit.csvとセキュリティポリシーのaudit.csvが存在しない(作られない)ので、グループポリシーのaudit.csvを作ってgpupdateしても本来反映先となるはずのセキュリティポリシーが存在しないことが原因らしい。

ではセキュリティポリシーのaudit.csvも生成すればいいのでは?と実験してみたがこれではだめだった。

auditpol /restoreでグループポリシーのaudit.csvをセキュリティポリシーとしてリストアしたらうまくいった。


2015年10月28日水曜日

C# Windowsプログラミングおぼえがき No.2 - 印刷ジョブ -

バックグラウンドプログラムで印刷ジョブから印刷情報を取得して、
それをActionで出力するというプログラムをC#で作った。
結構ちゃんと作ってたら長くなったので近いうちに要点だけまとめて載せよう

悩んだところがいくつかある。
・印刷ジョブをどうやって検知する?スレッド終了イベントの待機は?
→WaitForMultipleObjects()とFindNextPrinterChangeNotification()で解決。
・印刷情報はどうやって取得する?
→PRINTER_NOTIFY_INFO_DATA構造体とか定義してメモリから読むのとWMIのWin32_PrintJob

上記2つをWhile(!stopFlg)といった感じで
終了フラグがONになるまで印刷ジョブか終了イベントを検知する度に実行。

これでだいたい「印刷される度に値を自動出力」は可能になる。
しかしここで最大の難所が!!

・1度の印刷の終了はどうやって判定する?

Whileループの中で、印刷ジョブを検知して情報を取得したら、
次のWaitForMultipleObjects()が実行されるまでに
終了判定(印刷完了したから値を出力するよって処理)を行う必要がある。
じゃないと値を出力しないままプログラムがイベント待機に入ってしまうから。

なので、どの段階で印刷情報をすべて取得できたかは
印刷ページ数を正しく取得できたか否かで判定しよう、と考えた。

でも、1度の印刷で印刷情報の通知は何回も受信するわけだけど
それぞれ「ページ数」が違うんだよね。通知が届くごとに変わる。
基本的には増えていく。でもたまに0になる。
ページ数は正確に取得したいから避けては通れない。なんか法則があるのか?

紙印刷しまくって検証するわけにもいかないから、
仮想プリンタでPDF出力してジョブの中身を眺めてみた。
するとどうだ。あるパターンを見出すに至った。

「ページ数が過去最高かつそれが2回連続している場合、それが実際のページ数と一致する」
これだ!印刷ページダブルマウンテンの法則と名付けよう。

で、両面印刷だったり片面複数ページ印刷だったりするならそれらも考慮し
取得したページ数を再計算してやれば実際の印刷用紙枚数になるわけだ。
ちなみに片面複数ページ印刷の情報はPrintTicketクラスを使って取得した。
PrintTicketは最低サポートOSがVistaSP2だのServer2008R2だのとされているが
XPやServer2003でも使えてた。WMIのクラスもXPで使えるものは多い。


そんなこんなで実装完了。と思いきや・・・
XPS Docment Writerの印刷情報がたまに取れないorz

どうやらXPSには印刷ページダブル云々の法則が当てはまらないようだ。。

仕方ないので改めてネットで情報収集していたところ
JOB_STATUSとかいういかにもな値が存在することが判明。
状態の種類はたくさんあるんだけど、DELETEDになった時点で出力した値が正確だった。
これプリンタドライバの仕様によっては変わるのか?

まぁXPSでもPDFでもちゃんと値を取得できるようになったからいいや。


印刷情報を取得するコードは意外とサンプルが少ない。
苦労して見つけてもすごく単純で、物足りないものが多かった。
それも英語ばっかりだしね・・・

ああ疲れた





最後に小技をひとつ
仮想プリンタで両面印刷を実現する荒業について。

基本的に仮想プリンタは両面印刷に対応していない。
ファイルに裏面などないから当然といえば当然だな。
なので仮想プリンタの印刷設定には両面印刷の項目すら存在しない。

ではどうやって両面印刷のジョブを仮想プリンタに送るのか?
仮想マシンで物理マシンの仮想プリンタを使うのだ!

仮想だの物理だのややこしいが、整理するととっても単純である。

たとえば、VMware上で印刷を実行するとする。
プリンタには物理マシンにインストールされた仮想プリンタを指定する。
そしてその仮想プリンタの印刷設定画面を開くと・・・
両面印刷の項目があるではないか!!!
そいつを設定してやると、実際にジョブで両面印刷が指示される。

偶然見つけた方法だけどデバッグには有効だよね。
でもこれ、片面複数ページ印刷の項目は消えるんだけどね。

[追記 2018/02/20]
プログラムのアップロードをすっかり忘れていました。
改めてコードを若干整理してMITライセンスで公開中。
PrintMonitor - https://bitbucket.org/marolabo/public

2015年7月24日金曜日

C# Windowsプログラミングおぼえがき

■インストール済みソフトウェア一覧取得
PCにインストールしたソフトの一覧がほしいとき。
WMIでは取得できないものも多々あると思われるので、レジストリから情報を得る。

1.Uninstallからソフトウェア名を取得
uninstallのサブキーのうちDisplayNameが記載されたものを取得する。
これがコントロールパネルの「プログラムのアンインストール」で表示されるものだと思われる。
ちなみにUninstallではインストール日時やバージョンなども取得できる。

2.App Pathsから実行ファイル名を取得
uninstallからは実行ファイル名を取得できないので、
uninstallでInstallLocationを取得した上でApp Pathsのサブキー順次取得し、
そのPathの値がInstallLocationで取得したものと一致した場合に既定値を実行ファイルパスとして取得する。

64bitOSと32bitOSではレジストリパスが若干異なるので注意。
64bitの場合はSoftwareの直下にWow6432nodeというキーが入る。


■インストール済みセキュリティソフト一覧取得
WMIのAntiVirusProductを使う。XPより後のOSではSecurityCenter2を指定すること。
取得できるproductStateは、その製品にどんな機能があるかを表す3Bytesの値。
値ごとの具体的な意味はこちら
別に製品の設定で機能のON/OFFを変えてもそれが反映されるわけではないので注意。
製品の実際の設定値を知るには製品ごとのレジストリを読むしかない。


■Windows Defenderについて
ウィルス定義ファイルの更新タイミングはざっと見た感じだと次の3パターンがある。

①WindowsUpdate
②スキャン直前
③定期チェック

定期チェックはWindows8以降だけ対応しているのかも。Windows7では設定できなさそうだった。
スキャン直前に更新チェックするかどうかは設定次第なんだけど、
Windows7までではそれを除くと更新タイミングはWindowsUpdateだけということに・・・

そしてレジストリを眺めただけではどんな設定項目があるのか分かりづらい。
手動で設定してはじめて作成されるキーとかあるし。
他のアンチウィルスソフト使ってたら設定いじれないし。



2015年6月27日土曜日

情報処理技術者試験について No.3 - スペシャリスト短期必勝法? -

都内のセキュリティベンダに転職しました。
転職先の年間の資格手当はなんと50万円超。資格取っててヨカッター

-------------------------------------------------------

新人時代にスペシャリスト(DB,NW)を取得した時の勉強法をメモしておこう。
かなりきついが、これをやれば今からでも秋期の高度試験に合格できる自信がある。
受けないけど。

■勉強期間
3カ月半。
データベーススペシャリスト試験は4月中旬頃だから、1月頭から始めた。
ネットワークスペシャリスト試験は10月中旬頃だから、7月から始めた。

■勉強開始時点での実力
応用情報技術者と情報セキュリティスペシャリストは学生時代に取ってたけど
DBやNWを受験した時は新人SEだったので実務経験は皆無。
特にNWはかなり苦手意識を持っていた。

■使った参考書
データベーススペシャリストは『情報処理教科書』だけ。2013年度版だったっけな
これだけで充分。自信を持って薦められる最高の参考書だった。
ネットワークスペシャリストの参考書は『情報処理教科書』と『ネスペ23』。
それに加えて、『3 Minutes Networking』とか
『30 Minutes Networking』のWebページもよく見ていた。

■進め方
○まずは午前演習で基礎固め
最初の1か月は、ひたすら午前2の演習(午前1は免除だった)。
IPAのWebサイトで過去問を7年分くらいダウンロードしてひたすら繰り返し解く。
ここで基本的な専門用語とその意味を覚えつつ、勉強する癖を作る。
ほぼ満点を連発できるようになったら、1か月を待たずに次のステップに進む。

○午後1で考え方を学ぶ
次の1か月はひたすら過去問の午後1を解く。5年分くらいを繰り返し演習するのがいい。
はじめは全然理解が追いつかないし大問ひとつに1時間以上かかることもあるけど、
設問には自分なりにすべて答える。安易に模範解答を見ない。
演習後は解説を理解できるまで読むこと。必ず採点すること。
解説は情報処理教科書の購入者ページで読める。配点は自分で推測できる。

少し慣れてきたら、なるべく大問1つあたり40分を目安にして新しい問題に挑戦してみる。
1か月もすれば着眼点がわかってくるし午後1レベルの知識も身に付いているので、
新しい問題でも7割くらいは得点できるようになっているはず。

○午後2で精神を鍛える
最初は大問ひとつ解くのに3時間はかかるが、諦めずに最後まで回答すること。
人によるかもしれないけどDBは問2の基礎理論寄りの事例解析がとっつきやすくておすすめ。
とにかく過去問を解きまくり、その度に採点して解説を熟読する。これだけ。
これだけなんだけど最初は演習含め1回4時間はかかる。精神の修行である。
これを1か月ほぼ毎日続けた剛の者だけがこの地獄の強行軍で成功を手にできるのだ。

○最終調整
1か月に及ぶ午後2デスマーチを終えた頃には、午後2を初見で6割、
午後1なら8割は時間内で正解できるようになっているはず。
しかしそうでなくても大丈夫。この時点で試験まで2週間残っている。
この最後の期間は自分の不安要素を取り除くのに専念する。
午後2が弱いと感じるなら午後2を、午後1が不得意なら午後1を思うさま解く。
ただし、試験直前には必ず午前問題を解き直すこと。安定して9割は正解できるまで。

○試験当日
朝は早起きして、出かける前に必ずトイレに行っておくこと。
朝食はあっさりしたもので軽めに済ますといい。
試験会場までの交通情報をチェックし、30分前に着くくらいの余裕を持って出発。

自分の場合は試験1週間前あたりからipodを封印していた。
本番中に時間に追われ難問を前にうんうん悩んでいる最中、
間違っても好きなバンドの音楽を脳内自動再生してしまわないようにするためだ。
そして当日は昼食を摂らない。普段から昼は食べないことが多いというのもあるが
午後試験中にお腹が痛くなるのを怖れて水分もできるだけ摂らないようにしていた。

そして何より大事なことがひとつ。『絶対に途中退室しないこと』である。
途中で出ていく奴らはだいたい落ちてる。これ本当です。
僕は試験会場の部屋の受験番号の範囲をメモしておいて、その部屋にいた中で
どれくらいの人が合格したのかを合格発表時に確認しています。
まぁ高度試験ともなると9割近くの人が落ちるわけだけど、他の合格者の受験番号を見ては
「あーあの人も最後まで残って頑張ってたもんな」と心の中で健闘を讃えたりします。

高度試験は実質的に相対評価制。
建前はあれど、あくまで「上位15%のみが合格できる試験」であることを忘れてはいけない。
そして受験者の多くは応用情報技術者試験や他の高度試験を突破してきた猛者たちなのだ。

一通り解いて時間が余っていても、時間切れまで見直して凡ミスを排除すること。
これが結果の明暗を分けることもある。
それまでの努力を無駄にしないためにも途中退室は絶対に駄目。
少なくとも、FE/AP/SC/DB/NWを最短の2年半で突破してきた僕は、午前試験を含め
一度も途中退室したことはありません。

-------------------------------------------------------

情報処理技術者試験は、今のところ特に目標もないので受ける予定はないけど
そのうちCCNAとか取ってみようかな。楽そうだし手当でるし
しかしいずれは論文系にも挑戦しなければ・・・


余談だけど『役に立ったスペシャリスト試験ランキング』でも発表しようかな(唐突)

1位 データベーススペシャリスト
なんだかんだで大抵の案件でDBの知識が要るので、新人ほやほやで合格できたのは大きかった。
しかも受かりたての頃にちょうどPL/SQL使う仕事やってたしね。
転職してからもTBL設計を任されてこなしてるので、勉強したことが身に付いてる感が強い。
そして意外にも組込みメモリのファームウェア開発でもDBの考え方は役立った。
メモリの論物管理がまさにDBの思想

2位 ネットワークスペシャリスト
僕のこれまでの仕事では直接役立つ機会は少なかったが、
大規模システム開発の案件でインフラチームの人と話し合う時なんかで
専門的な内容でもスムーズに会話できたのが嬉しかった。
SMTP関係で厳しい要件で仕様作った時もとっかかりが楽だったな。
今はネットワークの知識必須の仕事なので毎日役立ってる。
若造の割に好条件のオファーで転職できたのもおそらくこの資格のおかげだろう・・・
保持資格としては一番高く評価されることが多い気がする。

3位 情報セキュリティスペシャリスト
上の2つと比べると「今役立ってる!」と思えることが少ない。
まさに今!と思えたのなんて組込みの現場でC言語を使ってた時だけだな。。
それもバッファオーバフロー関係と暗号化やハッシュ化だけだしな。。。
でもプログラミングやネットワーク関係だけじゃなく、
運用面や人的なセキュリティリスクについて学べたので普段のセキュリティ意識は高くなった。
意識が高くなって情報収集する癖がついたのも良いことだな。
岡崎市立中央図書館事件の話がきっかけで仲良くなれた上司もいたし。


組込みの現場ではエンベデッドスペシャリストを持ってる人が2人いたけど
その人たちは壮絶に優秀なエンジニアだったな・・・

2015年1月16日金曜日

セミナー参加 -MySQLレプリケーション入門-

本日Oracle青山センターで開催された『【初心者向け】MySQLレプリケーション入門』に参加してきた。

100席くらいの部屋は満席。
2時間だけの短い講習だったけど色々と勉強になった。

レプリケーションといえば冗長化!可用性向上!っていうイメージがこれまで強かったが、実は負荷分散にもなるんだね。
レプリケーションの概念から仕組みから実際の設定方法まで、具体的な説明を聞くことができた。
PC1台で実演してるところも見れたし、なかなか楽しかったな。

やり方はわかったので自分で試して手順をここに載せようかと思ったけど風邪っぽい上に明日も仕事なので今日はやめておこう。。
いつか時間がある時にでも。


【2015/01/28 追記】
内容を資料にまとめた。
ブラウザで表示すると体裁が崩れたり図内の文字が消えてたりするのでダウンロード推奨
https://drive.google.com/file/d/0BwTM4PitwqqoQ0hBbFl4SFpZNGM/view?usp=sharing