2016年3月3日木曜日

【Active Directory】NTタイムエポック値 について

event_note

Active Directoryの最終ログイン日時が知りたい

普段の業務にて

Active Directory に関連する業務の中で、よくある要望の一つとしてユーザーアカウントの最終ログイン日時を調べて欲しいというものがある。

Active Directory 関連の情報は Power Shell にて抽出することができる。

PowerShellにてActive Directory のユーザー情報を出力する

以下のコマンドにてユーザー情報を取得することができる。


# ActiveDirectory関連のモジュールを読み込みする
PS C:\> Import-Module ActiveDirectory

~ 中略 ~

# ユーザー情報を取得する
PS C:\> Get-ADUser -Properties * -Filter *

~ 実行結果 ~

Power Shellにて取得したユーザー情報のログインに関連する属性として 【LastLogon】【LastLogonTimeStamp】という2つの属性が存在する。
(ドメインの機能レベルが Windows Server 2003)

ここで落とし穴が・・・

Active Directory のドメインコントローラーを複数台にて運用している場合、【LastLogon】属性はユーザーがログインに使用したドメインコントローラーにのみ記録される。
他のドメインコントローラーには記録されないし情報がレプリケートされることもないので注意が必要である。

もう一つの属性として【LastLogonTimeStamp】があり、こちらはドメインコントローラーを複数運用している場合においても情報がレプリケートされる。
但し、レプリケートされるのに最大で14日のタイムラグが発生するようである。
これはログインする度にレプリケートするとサーバーに必要以上に負荷がかかるとの配慮のようである。

LastLogon属性とLastLogonTimeStamp属性の纏め

属 性 説 明
LastLogon ユーザーがログインに使用したドメインコントローラーにのみ記録される。
他のドメインコントローラーには記録されないし情報がレプリケートされることもない。
LastLogonTimeStamp ドメインコントローラー間にてレプリケートされるが、最大で14日のタイムラグが発生する。
また、保存される値はNTタイムエポック値の為、人間が理解するためには日付形式の文字列へ変換する必要がある。

NTタイムエポック値

もう一点、【LastLogonTimeStamp】属性にはNTタイムエポック値という値で記録される。
NTタイムエポック値とは、1601/01/01 00:00:00 から100ナノ秒単位のカウント値である。

日時:【2016/2/18 10:35:03】は NTタイムエポック値で表すと【131002329039401000】という18桁の整数となる。

関連記事

ActiveDirectory関連のPowerShellについてはこちらで記事にしています。

2020年1月18日に納車したWRX STI Type S (VAB F型)の整備について記録を残していきたいと思います。

【LastLogonTimeStamp】属性については、マイクロソフトが運営するブログにて詳しく説明されていますのでそちらを参照してください。

NTタイムエポック値を変換する

コマンドにて変換

Power Shell にて Active Directory のユーザー情報を抽出すると。

PS C:\> Get-ADUser -Properties * -Filter *

~~~(中略)~~~

DistinguishedName  : CN=staff1234,OU=ou_user,DC=testdc,DC=local
Enabled            : True
GivenName          : 
LastLogonTimeStamp : 131002329039401000
Name               : staff1234
ObjectClass        : user
ObjectGUID         : 5a46c14b-436f-41dc-ac36-d8b405892ef0
SamAccountName     : staff1234
SID                : S-1-5-21-3159277430-1725456294-2618848261-6241
Surname            : staff1234
UserPrincipalName  : staff1234@testdc.local

~~~(中略)~~~

上記の例では【LastLogonTimeStamp】属性に 131002329039401000 という値が格納されている。
ちなみに、NTエポック値 131002329039401000 を人間が理解できる日時(文字列)に変換すると 2016/2/18 10:35:03 になる。

NTエポック値についてはWindowsのw32tmコマンドにて、人間が理解できる文字列に変換することが出来る。

ためしに、w32tm /ntte 131002329039401000 と入力し実行すると。

