Loading...
2014年8月25日月曜日

HTML5 Console Access from Windows PC (Under Investigation)



以前のエントリーでも紹介していますが、vSphere 5.5 の vSphere Web Client からは Mac OS もサポートされています。Windows や Linux では vmware-vmrc という仮想マシンのコンソール アクセス用のバイナリが提供されていますが、Mac OS 用には提供されていません。Mac OS からアクセスした場合には、HTML5 ベースのコンソールがブラウザー内で動作します。 VMRC SDK にも記述はないので、まぁお察しください。

HTML5 ベースのコンソール

HTML5 ベースのコンソールは、Mac OS 上のブラウザーで vSphere Web Client にログインした後、仮想マシンの「コンソールの起動」をクリックすることでアクセスできます。



新しいタブ/ウィンドウが開き HTML5 ベースのコンソールが表示されます。



 コンソールに関わるボタンが「Send Ctrl+Alt+Del」だけで、「Power On」「Power Off」「Reset」「Mount ISO/FD」などがないのが寂しいところですが、仕様なので仕方ないでしょう。 

今回のポイントはコンソール アクセスのウィンドウの URL です。vCenter Server のポート 7331 に HTTP アクセスしています。vSphere Web Client はポート 9443 ですので、コンソールは vSphere Web Client とは別に扱われていそうです。私の環境は vCenter Server Appliance で構成されていますので、アプライアンスにログインしてポート 7331 を利用しているプロセスを lsof で確認してみます。

vc-l-01sp:~ # lsof -i:7331
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    5787 root   21u  IPv6  20543      0t0  TCP *:7331 (LISTEN)
java    5787 root   76u  IPv6 939059      0t0  TCP vc-l-01sp.yyy.zzz:7331->aa.bb.cc.dd:64146 (ESTABLISHED)
vc-l-01sp:~ # ps -ef | grep 5787
root      5787  5034  0 12:03 ?        00:00:19 /usr/java/jre-vmware/bin/java -Djetty.port=7331 -jar start.jar -Xss1024k -Xms1024m OPTIONS=Server,websocket
root     13209 12376  0 12:38 pts/0    00:00:00 grep 5787
vc-l-01sp:~ #
なぜ Jetty ... というツッコミはありますが、この Jetty が使っている他のポートを確認してみます。
vc-l-01sp:~ # lsof -n -P -p 5787 | grep TCP
java    5787 root   21u  IPv6              20543      0t0    TCP *:7331 (LISTEN)
java    5787 root   76u  IPv6             939059      0t0    TCP aa.bb.cc.dd:7331->ww.xx.yy.zz:64146 (ESTABLISHED)
java    5787 root   80u  IPv6             939064      0t0    TCP aa.bb.cc.dd:34321->AA.BB.CC.DD:902 (ESTABLISHED)
java    5787 root   86u  IPv6             544211      0t0    TCP 127.0.0.1:60056->127.0.0.1:443 (ESTABLISHED)
java    5787 root   87u  IPv6             544228      0t0    TCP aa.bb.cc.dd:33523->AA.BB.CC.DD:902 (CLOSE_WAIT)
vc-l-01sp:~ #
aa.bb.cc.dd は vCenter Server の IP アドレス、AA.BB.CC.DD は vSphere ESXi の IP アドレスになります。おそらく Jetty は、vCenter Server (vpxd) のポート 443 への API 用接続と、vSphere ESXi のポート 902 への VNC アクセスを持っていると推察できます。 また、コンソール アクセスのウィンドウの URL の GET アトリビュートを見てみると

  • vm-id (仮想マシンの Managed Object Reference ID)
  • vmName (仮想マシン名)
  • host (vCenter Server のアドレス)
  • sessionTicket (MKS チケットと vCenter Server の証明書の Thumbprint)
  • thumbprint (vCenter Server の証明書の Thumbprint) 

といったパラメータを確認できます。(Thumbprint は MKS チケットの Thumbprint ではないことに注意) ここまで分かれば Windows からでも HTML5 コンソールに接続できるのでは?と妄想してみます。

Windows PC から HTML5 コンソールへのアクセスにチャレンジ

