投稿

ラベル(Windows Server 2008 R2)が付いた投稿を表示しています

メールサーバの移行

イメージ
 自前のメールサーバを停止 これまで、自ドメインのメールサーバはVPS上に構築していた。 ・Ubuntu Server ・Postfix ・Dovecot ・spamAssassinと、BlackListの利用 Spam対策を行ってきたし、サーバ上でメールをトリガーにして各種プログラムを動かしたりしてきた。 メールサーバのメンテナンスは結構面倒くさくて、  ・Disk容量のチェック  ・不正アクセスのチェック  ・各種セキュリティパッチの適用 など、手間がかかる。 そこで、外部のサーバを利用することに…。 結構安くて使い勝手の良さそうなのが、「さくらのメールボックス」 3年契約で、3070円とな…。  メールアドレスは自分のだけなので、20GBまで利用可能!  (Gmailより大きいねぇ) ということで、早速契約。 アカウント設定を行って、既存のDNSを書き換える。WHOISも書き換えて完了。 SMTPとIMAPが利用できればOK。 ちょうど、GoogleがSPF設定していないと受信しないし、DKIMおよびDMARCに対応していないメールを弾くようになったので、対応しているのを確認。 さくらサーバ自体は、これまでお客さんのサーバとして何件も利用しているので、利用方法も難しくはない。  Webメールにも対応しているので、いざという場合にもありがたい。 ということで、各メールソフトの設定を変更。  PC(常時使用する3台)とタブレット、スマートフォンと台数は多いがそれ程手間はかからない。 問題は、旧サーバで送受信したメールの履歴だけれど、これはThunderbrdを使ってローカルに保存することで回避。  本当は、サーバtoサーバでMailboxに残そうとも考えたんだけど、古いメールはそれ程必要ないし、ローカルにバックアップしてあれば凌げるので、良しとする。 移行時にDNSの反映で若干時間がかかったものの、問題なく送受信できるのを確認して、作業完了。  これでメンテナンスの手間が減るので、安いもんです。

ログの整理 #3

PowerShellでは遅すぎて… 実際問題、ログからcsvに切り出すことは可能になったものの、10MBのログから200kb前後のcsvファイルを生成するのに前回のスクリプトだと約2時間かかるんですねぇ。 そりゃ、1レコードを生成するのに、ログオンIDで再度全部ログを舐めて、PCの名前とIPを拾っているわけで…。 単純に考えればO(n^2)というわけですね。 ログのローテーションというか上限を5MB(半分)にすれば、多分処理速度は1/4程度にまで下がるとは思われるけれど、120分が30分になって、ファイル数が倍なので実質1時間かかるわけで…。orz。 何が遅い? 実際、何に時間がかかっているのかを調べ始めたのだけれど、まずwhere-Objectが結構な時間を消費している。その後foreachで回す処理は激遅い。 結局、イベントログからオブジェクトとして扱っているのが、遅さの原因ぽい。 最適化しようにも、PowerShell自体の扱いに慣れていないので、とっても疲れるです。 他に良い方法は無いものだろうか?と思案し始めた時に、以前オライリーの本で見た記憶があったので、ちょいっと検索してみる。 方針変更! perlのモジュールにW32::EventLogが有るじゃないですか。 早速、マニュアルを参考にテスト用のコードを書いてみる。 さすがに、サーバ上での作業は心配なので、VM上のWindows7にActivePerlを入れてテストすることに。 細かい仕様を決めようか、汎用的に作ろうかと迷いつつも、現状の作業をサックリ行えることを目的に作成した。約1日かけて、コーディング終了。前回までのスクリプトと同じ結果を返すようにするところで、少々苦労したわ。 なので、若干コードは汚い(perlなのでさらに汚いww)とは思うのだけれど、これが素晴らしい性能を発揮してくれた。 コードは以下全体を載せておくので、もし万が一使いたい人は、自己責任にてお願いします。 さて、実際に同じデータを食わせてみると、なっなんと、2時間かかっていた処理を1分以内に終えてくれる!!! あぁ、これで今後のログの整理が快適になる。 1週間分、いや1ヶ月分まとめて処理だって怖くない! あとは、コマンドラインでイベントログを引数として渡せば良い仕様