C:\> w32tm /ntte 131002329039401000
151623 01:35:03.9401000 - 2016/02/18 10:35:03

エクセルのシリアル値への変換

NTタイムエポック値 131002329039401000 を変換した場合。

単 位 説 明
NTタイムエポック値 131002329039401000.000000000 1601/01/01 00:00:00 から100ナノ秒単位のカウント値
マイクロ秒 13100232903940100.000000000 NTタイムエポック値 / 10
ミリ秒 13100232903940.100000000 マイクロ秒 / 1000
13100232903.940100000 ミリ秒 / 1000
218337215.065668000 秒 / 60
3638953.584427810 分 / 60
151623.066017825 時 / 24
エクセルのシリアル値 42418.066017825 日 - 109205
エクセルのシリアル値 0 (1899/12/31 00:00:00)と 1600/1/1 00:00:00との差は 109205.000000000日 なので
エクセルのシリアル値(日本標準時) 42418.441017825 エクセルのシリアル値 + 0.375
9時間 / 24時間(日) = 0.375 なので
(日本標準時 = 世界標準時 + 9時間)
yyyy/mm/dd hh:nn:ss 2016/02/18 10:35:03 エクセルの書式 yyyy/mm/dd hh:mm:ss

計算式

エクセルでのシリアル値 = 
(NTタイムエポック値) / (10 * 1000 * 1000 * 60 * 60 * 24) - 109205 + 0.375

日付からNTタイムエポック値に変換する

Power Shellと .NETのライブラリを組み合わせて変換する。

Power Shellにて下記のコマンドを実行すると。

PS C:\> ([DateTime]"1601/1/1 00:00:00").Ticks
504911232000000000

NTタイムエポック値であれば【 0 】が得られるはずだが、大きく異るのは Windows OS のシステム時間はNTタイムエポック値(1601/1/1 00:00:00からのカウント値)で表現されるのに対し、.NET の世界では西暦元年(0001/1/1 00:00:00)からのカウント値になるからである。
つまり、知りたい日付の 【.NET Ticks 値】から 504911232000000000 を引いた値がNTタイムエポック値となる。

NTタイムエポック値 = (.NET Ticks値) - 504911232000000000

2016/2/26 01:23:45 のNTタイムエポック値は?

PS C:\> ([DateTime]"2016/2/26 01:23:45").Ticks - 504911232000000000
131009234250000000

実際の業務では

Power Shell にて Active Directory のユーザー情報をCSVファイルに抽出する。

PS C:\> Get-ADUser -Properties * -Filter * | Export-CSV -Encoding UTF8 -Path C:\ADUser.csv

先程抽出したCSVファイルをエクセルにて開き、日時表示用の列を追加する。

この場合は、AM列に計算式を追加した。

2016年2月16日火曜日

Windows 10 へのアップグレードをブロックする方法のまとめ

event_note

Windows10への強制アップグレードを阻止する

マイクロソフトの暴挙

最近、顧客の端末を勝手に「Windows 10」にアップグレードしてしまってトラブっているのでなんとかして欲しいという事案が頻発している。

Windows Updateの設定を自動にしていると、どうやら【KB3035583】という「Windows 10 アップグレード広告」なるものがインストールされるようであり、Windowsを起動する度にWindows 10へのアップグレードを促すポップアップが表示されるようになる。

いわばマルウェアソフトのようなものがマイクロソフト公式から発信されるのだから防ぎようがないのだが、流石に苦情が殺到したのか?企業向けという前置きの元、公式からWindows 10アップグレードを管理(ブロック)する方法が出ているようである。

Windows 10 へのアップグレードを抑止する方法

@ITにて Windows 10 のアップグレードブロックについて詳しく解説しているので紹介しておく。
Windows UpdateによるWindows 10へのアップグレードを「ブロック」する理由とその方法

手順1 Windows 10へのアップグレードを禁止する

1. 更新プログラム【KB3065987】がインストールされていることを確認する

