2015年2月27日金曜日

時刻同期先が2台の場合のntpdの設定方法

別記事でnptdの設定方法について調べた結果を記載したが、もう少し考慮が必要だった。具体的には時刻同期先の上位サーバーが2台の場合、特別な設定が必要だったことがわかった。

事象

ntpdは仕組みとして、同期先のサーバーの時刻の信頼性を見る仕組みがある。具体的には、万が一参照先の時刻が何らかの理由で時刻がずれた際に、その影響を受けることを回避するため、その時刻の信頼性を低いと見なして同期先候補から外すという動きをする。

その際に、「多数決」で同期先を選定する仕組みがあるのだが、同期先が2台の場合は多数決ができずに、全ての同期先を信頼性が低いと見なしてしまい、同期ができなくなる、ということが問題になる。
※RHELでは4台以上を同期先にすることを推奨している
※正確には単純な多数決ではない同期先決定のアルゴリズムがあるが、私も理解できていないので詳細は省略

回避策

それでも社内のNTPサーバーが2台しかない、等あればどうにかするしか無い。回避策は2つ。

trueオプションを付ける

これはRHELの推奨方法。ntp.confのserverのオプションで"true"と付けてやれば良い。なお、似たようなオプションに"prefer"がある。これらの違いは、ntp.confのmanページの記載を見れば書いてある。
prefer
このサーバを優先します。すべての他の要素が等しくても、このホストが同期のために選ばれます。 詳しくは 緩和ルールと prefer キーワード のページを参照ください。 このオプションは server と peer コマンドでのみ有効です。

true
このアソシエーションを正確な状態であると仮定します。つまり、選択アルゴリズムとクラスタリング アルゴリズムで必ず生き残ります。このオプションはどのアソシエーションでも有効ですが、 シリアルポート上の大きなジッターや精度 pulse-per-second (PPS) 信号をもつ参照クロックにとっては 最も有益です。
微妙にわかりづらい表現で書いてある。私の理解では、"prefer"は同期先候補のNTPサーバが複数あった場合に、このオプションを付けたサーバーを優先して同期先とする設定、"true"はそのサーバーの時刻を参照できる限り、そのサーバーを同期先とする設定となる。

同期先は2台の場合は全てのNTP同期先を正しいと判断できずに同期先候補から外すことが問題なので、"prefer"オプションではなく、"true"の設定が正しい。

同期先を1つにする

シンプルに同期先を1つにしてしまうということも一つの手だと思う。上位NTPサーバーの稼働率が良好で、時刻のずれも発生しないような環境であれば、特に問題ないと割り切る。


参考URL

2 台の NTP サーバーを、「プライマリ」および「バックアップ」に指定して使用することはできますか?
https://access.redhat.com/ja/node/441873

2015年2月23日月曜日

Windowsの各種GUIを開くコマンド

WindowsはGUIを使って操作するが、コントロールパネルを開くと大量のアイコンが出てきて設定したい項目を探すのに四苦八苦することがある。これはWindowsのバージョンが上がれば上がるほど探しにくくなる傾向にあると思う。

なので、比較的よく使う設定画面を呼び出すコマンドを調べたので記載する。「ファイル名を指定して実行」(Ctrl + R)にて実行すればGUIが表示される。
  • コントロールパネル
    control
  • サーバーマネージャー
    servermanager.msc
  • ローカルユーザーとグループ
    lusrmgr.msc
    Local USeR ManaGeRの略と思われる
  • サービス
    services.msc
  • イベントビューアー
    eventvwr
    ※なぜかこれは.mscを付けなくても良い
  • タスクスケジューラー
    taskschd.msc
  • リモートデスクトップ接続
    mstsc
    MicroSoft Terminal Services Clientの略と思われる
  • レジストリエディタ
    regedit
  • ディスクの管理
    diskmgmt.msc
  • ネットワーク接続
    ncpa.cpl
  • デバイスマネージャー
    devmgmt.msc
個人的にはeventvwrとmstscは良く使う。他にも使えそうなのがあったら随時追加しよう。

2015年2月20日金曜日

PowerCLIでvCneter Serverに接続する際にパスワードファイルを使って認証する方法

vCenter ServerにPowerCLIで接続するコマンドレットはConnect-VIServerとなる。vCenter ServerのOSに直接ログインしてPowerCLIを使う場合は、接続先にlocalhostを指定することで、ユーザー名やパスワードを求められることは無く接続が可能。
Connect-VIServer -Server localhost
しかし、他サーバーや端末から接続しようとすると、ユーザー名・パスワードを求められるポップアップが表示されてしまう。手作業であれば問題ないが、スクリプト等で実行しようとすると不便であり、かと言って、
Connect-VIServer -Server localhost -User hoge -Password hogepass
といったように、パスワードを平文で書いてしまうのもセキュリティ上問題となるので、パスワードファイルを生成して読み込ませる方法を記載する。この方法はPowerCLIに限らず、PowerShellのスクリプトでも活用できるはず。

実施方法

事前に「本スクリプト実行サーバ」にて、以下コマンドにてSecureString型のパスワード生成する。

Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File vcpwd.txt

コマンドを実行した後パスワードを入力してEnterを押せば、vcpwd.txtというファイルが作成される。