ログの整理 #2

直しを入れてみた 前回のスクリプトでは、切り出したログを処理すると、対応するログオンIDが見つからないことがあり、ホスト名やIPが空欄になる現象が発生していた。 そこで、後から確認するためにログオンIDをフィールドに付加する仕様に変更した。 こうすることで、手動で該当するログとの突き合わせが可能になる。切り出したcsvだけだと情報が欠落してしまい、再度全部チェックしないといけなくなるを避けるためだ。 さらに仕様変更 ログファイルは、キーボードから入力(といっても、Drag&Dropで入力できるので面倒ではないのだけれど)して、画面に出力していたものを、直接csvファイルに落とすことにした。 ファイル名も面倒なので、入力したログファイルの拡張子をcsvに変更するだけにした。 まあ、少しは手間が省けることでしょう。 ということで、以下がそのスクリプトの全体。 今のところ、最低限のチェックしか入れていないので、暇があれば修正をしようと思う。 誰かのお役に立てれば幸いですが…。 #requires -version 2.0 # 2012/10/04 add field logon-id #     direct write csv-file  function GetValue([String]$category, [String]$key, [String[]]$properties) {   $b = $false;   foreach ($property in $properties) {     if ($b -eq $false) {       if ($property.contains($category)) {         $b = $true;         continue;       }     } else {       if ($property.contains($key)) {         return [String]$property.Substring($property.IndexOf(":")+1).Trim();       }     }   }   return ""; } funct

ログの整理

イメージ
ユーザの操作を記録 Windows Serverで、ファイルの監査を行なって、「誰が・いつ・どのファイル・どうした」という統計と、問題が発生した場合にその原因を特定するために、詳細なログを取ることに…。 手順は簡単。まあどの本を見ても書かれているので、詳細は必要ないとは思うけど、参考にした資料くらいは載せておこうと思う。 マイクロソフトが出している文書 「ファイルサーバー上のファイル操作における監査」 が、2000/2003用ではあるけれど、きちっと書かれていますので、これに従えばOK。 ローカルポリシー→監査ポリシー→「オブジェクトアクセスの監査」で成功・失敗をON その他「アカウント ログオン イベントの監査」「ログオン イベントの監査」も設定 エクスプローラで監査したいフォルダを選択。→プロパティ→詳細設定→監査タブで追加→グループもしくはユーザもしくはeveryoneで設定する。 設定内容は「ファイルの作成/データの書き込み」「フォルダの作成/データの追加」「サブフォルダとファイルの削除」「削除」「アクセス許可の変更」「所有権の変更」あたりでOKかと…。必要に応じて設定してください。 あとは、セキュリティログに記録されるので、イベントビューワーあたりで確認すればOK。 大量のログが… ところが、訳の分からない大量のログが発生していて、すぐに溢れてしまう。上書きに設定してもⅠ時間と持たない。アーカイブするようにしても滅茶苦茶な量になる。 どうやら「フィルタリングプラットフォームの接続」に関するログががががが…。 ということで、これじゃログが使いものにならないクズだらけのログになってしまうので、対策を練ることに。 探してみると グループポリシー→Windowsの設定→セキュリティの設定→監査ポリシーの詳細な設定→監査ポリシー→オブジェクトアクセス→「フィルタリングプラットフォームの接続の監査」が有るじゃないですか。 思い切って、「監査なし」に設定する。 すると、今度は全くログを取らなくなってしまう。悩ましい。 そこで、ポリシーを探してみると、 詳細な設定→監査ポリシー→オブジェクトアクセス→「ファイルシステムの監査」と ログオンログオフの監査→「ログオンの監査」「ロ

標準で設定して欲しいのに