コントロールパネル→プログラムと機能→インストールされた更新プログラムを確認する

2. レジストリに下記のキーを登録することによりアップグレードを禁止する

reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v DisableOSUpgrade /t REG_DWORD /d 1 /f

手順2 タスクトレイの【Windows 10 アップグレード】アイコンを抹殺する

1. 更新プログラム【KB3035583】をアンインストールする

2. レジストリに下記のキーを登録することにより常駐プログラムを止める

コマンドプロンプトより下記コマンドを入力する

reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\Gwx /v DisableGwx /t REG_DWORD /d 1 /f

2016年2月8日月曜日

IPアドレス管理サーバーの構築 【3】 phpIPAM環境構築

event_note

必要なツール類をインストール

ツール類をインストールする前にパッケージ情報を最新にしておく。

    root@debian-phpipam:/tmp# apt-get update

標準エディタのviだとカーソルキーが動作しない(意図しない文字が勝手に入力されてしまう)のでVimエディタを導入する。

    root@debian-phpipam:/tmp# apt-get install vim

NTPクライアントをインストールする

    root@debian-phpipam:/tmp# apt-get install ntp

時刻合わせ(NTP)の設定を行う

デフォルトではpool.ntp.orgのntpサーバーを参照しているが変更する場合は/etc/ntp.confファイルを編集する
pool.ntp.orgについてlaunch

サービスの起動・停止などの管理を行うツール(sysv-rc-conf)をインストールする

    root@debian-phpipam:/tmp# apt-get install sysv-rc-conf
    root@debian-phpipam:/tmp# sysv-rc-conf ← 試しにsysv-rc-confを起動してみる

phpIPAMにて必要となる為、fpingをインストールする

    root@debian-phpipam:/tmp# apt-get install fping

apache2をインストールし設定ファイルを編集する

apache2をインストール

    root@debian-phpipam:/tmp# apt-get install apache2

apache2.confを編集する

    root@debian-phpipam:/tmp# cd /etc/apache2
    root@debian-phpipam:/etc/apache2# vim apache2.conf 

(変更前)

(変更後)

mod_rewrite を有効化しapache2を再起動

root@debian-phpipam:/etc/apache2# a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
  service apache2 restart
root@debian-phpipam:/etc/apache2# service apache2 restart

MySQLをインストールし設定ファイルを編集する

MySQLをインストール

    root@debian-phpipam:/etc/apache2# apt-get install mysql-server

インストール中にMySQLのルートパスワードを設定する

MySQLの設定ファイルを編集する

/etc/mysql/my.cnf

    root@debian-phpipam:/etc/apache2# cd /etc/mysql
    root@debian-phpipam:/etc/mysql# vim my.cnf

[mysqld]セクションに追記

    [mysqld]
    character-set-server=utf8           #文字コードにUTF-8を指定
    skip-character-set-client-handshake #クライアントの文字コードを無視する設定
    default-storage-engine=INNODB       #ストレージエンジンにINNODBを指定

[mysqldump]セクションに追記

    [mysqldump]
    default-character-set=utf8 #文字コードにUTF-8を指定

[mysql]セクションに追記

    [mysql]
    default-character-set=utf8 #文字コードにUTF-8を指定

別端末からMySQLに接続する必要がある場合には[mysqld]セクションのbind-addressを編集する必要がある

    [mysqld]
    # Instead of skip-networking the default is now to listen only on
    # localhost which is more compatible and is not less secure.
    bind-address = 127.0.0.1 #デフォルトでは自身のサーバーからのみアクセス可能。

MySQLを再起動する

    root@debian-phpipam:/etc/mysql# service mysql restart

php5をインストールし設定ファイルを編集する

php5をインストール

    root@debian-phpipam:/etc/mysql# apt-get install php5 libapache2-mod-php5 php-pear php5-gmp php5-mysql

/etc/php5/apache2/php.iniを編集する