クライアント偽装 (NG)

User-Agent を誤魔化せば...とやってみたものの、JavaScript 内で Runtime を見ている模様。

PowerCLI からのアクセス (NG)

上記のパラメーターを PowerCLI で取得して、Firefox を起動してみます。
$VCenter = "vc-l-01sp"
$VCenterThumbprint = "AA:BB:CC:DD:EE:FF:GG:HH:II:JJ:KK:LL:MM:NN:OO:PP:QQ:RR:SS:TT"
Add-PSSnapin VMware.VimAutomation.Core
Connect-VIServer $VCenter -User XXXX -Password XXXX

$Vm = Get-VM polaris

$Ticket = $Vm.ExtensionData.AcquireTicket("mks")

$VmName = $Vm.Name
$VmId = $Vm.ExtensionData.MoRef.Value
$VmHost = $VCenter
$SessionTicket = "cst-VCT-" + $Ticket.Ticket + "--tp-" + $VCenterThumbprint.Replace(":", "-")
$Thumprint = $VCenterThumbprint

$URL = "http://"+$VCenter+":7331/console/?vmId="+$VmId+"&vmName="+$VmName+"&host="+$VCenter+"&sessionTicket="+$SessionTicket+"&thumbprint="+$VCenterThumbprint

& 'C:\Program Files (x86)\Mozilla Firefox\firefox.exe' $URL
残念ながら、接続に失敗してしまいます。vCenter 側のログには以下のエラーが出力されます。 /var/log/vmware/vsphere-client/logs/vsphere\_client\_virgo.log
[2014-08-24 14:16:31.026] [ERROR] Thread-42                     System.err                                                        Aug 24, 2014 2:16:31 PM com.vmware.mks.AuthdAdapterServlet retrieveMksTicket
[2014-08-24 14:16:31.026] [ERROR] Thread-42                     System.err                                                        SEVERE: com.vmware.vim.binding.vim.fault.InvalidLogin:
[2014-08-24 14:16:31.026] [ERROR] Thread-42                     System.err                                                        inherited from com.vmware.vim.binding.vim.fault.VimFault:
[2014-08-24 14:16:31.026] [ERROR] Thread-42                     System.err                                                        inherited from com.vmware.vim.binding.vim.fault.InvalidLogin: Cannot complete login due to an incorrect user name or password.
[2014-08-24 14:16:31.026] [ERROR] Thread-42                     System.err                                                        2014-08-24 14:16:31.025:WARN:oejs.ServletHandler:/console/authd
[2014-08-24 14:16:31.026] [ERROR] Thread-42                     System.err                                                        java.lang.NullPointerException
[2014-08-24 14:16:31.026] [ERROR] Thread-42                     System.err                                                         at com.vmware.mks.AuthdAdapterServlet.doWebSocketConnect(AuthdAdapterServlet.java:135)
[2014-08-24 14:16:31.026] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.websocket.WebSocketFactory.acceptWebSocket(WebSocketFactory.java:328)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.websocket.WebSocketServlet.service(WebSocketServlet.java:97)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:648)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:534)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
[2014-08-24 14:16:31.027] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.Server.handle(Server.java:365)
[2014-08-24 14:16:31.028] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485)
[2014-08-24 14:16:31.028] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926)
[2014-08-24 14:16:31.028] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988)
[2014-08-24 14:16:31.028] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635)
[2014-08-24 14:16:31.028] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
[2014-08-24 14:16:31.028] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
[2014-08-24 14:16:31.028] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:627)
[2014-08-24 14:16:31.028] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:51)
[2014-08-24 14:16:31.028] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
[2014-08-24 14:16:31.028] [ERROR] Thread-42                     System.err                                                         at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
[2014-08-24 14:16:31.028] [ERROR] Thread-42                     System.err                                                         at java.lang.Thread.run(Unknown Source)
authd は vSphere ESXi でポート 902 の認証を司っているコンポーネントなので、Ticket あたりを間違えているのか...。

おわりに

Firebug などを使って、もうちょっと調べてみたいところです。


2014年8月25日月曜日

0 コメント:

コメントを投稿

Things

 
TOP