上記パスワードファイルを読み込ませてvCenter Serverに接続し、色々処理をした後切断するスクリプトは以下の通り。
# vCenterサーバへ接続
$VCENTER = "192.168.1.100"             # vCenter ServerのIPアドレス
$VCUSER = "vcenteruser"                # vCenter Serverログインユーザー

$secpasswd = cat vcpwd.txt | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PSCredential ($VCUSER, $secpasswd)
$vi = Connect-VIServer -Server $VCENTER -Credential $cred

~ここに処理を書く~

# vCenterサーバより切断
Disconnect-VIServer -Server $vi -Force -Confirm:$False

exit 0

2015年2月19日木曜日

TeraTermやPowerShellで右クリック1回したらクリップボードの中身が貼り付けられてしまう機能を停止する

インフラエンジニアやっていれば、Linuxの設定やスイッチのconfig等を編集する際に、予めテキストで作っておいたものをTeraTarm等で貼り付けて流す行為をよくやると思う。

この貼り付ける機能は、TeraTermやコマンドプロンプト、PowerShellではマウスの右クリックで実施できるようになっているが、逆に言えば右クリック一回でクリップボードの中身が全て貼り付けられてしまい、事故に繋がることがある。

そのため、特に保守運用を実施する場面では、右クリック1回での貼り付け機能を停止し、1回確認が実施されるプロセスを挟むようにすると良い。今回はその方法について記載する。

TeraTerm

日本語UIの場合は、[設定]→[その他設定]→[コピーと貼り付け]タブを選択する。英語UIの場合は[Setup]→[Additional settings]→[Copy and Paste]タブを選択する。以降は日本語UIにて説明する。



設定項目とその意味は以下になる。言ってしまえば、デフォルトのままがオススメ。

継続行コピーを有効にする (デフォルト:チェック有)
TeraTerm等で1行が長いと右端で折り返されて表示されるが、その行をコピーした際に、改行を入れないで1行としてコピーするためのオプション。基本的に有効にしておけば良い。

右クリックでの貼り付けを無効にする (デフォルト:チェック無)
TeraTerm上で右クリックを押しても何も反応しなくなる。不便なので原則チェックしない。

右クリックでの貼り付けを確認する (デフォルト:チェック無)
右クリックですぐに貼り付けられるのではなく、右クリックメニューとして、「貼り付け」と「貼り付け<CR>」を選ばなければペーストされなくなる。好みで有効にする。より安全を求めるなら有効にすべきだが、最近のTeraTermは改行コードが入っている文字のペーストは一度確認ポップアップが出るので、無効にしてもそこまで危険では無いと思う。

中クリックでの貼り付けを無効にする (デフォルト:チェック有)
ホイールのクリックで貼り付けたいという変わった方は、好みでこちらのチェックを外せば良い。

左クリックでののみ選択を確認する (デフォルト:チェック有)
チェックを外せば右クリックでも文字の選択ができるようになる。この場合、範囲選択完了直後にペーストされるようになる。こちらも好みで設定する。

危険なクリップボードの貼り付けを確認する (デフォルト:チェック有)
キーワードファイルを選択し、特定ワードがあると、「クリップボードの確認」のポップアップが表示されるようにある。例えば、haltと書いたキワードファイルを設定しておけば、haltが含まれた文字をペーストしようとすると改行が無くても確認ポップアップが表示される。

区切り文字
キーワードファイルの単語の区切り文字を設定できる機能、、、と思われる(きちんと使っていないので良くわからない)。

貼り付け行間遅延 (デフォルト:10ms)
シリアルポートの場合は、転送速度の関係からコマンド欠けが発生することもあるので設定することはあったが、SSHでも貼り付け時の各コマンドの遅延時間を設定できる。ただし、SSHで帯域も十分にあるのであれば、特にデフォルト値から変更は不要と考える。

コマンドプロンプト

タイトルバーを右クリック→[プロパティ]→[オプション]タブの[簡易編集モード]のチェックを外せば良い。逆にチェックすると右クリックで貼り付け放題になる。

[簡易編集モード]を無効にした場合のコマンドプロンプトでのコピー&ペーストの方法は以下手順で実施する。ちょっと面倒。
①コマンドプロンプトで右クリック→[範囲指定]を選択
②文字列を左クリックで選択
③Enterにてコピー
④コマンドプロンプトで右クリック→[貼り付け]を選択

PowerShell

コマンドプロンプトと全く同様。タイトルバーを右クリック→[プロパティ]→[オプション]タブの[簡易編集モード]のチェックを外せば良い。逆にチェックすると右クリックで貼り付け放題になる。

[簡易編集モード]を無効にした場合のPowerShellでのコピー&ペーストの方法はコマンドプロンプト同様、以下手順で実施する。
①コマンドプロンプトで右クリック→[範囲指定]を選択
②文字列を左クリックで選択
③Enterにてコピー
④コマンドプロンプトで右クリック→[貼り付け]を選択




2015年2月15日日曜日

Excelで簡易的に棒グラフを作る関数REPT

Excelの小ネタ。「指定した文字列を数字の回数だけ繰り返す」という関数がExcelにあって、REPT関数という。

使い方としては、昔のMS-DOSやLinuxのように文字で棒グラフを作ることに適している。例えば、以下の様なa~eの得点表があるとする。

a80
b20
c31
d64
e100

これをREPT関数を使って、「=REPT("|",B2)」のように入れてやると、、、