root@debian-phpipam:/etc/mysql# cd /etc/php5/apache2
root@debian-phpipam:/etc/php5/apache2# vim php.ini

(~中略~)

;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;

[CLI Server]
; Whether the CLI web server uses ANSI color coding in its terminal output.
cli_server.color = On

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone = 
date.timezone = Asia/Tokyo ←タイムゾーンの設定を追加する

phpIPAMをインストールする

phpIPAMをダウンロードする
今回はgithubよりphpIPAM1.2をダウンロード(2016/2/11時点の最新Ver)
https://github.com/phpipam/launch

    root@debian-phpipam:/etc/php5/apache2# cd /tmp
    root@debian-phpipam:/tmp# wget --no-check-certificate https://github.com/phpipam/phpipam/archive/1.2.tar.gz
    root@debian-phpipam:/tmp# ls
    1.2.tar.gz
    root@debian-phpipam:/tmp# tar xvf 1.2.tar.gz

phpIPAMのソースファイルをapacheの仮想ディレクトリへコピーする
今回はapache2のデフォルトディレクトリである/var/www/html/以下にコピー
事前にapache2のデフォルトindex.htmlファイルを削除しておく

    root@debian-phpipam:/tmp# rm /var/www/html/index.html
    root@debian-phpipam:/tmp# ls
    1.2.tar.gz  phpipam-1.2
    root@debian-phpipam:/tmp# cp -rf ./phpipam-1.2/* /var/www/html/

/var/www/html/以下のファイルのオーナーをwww-dataに変更する。

root@debian-phpipam:/var/www/html# chown www-data:www-data -R *
root@debian-phpipam:/var/www/html# ls -l
合計 64
-rwxr-xr-x  1 www-data www-data   110  2月 11 15:58 INSTALL.txt
-rwxr-xr-x  1 www-data www-data  2455  2月 11 15:58 README
-rwxr-xr-x  1 www-data www-data   105  2月 11 15:58 UPDATE
drwxr-xr-x  4 www-data www-data  4096  2月 11 15:58 api
drwxr-xr-x 14 www-data www-data  4096  2月 11 15:58 app
-rwxr-xr-x  1 www-data www-data  2761  2月 11 15:58 config.php
drwxr-xr-x  3 www-data www-data  4096  2月 11 15:58 css
drwxr-xr-x  3 www-data www-data  4096  2月 11 15:58 db
drwxr-xr-x 11 www-data www-data  4096  2月 11 15:58 functions
-rwxr-xr-x  1 www-data www-data 10057  2月 11 15:58 index.php
drwxr-xr-x  2 www-data www-data  4096  2月 11 15:58 install
drwxr-xr-x  3 www-data www-data  4096  2月 11 15:58 js
drwxr-xr-x  2 www-data www-data  4096  2月 11 15:58 misc
drwxr-xr-x  2 www-data www-data  4096  2月 11 15:58 upgrade

apache2を再起動する

    root@debian-phpipam:/tmp# service apache2 restart

ブラウザにてhttp://(phpIPAMサーバーのIP)/index.phpへアクセスすると。。
設定ファイルが無いと怒られる。

/var/www/html/config.dist.php ファイルをconfig.phpにリネームする。

root@debian-phpipam:/tmp# cd /var/www/html
root@debian-phpipam:/var/www/html# ls -l
合計 64
-rwxr-xr-x  1 root root   110  2月 11 15:58 INSTALL.txt
-rwxr-xr-x  1 root root  2455  2月 11 15:58 README
-rwxr-xr-x  1 root root   105  2月 11 15:58 UPDATE
drwxr-xr-x  4 root root  4096  2月 11 15:58 api
drwxr-xr-x 14 root root  4096  2月 11 15:58 app
-rwxr-xr-x  1 root root  2761  2月 11 15:58 config.dist.php
drwxr-xr-x  3 root root  4096  2月 11 15:58 css
drwxr-xr-x  3 root root  4096  2月 11 15:58 db
drwxr-xr-x 11 root root  4096  2月 11 15:58 functions
-rwxr-xr-x  1 root root 10057  2月 11 15:58 index.php
drwxr-xr-x  2 root root  4096  2月 11 15:58 install
drwxr-xr-x  3 root root  4096  2月 11 15:58 js
drwxr-xr-x  2 root root  4096  2月 11 15:58 misc
drwxr-xr-x  2 root root  4096  2月 11 15:58 upgrade
root@debian-phpipam:/var/www/html# mv config.dist.php config.php
root@debian-phpipam:/var/www/html#