時刻合わせをどうするか…。 先日、nettime.batでクライアントとサーバの時刻同期を強制的に行わせることにしたのだけれど…。 肝心のサーバは、どうするかという問題があるわけです。 今回は、proxyの下にWindows Serverを設置しているので、直接外に行かせたくない気もして、ntpで時刻合わせをしているproxyと同期することにします。 さて、Linuxならntpでサーバ指定すればOKなんだけど、Windowsはどうするの? と…。昔なら さくら時計 でというのもありですし、自分のマシンならそれもいいでしょう。 できれば、標準のコマンドで合わせて欲しいわけです。 メニューを漁っても、それらしき項目は無いわけで…。 探してみると「 Windows Server 2008 で時刻同期を設定する (NTP) 」なんて記事がちゃんとありました。 手順は簡単 コマンドプロンプトを開く w32tm /query /configuration で状況確認 w32tm /config /manualpeerlist:(ntpサーバのIP) /syncfromflags:manual で設定 w32tm /config /update で設定を反映 再度確認 とこれだけです。今回、proxyは192.168.0.1で立てましたので、これを指定して終了。 ところでntpだけど そうえいば、昔ntp.confを設定するときには、福岡大学と同期という情報が流れて、それが元でfukuoka-u.ac.jpのntpがパンクするなんて事件がありましたなぁ。 その結果、他のところを使おうということで、 ntp.jst.mfeed.ad.jp ntp.ring.gr.jp なんかを利用するのが一般的だったんだけど、最近はNTP POOL PROJECTなんてのができているんですね〜。 ちなみに、ubuntuにntpを入れて、ntp.confを確認すると、  server 0.ubuntu.pool.ntp.org server 1.ubuntu.pool.ntp.org server 2.ubuntu.pool.ntp.org server 3.ubuntu.pool.ntp.org

Windows Server 手こずった #3

イメージ
バックアップドライブの設定 今回は、NASを利用していたので、そのまま使おうかとも考えたのだけれども、細かな制御がしにくいことやログを取る上で、ユーザ名など詳細に記録したいという事で、NASのデータをWindowsServer上に移動し、FileServerとして稼働することにした。 こんどはNASをバックアップにしようと思ったのだけれど、バッファローのLinkStationは直接USBで接続して利用できない…らしい。といって、Network上に置いていたら意味がない。 サーバに新たにNICを挿して、ローカルなネットワークを構築しても良いのだけど、手間の割にメリットが無いので、外付けのHDDを購入してバックアップ用に割り当てることにした。 現場近くのケーズデンキに行くと、USB3.0対応の2TBのものが、1万円ちょっとででているので、速攻で購入。 戻って接続。 OK認識は大丈夫。HDD上に置かれているフォーマッタやパーティション切り直しツールなんかは、一切いらないので、削除。変なツールは不要ですし、標準のもので十分だもんね〜。 さて、バックアップソフトには、お気に入りのpdumpfsを利用。LinuxでのFileServerでもお世話になりました。Windows版も出ているので、利用することに。 本当はRuby突っ込んで実行なんてのも良いのだけれど、個人的な趣味に走り過ぎと言われるのはまずいので…。 削除は、手動で実行することに決め、余分なタスクなどは設定しない。 さて、テスト…。 エラーだ。 新しいHDDに書き込みができない。・・・。 そうか、pdumpfsの権限が不足しているのか〜と、試しにeveryoneフルコントロールにしようとして、権限がないと言われる。 ちょっ、俺はadministratorで入ってるんやで!!! なんでや〜。 ええい、ドライブのパスも変更できるし、フォーマともできるのに…。 そっか、クイックフォーマットが悪さしてるんだなきっと。 じゃ、クイックじゃないフォーマットを…NTFSで2TB。ぽちっ! 1%……… 2%……… ってめちゃめちゃ遅いじゃんか。ダメだ、他の作業を先にやることにしようと…。と諦めて前日帰宅。 でもって、朝見るとようやく55%。はぁ、結局フォーマットをかけた翌

現場で書き換え…