a 80 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
b 20 ||||||||||||||||||||
c 31 |||||||||||||||||||||||||||||||
d 64 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e 100 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

上記の通り"|"文字のグラフで表現でき、数字の差を直感的に把握することができる。

2015年2月14日土曜日

VMwareの標準機能を使ったバックアップとリストアの比較

仮想マシンをバックアップしてリストアする方法について、特別なバックアップソフトウェアを使わずに標準機能のみにて実現することを検討してみた。以下3パターンの方法を実際に試し、メリデメ比較を行ってみた。
  1. 仮想マシンのクローンを使う
  2. OVFテンプレートのエクスポートを使う
  3. データストアから直接vmdkファイルをぶっこ抜く
比較結果を以下に記載する。

テスト用の仮想マシン情報

今回テストに利用する仮想マシンの情報は以下の通り。
仮想マシン名:RHEL61_64
仮想ディスクサイズ:16GB (Thin Provision)
OSの使っているディスク容量:約3GB
仮想ディスクはThinで作成しているので、実際の容量は16GBよりも小さい。ESXiのDCUIにて直接vmfs領域を見てみると以下の通り。実際の容量は合計で3.6GBとなる。
/vmfs/volumes/51d55cb3-dbe9bff0-0eeb-d89d6714e6d5/RHEL61_64 # du -ah .
3.6G    ./RHEL61_64-flat.vmdk
64.0K   ./RHEL61_64.vmdk
64.0K   ./RHEL61_64.nvram
64.0K   ./RHEL61_64.vmx
64.0K   ./RHEL61_64.vmxf
64.0K   ./RHEL61_64.vmsd
1.0M    ./vmware-8.log
1.0M    ./vmware-9.log
2.0M    ./RHEL61_64-ctk.vmdk
1.0M    ./vmware-11.log
1.0M    ./vmware.log
1.0M    ./vmware-6.log
1.0M    ./vmware-7.log
64.0K   ./RHEL61_64-1.png
1.0M    ./RHEL61_64-2.png
1.0M    ./vmware-10.log
3.6G    .

仮想マシンのクローンを使う

仮想マシンのクローンにて仮想マシンを複製してバックアップするという方法。作業手順としては最もシンプルだし、VAAIの効果もあって複製に必要となるデータコピーの時間も短くなる可能性がある。また、仮想マシン稼働中にも取得できるというメリットも大きい。ただし、クローンを使うにはvCenter Serverが必要となる。

容量はもとの仮想マシンと完全に同じになるため、今回の場合では3.6GB程度のデータコピーが発生する。

リストアしたい時に元の仮想マシンを止めて、クローンを起動させるだけで復旧できてしまうため、とてもお手軽。

OVFテンプレートのエクスポートを使う

vCenter Serverが無くてもESXの機能として実施可能な「OVFテンプレートのエクスポート」。以下の通りファイル容量が最もコンパクトになる(3.6GB→1.3GB)。詳細は不明だが、OVFテンプレート作成時に圧縮をかけてくれるようだ。
2015/02/05  09:31    <DIR>          .
2015/02/05  09:31    <DIR>          ..
2015/02/05  09:31     1,363,008,512 RHEL61_64-disk1.vmdk
2015/02/05  09:31               133 RHEL61_64.mf
2015/02/05  09:31            11,257 RHEL61_64.ovf
               3 個のファイル       1,363,019,902 バイト
一度Datastore外の領域に保存する必要があるのでネットワーク経由でのコピーとなるため、データコピーの速度はあまり高望みはできない(エクスポート先のサーバーを10GbpsのNICを付けるとかすれば別だが)。

ちなみに注意事項としては、仮想マシンの仮想CDドライブにISOファイル等をマウントしたままエクスポートしてしまうとインポート時に失敗するので注意。やってしまった場合でも回避方法はあって、ovfファイルの該当箇所を書き換えてmfファイルのハッシュ値を再計算して更新すれば良い。詳しくは別記事で記載している。

リストアは「OVFテンプレートのデプロイ」にて実施する。特に小難しいことは何もなく、ウィザードに従ってデプロイすれば良い。

データストアから直接vmdkファイルをぶっこ抜く

vSphere Clientからデータストアブラウザを使ってダウンロードした場合、ディスクをThinで作っていたとしても、Thickの容量に展開されてダウンロードされるようだ。従って、容量的に大きくなってしまい、シンプロビジョニングのメリットも全て失われることから、この方法を選択する理由は全くないと思う。

以下はデータストアブラウザからコピー後の各ファイルの容量(3.6GB→16GB)。データストアブラウザと実際のコピーしたファイルの名称には若干差があって、たとえばvmdfファイルは***-flat.vmdkファイルという名称にてダウンロードされる。
2015/02/05  09:44    <DIR>          .
2015/02/05  09:44    <DIR>          ..
2015/02/04  17:39            10,790 RHEL61_64-1.png
2015/02/04  17:39           700,121 RHEL61_64-2.png
2015/02/04  17:39         1,049,088 RHEL61_64-ctk.vmdk
2015/02/04  17:39    17,179,869,184 RHEL61_64-flat.vmdk
2015/02/04  17:39             8,684 RHEL61_64.nvram
2015/02/04  15:53               606 RHEL61_64.vmdk
2015/02/04  17:39                43 RHEL61_64.vmsd
2015/02/04  17:39             3,762 RHEL61_64.vmx
2015/02/04  17:39               264 RHEL61_64.vmxf
2015/02/04  17:39           778,394 vmware-10.log
2015/02/04  17:39           127,005 vmware-11.log
2015/02/04  17:39           223,817 vmware-6.log
2015/02/04  17:39           127,871 vmware-7.log
2015/02/04  17:39           208,558 vmware-8.log
2015/02/04  17:39           125,719 vmware-9.log
2015/02/04  17:39           127,634 vmware.log
              16 個のファイル      17,183,361,540 バイト
