Hack the World!

プログラミングや,ネットワークに関する話題を取り扱っています.知識をつけて,優雅にお仕事するのを目指しています.

踏み台(Proxy)経由でWindows関連モジュールを利用する。

Ansible Advent Calendar 2014 の25日目です。
メリー・クリスマス
 
今年のAdvent Calendarももう終わりですね。
見渡してみれば、Linuxがやはり多いようですね。
 
そんなことを気にせずWindowsネタをぶち込みます。
 

 

2014年は私にとってAnsibleに非常に助けられました。
2015年もサーバーを大量に作らなければならないため、来年もAnsibleにもお世話になる予定です。
 
Ansible Meetupの中でも触れましたが、Windows対応に苦慮しており、
もっとユーザーが増えるとイイな、ということでWindowsネタです。
 

 
 
大規模なネットワークを組んでいるとどうしてもIPアドレスを節約したい!と言った要望が多いです。
そもそもIPアドレスちゃんと管理してなかった。。。ああ、でも整理する時間はない。
といったことが起こりえます。
 
グローバルIPは、IANAなどを通じて割り当てられるため割りとちゃんと管理されるのですが、
意外と目が行かないのが管理用のネットワークです。
そういう場合、踏み台経由にしてネットワークを分離したりします。
 

f:id:graceful_life:20141225094952p:image

すると、当然クライアントからは直接接続はできなくなるので、踏み台サーバを立てたりします。
 
Linuxでもそういう環境/需要は多いようで、ProxyCommandを使う方法が公開されています。
 
 
さて、Windowsはというと、普通のProxyを立ててやれば良いようです。
 
が、WinRMはHTTPSを使うため、HTTPSに対応したForward Proxyが必要なようです。
知っていればよかったのですが、nginxはSSLのForward Proxyに対応していないので、Squidを利用しましょう。
 
 
 
以下が実行環境です。
 
クライアント
 
 
踏み台
Ubuntu 14.04
 
 
Squid3
 
ターゲット
Windows 2012 R2(評価版)
 
 
 
export http_proxy=http://[proxy ip]:[proxy port]
export https_proxy=http://[proxy ip]:[proxy port]
ansible-playbook -i inventory windows_via_proxy.yml
 
 
以下はSquid を入れる部分を含んだPlaybookです。
(2014年12月25日時点でRole公開できていませんので、乗せたらアップデートします。)
 
 
windows_via_proxy.yml
- hosts: proxy
  roles:
    - gracefullife.squid
- hosts: win
  vars:
    - log_types:
        - Application
        - Setup
        - Security
        - System
        - Internet Explorer
        - HardwareEvents
  tasks:
    - shell:  date +"%Y%m%d_%H%M%S"
      delegate_to: 127.0.0.1
      run_once: true
      register: dt
    - script: Compress-Eventlog.ps1 -output_prefix {{inventory_hostname}}_{{dt.stdout}}
    - fetch:  src="C:\Users\Administrator\AppData\Local\Temp\{{inventory_hostname}}_{{dt.stdout}}.zip"
                 dest=./logs/
                 flat=true
 
 
 
Compress-Eventlog.ps1
Eventlogをエクスポートして、Zipで圧縮するスクリプトです。
Export-Eventlogが、Eventlogを出力する関数で別だししてあります。(ファイル分けたいけど、今のところscriptで実行してるので同じファイルに書いてます。)
 
Param(
  [Parameter(Mandatory=$True,Position=1)]
  [String]$output_prefix
)
 
function Export-Eventlog{
  Param(
    [Parameter(Mandatory=$True,Position=1)]
    [String] $output_prefix ='hostname_19700101_000000',
 
    [parameter(Mandatory=$false, Position=2)]
    [ValidateSet("Application", "System", "Setup", "Security", "HardwareEvents", "Internet Explorer")]
    [String]$log_type
  )
 
  $log_query= "*"
 
  $outpath =  Get-Location
 
  $outfile_fullpath=New-Object System.Text.StringBuilder
  $($outpath.Path, "\", $output_prefix, "_" ,$log_type, ".evtx") | %{[void]$outfile_fullpath.Append($_)}
 
  $evsession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession
  $evsession.ExportLog($log_type,"LogName",$log_query, $outfile_fullpath.ToString() )
}
 
 
@("Application", "Setup", "System", "HardwareEvents" ) | ForEach-Object -process {Export-Eventlog -output_prefix $output_prefix -log_type $_}
 
$outfile_filename=New-Object System.Text.StringBuilder
$($output_prefix, ".zip") | %{[void]$outfile_filename.Append($_)}
$outfile_fullpath=Join-Path -Path $Env:TEMP -ChildPath $outfile_filename.ToString()
 
 
$files = (Get-ChildItem $outpath | Where-Object {$_.Name -like '*.evtx'} | Select-Object -Property Name | %{[String]$_.Name})
Echo $files
 
Compress-Archive -Path $files -DestinationPath $outfile_fullpath -Update
 
Echo $outfile_fullpath
 
 
 
ここまでで環境整えるのも一苦労なのでどこまでやられた人が居るのか謎ですが
やった人は気づくでしょう。
 
WinRM over SSL(5986)で、動かない!
 
 
 
どうやら、Pythonのバグのようです。
 
 
暫定パッチが公開されているので適用してみたのですが、SSLはダメっぽいので、
とりあえずHTTPに逃げました。。。。
 
--------------------------------------------------------------
 
実行すると以下の様なファイルが生成されているはずです。
./logs/win2012r2_20141225_091011.zip
 
 
解凍すると、evtx が含まれているので、Windowsに持ってくれば見れるはずです。
--------------------------------------------------------------
 
 
 
SquidのRoleは公開されていなかったので、Galaxyに公開しようと思っています。
また、SSL Proxyも断念している所です。
上記、情報のアップデートしたら本記事もアップデートします。
 
 
 
 

さて、ここいらで告知など
 
現在技術評論社様とAnsibleの書籍を企画中で、
2015年春中の出版を目指して進めている所です。
 
 
レビューアーを募集しておりますので、やってやるぜ!という方がいらっしゃいましたら
twitter (@myb1126) までご連絡いただければ幸いです。
もしくは、 https://github.com/gracefullife にメールアドレスも記載してありますのでそちらからお願い致します。
 
 
 
 
 
以下、余談

 
今回、Zipファイル化がしたかったのも有り、Powershell5.0で実行しています。
どうしても、Powershell 3.0でやりたい場合は、PSCX(Power Shell Community eXtension)の中に、
Write-Zip というのが用意されているようです。
 
 
Powershell5.0ではNetwork Switch Cmdletsも用意されているので、ここらへんも興味の対象です。
 
 

 
Squidを入れるのも難しい人は、Port Forwarding でもいいんじゃないか、というツッコミもあり
 
 
という訳で、参加された皆様お疲れ様でしたー。
見てくださった方もありがとうございます。
 
来年は是非皆様方も書いてみてください。
 
そして、良いお年を!