ログインスクリプトでエラー 前回、マイクロソフトのサンプルに問題があって、修正が必要と書いたのだけれど、現場でテストしてみると、さらにエラーが発生する。 strGroups = LCase(Join(CurrentUser.MemberOf)) 今度は、この記述だ・・・。 どうやら、ユーザのデータを引いた時のOUやグループの設定状況でデータ個数が配列で返らない場合に、うまくjoinできていないらしい。 そこで、 'strGroups = LCase(Join(CurrentUser.MemberOf)) if IsArray(CurrentUser.MemberOf) then    strGroups = LCase(join(CurrentUser.MemberOf)) else    strGroups = LCase(CurrentUser.MemberOf) End if てな感じで、配列かどうかで処理を分ける必要があるということが判明。 その場で、書き換えてテストしなければならない程の、逼迫ぶりで…。疲れましたゎ。 でも、これで何とか動作するようになり、OKです。 念の為、全て記述しておこう。 Const MANAGER_GROUP = "cn=manager" Const SUPPORT_GROUP = "cn=support" 'Const STAFF_GROUP   = "cn=staff" Set wshNetwork = CreateObject("WScript.Network") 'homeはプロファイル設定で掴ませることにするのでコメントアウト 'wshNetwork.MapNetworkDrive "i:" , "\\dc01\home$\" & wshNetwork.UserName wshNetwork.MapNetworkDrive "s:" , "\\dc01\staff" Set ADSysInfo = CreateObject("ADSystemInfo")

相変わらずなトラブルに見舞われ…?

システム導入作業ほぼ完了 日曜から3日連続で、8時〜23時程度の作業に追われていましたが、これもほぼ終わろうとしています。さすがに、連続的な作業と、現場の人達の相談(というかクレームw)に疲れてきましたが、何とか終りが見えてきたので、今日は早めに帰宅、おかげで少し時間が取れました。昨日までは帰ってシャワーを浴びたら即ベッドで死んだように寝ていましたから、今日は心に余裕があります。 ほぼすべてのトラブルも解決の目処が立ちました〜。 新しいOSを使ったせいもあって、様々トラブルというか自分の知識が足りなかった部分も多々あるんだけれど、面白い経験をしたのでメモメモ…。 Windows Serverのライセンス 今回、職員は120名以上で所有PCは40台程度の職場への導入だったので、Windows Server 2008R2(5CAL)に+35CALを用意しました。 以前からWindows Serverは接続デバイス数か接続ユーザー数が選べたはずだったので、当然少ない方のデバイスで40CAL用意したわけです。 日曜に搬入だったので、それまでに設定作業をあらかた終わらせようと頑張っていたわけです。搬入前日に、ほぼイメージも出来上がり、設置してクライアントのPCを接続した時に、エラーになってはまずいということで、ライセンスの登録をしようと最終作業を始めました。 コントロールパネルを開いて、接続デバイス数で…。と思ったら、設定場所が見つからない。確か、あったはずなのに…。 あちらを開き、こちらを開き、Helpを確認し…。見つからない。 まずい、明日になって接続でトラブりたくないし…。 で、結局かなりの時間を費やし、見つけたのはモラルライセンスだったわけです。 「 稼動ライセンスモードについて 」に詳細に書かれていました。2008から変更になっていたようです…。 つまり、設定する項目は無効になっていて、法人のモラルにしたがって購入・利用しろと…。 キツネに化かされたような気がしました〜。頭の上にかけたメガネを探していたような、まぬけな作業を2時間近くしていたことになる訳で…、恥ずかしい!けど記録しておこう!とな。 最近のマイクロソフトは、対応の仕方が少し変わってきたような気がします。無料のOSが台頭してきたのも影響しているのかもしれません

ログオン・スクリプトの作成

イメージ
Active Directoryでのユーザに 構築も終盤になってきて、ユーザの要望に合わせた設定を行なっていく。手こずりネタ第3弾ww。 現在NASのに保存されているデータをファイルサーバ上に移動させて、そこを利用することに。 これまでのままでは、使い勝手が悪いので、ネットワーク上のドライブに個人用の領域を確保する。 方針としては以下のとおり。 private領域(他人からは参照されない) public領域(全職員が共有する。読み書き可能) group領域(特定のグループだけが読み書き可能。) 3つめのGroup領域は、必要に応じて複数存在させる。 これと、役職の関係が出てくるので、よく考える必要がある。 管理職は、全ての領域(1〜3)が読み書き可能。 groupメンバーは、自分のgroupとpublicが読み書き可能。 それ以外の、一般職員はpublicのみ。 そして、全員にprivate領域の読み書き可能権限を与える。 とまあ、表にしたほうが早いかもしれない。 ログオン・スクリプトの作成 net useで処理することが、多かったけど、今回は別の方法を試して見ることに。 マイクロソフトのページ を参考に、書き換えてテストすることに。 先ほどの方針に従って、書き換える。プリンタはとりあえず考慮しない。 Const MANAGER_GROUP = "cn=manager" Const SUPPORT_GROUP = "cn=support" 'Const STAFF_GROUP   = "cn=staff"  Set wshNetwork = CreateObject("WScript.Network") 'wshNetwork.MapNetworkDrive "i:" , "\\dc01\home$\" & wshNetwork.UserName wshNetwork.MapNetworkDrive "s:" , "\\dc01\staff"  Set ADSysInfo = CreateObject(