リストアはこのファイルをデータストアブラウザでアップロードして、vmxファイルをインベントリに追加すればできるはず(未検証)。

まとめ

以下に比較した3案のメリット・デメリットを記載する。リストアの早期復旧が必要ならばクローンを、バックアップ先のディスク容量を節約するならOVFテンプレートのエクスポートが良いと思う。

仮想マシンのクローンを使う

・メリット:vCenter Serverの標準機能であり手順がシンプル・SAN経由での仮想マシンコピー可能・仮想マシンON中でバックアップ可能・最もリストアが早い
・デメリット:vCenter Serverが必要

OVFテンプレートのエクスポートを使う

・メリット:vCenter Server不要・バックアップ容量が最もコンパクト・仮想マシンをファイルとして扱えるため取り回しし易い(さらにテープへバックアップなども可能)
・デメリット:NW経由のバックアップとなるためNW帯域がボトルネックになる

データストアから直接vmdkファイルをぶっこ抜く

・メリット:無いと思う…
・デメリット:バックアップ容量が最も大きい・NW経由のバックアップとなるためNW帯域がボトルネックになる


2015年2月13日金曜日

謎のコマンドyesの使い方(Linux標準コマンドでCPU・メモリに負荷を掛ける方法)

Linuxには"yes"というコマンドがある。最初何だそれは、と思ったコマンドだが、案外使い道の多いコマンドだったので、まとめてみた。

基本編