改めてブラウザにてhttp://(phpIPAMサーバーのIP)/index.phpへアクセスする

この画面が出ればインストール完了
後はブラウザの指示に従いphpIPAMの設定を行う。
通常は[1 Automatic database installation]で問題ない。

MySQLへアクセスする為にusername及びpasswordを入力する。

[Install phpipam database]をクリックする。
[Database installed successfully!]と出れば完了。
続いて[Continue]をクリック。

[phpIPAM]のAdminのパスワードを設定する。
パスワードはあまりに短いと怒られるので8文字以上を設定する。

[Save Settings]をクリックする。
続いて[Proceed to login]をクリックする。

phpIPAMのログイン画面が表示される。
先ほど設定したadmin及びパスワードにてログイン出来るかを確認する。

phpIPAMのダッシュボード画面
インストール直後はサンプルのデータが入力されているので不要であれば削除する。

phpIPAMで出来ること

ネットワークセグメント毎にIPアドレスの管理を行うことが出来る。
また設定したセグメント配下のサーバー及びネットワーク機器に対してのPingによる死活監視、及び新たにネットワークに接続された機器を発見することも出来る。(ネットワークスキャン)

赤枠のオプションを[Yes]にするとチェックを行う。

Pingによる死活監視やネットワークのスキャンに関してはLinuxのcron機能により実現しているので、これらの機能を利用する場合はcrontabファイルにスクリプトを登録する必要がある。

余談:
上記オプションを[Yes]に設定しても、待てど暮らせどチェックを行っている様子がないのであらためて公式サイトを調べると、、、どうやら監視スクリプトをcronに登録する必要があるらしいということがわかった。
(↑ハマった部分)

詳しくは公式サイトを参照launch

監視スクリプトは下記のディレクトリにある

root@debian-phpipam:/var/www/html# cd ./functions/scripts
root@debian-phpipam:/var/www/html/functions/scripts# 
root@debian-phpipam:/var/www/html/functions/scripts# ls -l
合計 40
-rw-r--r-- 1 www-data www-data 10967  2月 11 15:58 discoveryCheck.php #スキャン
-rw-r--r-- 1 www-data www-data  1810  2月 11 15:58 find_untranslated_files.php
-rwxr-xr-x 1 www-data www-data 15039  2月 11 15:58 pingCheck.php #ping監視
-rw-r--r-- 1 www-data www-data  3653  2月 11 15:58 reset-admin-password.php
-rw-r--r-- 1 www-data www-data  3643  2月 11 15:58 resolveIPaddresses.php
root@debian-phpipam:/var/www/html/functions/scripts#

crontabにスクリプトを登録する。
下記の例ではpingCheck(ping監視)は15分毎に、discoveryCheck(スキャン)は毎時5分に実行する。

root@debian-phpipam:/var/www/html/functions/scripts# cd /etc
root@debian-phpipam:/etc# vim crontab

(~中略~)

*/15 * * * * root /usr/bin/php5 /var/www/html/functions/scripts/pingCheck.php
5 * * * * root /usr/bin/php5 /var/www/html/functions/scripts/discoveryCheck.php

root@debian-phpipam:/etc# service cron restart #cronを再起動する

2016年2月7日日曜日

IPアドレス管理サーバーの構築 【2】 Debian GNU/Linuxのインストール