Windows Server 手こずった #2

イメージ
OUが削除できない ユーザーを追加するのに、テスト用にOU(組織単位)を切って、そこにまとめて追加できるよう何度もテストをしたんだけど、そのテスト用のOUが削除できない…。 もちろん、昔のサーバーにはこんな機能はなかった(はず)ので、少々焦りました。 確かにOU作成するときに、「間違って削除されないようコンテナを保護する」にチェックが入っていたんだけど…。削除させてくれよ〜。 所有権がないのか?とか、オプションで表示できるはず…と探しまわって、ありました。 [表示]-[拡張機能]をクリック→拡張機能の表示を有効にする。 このあと、OUのプロパティを開いてみると、タブが増えていて、「間違って削除されないようコンテナを保護する」のチェックボックスを外すと、念願のOU削除が可能になりました。 休憩しながら、2008Serverの書籍をよく読むと、小さく書かれていました。トホホ…。 まあ、2度と忘れることは無いけど、もう少し体系立ててメニューとかタブとか作って欲しいなぁ。 結局、使い勝手の悪さもNTの頃から変わっていないやんけ〜。 以前のではOUはサックリ削除できたと思うんだけどな…。消す前に確認してくれれば充分だと思うんだけどな…。今回作業してて、あぁ間違えて消しちゃうとこだったよ〜なんと事は1度も起きなかったんだけどな。 いま、検索してみたら「【 解説】「Active Directory」ドメインサービスの7つの強化ポイント 」なる2008が出た当時の記事に、書かれているじゃないですか〜。 きっと、2008を使っている人には常識なのかもしれない…。僕は非常識ということになるんだな…。 まあ、これも一度ハマれば二度と忘れることはなかろう。

Windows Server 2008 R2 に手こずった

イメージ
NT Serverとは随分変わったね このところ作業に追われ、なかなか更新する時間が取れなかった。しかし作業も進んできたので記録をとっておく必要もあるし、結構ハマったから、その内容をまとめておこうと思う。 最初にWindows Serverに触れたのはNT3.51だったから、もうあれから随分時が流れました。次が2000 Serverで2003は少しメンテしたぐらい。 今回は2008ということで、機能的にも随分設定が楽になったところが各所に見られました。が、しかし思い通りに行かない部分も多々あり、それで時間が取られているんだけど…。 今回は、120名ほどユーザーアカウントを作成する必要があるので、とても手作業というわけには行きません。 そこで、バッチを作成してdsaddコマンドを使い一括登録しました。 日々是消費 さんのスクリプトを参考にしました。 adduser.bat @echo on for /f "tokens=1-3 delims=," %%i in (userlist.csv) do ( dsadd user  "CN=%%i,OU=Organization,DC=Company,DC=local"   -samid %%i -pwd %%j -display %%k -hmdir \\dc01\home$\%%i -hmdrv I: -profile \\dc01\profile$\%%i -canchpwd no -acctexpires never   mkdir \\dc01\home$\%%i cacls \\dc01\home$\%%i /G %%i:F /E   mkdir \\dc01\profile$\%%i cacls \\dc01\Profile$\%%i /G %%i:F /E net user %%i %%j net user %%i /ACTIVE:YES ) これに、アカウント名,パスワード,表示名(漢字)のフィールド3つだけのuserlist.csvファイルを作成して、実行させて完了。 と思いきや、 エラーを吐いて、うまく登録できていないユーザがちらほら…。 原因は、パスワードの複雑さが足りないことらしい。 パスワード自動