「"y"を一文字入力して改行するを無限に繰り返す」が基本動作となる。
# yes
y
y
y
y
y
~以下略~
y
y
^C   ←Ctrl + Cで止める
#
yesの後に文字列を書けば、その文字列が繰り返される。
# yes no
no
no
no
no
no
~以下略~
no
no
^C   ←Ctrl + Cで止める
#
このコマンドの意図される使い方は、rmコマンド等でyes/noを求められる際にyesをパイプで渡してやると、いちいち"y"を押してエンターする手間が省けるという使い方ができることらしい。rmでは-fオプションあるから、よほど変わった人では無い限り常用はしないだろうが、-fオプションの無いコマンドでは使い道はあるかもしれない。
# yes | rm testfile.txt
rm: remove 通常ファイル `testfile.txt'?    ←間髪入れずにyが入力される
#

応用編

このコマンドの真髄は、アイデアによって面白い使い方ができることだと思う。特にサーバーへ負荷を掛けるにはうってつけである。

CPUに負荷を掛けるyes

# yes > /dev/null
※CPU負荷が高くなる原理:/dev/nullに"y"を無限に出力する。この処理がCPUを使い切る程の速度で実行されるため(画面描写が無いので超高速)

メモリに負荷を掛けるyes

# /dev/null < `yes`
または
# /dev/null < $(yes)
※メモリ負荷が高くなる原理:/dev/nullに`yes`(=$(yes))を入力する。無限に続くyが入力されることによって、メモリを沢山使ってくれるらしい(理解不足)

ちなみに、この処理は徐々にメモリ使用量が上がっていく動作をするので、早く上げたい場合は、yesの後に文字列を付与すると多少早くなるようだ。
# /dev/null < `yes aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`

参考URL

UNIXシェルスクリプトメモ
http://www.ne.jp/asahi/hishidama/home/tech/unix/sh.html



2015年2月9日月曜日

「OVFパッケージのデプロイに失敗しました」のメッセージに対する対処方法

OVFテンプレートのエクスポートを実施して、いざインポートしようとすると以下ポップアップが出て失敗することがある。
OVFパッケージのデプロイに失敗しました: ファイルds:///vmfs/volumes/~/_deviceImage-0.isoが見つかりませんでした
これは、仮想CDドライブにISO等をマウントしたままエクスポートを実施してしまうと発生する事象となる。仮想CDをアンマウントしてもう1回OVFテンプレートのエクスポートを実施すれば良いがエクスポートの時間が無駄となるので、以下に対処方法を記載する。

対処方法

①予め拡張子.ovfと.mfのファイルをバックアップ取っておく。.ovfのファイルは仮想マシンの構成情報を格納するテキストファイルで、.mfはマニフェストファイルと呼ばれるファイルのハッシュ値が記載されたテキストファイル。

②.ovfファイルにて以下行を探す。
<rasd:ResourceSubType>vmware.cdrom.iso</rasd:ResourceSubType>
上記を以下に修正(VMware KBではremotepassthroughだが、remoteatapiでも成功する。
<rasd:ResourceSubType>vmware.cdrom.remotepassthrough</rasd:ResourceSubType>
または
<rasd:ResourceSubType>vmware.cdrom.remoteatapi</rasd:ResourceSubType>

③.mfの2行目の値を先ほど修正が加わった.ovfファイルに対してSHA-1を計算し直した内容にて書き直す。
SHA1(VirtualMachine.vmdk)= 9ca7dd6da78a6f58ab5ace56b0f93deb9b6e8b75
SHA1(VirtualMachine.ovf)= d38a9fb157fe0130a0a1808d525b7ee8f51161fd ←これを書き直す
SHA-1の計算はフリーソフトでも良いし、MicrosoftからもFCIVなるツールが更改されている(参考URL参照)。

ちなみに、FCIVでの計算方法は以下の通り、
FCIV -sha1 VirtualMachine.ovf

参考URL

Deploying an OVF fails on vCenter Server 5.1/5.5 when VMware tools are installed (2034422)
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2034422

可用性とファイル チェックサム整合性検証ユーティリティの説明(FCIV)
https://support.microsoft.com/kb/841290


2015年2月6日金曜日

Brocade Web Toolsでhttpsを有効化する方法

BrocadeのSANスイッチでWeb Toolsを使う場合、標準ではHTTP通信でアクセスする必要がある。セキュリティの観点から通信暗号化しておこうということで、オレオレ証明書をインストールしてHTTPS通信を有効にする方法を調べて、実際にやってみた。

なお、SANスイッチのFabric OSのバージョンは7.0.0c。

有効化手順

結構手順が多くて面倒だが、以下の通り対応していけば良い。

公開鍵と秘密鍵のキーペアを作成

作業は全てSANスイッチのコマンドで実施する。まずはスイッチ内に公開鍵と秘密鍵のキーペアを作成するため"secCertUtil genkey"コマンドを実行すると、キーを作成する際に4点自動処理されると注意書きが表示される。

1. CSRを全て削除
2. 証明書を全て削除
3. 証明書のファイル名をリセット
4. HTTPS無効化

要するにキー再作成によって全ての証明書情報は削除されるので、一から証明書をインストールし直す必要が発生する。今回はそもそも一から入れるつもりなので問題なし。
SANSW:admin> secCertUtil genkey
Generating a new key pair will automatically do the following:
1. Delete all existing CSRs.
2. Delete all existing certificates.
3. Reset the certificate filename to none.
4. Disable secure protocols.

Continue (yes, y, no, n): [no] yes
Select key size [1024 or 2048]: 1024
Generating new rsa public/private key pair
Done.
SANSW:admin>

CSR(Certificate Signing Request)を作成

CSRを作成する。どうせオレオレ証明書で作成するので項目は適当でも良い。必須項目は"Country"、"Common Name"のみ。
SANSW:admin> secCertUtil gencsr
Country Name (2 letter code, eg, US):JP
State or Province Name (full name, eg, California):Tokyo
Locality Name (eg, city name):Minato-ku
Organization Name (eg, company name):hoge
Organizational Unit Name (eg, department name):hoge
Common Name (Fully qualified Domain Name, or IP address):192.168.2.6
Generating CSR, file name is: 192.168.2.6.csr
Done.
SANSW:admin>
なお、"secCertUtil showcsr"コマンドで作成したCSRの内容を出力できる。
SANSW:admin> secCertUtil showcsr
verify OK
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP, ST=Tokyo, L=Minato-ku, O=hoge, OU=hoge, CN=192.168.2.6
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:d6:5a:4c:c6:0b:e0:b3:de:8c:12:98:88:65:1b:
                    54:da:2c:28:da:2b:b1:9a:dd:bd:a7:f9:e8:f7:92:
                    37:16:99:d8:d4:cf:ba:71:d9:8a:52:55:c4:ef:6e:
                    d2:6b:da:04:5d:38:23:93:dc:bb:66:29:98:b6:00:
                    64:3d:a0:4d:26:62:39:a3:40:a8:95:6d:81:05:1f:
                    d6:3f:1d:6b:9f:86:b3:90:5e:e7:2c:31:1d:14:00:
                    c4:86:02:ab:44:f2:77:c8:6a:4d:00:39:67:e3:d6:
                    94:7d:0f:ce:08:3c:a1:5b:79:4e:c7:26:d3:b5:96:
                    a6:3a:d4:2d:2c:fc:b7:4d:d3
                Exponent: 65537 (0x10001)
        Attributes:
            serialNumber             :10:00:00:27:f8:4c:13:88
        Requested Extensions:
            X509v3 Subject Alternative Name:
                DNS:192.168.2.6, IP Address:192.168.2.6
    Signature Algorithm: sha1WithRSAEncryption
        19:33:02:6d:a2:89:ed:25:03:58:67:f6:96:51:cd:03:dc:35:
        e3:4c:1e:4c:66:08:e0:52:23:40:97:3a:88:7c:df:ad:4c:bf:
        d2:a9:06:c8:85:b2:ea:b0:87:75:60:0c:35:9d:d2:9f:10:5b:
        0c:86:05:56:b3:bc:39:e2:9e:ae:40:d8:42:0a:c0:fe:41:ff:
        60:ad:a0:c2:01:25:02:7e:cf:26:40:c7:6a:41:2e:b3:25:81:
        d9:c6:94:b9:62:ec:0c:db:03:06:40:fb:5c:6b:38:f6:a9:ef:
        04:9a:46:00:55:62:19:f7:3e:ca:bf:86:76:97:0b:77:4f:b2:
        bd:99

CSR contents in base64 format

-----BEGIN CERTIFICATE REQUEST-----
MIIB/DCCAWUCAQAwaDELMAkGA1UEBhMCSlAxDjAMBgNVBAgTBVRva3lvMRIwEAYD
VQQHEwlNaW5hdG8ta3UxDTALBgNVBAoTBGhvZ2UxDTALBgNVBAsTBGhvZ2UxFzAV
BgNVBAMTDjE5Mi4xNjguMjQ3LjYyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
gQDWWkzGC+Cz3owSmIhlG1TaLCjaK7Ga3b2n+ej3kjcWmdjUz7px2YpSVcTvbtJr
2gRdOCOT3LtmKZi2AGQ9oE0mYjmjQKiVbYEFH9Y/HWufhrOQXucsMR0UAMSGAqtE
8nfIak0AOWfj1pR9D84IPKFbeU7HJtO1lqY61C0s/LdN0wIDAQABoFQwIAYDVQQF
MRkTFzEwOjAwOjAwOjI3OmY4OjRjOjEzOjg4MDAGCSqGSIb3DQEJDjEjMCEwHwYD
VR0RBBgwFoIOMTkyLjE2OC4yNDcuNjKHBMCo9z4wDQYJKoZIhvcNAQEFBQADgYEA
GTMCbaKJ7SUDWGf2llHNA9w140weTGYI4FIjQJc6iHzfrUy/0qkGyIWy6rCHdWAM
NZ3SnxBbDIYFVrO8OeKerkDYQgrA/kH/YK2gwgElAn7PJkDHakEusyWB2caUuWLs
DNsDBkD7XGs49qnvBJpGAFViGfc+yr+GdpcLd0+yvZk=
-----END CERTIFICATE REQUEST-----

SANSW:admin>

CSRのエクスポート

CSRを使ってサーバー証明書を作成するため、一旦外部のサーバーへExportする。以下では192.168.2.8のサーバーの/tmpにCSRをエクスポートする。CSRは<SANスイッチのIPアドレス>.csrというファイル名で出力される。
SANSW:admin> secCertUtil export
Select protocol [ftp or scp]: scp
Enter IP address: 192.168.2.8
Enter remote directory: /tmp
Enter Login Name: root
root@192.168.2.8's password:
Success: exported CSR.
SANSW:admin>

CSRを使ってサーバー証明書(オレオレ証明書)を作成

ここからはLinuxサーバーで作業する。コマンドを打つたびにpass phraseを求められるかもしれないが、全部同じものを入れておけばOKと思われる。

Linuxサーバー自身の秘密鍵を作成する。
# cd /etc/pki/tls/certs
# make server.key
/etc/pki/tls/openssl.cnfを修正する。basicConstraintsの設定は、証明書にCAの情報を含めるようにする設定?らしい。ここは良くわかっていないが、設定しないと作ったサーバー証明書がインストールできない場合があるらしい…。
basicConstraints=CA:FALSE
→basicConstraints=CA:TRUE
証明書の有効期限を10年に変更する。
default_days    = 365
→default_days    = 3650
以上でopenssl.cnfの設定は終わり。LinuxサーバーにCAとしての設定を投入する。/etc/pki/tls/miscにあるCAスクリプトを使う。
# cd /etc/pki/tls/misc
# ./CA -newca
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Tokyo
Locality Name (eg, city) [Newbury]:Minato-ku
Organization Name (eg, company) [My Company Ltd]:Private_CA
Organizational Unit Name (eg, section) []:CertificationAuthority
Common Name (eg, your name or your server's hostname) []:Private_CA
Email Address []:webmaster@example.com
SANスイッチのCSRに対して署名しサーバー証明書を作成する。newcert.pemがサーバー証明書となる。
# cp /tmp/192.168.2.6.csr newreq.pem
# ./CA -sign
# ls -l *.pem
-rw-r--r-- 1 root root 3312  7月 17 11:37 newcert.pem
-rw------- 1 root root  712  7月 17 11:37 newreq.pem
拡張子はpemのまま、適当なディレクトリに配置する(拡張子をcrtとかに変えると、「Bad format certificate」のエラーが出て証明書のImportに失敗するので注意)。
# cp newcert.pem /tmp/192.168.2.6.pem

サーバー証明書のインポート

SANスイッチに戻って、サーバー証明書をImportする。この作業が完了すれば、HTTPS通信にてWeb Toolsにアクセスできるようになる。
SANSW:admin> seccertutil import -config swcert -enable https
Select protocol [ftp or scp]: scp
Enter IP address: 192.168.2.8
Enter remote directory: /tmp
Enter certificate name (must have ".crt" or ".cer" ".pem" or ".psk" suffix):192.168.2.6.pem
Enter Login Name: root
root@192.168.2.8's password:
Success: imported certificate [192.168.2.6.pem].
Certificate file in configuration has been updated.
Secure http has been enabled.
SANSW:admin>

参考URL

Brocade マニュアル
・Fabric OS Administrator's Guide, 7.0.0 [英語:PDF] P.124
・Fabric OS Command Reference, 7.0.0 [英語:PDF] P.867
http://www.brocadejapan.com/resource-center/manual

2015年2月4日水曜日

セキュリティを考慮したntpdの設定方法

Linuxなら誰でも使っているntpd。この前、話題になった脆弱性(https://jvn.jp/vu/JVNVU96605606/)が見つかってしまったので、対策として設定確認とセキュリティ強化を実施する必要があり、設定方法を今一度調べてみた。

どうやら今まで正しい設定方法を理解できていなかったようだったので、以下に整理した内容を記載する。

ntpdの推奨設定例

/etc/ntp.confを設定すれば良いのだが、基本構造は以下の通りと考えれば良い。
#################################
# 設定条件
# 上位NTPサーバ:100.100.2.5
# 参照許可NW:192.168.100.0/24
#################################

driftfile /var/lib/ntp/drift

# restrictは上から順に評価されるため、最初に全て拒否ルールを設定
restrict default ignore
restrict -6 default ignore

# localhostを許可
restrict 127.0.0.1
restrict -6 ::1
# 同期先を許可
restrict 100.100.2.5 kod nomodify notrap nopeer noquery
# 参照を許可するNW
restrict 192.168.100.0 mask 255.255.255.0 kod nomodify notrap nopeer noquery

# 同期先
server 100.100.2.5 iburst

# 同期先が無い場合、自身のクロックを参照する設定
#server 127.127.1.0     # local clock
#fudge 127.127.1.0 stratum 10

設定の詳細説明

上から順に見ていこう。
driftfile /var/lib/ntp/drift
driftfileは時刻のずれを記憶するファイルで、ntpdが時刻を合わせる際の内部時計とのずれの傾向を記録する。これによって、ntpdが上位サーバーと通信ができず時刻同期ができなくなったとしても履歴の情報から誤差の修正を行い、潜在的な時刻のずれの影響を抑止する。
# restrictは上から順に評価されるため、最初に全て拒否ルールを設定
restrict default ignore
restrict -6 default ignore
restrictは「制限」という意味のオプションでアクセス制限の設定を行うオプションとなる。"default ignore"はデフォルトで全てを拒否するオプション。セキュリティの観点から言えば、まずデフォルト拒否のルールを入れて、必要なものは都度許可ルールを入れる方が良い。
# localhostを許可
restrict 127.0.0.1
restrict -6 ::1
# 同期先を許可
restrict 100.100.2.5 kod nomodify notrap nopeer noquery
# 参照を許可するNW
restrict 192.168.100.0 mask 255.255.255.0 kod nomodify notrap nopeer noquery
まず上2つのlocalhostを全て許可するルールは、決まり文句として設定する必要があるようだ。他に設定する許可ルールとしては、①同期先のIPアドレス、②参照を許可するIPアドレス(またはネットワークアドレス)を設定すれば良い。restrict文のオプションに色々付いているが、これは決まり文句として書いておけば良い。

少しわかりづらいのが、noqueryのオプションで、一見するとquery(問い合わせ)をnoするオプションなので、時刻同期を拒否するように見えるが、実際はntpqやntpdcからのクエリーに対して拒否するオプションであり、時刻同期には影響しない(man ntp_accの説明で確認できる)。
# 同期先
server 100.100.2.5 iburst
同期先の上位サーバーを記載する。ホスト名でも大丈夫だが、名前解決のオーバーヘッドを減らす意味でIPアドレス指定の方が良いかもしれない。"iburst"オプションは、ntpd起動時の初回同期のポーリング間隔をデフォルトの64秒よりも小さい2秒に変更する機能で、初回の同期間隔が短縮されるのでオススメ。
# 同期先が無い場合、自身のクロックを参照する設定
#server 127.127.1.0     # local clock
#fudge 127.127.1.0 stratum 10
これは全ての同期先との同期に失敗した場合に、自分自身のローカルクロックと同期するという設定。ただし、同期先が生きているのにローカルクロックと同期してしまう原因不明の事象が発生することがあるらしく、コメントアウトを推奨する。実際に私が検証した際も以下の通り事象が発生してしまった(LOCAL(0)の右に"*"が付いて同期されてしまっている)。
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 192.168.100.100  .LOCL.           1 u  249  512  377    0.977   -4.058   5.767
 192.168.100.101  192.168.1.100   2 u  461  512  377    0.308   -3.269   1.028
*LOCAL(0)        .LOCL.          10 l   47   64  377    0.000    0.000   0.000

その他Tips

その他、ntpdの設定を調査する中で見つけたTips。

「Temporary failure in name resolution」のエラー

ntpq -pで状況を確認すると「Temporary failure in name resolution」のエラーが発生することがある。これはhostsの設定誤りが原因で、/etc/hostsの設定内容を確認し、127.0.0.1がきちんとlocalhostで名前解決できるようになっているか確認する。

ntpdのmanページ

man ntpdとやっても実はそこまで多くの細かい説明は出てこない。調べるなら以下のmanページを見ること。
man ntp.conf   ←iburstの説明等が記載
man ntp_acc   ←ntp_acc - Access Control Optionsのことで、restrictのオプションの説明が記載

参考URL

ArchLinux - Network Time Protocol daemon (日本語)


2015年2月2日月曜日

vCenter ServerがIISのポートと競合して起動に失敗した件

掲題の事象に出くわしたのでメモ。

事象

vCenter Serverのインストールされているサーバーに、別アプリをインストールする前提条件としてIISを入れた後再起動したら、vCenter Serverのサービスが以下メッセージで起動に失敗した。
ログの名前:アプリケーション
ソース:VMware VirtualCenter Server
イベントID:1000
レベル:エラー
内容:Failed to intialize VMware VirtualCenter. Shutting down...
   ※注:"intialize"が"initialize"になっていないが原文ママ
切り分けとして、IISのサービスを停止して再度vCenter Serverのサービス起動を試みたら復旧。結局、別アプリの前提にIISは要らなかったのでIISをアンインストールして根本対応した。
※どうしてもIISが必要な要件がある場合はIIS側のリッスンポートを80から変えてあげる必要があるようだ。

調べたら色々参考URLがあったので、本件は有名な事象だった模様。80だけでなく、443、902などのポートも競合しないように注意が必要とのこと。

参考URL

Port already in use when installing VMware vCenter Server 4.x / 5.x (4824652)
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=4824652

ポート 80 に対する vCenter Server と IIS の競合
https://pubs.vmware.com/vsphere-51/index.jsp?topic=%2Fcom.vmware.vsphere.upgrade.doc%2FGUID-C6CCC905-24B7-4C2B-A179-5A7D7866EE33.html

vCenter Server に必要なポート
https://pubs.vmware.com/vsphere-51/index.jsp#com.vmware.vsphere.upgrade.doc/GUID-925370DD-E3D1-455B-81C7-CB28AAF20617.html#GUID-925370DD-E3D1-455B-81C7-CB28AAF20617

Virtual Centerサーバサービスが開始されない、又はFailする場合のトラブルシューティング (2010807)
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2010807

2015年2月1日日曜日

Windows標準コマンドでgrepする

前回の「Windows標準コマンドでdiffする」に引き続き、今回はgrep。

コマンドプロンプト

findstrというコマンドが用意されている。ヘルプを見てみる。
c:\>findstr /?
ファイルから文字列を検索します。

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P]
        [/F:ファイル] [/C:文字列] [/G:ファイル] [/D:ディレクトリ一覧]
        [/A:色属性] [/OFF[LINE]] 文字列 [[ドライブ:][パス]ファイル名[ ...]]
  /B           行の先頭にあるパターンを検索します。
  /E           行の末尾にあるパターンを検索します。
  /L           検索文字列をリテラルとして使用します。
  /R           検索文字列を正規表現として使用します。
  /S           現在のディレクトリとすべてのサブディレクトリから一致する
               ファイルを検索します。
  /I           検索するときに大文字と小文字を区別しません。
  /X           完全に一致する行を出力します。
  /V           一致しない行のみを出力します。
  /N           一致する各行の前に行番号を出力します。
  /M           ファイルに一致する行があるときに、ファイル名のみを出力します。
  /O           一致する各行の前に文字オフセットを出力します。
  /P           印刷不可能な文字を含むファイルをスキップします。
  /OFF[LINE]   オフライン属性が設定されたファイルをスキップしません。
  /A:属性      2 桁の 16 進数で色属性を指定します。"color /?" を参照してくだ
               さい。
  /F:ファイル  指定したファイルからファイル一覧を読み取ります (/ を指定するとコンソール)。
  /C:文字列    指定された文字列をリテラル検索文字列として使用します。
  /G:ファイル  指定されたファイルから検索文字列を取得します (/ を指定するとコンソール)。
  /D:ディレクトリ
               セミコロンで区切られた検索されるディレクトリ文字列テキストの一覧を検索します。
  [ドライブ:][パス]ファイル名
               検索するファイルを指定します。

複数の文字列を検索する場合には、引数 /C を使わず、各文字列をスペースで区切ります。
たとえば、FINDSTR "hello there" x.y と指定した場合は、ファイル x.y で "hello"または "there" が検索されます。
これに対して、FINDSTR /C:"hello there" x.y と指定した場合はファイル x.y で"hello there" が検索されます。

正規表現クイック リファレンス:
  .            ワイルドカード: 任意の文字
  *            繰り返し: ゼロ個以上の直前の文字またはクラス
  ^            行位置: 行頭
  $            行位置: 行末
  [class]      文字クラス: セットの任意の 1 文字
  [^class]     逆クラス: セット以外の任意の 1 文字
  [x-y]        範囲: 指定した範囲の任意の文字
  \x           エスケープ: メタ文字 x のリテラル使用
  \<xyz        単語位置: 単語の先頭
  xyz\>        単語位置: 単語の終わり

FINDSTR の詳細な正規表現に関しては、オンライン ヘルプのコマンド リファレンスを参照してください。
正規表現も使えて中々便利そう。/xで完全一致、/nで抽出行番号、/rで正規表現利用を選択すると使いやすそう。オプション無しでも普通に正規表現使えるっぽいが。
※test.txtの中身は以下3行
hoge
hogehoge
hoge3

C:\>findstr /xnr "^ho.*ho.*" test.txt
2:hogehoge
さらにファイル名にワイルドカードを使って複数ファイルのgrepも可能になっていて、意外と高機能。
C:\>findstr /xnr "^ho.*ho.*" test*.txt
test.txt:2:hogehoge
test2.txt:2:hogehoge

PowerShell

Select-Stringというコマンドレットがあるのでそれを使う。ファイル名にワイルドカードを使って複数ファイルのgrepも可能。
PS C:\> Select-String "^ho.*ho" .\test.txt

test.txt:2:hogehoge