event_note
INDEX

Debian GNU/Linuxインストールイメージファイルのダウンロード

Debian GNU/Linuxのインストールに関しては特に難しいところは無い。
https://www.debian.org/launch
へアクセスしてインストールに必要なファイルをダウンロードする。

今回は最小のインストールイメージファイルを使用しインストールする。
最小の CD を使って、ネットワークインストールするlaunch

仮想マシンの作成とDebian GNU/Linuxのインストール

VMware Playerに仮想マシンを作成する。

IPアドレス管理サーバーの構築 【1】 考察

event_note

IPアドレスを管理する上での諸問題

諸事情により社内ネットワークの管理者になってしまった。
社内ネットワークのIPアドレス管理については、うちの会社の場合も例に漏れずExcelにて管理されており??
とても管理できているとは言えない状況。 (ようするに管理できていない)

問題点①

新たなサーバーや端末の設置に伴い、新規IPアドレスの払い出しが必要になることはよくあるこで、その時にExcelをメンテしIPアドレスの払い出しを行うが、逆に不要となったサーバーや端末の廃棄はするものの、同時に不要となったIPアドレスの返却(Excelメンテ)が行われていないのが現状である。
Excel管理では実際にどのIPが使われていて、どのIPが使われていないのか?わからなくなってしまっている。

問題点②

IPアドレスを必要となった時に必要な人がExcelをメンテして勝手にIPアドレスを消費してしまっているのが現状で、誰が?何時?何のために?IPアドレスを確保したのか?全くわからない。
気の利いた人であれば備考として何らかの情報を残している場合もあるが、殆どの場合はなんの情報も残っていない。

IPアドレス管理ツール

グーグル検索にて「 IPアドレス 管理 ツールlaunch 」といったキーワードにて検索をかけてみると、IPアドレスの管理を行うためのツールが幾つかヒットする。 どうやらこれらのツールは IP Address Manager (IPAM)launch というらしい。

  • Windows Server 2012標準のIPAM機能
  • SolarWinds IPAM (ソーラーウィンズ社)
  • Pandora FMS
  • phpIPAM

Windows Server 2012標準でIPAM機能があるみたいだが、いまいちよくわからないのと今までMicrosoft標準機能で良い思いをしたことがないので却下。
SolarWinds IPAMは高機能みたいだけど有料のツールである為、気軽に試すことが出来ない。
Pandora FMSはIPアドレスの管理というよりは、サーバーやネットワーク機器の管理を行うツールのようである。

phpIPAM

phpIPAMとは?

phpIPAMlaunch はオープンソースのIPアドレス管理ツールである。
ツールといっても実際にはapache+phpで動作するWEBのシステムである。
動作させるにはLinuxサーバーにapache2 + php5及びMySQLをインストールする必要がある。
詳細については 公式サイトlaunch があるのでそちらを参照頂きたいが、大きくは以下のことが可能である。

  • IPv4及びv6アドレスの管理
  • pingによる死活監視
  • 新たにネットワークに接続された機器を発見する機能
  • 情報を編集した際のチェンジログを保存
  • インポート・エクスポート機能(csv or xls)

個人的には新たにネットワークに接続された機器を発見する機能はありがたい。
ネットワーク管理者に無断で接続されたサーバーや端末を発見することが出来る。
また、pingによる死活監視も可能なので、現時点で使われていないIPアドレスも把握することが出来る。

ところで、phpIPAMの情報は非常に少ない。
googleにて「phpipam」を検索しても殆どが英語のサイトで、日本語にて紹介しているサイトは数えるほどしかない。
実際にphpIPAMサーバーを立ち上げるまでには結構な苦労があったので、他の方の手助けになれば?と思い当記事を書き残すことにした。

今回はお試しということでVMware Playerの仮想マシン上に Debian GNU/Linuxlaunch (Debian 8.3 Jessie)をインストールしphpIPAMを導入することにする。

phpIPAMサンプル画面